made lb reusable, and new sorting made by legonzaur

This commit is contained in:
2023-06-04 14:45:00 +02:00
parent 3aab0f9dd6
commit a30f1ab297
7 changed files with 75 additions and 180 deletions
+40
View File
@@ -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
+5 -9
View File
@@ -1,12 +1,8 @@
import aiohttp async def getserver(s,snippet):
server = ""
async with s.get('https://tone.sleepycat.date/v2/client/servers') as r:
async def getserver(snippet): response = await r.json()
server = "" servers = response.keys()
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()
for i in servers: for i in servers:
if(snippet.lower().replace(" ", "") == i.lower().replace(" ", "")): if(snippet.lower().replace(" ", "") == i.lower().replace(" ", "")):
server = i server = i
+1 -1
View File
@@ -28,7 +28,7 @@ async def sync(ctx):
synced = await client.tree.sync() synced = await client.tree.sync()
print(f'You synced {str(len(synced))} commands') print(f'You synced {str(len(synced))} commands')
else: 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 def main():
async with client: async with client:
+13 -82
View File
@@ -1,6 +1,8 @@
import aiohttp
import discord import discord
from discord.ext import commands from discord.ext import commands
import requests import requests
from Reuse.getLeaderboard import getleaderboard
from Reuse.getServer import getserver from Reuse.getServer import getserver
from Reuse.getWeapon import getweaponid from Reuse.getWeapon import getweaponid
@@ -18,11 +20,9 @@ class Leaderboard(commands.Cog):
boards = ["kd", "avgd", "maxd", "totald","deaths", "kills"] boards = ["kd", "avgd", "maxd", "totald","deaths", "kills"]
error = False error = False
board = "" board = ""
servers = []
server = "" server = ""
weaponid= "" weaponid= ""
weaponname= "" weaponname= ""
if(message == ()): if(message == ()):
error = True error = True
botmessage = "No leaderboard option selected, choose from:\n" botmessage = "No leaderboard option selected, choose from:\n"
@@ -33,20 +33,18 @@ class Leaderboard(commands.Cog):
message = list(message) message = list(message)
message = "".join(message) message = "".join(message)
message = message.split(",") message = message.split(",")
print(message) 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): if(board == "" and error == False):
error = True error = True
@@ -57,78 +55,11 @@ class Leaderboard(commands.Cog):
botmessage = botmessage + "\n*Note you need to split filters with comma's(,)" botmessage = botmessage + "\n*Note you need to split filters with comma's(,)"
await ctx.send(f"```{botmessage}```") 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}```') 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): async def setup(client):
await client.add_cog(Leaderboard(client)) await client.add_cog(Leaderboard(client))
+2 -2
View File
@@ -35,8 +35,8 @@ class Stats(commands.Cog):
for item in residue: for item in residue:
if(weaponid == "" and item != None and item != ""): if(weaponid == "" and item != None and item != ""):
weaponid, weaponname = getweaponid(item) weaponid, weaponname = getweaponid(item)
if(server == "" and item != None and item != "" and weaponid == ""): if(server == "" and item != None and item != "" and item != weaponname):
server = await getserver(item) server = await getserver(session, item)
if(len(players.values()) == 0 and error == False): if(len(players.values()) == 0 and error == False):
+11 -84
View File
@@ -1,7 +1,9 @@
import aiohttp
import discord import discord
from discord.ext import commands from discord.ext import commands
from discord import app_commands from discord import app_commands
import requests import requests
from Reuse.getLeaderboard import getleaderboard
from Reuse.getServer import getserver from Reuse.getServer import getserver
from Reuse.getWeapon import getweaponid from Reuse.getWeapon import getweaponid
@@ -22,95 +24,20 @@ class SlashLeaderboard(commands.Cog):
server = "" server = ""
weaponid= "" weaponid= ""
weaponname= "" weaponname= ""
async with aiohttp.ClientSession() as session:
if(weapon != ""):
weaponid, weaponname = getweaponid(weapon)
if(servername != ""):
server = getserver(session,servername)
if(weapon != ""): if(board in boards):
weaponid, weaponname = getweaponid(weapon) botmessage = getleaderboard(weaponid=weaponid, weaponname=weaponname, server=server, board=board)
if(servername != ""): else:
server = getserver(servername) botmessage = "You gave a none existing filter"
if(board in boards):
botmessage = self.getleaderboard(weaponid=weaponid, weaponname=weaponname, server=server, board=board)
else:
botmessage = "You gave a none existing filter"
await interaction.response.send_message(f'```{botmessage}```') 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)<lb_length):
current = 0
name = ""
for p in players:
stats = response[p]
if(easyfilter):
checked = stats[str(board)]
if(hardfilter):
if(board.lower() == "kd"):
if(weaponid != ""):
deaths = stats['deaths_while_equipped']
else:
deaths = stats['deaths']
if(deaths == 0):
deaths = deaths + 1
checked = round(stats["kills"] / deaths, 2)
if(board.lower() == "avgd"):
if(stats["kills"] == 0):
kills = 1
else:
kills = stats["kills"]
checked = round(stats["total_distance"] / kills, 2)
#print(checked, ", ", current )
if(checked >= 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") @leaderboard.autocomplete("weapon")
async def autocomplete_weapon(self, interaction: discord.Interaction, current: str) -> list[app_commands.Choice[str]]: async def autocomplete_weapon(self, interaction: discord.Interaction, current: str) -> list[app_commands.Choice[str]]:
data = [] data = []
+3 -2
View File
@@ -8,6 +8,7 @@ import requests
from Reuse.getPlayer import get_all_playerids from Reuse.getPlayer import get_all_playerids
from Reuse.getServer import getserver from Reuse.getServer import getserver
from Reuse.getStats import get_allplayer_stats from Reuse.getStats import get_allplayer_stats
from Reuse.getWeapon import getweaponid
class SlashStats(commands.Cog): class SlashStats(commands.Cog):
def __init__(self, client): def __init__(self, client):
@@ -35,9 +36,9 @@ class SlashStats(commands.Cog):
return return
if(weapon != ""): if(weapon != ""):
weaponid, weaponname = self.getweaponid(weapon) weaponid, weaponname = getweaponid(weapon)
if(servername != ""): if(servername != ""):
server = await getserver(servername) server = await getserver(session, servername)
async with aiohttp.ClientSession() as session: async with aiohttp.ClientSession() as session:
botmessage = await get_allplayer_stats(session, players.values(), weaponid, weaponname, server) botmessage = await get_allplayer_stats(session, players.values(), weaponid, weaponname, server)