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