diff options
Diffstat (limited to 'cogs/src.py')
-rwxr-xr-x | cogs/src.py | 291 |
1 files changed, 0 insertions, 291 deletions
diff --git a/cogs/src.py b/cogs/src.py deleted file mode 100755 index a382418..0000000 --- a/cogs/src.py +++ /dev/null @@ -1,291 +0,0 @@ -from discord.ext import commands -from discord.ext import tasks -from discord.utils import get -from datetime import timedelta -import discord -import requests -import json -import asyncio -import dateutil.parser -from pathlib import Path - - -async def rejectRun(self, apiKey, ctx, run, reason): - await ctx.message.delete() - run = run.split('/')[-1] - reject = {"status": {"status": "rejected", "reason": reason}} - r = requests.put(f"https://www.speedrun.com/api/v1/runs/{run}/status", - headers={ - "X-API-Key": apiKey, - "Accept": "application/json", - "User-Agent": "mcbeDiscordBot/1.0" - }, - data=json.dumps(reject)) - if r.status_code == 200 or r.status_code == 204: - await ctx.send(f'Run rejected succesfully for `{reason}`') - else: - await ctx.send("Something went wrong") - await ctx.message.author.send( - f"```json\n{json.dumps(json.loads(r.text),indent=4)}```") - - -async def approveRun(self, apiKey, ctx, run, reason=None): - await ctx.message.delete() - run = run.split('/')[-1] - if reason == None: - approve = {"status": {"status": "verified"}} - else: - approve = {"status": {"status": "verified", "reason": reason}} - r = requests.put(f"https://www.speedrun.com/api/v1/runs/{run}/status", - headers={ - "X-API-Key": apiKey, - "Accept": "application/json", - "User-Agent": "mcbeDiscordBot/1.0" - }, - data=json.dumps(approve)) - if r.status_code == 200 or r.status_code == 204: - await ctx.send("Run approved succesfully") - else: - await ctx.send("Something went wrong") - await ctx.message.author.send( - f"```json\n{json.dumps(json.loads(r.text),indent=4)}```") - - -async def deleteRun(self, apiKey, ctx, run): - await ctx.message.delete() - run = run.split('/')[-1] - r = requests.delete(f"https://www.speedrun.com/api/v1/runs/{run}", - headers={ - "X-API-Key": apiKey, - "Accept": "application/json", - "User-Agent": "mcbeDiscordBot/1.0" - }) - if r.status_code == 200 or r.status_code == 204: - await ctx.send("Run deleted succesfully") - else: - await ctx.send("Something went wrong") - await ctx.message.author.send( - f"```json\n{json.dumps(json.loads(r.text),indent=4)}```") - - -async def pendingRuns(self, ctx): - mcbe_runs = 0 - mcbeil_runs = 0 - mcbece_runs = 0 - runs_to_reject = [] - head = {"Accept": "application/json", "User-Agent": "mcbeDiscordBot/1.0"} - gameID = 'yd4ovvg1' # ID of Minecraft bedrock - gameID2 = 'v1po7r76' # ID of Category extension - runsRequest = requests.get( - f'https://www.speedrun.com/api/v1/runs?game={gameID}&status=new&max=200&embed=category,players,level&orderby=submitted', - headers=head) - runs = json.loads(runsRequest.text) - runsRequest2 = requests.get( - f'https://www.speedrun.com/api/v1/runs?game={gameID2}&status=new&max=200&embed=category,players,level&orderby=submitted', - headers=head) - runs2 = json.loads(runsRequest2.text) - # Use https://www.speedrun.com/api/v1/games?abbreviation=mcbe for ID - - for game in range(2): - for i in range(200): - leaderboard = '' # A little ugly but prevents name not defined error - level = False - try: - for key, value in runs['data'][i].items(): - if key == 'id': - run_id = value - if key == 'weblink': - link = value - if key == 'level': - if value["data"]: - level = True - categoryName = value["data"]["name"] - if key == 'category' and not level: - categoryName = value["data"]["name"] - if key == 'videos': - if value['links'][0]['uri'] in self.bot.runs_blacklist[ - "videos"]: - await rejectRun( - self, self.bot.config['api_key'], ctx, run_id, - 'Detected as spam by our automatic filter') - if key == 'players': - if value["data"][0]["names"][ - "international"] in self.bot.runs_blacklist[ - "players"]: - runs_to_reject.append([run_id, value['data'][0]['names']['international']]) - elif value["data"][0]['rel'] == 'guest': - player = value["data"][0]['name'] - else: - player = value["data"][0]["names"]["international"] - if key == 'times': - rta = timedelta(seconds=value['realtime_t']) - if key == 'submitted': - timestamp = dateutil.parser.isoparse(value) - except Exception as e: - print(e.args) - break - if game == 0: - if level == True: - mcbeil_runs += 1 - leaderboard = 'Individual Level Run' - else: - mcbe_runs += 1 - leaderboard = "Full Game Run" # If this doesn't work I'm starting a genocide - elif game == 1: - leaderboard = "Category Extension Run" - mcbece_runs += 1 - embed = discord.Embed( - title=leaderboard, - url=link, - description= - f"{categoryName} in `{str(rta).replace('000','')}` by **{player}**", - color=16711680 + i * 60, - timestamp=timestamp) - await self.bot.get_channel( - int(self.bot.config[str( - ctx.message.guild.id)]["pending_channel"]) - ).send(embed=embed) - runs = runs2 - gameID = gameID2 - embed_stats = discord.Embed( - title='Pending Run Stats', - description= - f"Full Game Runs: {mcbe_runs}\nIndividual Level Runs: {mcbeil_runs}\nCategory Extension Runs: {mcbece_runs}", - color=16711680 + i * 60) - await self.bot.get_channel( - int(self.bot.config[str(ctx.message.guild.id)]["pending_channel"]) - ).send(embed=embed_stats) - - for run in runs_to_reject: - await rejectRun(self, self.bot.config['api_key'], ctx, run[0], f'Detected as a banned player ({run[1]}) by our automatic filter') - - -async def verifyNew(self, apiKey=None, userID=None): - if apiKey == None: - head = { - "Accept": "application/json", - "User-Agent": "mcbeDiscordBot/1.0" - } - else: - head = { - "X-API-Key": apiKey, - "Accept": "application/json", - "User-Agent": "mcbeDiscordBot/1.0" - } - server = self.bot.get_guild(574267523869179904) - # Troll is mentally challenged I guess ¯\_(ツ)_/¯ - RunneRole = server.get_role(574268937454223361) - WrRole = server.get_role(583622436378116107) - #if userID == None: - # return - #else: - user = self.bot.get_user(int(userID)) - data = json.loads(Path('./api_keys.json').read_text()) - - if str(user.id) in data: - pbs = requests.get( - f"https://www.speedrun.com/api/v1/users/{data[str(user.id)]}/personal-bests", - headers=head) - 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 - try: - profile = json.loads(r.text) - except json.decoder.JSONDecodeError: - return - srcUserID = profile["data"]["id"] - 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) - - wrCounter = False - runnerCounter = False - - for i in pbs["data"]: - if i["place"] == 1: - if i["run"]["game"] == "yd4ovvg1" or i["run"]["game"] == "v1po7r76": - if not i["run"]["level"]: - wrCounter = True - if i["run"]["game"] == "yd4ovvg1" or i["run"]["game"] == "v1po7r76": - # I have no shame - runnerCounter = True - - if wrCounter: - await server.get_member(user.id).add_roles(WrRole) - else: - await server.get_member(user.id).remove_roles(WrRole) - if runnerCounter: - await server.get_member(user.id).add_roles(RunneRole) - else: - await server.get_member(user.id).remove_roles(RunneRole) - - -class Src(commands.Cog): - def __init__(self, bot): - self.bot = bot - self.checker.start() - - async def is_mod(ctx): - return ctx.author.guild_permissions.manage_channels - - @commands.command(description="Posts all pending runs to #pending-runs") - @commands.guild_only() - async def pending(self, ctx): - async with ctx.typing(): - await self.bot.get_channel( - int(self.bot.config[str( - ctx.message.guild.id)]["pending_channel"])).purge(limit=500 - ) - await pendingRuns(self, ctx) - - @commands.command(description="Reject runs quickly") - @commands.check(is_mod) - @commands.guild_only() - async def reject(self, ctx, apiKey, run, *, reason): - await rejectRun(self, apiKey, ctx, run, reason) - - @commands.command(description="Approve runs quickly") - @commands.check(is_mod) - @commands.guild_only() - async def approve(self, ctx, apiKey, run, *, reason=None): - await approveRun(self, apiKey, ctx, run, reason) - - @commands.command(description="Delete runs quickly") - @commands.check(is_mod) - @commands.guild_only() - async def delete(self, ctx, apiKey, run): - await deleteRun(self, apiKey, ctx, run) - - @commands.command() - async def verify(self, ctx, apiKey=None, userID=None): - self.bot.messageBlacklist.append(ctx.message.id) - if apiKey == None: - data = json.loads(Path('./api_keys.json').read_text()) - if not str(ctx.author.id) in data: - await ctx.send( - f"Please try again this command by getting an apiKey from https://www.speedrun.com/api/auth then do `{ctx.prefix}verify <apiKey>` in my DMs or anywhere in this server. \nBe careful who you share this key with. To learn more check out https://github.com/speedruncomorg/api/blob/master/authentication.md" - ) - return - if ctx.guild != None: - await ctx.message.delete() - async with ctx.typing(): - if userID == None: - userID = ctx.message.author.id - await verifyNew(self, apiKey, userID) - - @tasks.loop(minutes=10.0) - async def checker(self): - data = json.loads(Path('./api_keys.json').read_text()) - for key, value in data.items(): - await verifyNew(self, None, key) - - -def setup(bot): - bot.add_cog(Src(bot)) |