102 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			102 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/usr/bin/env bash
 | |
| 
 | |
| # Word tracking leaderboard module - shows top users in a category
 | |
| 
 | |
| # shellcheck disable=SC1091
 | |
| [ -f functions.sh ] && source functions.sh
 | |
| # shellcheck disable=SC1091
 | |
| [ -f triggers/wordtrack/categories.sh ] && source triggers/wordtrack/categories.sh
 | |
| 
 | |
| name="$1"
 | |
| channelName="$2"
 | |
| shift 2
 | |
| 
 | |
| category="$1"
 | |
| 
 | |
| # If no category specified, list available categories
 | |
| # shellcheck disable=SC2154
 | |
| if [[ -z "$category" ]]; then
 | |
|     msg "$channelName" "$name: Available categories: ${categories[*]}"
 | |
|     exit 0
 | |
| fi
 | |
| 
 | |
| # Validate category exists
 | |
| categoryValid=0
 | |
| # shellcheck disable=SC2154
 | |
| for cat in "${categories[@]}"; do
 | |
|     if [[ "$cat" == "$category" ]]; then
 | |
|         categoryValid=1
 | |
|         break
 | |
|     fi
 | |
| done
 | |
| 
 | |
| if ((categoryValid == 0)); then
 | |
|     msg "$channelName" "$name: Invalid category. Available: ${categories[*]}"
 | |
|     exit 0
 | |
| fi
 | |
| 
 | |
| # Data directory for this channel
 | |
| dataDir="triggers/wordtrack/data/${channelName}"
 | |
| 
 | |
| if [[ ! -d "$dataDir" ]]; then
 | |
|     msg "$channelName" "$name: No tracking data available yet."
 | |
|     exit 0
 | |
| fi
 | |
| 
 | |
| # Collect all users' counts for this category
 | |
| declare -A leaderboard
 | |
| 
 | |
| for userFile in "$dataDir"/*.dat; do
 | |
|     [[ -f "$userFile" ]] || continue
 | |
| 
 | |
|     userName=$(basename "$userFile" .dat)
 | |
| 
 | |
|     while IFS='=' read -r cat count; do
 | |
|         if [[ "$cat" == "$category" ]]; then
 | |
|             leaderboard["$userName"]="$count"
 | |
|         fi
 | |
|     done < "$userFile"
 | |
| done
 | |
| 
 | |
| # Check if anyone has been tracked
 | |
| if [[ ${#leaderboard[@]} -eq 0 ]]; then
 | |
|     msg "$channelName" "$name: No one has been tracked in the ${category} category yet."
 | |
|     exit 0
 | |
| fi
 | |
| 
 | |
| # Sort users by count (descending)
 | |
| sortedUsers=()
 | |
| while IFS= read -r line; do
 | |
|     sortedUsers+=("$line")
 | |
| done < <(for user in "${!leaderboard[@]}"; do
 | |
|     echo "${leaderboard[$user]} $user"
 | |
| done | sort -rn | head -5)
 | |
| 
 | |
| # Get level names for this category
 | |
| levelsArrayName="${category}Levels"
 | |
| declare -n levelsRef="$levelsArrayName"
 | |
| 
 | |
| # Build leaderboard message
 | |
| leaderParts=()
 | |
| position=1
 | |
| 
 | |
| for entry in "${sortedUsers[@]}"; do
 | |
|     count="${entry%% *}"
 | |
|     userName="${entry#* }"
 | |
| 
 | |
|     # Find level for this count
 | |
|     level="Unranked"
 | |
|     for threshold in $(printf '%s\n' "${!levelsRef[@]}" | sort -n); do
 | |
|         if ((count >= threshold)); then
 | |
|             level="${levelsRef[$threshold]}"
 | |
|         fi
 | |
|     done
 | |
| 
 | |
|     leaderParts+=("${position}. ${userName}: ${level} (${count} words)")
 | |
|     ((position++))
 | |
| done
 | |
| 
 | |
| unset -n levelsRef
 | |
| 
 | |
| msg "$channelName" "$name: Top ${category} users: $(IFS=' | '; echo "${leaderParts[*]}")"
 |