aboutsummaryrefslogtreecommitdiff
path: root/cogs
diff options
context:
space:
mode:
authorLuca Matei Pintilie <luca@lucamatei.com>2024-08-04 11:14:23 +0000
committerLuca Matei Pintilie <luca@lucamatei.com>2024-08-10 09:18:57 +0000
commitd3fbe9c8a5d2875d964a6de86d7007ddf7ad9247 (patch)
tree90bfe2a1f1f0b4d7b89ea67490152d897f255030 /cogs
parentacfbb761379f6f27a1c4740b74ba6758942780fc (diff)
downloadsteve-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-xcogs/general.py2
-rwxr-xr-xcogs/src.py100
-rwxr-xr-xcogs/utils.py2
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: