aboutsummaryrefslogtreecommitdiff
path: root/cogs/src.py
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/src.py
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 '')
-rwxr-xr-xcogs/src.py100
1 files changed, 83 insertions, 17 deletions
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))