Cleanup.
This commit is contained in:
101
modules/wordtrack-leaders/wordtrack-leaders.sh
Executable file
101
modules/wordtrack-leaders/wordtrack-leaders.sh
Executable file
@@ -0,0 +1,101 @@
|
||||
#!/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[*]}")"
|
||||
Reference in New Issue
Block a user