diff options
author | Luca Matei Pintilie <luca@lucamatei.com> | 2024-08-09 19:35:30 +0000 |
---|---|---|
committer | Luca Matei Pintilie <luca@lucamatei.com> | 2024-08-09 19:35:30 +0000 |
commit | 2ca05c8bd9d5c0aca825a9a1505f3000f24bd43e (patch) | |
tree | 90bfe2a1f1f0b4d7b89ea67490152d897f255030 | |
parent | 48dd788fb7018aeac66de9a4713863f6ac5f022a (diff) | |
download | steve-bot-2ca05c8bd9d5c0aca825a9a1505f3000f24bd43e.tar steve-bot-2ca05c8bd9d5c0aca825a9a1505f3000f24bd43e.tar.gz steve-bot-2ca05c8bd9d5c0aca825a9a1505f3000f24bd43e.tar.bz2 steve-bot-2ca05c8bd9d5c0aca825a9a1505f3000f24bd43e.tar.lz steve-bot-2ca05c8bd9d5c0aca825a9a1505f3000f24bd43e.tar.xz steve-bot-2ca05c8bd9d5c0aca825a9a1505f3000f24bd43e.tar.zst steve-bot-2ca05c8bd9d5c0aca825a9a1505f3000f24bd43e.zip |
Add Active Role implementation and increase src.py scheduled job to 30minremove-dupes
Increasing to 30min as the jobs can overlap and overwrite each other,
which is not a good idea. Helps with rate limiting as well.
-rwxr-xr-x | cogs/src.py | 69 | ||||
-rwxr-xr-x | cogs/utils.py | 2 |
2 files changed, 49 insertions, 22 deletions
diff --git a/cogs/src.py b/cogs/src.py index 26bb820..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 @@ -337,27 +347,33 @@ async def verifyNew(self, apiKey=None, userID=None): 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(RunnerRole) + if activeRunnerCounter: + await member.add_roles(ActiveRunnerRole) else: - await member.remove_roles(RunneRole) + await member.remove_roles(ActiveRunnerRole) async def verifiedCount(self, ctx, modName): @@ -475,7 +491,7 @@ 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 = [] @@ -483,20 +499,21 @@ class Src(commands.Cog): for key, value in data.items(): skip = False for key2, value2 in data.items(): - if value == value2 and not key == key2: - print(f"Alt found: {value} is the same for {key} and {key2}") + 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: if not skip: await verifyNew(self, None, key) except discord.NotFound: - print(f"Didn't find user {key}. Deleting") + 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) - continue + 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: @@ -508,14 +525,24 @@ class Src(commands.Cog): 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: - member = await server.fetch_member(int(key)) + 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: - print(f"Didn't find user {key}. Deleting") + # 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] 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: |