from disnake.ext import commands import disnake import db import httpx from datetime import datetime from loguru import logger import sb_utils import sb_emojis class Check_House(commands.Cog): def __init__(self,bot): self.bot = bot @commands.slash_command(description="Look up Activity about a house") async def check_house(self, inter:disnake.ApplicationCommandInteraction,house=commands.Param(description="Which house?",choices=[str(x) for x in range(1,21)]),ban_check=commands.Param(description="Also check for bans? This will take a while, slowed down to avoid FF banning the bot",choices=["Yes","No"],default="No"),world:str = ""): logger.info(f"{inter.application_command.name} used by {inter.author} using {inter.filled_options}") await inter.response.defer(with_message=True,ephemeral=True) async with httpx.AsyncClient() as client: result = await client.get(f"https://shk.azure-api.net/shkinfo/v1/HouseActivity?world=World%202&house={house}&Key=5E78CFC8-1FFA-4036-8427-D94ED6E1A45B&subscription-key=ff2e578e119348ea8b48a2acd2f5a48d") house_players_activity = {} for player in result.json(): banned = None vm = None if ban_check == "Yes": banned_result = await sb_utils.check_banned_player(session,client,player["Username"]) banned = banned_result["banned"] house_players_activity[player["Username"]] = (max(datetime.strptime(player["MaxPersonTime"],"%Y-%m-%dT%H:%M:%S"),datetime.strptime(player["MaxTraderTime"],"%Y-%m-%dT%H:%M:%S")),(banned,vm)) #Done with Httpx session house_result = session.query(db.House).filter(db.House.id == house).one_or_none() #Done with db session sorted_players = sorted(house_players_activity.items(), key=lambda x: x[1][0]) # Sort by least active embed = disnake.Embed(title=f"{house_result.emoji} House {house} Activity Report {house_result.emoji}") embed.description = f"Generated at: {disnake.utils.format_dt(disnake.utils.utcnow(),'D')}\nOnly tracks map activity, so if they're online and not scouting/trading etc this won't reflect that" embed.set_thumbnail(file=disnake.File(f"resources\house_sprites\{house}.png")) player_entries = [(f"**{player}** - {data[0].strftime('%d/%b/%Y %H:%M:%S')}\n",data[1]) for player,data in sorted_players] temp_value = "" for player_tuple in player_entries: if player_tuple[1][0] != None: #Banned has been set if player_tuple[1][0]: banned_emoji = sb_emojis.embed_fillers["banned"] else: banned_emoji = sb_emojis.embed_fillers["banned_before"] else: banned_emoji = sb_emojis.embed_fillers["no_data"] if player_tuple[1][1] != None: #VM has been set if player_tuple[1][1]: vm_emoji = sb_emojis.embed_fillers["vm_active"] else: vm_emoji = sb_emojis.embed_fillers["vm_logged"] else: vm_emoji = sb_emojis.embed_fillers["no_data"] temp = f"{vm_emoji}{banned_emoji} {player_tuple[0]}" if "01/Jan/0001 00:00:00" in player_tuple[0]: temp = temp.replace("01/Jan/0001 00:00:00","**INACTIVE/RESET**") if len(temp_value)+len(temp) > 1024: if len(embed)+len(temp_value) > 6000: break embed.add_field(name='\u200b',value=temp_value,inline=False) temp_value = '' temp_value += temp embed.add_field(name='\u200b',value=temp_value,inline=False) embed.colour = disnake.Color(int(house_result.color,0)) await inter.send("Here you go, blame discord for this dumb message...",delete_after=1) await inter.channel.send(embed=embed) def setup(bot): bot.add_cog(Check_House(bot))