From 7ad88d99e01b7edd03c876414ff9e48559188135 Mon Sep 17 00:00:00 2001 From: legonzaur Date: Fri, 26 May 2023 11:10:36 +0200 Subject: [PATCH 1/2] optimize leaderboard sorting --- cogs/leaderboard.py | 81 +++++++++++++++------------------------------ 1 file changed, 26 insertions(+), 55 deletions(-) diff --git a/cogs/leaderboard.py b/cogs/leaderboard.py index 3e06255..1726616 100644 --- a/cogs/leaderboard.py +++ b/cogs/leaderboard.py @@ -1,6 +1,7 @@ import discord from discord.ext import commands import requests +import time class Leaderboard(commands.Cog): def __init__(self, client): @@ -160,57 +161,26 @@ class Leaderboard(commands.Cog): return server - def getleaderboard(self, board, weaponid="", weaponname="", server=""): - easyfilter = False - hardfilter = False + 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() in ["kills", "deaths", "maxd", "totald"]): - if(board.lower() == "totald"): - board = "total_distance" - if(board.lower() == "maxd"): - board = "max_distance" - easyfilter = True - else: - hardfilter = True - top10 = {} - - if(len(players) < 10): - lb_length = len(players) - else: - lb_length = 10 - - while(len(top10)= current and stats["username"] not in top10.keys()): - #print(checked, ", ", current) - current = checked - name = stats['username'] + start_time = time.time() + if(board.lower() == "totald"): + board = "total_distance" + elif(board.lower() == "maxd"): + board = "max_distance" - top10[name] = current + 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" @@ -225,15 +195,16 @@ class Leaderboard(commands.Cog): 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") + 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 - + print("--- %s seconds ---" % (time.time() - start_time)) return botmessage async def setup(client): - await client.add_cog(Leaderboard(client)) \ No newline at end of file + await client.add_cog(Leaderboard(client)) + + + + +print(Leaderboard(None).getleaderboard('kills')) \ No newline at end of file From 75b02f47fe8b3b296c225c3a9209c5ce7135b6af Mon Sep 17 00:00:00 2001 From: legonzaur Date: Fri, 26 May 2023 11:17:59 +0200 Subject: [PATCH 2/2] remove debug prints --- cogs/leaderboard.py | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/cogs/leaderboard.py b/cogs/leaderboard.py index 1726616..b23b883 100644 --- a/cogs/leaderboard.py +++ b/cogs/leaderboard.py @@ -1,7 +1,6 @@ import discord from discord.ext import commands import requests -import time class Leaderboard(commands.Cog): def __init__(self, client): @@ -165,7 +164,6 @@ class Leaderboard(commands.Cog): payload = {"weapon": weaponid, "server": server} response = requests.get('https://tone.sleepycat.date/v2/client/players', params=payload).json() players = response.keys() - start_time = time.time() if(board.lower() == "totald"): board = "total_distance" elif(board.lower() == "maxd"): @@ -198,13 +196,7 @@ class Leaderboard(commands.Cog): 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 - print("--- %s seconds ---" % (time.time() - start_time)) return botmessage async def setup(client): - await client.add_cog(Leaderboard(client)) - - - - -print(Leaderboard(None).getleaderboard('kills')) \ No newline at end of file + await client.add_cog(Leaderboard(client)) \ No newline at end of file