From 6083734868f416bdcab09bbe9d9f003c434cf790 Mon Sep 17 00:00:00 2001 From: iiLarsH Date: Tue, 16 May 2023 22:45:51 +0200 Subject: [PATCH] stats are now embeds for both normal and slash --- cogs/stats.py | 60 ++++++++----- cogs/websocket.py | 27 +++--- slashcogs/slashstats.py | 195 ++++++++++++++++++++++++---------------- 3 files changed, 166 insertions(+), 116 deletions(-) diff --git a/cogs/stats.py b/cogs/stats.py index 5b292c0..10ef3d2 100644 --- a/cogs/stats.py +++ b/cogs/stats.py @@ -45,16 +45,10 @@ class Stats(commands.Cog): return async with aiohttp.ClientSession() as session: - stats = await self.get_allplayer_stats(session, players.values(), weaponid, weaponname, server) + botmessage = await self.get_allplayer_stats(session, players.values(), weaponid, weaponname, server) - if(server != ""): - botmessage = str("Stats for " + server + "\n" + "-----------------------" + "\n") - else: - botmessage = str("Stats for all servers\n" + "-----------------------" + "\n") - botmessage = botmessage + str("\n-----------------------\n".join(stats)) - - await ctx.send(f"```{botmessage}```") + await ctx.send(embed=botmessage) async def get_all_playerids(self, s, playernames): @@ -89,7 +83,7 @@ class Stats(commands.Cog): player = str(f"{playername.lower()}: {None}") return player - def getweaponid(self,weaponname): + def getweaponid(self,givenweapon): weapons ={ "execution": "human_execution", "car": "mp_weapon_car", @@ -139,8 +133,9 @@ class Stats(commands.Cog): } weaponid = "" + weaponname = "" for weapon in weapons: - if(weaponname.lower() in weapon.lower()): + if(givenweapon.lower() in weapon.lower()): weaponid = weapons[weapon] weaponname = weapon break @@ -153,7 +148,6 @@ class Stats(commands.Cog): async with session.get('https://tone.sleepycat.date/v2/client/servers') as r: response = await r.json() servers = response.keys() - for i in servers: if(snippet.lower() == i.lower().replace(" ", "")): server = i @@ -164,14 +158,29 @@ class Stats(commands.Cog): return server async def get_allplayer_stats(self, s, playerids, weaponid = "", weaponname= "",server = ""): - tasks = [] - for playerid in playerids: - task = asyncio.create_task(self.getstats(s, playerid, weaponid, weaponname, server), name=playerid) - tasks.append(task) - res = await asyncio.gather(*tasks) - return res + tasks = [] + for playerid in playerids: + task = asyncio.create_task(self.getstats(s, playerid, weaponid, server), name=playerid) + tasks.append(task) + res = await asyncio.gather(*tasks) + if(server == ""): + server = "All" + if(weaponname == ""): + weaponname = "Any" - async def getstats(self, s, playerid, weaponid = "", weaponname = "", server = ""): + botmessage = discord.Embed(title="Stats", description=f"**Server:** {server}\n**Weapon:** {weaponname}", colour=discord.Colour.orange()) + if(weaponname != "Any"): + if(requests.head(f"https://toneapi.github.io/ToneAPI_webclient/weapons/{weaponid}.png").status_code == 200): + botmessage.set_thumbnail(url=f"https://toneapi.github.io/ToneAPI_webclient/weapons/{weaponid}.png") + else: + botmessage.set_thumbnail(url="https://toneapi.github.io/ToneAPI_webclient/weapons/notfound.png") + + for stats in res: + botmessage.add_field(name=f"Stats for {stats['Player']}", value=stats['message']) + + return botmessage + + async def getstats(self, s, playerid, weaponid = "", server = ""): payload = {'player': playerid, 'weapon': weaponid, 'server': server} async with s.get('https://tone.sleepycat.date/v2/client/players', params=payload) as r: response = await r.json() @@ -180,25 +189,28 @@ class Stats(commands.Cog): errorresponse = await Er.json() if(errorresponse['matches'] != None): playername = errorresponse['matches'][0] - return str("No stats found for player: " + playername) + stats = {"Player": playername, "message": "No stats found for this player."} + return stats killstats = response[str(playerid)] - botmessage = str("Playername: " + killstats['username'] + '\n' + "Kills : " + str(killstats['kills']) + '\n' ) + botmessage = str("Kills: " + str(killstats['kills']) + '\n' ) if(weaponid != ""): deaths=killstats['deaths_while_equipped'] if(deaths == 0): deaths = 1; - botmessage += str(str("Deaths : " + str(killstats['deaths_while_equipped'])) + '\n' + str("Weapon : " + weaponname) + '\n' - + str(str("weapon KD : " + str("{:0.2f}".format(killstats['kills']/deaths)))+ '\n' + str("Deaths to : " + str(killstats['deaths'])))) + botmessage += str(str("Deaths: " + str(killstats['deaths_while_equipped'])) + '\n' + str(str("weapon KD : " + str("{:0.2f}".format(killstats['kills']/deaths)))+ '\n' + str("Deaths to: " + str(killstats['deaths'])))) else: deaths=killstats['deaths'] if(deaths == 0): deaths = 1; - botmessage = botmessage + str("Deaths : " + str(killstats['deaths'])) + '\n' + str("KD : " + str("{:0.2f}".format(killstats['kills']/deaths))) + botmessage = botmessage + str("Deaths: " + str(killstats['deaths'])) + '\n' + str("KD: " + str("{:0.2f}".format(killstats['kills']/deaths))) - return botmessage + stats = {"Player": killstats['username'], "message": botmessage} + + return stats + async def setup(client): diff --git a/cogs/websocket.py b/cogs/websocket.py index 4ca748c..0f37861 100644 --- a/cogs/websocket.py +++ b/cogs/websocket.py @@ -20,23 +20,24 @@ class Websocket(commands.Cog): self.websocket.cancel() @tasks.loop(seconds=5) - async def websocket(self): - global atkerlist - global victimlist - atkerlist = [] - victimlist = [] - uri = "wss://tone.sleepycat.date/v2/client/websocket" - async with websockets.connect(uri) as ws: - async for message in ws: - if (message == "ping"): - print("pong\n") - await ws.send("pong") - else: - await self.message_handler(message) + async def websocket(self, ws): + async for message in ws: + if (message == "ping"): + print("pong\n") + await ws.send("pong") + else: + await self.message_handler(message) @websocket.before_loop async def before_websocket(self): print('waiting... for bot to start. (websocket)') + uri = "wss://tone.sleepycat.date/v2/client/websocket" + global atkerlist + global victimlist + atkerlist = [] + victimlist = [] + async with websockets.connect(uri) as ws: + await self.websocket(ws) await self.bot.wait_until_ready() async def message_handler(self, message): diff --git a/slashcogs/slashstats.py b/slashcogs/slashstats.py index 4f1bbcb..79eb319 100644 --- a/slashcogs/slashstats.py +++ b/slashcogs/slashstats.py @@ -1,3 +1,5 @@ +import asyncio +import aiohttp import discord from discord.ext import commands from discord import app_commands @@ -15,54 +17,61 @@ class SlashStats(commands.Cog): @app_commands.describe(playernames = "Ingame name of the player or players", weapon = "Ingame Weaponname", servername = "A Tone supported server") @app_commands.rename(playernames = "player", servername = "server") async def stats(self, interaction: discord.Interaction, playernames : str, weapon : str = "", servername : str = ""): - error = False - playernames = playernames.replace(",", "") - playernames = playernames.split(" ") - players = [] server = "" - weaponid= "" - weaponname= "" - - print(playernames) + weaponid = "" + weaponname = "" - for i in playernames: - playerid = self.getplayerid(i) - if(playerid != ""): - players.append(playerid) - if(weapon != ""): - weaponid, weaponname = self.getweaponid(weapon) - if(servername != ""): - server = self.getserver(servername) + playernames = playernames.strip() + playernames = playernames.split(",") - if(len(players) == 0 and error == False): - error = True - await interaction.response.send_message("```No existing player found, check if the name is correct or has changed```") + async with aiohttp.ClientSession() as session: + players = await self.get_all_playerids(session, playernames) + if(players == {} or players.keys() == []): + await interaction.response.send_message("```No existing player given.\nIf you put in multiple players make sure to split them with a comma(,)```") + return - list_of_stats = [] - for i in players: - stats = self.getstats(playerid=i,weaponid=weaponid, weaponname=weaponname, server=server) - list_of_stats.append(stats) + if(servername != ""): + server = await self.getserver(servername) + print(server) + if(weapon != ""): + weaponid, weaponname = self.getweaponid(weapon) - if ("".join(list_of_stats) != ""): - if(server != ""): - botmessage = str("Stats for " + server + "\n" + "---------------------" + "\n") - else: - botmessage = str("Stats for all servers\n" + "---------------------" + "\n") - divider = str("\n --------------------- \n") - botmessage = botmessage + divider.join(list_of_stats) - - await interaction.response.send_message(f'```{botmessage}```') + async with aiohttp.ClientSession() as session: + botmessage = await self.get_allplayer_stats(session, players.values(), weaponid, weaponname, server) + + await interaction.response.send_message(embed=botmessage) - def getplayerid(self, playername): + async def get_all_playerids(self, s, playernames): + players = {} + tasks = [] + for playername in playernames: + task = asyncio.create_task(self.getplayerid(s, playername),name=playername) + tasks.append(task) + res = await asyncio.gather(*tasks) + for player in res: + player = player.split(":") + playername = player[0].strip() + playerid = player[1].strip() + if(playerid != "None" and playername not in players): + players[playername] = playerid + + return players + + async def getplayerid(self,s,playername): playerid = "" - payload = str("username=") + playername - response = requests.get('https://northstar.tf/accounts/lookup_uid', params=payload).json() - if (response['matches'] != None): - playerid = response['matches'][0] - return str(playerid) - - def getweaponid(self, weaponname): + playername = playername.replace(",", "") + payload = str(f"?username={playername}") + async with s.get(f'https://northstar.tf/accounts/lookup_uid{payload}') as r: + response = await r.json() + if (response['matches'] != None and response['matches'] != []): + playerid = response['matches'][0] + player = str(f"{playername.lower()}: {playerid}") + else: + player = str(f"{playername.lower()}: {None}") + return player + + def getweaponid(self,givenweapon): weapons ={ "execution": "human_execution", "car": "mp_weapon_car", @@ -85,7 +94,7 @@ class SlashStats(commands.Cog): "softball": "mp_weapon_softball", "firestar": "mp_weapon_thermite_grenade", "melee": "melee_pilot_emptyhanded", - "masstiff": "mp_weapon_mastiff", + "mastiff": "mp_weapon_mastiff", "mgl": "mp_weapon_mgl", "r-101": "mp_weapon_rspn101_og", "wingman": "mp_weapon_wingman", @@ -112,58 +121,83 @@ class SlashStats(commands.Cog): } weaponid = "" + weaponname = "" for weapon in weapons: - if(weaponname.lower() in weapon.lower()): + if(givenweapon.lower() in weapon.lower()): weaponid = weapons[weapon] weaponname = weapon break - if(weaponid == ""): - weaponname = "" return weaponid, weaponname - def getserver(self, snippet): + async def getserver(self, snippet): server = "" - response = requests.get('https://tone.sleepycat.date/v2/client/servers').json() - 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: - if(snippet.lower() in i.lower()): - if(snippet.lower()== i.lower()): - server = i - break - else: - server = i + if(snippet.lower() == i.lower().replace(" ", "")): + server = i + break + elif(snippet.lower() in i.lower().replace(" ", "")): + server = i return server - def getstats(self, playerid, weaponid = "", weaponname = "", server = ""): - payload = {'player': playerid, 'weapon': weaponid, 'server': server} - response = requests.get('https://tone.sleepycat.date/v2/client/players', params=payload).json() - if(response == {}): - errorresponse = requests.get("https://northstar.tf/accounts/get_username", params={"uid": playerid}).json() - if(errorresponse['matches'] != None): - playername = errorresponse['matches'][0] - return str("No stats found for player: " + playername) - - killstats = response[str(playerid)] + async def get_allplayer_stats(self, s, playerids, weaponid = "", weaponname= "",server = ""): + tasks = [] + for playerid in playerids: + task = asyncio.create_task(self.getstats(s, playerid, weaponid, server), name=playerid) + tasks.append(task) + res = await asyncio.gather(*tasks) + if(server == ""): + server = "All" + if(weaponname == ""): + weaponname = "Any" - botmessage = str("Playername: " + killstats['username'] + '\n' + "Kills : " + str(killstats['kills']) + '\n' ) - - if(weaponid != ""): - deaths=killstats['deaths_while_equipped'] - if(deaths == 0): - deaths = 1; - botmessage += str(str("Deaths : " + str(killstats['deaths_while_equipped'])) + '\n' + str("Weapon : " + weaponname) + - '\n' + str(str("weapon KD : " + str("{:0.2f}".format(killstats['kills']/deaths)))) + '\n' + str("Deaths to : " + str(killstats['deaths']))) - - else: - deaths=killstats['deaths'] - if(deaths == 0): - deaths = 1; - botmessage = botmessage + str("Deaths : " + str(killstats['deaths'])) + '\n' + str("KD : " + str("{:0.2f}".format(killstats['kills']/deaths))) + botmessage = discord.Embed(title="Stats", description=f"**Server:** {server}\n**Weapon:** {weaponname}", colour=discord.Colour.orange()) + if(weaponname != "Any"): + if(requests.head(f"https://toneapi.github.io/ToneAPI_webclient/weapons/{weaponid}.png").status_code == 200): + botmessage.set_thumbnail(url=f"https://toneapi.github.io/ToneAPI_webclient/weapons/{weaponid}.png") + else: + botmessage.set_thumbnail(url="https://toneapi.github.io/ToneAPI_webclient/weapons/notfound.png") + for stats in res: + botmessage.add_field(name=f"Stats for {stats['Player']}", value=stats['message']) + return botmessage + + async def getstats(self, s, playerid, weaponid = "", server = ""): + payload = {'player': playerid, 'weapon': weaponid, 'server': server} + async with s.get('https://tone.sleepycat.date/v2/client/players', params=payload) as r: + response = await r.json() + if(response == {}): + async with s.get("https://northstar.tf/accounts/get_username", params={"uid": playerid}) as Er: + errorresponse = await Er.json() + if(errorresponse['matches'] != None): + playername = errorresponse['matches'][0] + stats = {"Player": playername, "message": "No stats found for this player."} + return stats + + killstats = response[str(playerid)] + + botmessage = str("Kills: " + str(killstats['kills']) + '\n' ) + + if(weaponid != ""): + deaths=killstats['deaths_while_equipped'] + if(deaths == 0): + deaths = 1; + botmessage += str(str("Deaths: " + str(killstats['deaths_while_equipped'])) + '\n' + str(str("weapon KD : " + str("{:0.2f}".format(killstats['kills']/deaths)))+ '\n' + str("Deaths to: " + str(killstats['deaths'])))) + else: + deaths=killstats['deaths'] + if(deaths == 0): + deaths = 1; + botmessage = botmessage + str("Deaths: " + str(killstats['deaths'])) + '\n' + str("KD: " + str("{:0.2f}".format(killstats['kills']/deaths))) + + stats = {"Player": killstats['username'], "message": botmessage} + + return stats @stats.autocomplete("weapon") async def autocomplete_weapon(self, interaction: discord.Interaction, current: str) -> list[app_commands.Choice[str]]: @@ -177,7 +211,10 @@ class SlashStats(commands.Cog): @stats.autocomplete("servername") async def autocomplete_server(self, interaction: discord.Interaction, current: str) -> list[app_commands.Choice[str]]: data = [] - servers = requests.get("https://tone.sleepycat.date/v2/client/servers").json() + async with aiohttp.ClientSession() as session: + async with session.get('https://tone.sleepycat.date/v2/client/servers') as r: + servers = await r.json() + for server_choice in servers.keys(): if(current.lower() in server_choice.lower()): data.append(app_commands.Choice(name=server_choice, value=server_choice))