aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamot19 <81269200+Samot19@users.noreply.github.com>2021-06-24 20:35:40 +0000
committerGitHub <noreply@github.com>2021-06-24 20:35:40 +0000
commit4266dc89c4df32950ae413b5afbe3f7dc73715f6 (patch)
tree93ba0ad60013a714aa9f6a477cf88af2aa7b5ee1
parent80bef8c06e1debf01881c83c97ffe1105e880360 (diff)
downloadsteve-bot-4266dc89c4df32950ae413b5afbe3f7dc73715f6.tar
steve-bot-4266dc89c4df32950ae413b5afbe3f7dc73715f6.tar.gz
steve-bot-4266dc89c4df32950ae413b5afbe3f7dc73715f6.tar.bz2
steve-bot-4266dc89c4df32950ae413b5afbe3f7dc73715f6.tar.lz
steve-bot-4266dc89c4df32950ae413b5afbe3f7dc73715f6.tar.xz
steve-bot-4266dc89c4df32950ae413b5afbe3f7dc73715f6.tar.zst
steve-bot-4266dc89c4df32950ae413b5afbe3f7dc73715f6.zip
Add the caller's place on the fair leaderboard
When invoking the fboard command. If caller is in top 11, highlight their entry. Also add total number of people that have the same value as the caller if caller place is less than 11.
-rwxr-xr-xcogs/utils.py98
1 files changed, 72 insertions, 26 deletions
diff --git a/cogs/utils.py b/cogs/utils.py
index e19ad11..8815d7a 100755
--- a/cogs/utils.py
+++ b/cogs/utils.py
@@ -7,6 +7,7 @@ import unicodedata
from collections import namedtuple
from datetime import timedelta
from random import choice, randint
+from math import floor
import discord
from discord.ext import commands
@@ -522,35 +523,14 @@ class Utils(commands.Cog):
@commands.command()
async def fboard(self, ctx, requested: str = "streak"):
"""Show fair leaderboard (day or streak)."""
- # get fair object
with open("fair.json", "r") as f:
fair = json.load(f)
- # Detect people who didn't maintain their streak.
+ #Detect people who didn't maintain their streak.
for user in fair:
- tz = fair[user]["timezone"]
- try:
- currentdate = datetime.datetime.now(timezone(tz)).date()
- except:
- # Ocean put in a test timezone and it messes with stuff
- continue
- if fair[user]["date"] != str(currentdate) and fair[user]["date"] != str(
- currentdate - timedelta(1)
- ):
+ currentdate = datetime.datetime.now().date()
+ if fair[user]["date"] != str(currentdate) and fair[user]["date"] != str(currentdate-datetime.timedelta(1)):
fair[user]["streak"] = 1
- fair[user]["date"] = str(currentdate)
- try:
- # It seems like people don't like spam pings
-
- # await ctx.send(
- # self.bot.get_user(int(user)).mention
- # + ": You lost your streak! <:sad:716629485449117708>"
- # )
-
- pass
- except:
- # User left the server so the bot can't find them
- continue
with open("fair.json", "w") as f:
json.dump(fair, f, indent=4)
@@ -579,15 +559,81 @@ class Utils(commands.Cog):
embed = discord.Embed(
title="Fair Leaderboard", color=7853978, timestamp=ctx.message.created_at
)
+
+ addNewField = True
+ callerid = ctx.message.author.id
# Get the top 10 entries and extract the info and user from each string
for i in range(10):
entry = leaderboard[i][:-18]
userstr = leaderboard[i][-18:]
- text = text + f"{i+1}. {self.bot.get_user(int(userstr))}: {entry} \n"
+ #If caller is in top 10, then we highlight their entry
+ if str(callerid) == userstr:
+ text += f"**{i+1}. {self.bot.get_user(int(userstr))}: {entry}** \n"
+ addNewField = False
+ else:
+ text += f"{i+1}. {self.bot.get_user(int(userstr))}: {entry} \n"
+
+ if not str(callerid) in fair:
+ addNewField = False
+
+ #If caller is not in top 10, we add a new field with their place on the leaderboard and another one with number of people that have the same value (tied)
+ if addNewField:
+ if flag == "Day":
+ value = fair[str(callerid)]["day"]
+ elif flag == "Streak":
+ value = fair[str(callerid)]["streak"]
+
+ #Binary searches for caller in leaderboard. First we find leftmost element that has [value] in it.
+ left = 0
+ right = len(leaderboard)
+ while left < right:
+ middle = floor((left + right)/2)
+ if int(leaderboard[middle][:-18]) > value:
+ left = middle + 1
+ else:
+ right = middle
+
+ leftIndex = left
+
+ #Now we find the rightmost one.
+ left = 0
+ right = len(leaderboard)
+ while left < right:
+ middle = floor((left + right)/2)
+ if int(leaderboard[middle][:-18]) < value:
+ right = middle
+ else:
+ left = middle + 1
+
+ rightIndex = right - 1
+
+ callerIndex = False
+
+ #Finally, we find the caller id index
+ left = leftIndex
+ right = rightIndex
+ while left <= right:
+ middle = floor((left + right)/2)
+ if int(leaderboard[middle][-18:]) > callerid:
+ left = middle + 1
+ elif int(leaderboard[middle][-18:]) < callerid:
+ right = middle - 1
+ else:
+ callerIndex = middle
+ break
+
+ entry = leaderboard[callerIndex][:-18]
+ userstr = leaderboard[callerIndex][-18:]
+
+ #If caller is the 11th place on the leaderboard, highlight their entry.
+ if callerIndex == 10:
+ text += f"**{callerIndex + 1}. {self.bot.get_user(int(userstr))}: {entry}** \n"
+ else:
+ text += f"\n{callerIndex + 1}. {self.bot.get_user(int(userstr))}: {entry} \nTotal number of people with value {entry}: {rightIndex - leftIndex}\n"
embed.add_field(
- name=flag, value=discord.utils.escape_mentions(text), inline=False
+ name=flag, value=text, inline=False
)
await ctx.send(embed=embed)