From a30f1ab2975e9a83829917bdc7dd8b437e354dad Mon Sep 17 00:00:00 2001 From: iiLarsH Date: Sun, 4 Jun 2023 14:45:00 +0200 Subject: [PATCH] made lb reusable, and new sorting made by legonzaur --- Reuse/getLeaderboard.py | 40 +++++++++++++++ Reuse/getServer.py | 14 ++---- bot.py | 2 +- cogs/leaderboard.py | 95 +++++------------------------------ cogs/stats.py | 4 +- slashcogs/slashleaderboard.py | 95 ++++------------------------------- slashcogs/slashstats.py | 5 +- 7 files changed, 75 insertions(+), 180 deletions(-) create mode 100644 Reuse/getLeaderboard.py diff --git a/Reuse/getLeaderboard.py b/Reuse/getLeaderboard.py new file mode 100644 index 0000000..1fea181 --- /dev/null +++ b/Reuse/getLeaderboard.py @@ -0,0 +1,40 @@ +import requests + +def getleaderboard(board:str, weaponid="", weaponname="", server=""): + payload = {"weapon": weaponid, "server": server} + response = requests.get('https://tone.sleepycat.date/v2/client/players', params=payload).json() + players = response.keys() + if(board.lower() == "totald"): + board = "total_distance" + elif(board.lower() == "maxd"): + board = "max_distance" + + if(board.lower() == "kd"): + handler = lambda p : response[p]['kills'] / max(response[p]["deaths"], 1) + elif(board.lower() == "avgd"): + handler = lambda p : response[p]['total_distance'] / max(response[p]["kills"], 1) + else: + if(board.lower() not in ['username', 'deaths','kills', 'max_distance','total_distance']): + raise KeyError("Key " + board.lower() + ' not found for player leaderboard') + handler = lambda p : response[p][board.lower()] + + result = sorted(players, key=handler, reverse=True)[:10] + + if(board.lower() == "deaths"): + inbetween = "to" + else: + inbetween = "with" + + if(server == ""): + server = "all servers" + if(weaponname == ""): + weaponname = "any weapon" + + botmessage = str(f"Leaderboard of {board} {inbetween} {weaponname} for {server}\n-------------------------------\n") + + counter = 1 + for p in result: + botmessage = botmessage + str(f"{str(counter):<2}"+ " - " + f"{response[p]['username'] :<20}" + " : "+ f"{str(handler(p)):<8}" + "\n") + counter= counter+1 + + return botmessage \ No newline at end of file diff --git a/Reuse/getServer.py b/Reuse/getServer.py index 93fe470..7abe0e0 100644 --- a/Reuse/getServer.py +++ b/Reuse/getServer.py @@ -1,12 +1,8 @@ -import aiohttp - - -async def getserver(snippet): - server = "" - async with aiohttp.ClientSession() as session: - async with session.get('https://tone.sleepycat.date/v2/client/servers') as r: - response = await r.json() - servers = response.keys() +async def getserver(s,snippet): + server = "" + async with s.get('https://tone.sleepycat.date/v2/client/servers') as r: + response = await r.json() + servers = response.keys() for i in servers: if(snippet.lower().replace(" ", "") == i.lower().replace(" ", "")): server = i diff --git a/bot.py b/bot.py index 4ebc1c6..450cf35 100644 --- a/bot.py +++ b/bot.py @@ -28,7 +28,7 @@ async def sync(ctx): synced = await client.tree.sync() print(f'You synced {str(len(synced))} commands') else: - await ctx.send('You must be the botowner to use this command!') + await ctx.send("```You must be the botowner to use this command!```") async def main(): async with client: diff --git a/cogs/leaderboard.py b/cogs/leaderboard.py index a269510..782a607 100644 --- a/cogs/leaderboard.py +++ b/cogs/leaderboard.py @@ -1,6 +1,8 @@ +import aiohttp import discord from discord.ext import commands import requests +from Reuse.getLeaderboard import getleaderboard from Reuse.getServer import getserver from Reuse.getWeapon import getweaponid @@ -18,11 +20,9 @@ class Leaderboard(commands.Cog): boards = ["kd", "avgd", "maxd", "totald","deaths", "kills"] error = False board = "" - servers = [] server = "" weaponid= "" weaponname= "" - if(message == ()): error = True botmessage = "No leaderboard option selected, choose from:\n" @@ -33,20 +33,18 @@ class Leaderboard(commands.Cog): message = list(message) message = "".join(message) message = message.split(",") - print(message) + async with aiohttp.ClientSession() as session: + + for item in message: + if(item.lower() in boards): + board = item; + else: + if(item != None and item != "" and weaponid == ""): + weaponid, weaponname = getweaponid(item) + if(item != None and item != "" and server == "" and item != weaponname): + server = await getserver(session, item) - for i in message: - item = i.strip() - if(item.lower() not in boards): - function_dict = await self.message_handler(item) - if(function_dict['weapon'] != None): - weaponname = function_dict["weapon"][1] - weaponid= function_dict['weapon'][0] - if(function_dict['server'] != None): - servers.append(function_dict['server']) - else: - board = item if(board == "" and error == False): error = True @@ -57,78 +55,11 @@ class Leaderboard(commands.Cog): botmessage = botmessage + "\n*Note you need to split filters with comma's(,)" await ctx.send(f"```{botmessage}```") - servers.append(await getserver("", " ".join(message))) - server = "" - if(len(servers) > 1): - for i in servers: - if(i.lower() in " ".join(message).lower()): - server = i - break - else: - server = servers[0] - botmessage = self.getleaderboard(weaponid=weaponid, weaponname=weaponname, server=server, board=board) + botmessage = getleaderboard(weaponid=weaponid, weaponname=weaponname, server=server, board=board) await ctx.send(f'```{botmessage}```') - async def message_handler(self, message): - weapon = False - server = False - return_message = {"weapon": None, "server": None} - - weaponid, weaponname = getweaponid(message) - if(weaponid != ""): - weapon = True - - servername = await getserver(message) - if(servername != ""): - server = True - - if(server): - return_message["server"] = servername - if(weapon): - return_message["weapon"] = [weaponid, weaponname] - - return return_message - - - def getleaderboard(self, board:str, weaponid="", weaponname="", server=""): - payload = {"weapon": weaponid, "server": server} - response = requests.get('https://tone.sleepycat.date/v2/client/players', params=payload).json() - players = response.keys() - if(board.lower() == "totald"): - board = "total_distance" - elif(board.lower() == "maxd"): - board = "max_distance" - - if(board.lower() == "kd"): - handler = lambda p : response[p]['kills'] / max(response[p].deaths, 1) - elif(board.lower() == "avgd"): - handler = lambda p : response[p]['total_distance'] / max(response[p].kills, 1) - else: - if(board.lower() not in ['username', 'deaths','kills', 'max_distance','total_distance']): - raise Exception("Key " + board.lower() + ' not found for player leaderboard') - handler = lambda p : response[p][board.lower()] - - result = sorted(players, key=handler, reverse=True)[:10] - - if(board.lower() == "deaths"): - inbetween = "to" - else: - inbetween = "with" - - if(server == ""): - server = "all servers" - if(weaponname == ""): - weaponname = "any weapon" - - botmessage = str(f"Leaderboard of {board} {inbetween} {weaponname} for {server}\n-------------------------------\n") - - counter = 1 - for p in result: - botmessage = botmessage + str(f"{str(counter):<2}"+ " - " + f"{response[p]['username'] :<20}" + " : "+ f"{str(handler(p)):<8}" + "\n") - counter= counter+1 - return botmessage async def setup(client): await client.add_cog(Leaderboard(client)) \ No newline at end of file diff --git a/cogs/stats.py b/cogs/stats.py index 6ee53b4..8fba69b 100644 --- a/cogs/stats.py +++ b/cogs/stats.py @@ -35,8 +35,8 @@ class Stats(commands.Cog): for item in residue: if(weaponid == "" and item != None and item != ""): weaponid, weaponname = getweaponid(item) - if(server == "" and item != None and item != "" and weaponid == ""): - server = await getserver(item) + if(server == "" and item != None and item != "" and item != weaponname): + server = await getserver(session, item) if(len(players.values()) == 0 and error == False): diff --git a/slashcogs/slashleaderboard.py b/slashcogs/slashleaderboard.py index 4929831..496bd5d 100644 --- a/slashcogs/slashleaderboard.py +++ b/slashcogs/slashleaderboard.py @@ -1,7 +1,9 @@ +import aiohttp import discord from discord.ext import commands from discord import app_commands import requests +from Reuse.getLeaderboard import getleaderboard from Reuse.getServer import getserver from Reuse.getWeapon import getweaponid @@ -22,94 +24,19 @@ class SlashLeaderboard(commands.Cog): server = "" weaponid= "" weaponname= "" + async with aiohttp.ClientSession() as session: + if(weapon != ""): + weaponid, weaponname = getweaponid(weapon) + if(servername != ""): + server = getserver(session,servername) - if(weapon != ""): - weaponid, weaponname = getweaponid(weapon) - if(servername != ""): - server = getserver(servername) - - if(board in boards): - botmessage = self.getleaderboard(weaponid=weaponid, weaponname=weaponname, server=server, board=board) - else: - botmessage = "You gave a none existing filter" + if(board in boards): + botmessage = getleaderboard(weaponid=weaponid, weaponname=weaponname, server=server, board=board) + else: + botmessage = "You gave a none existing filter" await interaction.response.send_message(f'```{botmessage}```') - - def getleaderboard(self, board, weaponid="", weaponname="", server=""): - easyfilter = False - hardfilter = False - payload = {"weapon": weaponid, "server": server} - response = requests.get('https://tone.sleepycat.date/v2/client/players', params=payload).json() - players = response.keys() - - if(board.lower() in ["kills", "deaths", "maxd", "totald"]): - if(board.lower() == "totald"): - board = "total_distance" - if(board.lower() == "maxd"): - board = "max_distance" - easyfilter = True - else: - hardfilter = True - - if(len(players) < 10): - lb_length = len(players) - else: - lb_length = 10 - - top10 = {} - while(len(top10)= current and stats["username"] not in top10.keys()): - #print(checked, ", ", current) - current = checked - name = stats['username'] - - top10[name] = current - - if(board.lower() == "deaths"): - inbetween = "to" - else: - inbetween = "with" - - if(server == ""): - server = "all servers" - if(weaponname == ""): - weaponname = "any weapon" - - botmessage = str(f"Leaderboard of {board} {inbetween} {weaponname} for {server}\n-------------------------------\n") - - counter = 1 - for i, j in top10.items(): - if(hardfilter): - stat = str("{:0.2f}".format(j)) - if(easyfilter): - stat = str(j) - botmessage = botmessage + str(f"{str(counter):<2}"+ " - " + f"{i :<20}" + " : "+ f"{stat:<8}" + "\n") - counter= counter+1 - - return botmessage @leaderboard.autocomplete("weapon") async def autocomplete_weapon(self, interaction: discord.Interaction, current: str) -> list[app_commands.Choice[str]]: diff --git a/slashcogs/slashstats.py b/slashcogs/slashstats.py index f126201..c7a94aa 100644 --- a/slashcogs/slashstats.py +++ b/slashcogs/slashstats.py @@ -8,6 +8,7 @@ import requests from Reuse.getPlayer import get_all_playerids from Reuse.getServer import getserver from Reuse.getStats import get_allplayer_stats +from Reuse.getWeapon import getweaponid class SlashStats(commands.Cog): def __init__(self, client): @@ -35,9 +36,9 @@ class SlashStats(commands.Cog): return if(weapon != ""): - weaponid, weaponname = self.getweaponid(weapon) + weaponid, weaponname = getweaponid(weapon) if(servername != ""): - server = await getserver(servername) + server = await getserver(session, servername) async with aiohttp.ClientSession() as session: botmessage = await get_allplayer_stats(session, players.values(), weaponid, weaponname, server)