#!/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[*]}")"