diff options
author | Luca Matei Pintilie <luca@lucamatei.com> | 2024-08-04 11:14:23 +0000 |
---|---|---|
committer | Luca Matei Pintilie <luca@lucamatei.com> | 2024-08-10 09:18:57 +0000 |
commit | d3fbe9c8a5d2875d964a6de86d7007ddf7ad9247 (patch) | |
tree | 90bfe2a1f1f0b4d7b89ea67490152d897f255030 /cogs | |
parent | acfbb761379f6f27a1c4740b74ba6758942780fc (diff) | |
download | steve-bot-d3fbe9c8a5d2875d964a6de86d7007ddf7ad9247.tar steve-bot-d3fbe9c8a5d2875d964a6de86d7007ddf7ad9247.tar.gz steve-bot-d3fbe9c8a5d2875d964a6de86d7007ddf7ad9247.tar.bz2 steve-bot-d3fbe9c8a5d2875d964a6de86d7007ddf7ad9247.tar.lz steve-bot-d3fbe9c8a5d2875d964a6de86d7007ddf7ad9247.tar.xz steve-bot-d3fbe9c8a5d2875d964a6de86d7007ddf7ad9247.tar.zst steve-bot-d3fbe9c8a5d2875d964a6de86d7007ddf7ad9247.zip |
Remove alts, add Active Runner role, increase src.py scheduled job to 30min
Removing alts from the database to save on resources and to ensure the
integrity of the roles.
Adding Active Runner role, which will be given to runners with a run on
the leaderboard in the past 2 years.
Increasing to 30min as the jobs can overlap and overwrite each other,
which is not a good idea. Helps with rate limiting as well.
Diffstat (limited to 'cogs')
-rwxr-xr-x | cogs/general.py | 2 | ||||
-rwxr-xr-x | cogs/src.py | 100 | ||||
-rwxr-xr-x | cogs/utils.py | 2 |
3 files changed, 85 insertions, 19 deletions
diff --git a/cogs/general.py b/cogs/general.py index 64e0ab6..65ff521 100755 --- a/cogs/general.py +++ b/cogs/general.py @@ -384,7 +384,7 @@ class MyHelpCommand(commands.MinimalHelpCommand): ]
def get_command_signature(self, command):
- return f"``{self.clean_prefix}{command.qualified_name} {command.signature}``"
+ return f"``{self.context.clean_prefix}{command.qualified_name} {command.signature}``"
def get_ending_note(self) -> str:
return choice(self.messages)
diff --git a/cogs/src.py b/cogs/src.py index 166760e..17f2141 100755 --- a/cogs/src.py +++ b/cogs/src.py @@ -1,5 +1,7 @@ import json -from datetime import timedelta +from datetime import timedelta, datetime +import dateutil.parser +from dateutil.relativedelta import relativedelta from pathlib import Path import aiohttp @@ -303,24 +305,32 @@ async def verifyNew(self, apiKey=None, userID=None): "User-Agent": "mcbeDiscordBot/1.0", } server = self.bot.get_guild(574267523869179904) - # Troll is mentally challenged I guess ¯\_(ツ)_/¯ - RunneRole = server.get_role(574268937454223361) + RunnerRole = server.get_role(574268937454223361) + ActiveRunnerRole = server.get_role(1271515943050412042) WrRole = server.get_role(583622436378116107) # if userID == None: # return # else: user = await self.bot.fetch_user(int(userID)) + member = await server.fetch_member(user.id) data = json.loads(Path("./api_keys.json").read_text()) if str(user.id) in data: + srcId = data[str(user.id)] pbs = requests.get( - f"https://www.speedrun.com/api/v1/users/{data[str(user.id)]}/personal-bests", + f"https://www.speedrun.com/api/v1/users/{srcId}/personal-bests", headers=head, ) + if pbs.status_code == 404: + self.bot.logger.warning(f"Speedrun.com user {srcId} not found. Deleting") + await member.remove_roles(ActiveRunnerRole) + await member.remove_roles(RunnerRole) + await member.remove_roles(WrRole) + # TODO: Custom exception here? + raise Exception("speedrun_com_user_not_found") pbs = json.loads(pbs.text) else: r = requests.get("https://www.speedrun.com/api/v1/profile", headers=head) - # print(r.text) if r.status_code >= 400: await user.send(f"```json\n{r.text}```") return @@ -329,33 +339,41 @@ async def verifyNew(self, apiKey=None, userID=None): except json.decoder.JSONDecodeError: return srcUserID = profile["data"]["id"] + + data[user.id] = srcUserID + with open("api_keys.json", "w") as file: - data[user.id] = srcUserID json.dump(data, file, indent=4) pbs = requests.get(profile["data"]["links"][3]["uri"], headers=head) pbs = json.loads(pbs.text) + cutoff = (datetime.now() - relativedelta(years=2)).timestamp() wrCounter = False runnerCounter = False + activeRunnerCounter = False for i in pbs["data"]: - if i["place"] == 1: - if i["run"]["game"] == "yd4ovvg1" or i["run"]["game"] == "v1po7r76": + if i["run"]["game"] == "yd4ovvg1" or i["run"]["game"] == "v1po7r76": + if i["place"] == 1: if not i["run"]["level"]: wrCounter = True - if i["run"]["game"] == "yd4ovvg1" or i["run"]["game"] == "v1po7r76": - # I have no shame + # If the run was submitted after the cutoff date, the runner is active + if dateutil.parser.isoparse(i["run"]["submitted"]).timestamp() > cutoff: + activeRunnerCounter = True runnerCounter = True - member = await server.fetch_member(user.id) if wrCounter: await member.add_roles(WrRole) else: await member.remove_roles(WrRole) if runnerCounter: - await member.add_roles(RunneRole) + await member.add_roles(RunnerRole) else: - await member.remove_roles(RunneRole) + await member.remove_roles(RunnerRole) + if activeRunnerCounter: + await member.add_roles(ActiveRunnerRole) + else: + await member.remove_roles(ActiveRunnerRole) async def verifiedCount(self, ctx, modName): @@ -473,17 +491,65 @@ class Src(commands.Cog): return await verifiedCount(self, ctx, modName) - @tasks.loop(minutes=10.0) + @tasks.loop(minutes=30.0) async def checker(self): data = json.loads(Path("./api_keys.json").read_text()) + keys_to_delete = [] + alts_to_remove = [] for key, value in data.items(): + skip = False + for key2, value2 in data.items(): + if value == value2 and key != key2 and key2 not in alts_to_remove: + self.bot.logger.info(f"Alt found: {value} is the same for {key} and {key2}. Deleting") + alts_to_remove.append(key) + skip = True try: - await verifyNew(self, None, key) + if not skip: + await verifyNew(self, None, key) + except discord.NotFound: + self.bot.logger.info(f"Didn't find user {key}. Deleting") + keys_to_delete.append(key) except Exception as e: - print(f"{key}: {value}") - print(e.args) + if e.args[0] == "speedrun_com_user_not_found": + keys_to_delete.append(key) + else: + self.bot.logger.error(f"{key}: {value}", exc_info=e) + + data = json.loads(Path("./api_keys.json").read_text()) + for key in keys_to_delete: + id = str(key) + if id in data.keys(): + del data[id] + + # TODO: Don't copy logic from verifyNew + server = self.bot.get_guild(574267523869179904) + RunnerRole = server.get_role(574268937454223361) + WrRole = server.get_role(583622436378116107) + ActiveRunnerRole = server.get_role(1271515943050412042) + + for key in alts_to_remove: + userID = int(key) + try: + user = await self.bot.fetch_user(userID) + except discord.NotFound: + self.bot.logger.info(f"Didn't find user {key}. Deleting") + + try: + member = await server.fetch_member(key) + await member.remove_roles(RunnerRole) + await member.remove_roles(WrRole) + await member.remove_roles(ActiveRunnerRole) + except discord.NotFound: + # self.bot.logger.info(f"Didn't find user {key} in server. Not deleting") continue + id = str(key) + if id in data.keys(): + del data[id] + + with open("api_keys.json", "w") as file: + json.dump(data, file, indent=4) + async def setup(bot): await bot.add_cog(Src(bot)) diff --git a/cogs/utils.py b/cogs/utils.py index a9dc2fe..e13080a 100755 --- a/cogs/utils.py +++ b/cogs/utils.py @@ -163,7 +163,7 @@ class Utils(commands.Cog): # Add extra comment based on number of sleepHrs if sleepHrs == 0: await ctx.send( - f"{discord.utils.escape_mentions(ctx.message.author.display_name)} -> your sleep is 0 hours long - nice try \:D" + f"{discord.utils.escape_mentions(ctx.message.author.display_name)} -> your sleep is 0 hours long - nice try :D" ) elif sleepHrs <= 5: if sleepHrs == 1: |