countdown-bot

A Discord bot that runs countdown games and generates analytics
git clone https://git.ashermorgan.net/countdown-bot/
Log | Files | Refs | README

commit b5672171cad893543bd0f742df8b016547f3ebba
parent 9b759b341dcb4e16cd16c1f47f420bb6e66fb7c4
Author: AsherMorgan <59518073+AsherMorgan@users.noreply.github.com>
Date:   Thu, 11 Feb 2021 17:32:03 -0800

Improve leaderboard command output.

Diffstat:
Mbot.py | 97++++++++++++++++++++++++++++++++-----------------------------------------------
1 file changed, 39 insertions(+), 58 deletions(-)

diff --git a/bot.py b/bot.py @@ -15,6 +15,18 @@ import tempfile channels = [] countdowns = {} TIMEZONE = timedelta(hours=-8) # America/Los_Angeles +POINT_RULES = { + "1000s": 1000, + "1001s": 500, + "200s": 200, + "201s": 100, + "100s": 100, + "101s": 50, + "Prime Numbers": 15, + "Odd Numbers": 12, + "Even Numbers": 10, + "First Number": 0, +} @@ -219,7 +231,6 @@ class Countdown: if (message.author not in points): points[message.author] = { "author": message.author, - "points": 0, "breakdown": { "1000s": 0, "1001s": 0, @@ -233,39 +244,23 @@ class Countdown: "First Number": 0, }, } - if (message.number == self.messages[0].number): - points[message.author]["points"] += 0 - points[message.author]["breakdown"]["First Number"] += 0 - elif (message.number % 1000 == 0): - points[message.author]["points"] += 1000 - points[message.author]["breakdown"]["1000s"] += 1000 - elif (message.number % 1000 == 1): - points[message.author]["points"] += 500 - points[message.author]["breakdown"]["1001s"] += 500 - elif (message.number % 200 == 0): - points[message.author]["points"] += 200 - points[message.author]["breakdown"]["200s"] += 200 - elif (message.number % 200 == 1): - points[message.author]["points"] += 100 - points[message.author]["breakdown"]["201s"] += 100 - elif (message.number % 100 == 0): - points[message.author]["points"] += 100 - points[message.author]["breakdown"]["100s"] += 100 - elif (message.number % 100 == 1): - points[message.author]["points"] += 50 - points[message.author]["breakdown"]["101s"] += 50 - elif (message.number in primes): - points[message.author]["points"] += 15 - points[message.author]["breakdown"]["Prime Numbers"] += 15 - elif (message.number % 2 == 1): - points[message.author]["points"] += 12 - points[message.author]["breakdown"]["Odd Numbers"] += 12 - else: - points[message.author]["points"] += 10 - points[message.author]["breakdown"]["Even Numbers"] += 10 + if (message.number == self.messages[0].number): points[message.author]["breakdown"]["First Number"] += 1 + elif (message.number % 1000 == 0): points[message.author]["breakdown"]["1000s"] += 1 + elif (message.number % 1000 == 1): points[message.author]["breakdown"]["1001s"] += 1 + elif (message.number % 200 == 0): points[message.author]["breakdown"]["200s"] += 1 + elif (message.number % 200 == 1): points[message.author]["breakdown"]["201s"] += 1 + elif (message.number % 100 == 0): points[message.author]["breakdown"]["100s"] += 1 + elif (message.number % 100 == 1): points[message.author]["breakdown"]["101s"] += 1 + elif (message.number in primes): points[message.author]["breakdown"]["Prime Numbers"] += 1 + elif (message.number % 2 == 1): points[message.author]["breakdown"]["Odd Numbers"] += 1 + else: points[message.author]["breakdown"]["Even Numbers"] += 1 # Create ranked leaderboard - leaderboard = [points[x] for x in points] + leaderboard = [] + for contributor in points.values(): + contributor["contributions"] = sum(contributor["breakdown"].values()) + contributor["points"] = sum([contributor["breakdown"][x] * POINT_RULES[x] for x in contributor["breakdown"]]) + leaderboard += [contributor] leaderboard = sorted(leaderboard, key=lambda x: x["points"], reverse=True) return leaderboard @@ -487,7 +482,7 @@ async def leaderboard(ctx, user=None): await ctx.send("Error: The countdown is empty.") return - # Get leaderboard + # Get leaderboard leaderboard = countdown.leaderboard() # Create embed @@ -501,32 +496,17 @@ async def leaderboard(ctx, user=None): for i in range(0, len(leaderboard)): ranks += f"{i+1:,}\n" points += f"{leaderboard[i]['points']:,}\n" - users += f"{await getUsername(leaderboard[i]['author'])}\n" + users += f"<@{leaderboard[i]['author']}>\n" embed.add_field(name="Rank",value=ranks, inline=True) embed.add_field(name="Points",value=points, inline=True) embed.add_field(name="User",value=users, inline=True) # Add leaderboard rules - rules = "1000s\n" \ - "1001s\n" \ - "200s\n" \ - "201s\n" \ - "100s\n" \ - "101s\n" \ - "Prime Numbers\n" \ - "Odd Numbers\n" \ - "Even Numbers\n" \ - "First Number\n" - values = "1000 points\n" \ - "500 points\n" \ - "200 points\n" \ - "100 points\n" \ - "100 points\n" \ - "50 points\n" \ - "15 points\n" \ - "12 points\n" \ - "10 points\n" \ - "0 points\n" + rules = "" + values = "" + for rule in POINT_RULES: + rules += f"{rule}\n" + values += f"{POINT_RULES[rule]} points\n" embed.add_field(name="Rules", value="Only 1 rule is applied towards each number", inline=False) embed.add_field(name="Numbers", value=rules, inline=True) embed.add_field(name="Points", value=values, inline=True) @@ -543,9 +523,10 @@ async def leaderboard(ctx, user=None): rank = temp.index(True) # Add description - embed.description = f"**Point Breakdown for:** {leaderboard[rank]['name']}\n" + embed.description = f"**User:** <@{leaderboard[rank]['author']}>\n" + embed.description += f"**Rank:** #{rank + 1:,}\n" embed.description += f"**Total Points:** {leaderboard[rank]['points']:,}\n" - embed.description += f"**Rank:** {rank + 1:,}\n" + embed.description += f"**Total Contributions:** {leaderboard[rank]['contributions']:,}\n" # Add points breakdown rules = "" @@ -553,9 +534,9 @@ async def leaderboard(ctx, user=None): percentage = "" for category in leaderboard[rank]["breakdown"]: rules += f"{category}\n" - points += f"{leaderboard[rank]['breakdown'][category]:,}\n" + points += f"{leaderboard[rank]['breakdown'][category] * POINT_RULES[category]:,} *({leaderboard[rank]['breakdown'][category]:,})*\n" if (leaderboard[rank]['points'] > 0): - percentage += f"{round(leaderboard[rank]['breakdown'][category] / leaderboard[rank]['points'] * 100, 1)}%\n" + percentage += f"{round(leaderboard[rank]['breakdown'][category] * POINT_RULES[category] / leaderboard[rank]['points'] * 100, 1)}%\n" else: percentage += "0%\n" embed.add_field(name="Category", value=rules, inline=True)