Files
stormbot/modules/wordtrack-leaders/wordtrack-leaders.sh
Storm Dragon a0afefadfd Cleanup.
2025-10-24 21:35:41 -04:00

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