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 4bf5ac2691d446501ac8789d9ac8024e7860198a
parent a92688f33be577793d39086b9c7db27f5b05450a
Author: AsherMorgan <59518073+AsherMorgan@users.noreply.github.com>
Date:   Sun, 24 Jan 2021 16:01:21 -0800

Implement user point breakdowns.

Diffstat:
Mbot.py | 156++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------
1 file changed, 102 insertions(+), 54 deletions(-)

diff --git a/bot.py b/bot.py @@ -225,35 +225,55 @@ class Countdown: points = {} for message in self.messages: if (message.author not in points): - points[message.author] = 0 + points[message.author] = { + "author": message.author, + "points": 0, + "breakdown": { + "1000s": 0, + "1001s": 0, + "200s": 0, + "201s": 0, + "100s": 0, + "101s": 0, + "Prime Numbers": 0, + "Odd Numbers": 0, + "Even Numbers": 0, + "First Number": 0, + }, + } if (message.number == self.messages[0].number): - points[message.author] += 0 + points[message.author]["points"] += 0 + points[message.author]["breakdown"]["First Number"] += 0 elif (message.number % 1000 == 0): - points[message.author] += 1000 + points[message.author]["points"] += 1000 + points[message.author]["breakdown"]["1000s"] += 1000 elif (message.number % 1000 == 1): - points[message.author] += 500 + points[message.author]["points"] += 500 + points[message.author]["breakdown"]["1001s"] += 500 elif (message.number % 200 == 0): - points[message.author] += 200 + points[message.author]["points"] += 200 + points[message.author]["breakdown"]["200s"] += 200 elif (message.number % 200 == 1): - points[message.author] += 100 + points[message.author]["points"] += 100 + points[message.author]["breakdown"]["201s"] += 100 elif (message.number % 100 == 0): - points[message.author] += 100 + points[message.author]["points"] += 100 + points[message.author]["breakdown"]["100s"] += 100 elif (message.number % 100 == 1): - points[message.author] += 50 + points[message.author]["points"] += 50 + points[message.author]["breakdown"]["101s"] += 50 elif (message.number in primes): - points[message.author] += 15 + points[message.author]["points"] += 15 + points[message.author]["breakdown"]["Prime Numbers"] += 15 elif (message.number % 2 == 1): - points[message.author] += 12 + points[message.author]["points"] += 12 + points[message.author]["breakdown"]["Odd Numbers"] += 12 else: - points[message.author] += 10 + points[message.author]["points"] += 10 + points[message.author]["breakdown"]["Even Numbers"] += 10 # Create ranked leaderboard - leaderboard = [] - for author in points: - leaderboard += [{ - "author":author, - "points":points[author] - }] + leaderboard = [points[x] for x in points] leaderboard = sorted(leaderboard, key=lambda x: x["points"], reverse=True) return leaderboard @@ -366,7 +386,7 @@ async def contributors(ctx): @bot.command(aliases=["l"]) -async def leaderboard(ctx): +async def leaderboard(ctx, user=None): """ Shows the countdown leaderboard """ @@ -383,42 +403,70 @@ async def leaderboard(ctx): # Create embed embed=discord.Embed(title="Countdown Leaderboard") - # Add leaderboard - ranks = "" - points = "" - users = "" - for i in range(0, len(leaderboard)): - ranks += f"{i+1}\n" - points += f"{leaderboard[i]['points']:,}\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" - 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) + if (user is None): + # Add leaderboard + ranks = "" + points = "" + users = "" + for i in range(0, len(leaderboard)): + ranks += f"{i+1}\n" + points += f"{leaderboard[i]['points']:,}\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" + 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) + else: + # Get user rank + temp = [x["author"].startswith(user) for x in leaderboard] + if (True not in temp): + await ctx.send("User not found.") + return + rank = temp.index(True) + + # Add description + embed.description = f"**Point Breakdown for:** {leaderboard[rank]['author']}\n" + embed.description += f"**Total Points:** {leaderboard[rank]['points']:,}\n" + embed.description += f"**Rank:** {rank + 1}\n" + + # Add points breakdown + rules = "" + points = "" + percentage = "" + for category in leaderboard[rank]["breakdown"]: + rules += f"{category}\n" + points += f"{leaderboard[rank]['breakdown'][category]:,}\n" + if (leaderboard[rank]['points'] > 0): + percentage += f"{round(leaderboard[rank]['breakdown'][category] / leaderboard[rank]['points'] * 100, 1)}%\n" + else: + percentage += "0%\n" + embed.add_field(name="Category", value=rules, inline=True) + embed.add_field(name="Points", value=points, inline=True) + embed.add_field(name="Percentage", value=percentage, inline=True) # Send embed await ctx.send(embed=embed)