import discord from discord.ext import commands from data.DatabaseConnection import * from datetime import datetime, timedelta from functions.emoji_check import * class Leaderboards(commands.Cog): def __init__(self, client): self.client = client @commands.group(name="top",case_insensitive=True, invoke_without_command=True) async def top(self, ctx, *args): pass async def create_leaderboard_embed(self, title, column, time=False): def seconds_to_time(s): t = timedelta(seconds=s) d = datetime(1,1,1) + t res = "" if d.day - 1 > 0: res += f"{d.day - 1}d " if d.day - 1 > 0 or d.hour > 0: res += f"{d.hour}h ".zfill(4) if d.day - 1 > 0 or d.hour > 0 or d.minute > 0: res += f"{d.minute}m ".zfill(4) if d.day - 1 > 0 or d.hour > 0 or d.minute > 0 or d.second > 0: res += f"{d.second}s".zfill(3) return res if column == "quizWins": top_players = [] quizplayersdb = QuizPlayersDB() for player in quizplayersdb.get_top_players(): discorduser = {} discorduser["playerName"] = deEmojify((await self.client.fetch_user(player["discordid"])).name).strip() discorduser["stat"] = player["stat"] top_players.append(discorduser) quizplayersdb.close() else: playerdb = PlayerDBLinker() top_players = playerdb.get_stats(column) playerdb.close() embed = discord.Embed() embed.colour = discord.Colour.orange() embed.set_author(name="Top") message = "" space = 6 longestname = 13 longestscore = 0 for player in top_players: longestname = max(longestname, len(player["playerName"])) longestscore = max(longestscore, len(str(player["stat"]))) message += f"Pos {' ' * (space - 3)}Minecraftname{' ' * (longestname - 13)} {title}\n\n" for i, player in enumerate(top_players): message += f"{str(i + 1)}){' ' * (space - len(str(i + 1)))}{player['playerName']}{' ' * (longestname - len(player['playerName']))} {seconds_to_time(player['stat']) if time else player['stat']}\n" embed.add_field(name=f"{title}:", value=f"```{message}```", inline=False) return embed @top.command(name="broken", case_insensitive=True) async def top_broken(self, ctx): embed = await self.create_leaderboard_embed("Broken blocks", "brokenBlocks") await ctx.send(embed=embed) @top.command(name="kills", case_insensitive=True) async def top_kills(self, ctx): embed = await self.create_leaderboard_embed("Kills", "pvpKills") await ctx.send(embed=embed) @top.command(name="deaths", case_insensitive=True) async def top_deaths(self, ctx): embed = await self.create_leaderboard_embed("Deaths", "pvpDeaths") await ctx.send(embed=embed) @top.command(name="level", case_insensitive=True) async def top_level(self, ctx): embed = await self.create_leaderboard_embed("Level", "playerLevel") await ctx.send(embed=embed) @top.command(name="placed", case_insensitive=True) async def top_placed(self, ctx): embed = await self.create_leaderboard_embed("Placed blocks", "placedBlocks") await ctx.send(embed=embed) @top.command(name="playedtime", aliases=["onlinetime"], case_insensitive=True) async def top_playedtime(self, ctx): embed = await self.create_leaderboard_embed("Played time", "onlineTime", time=True) await ctx.send(embed=embed) @top.command(name="sailed", case_insensitive=True) async def top_sailed(self, ctx): embed = await self.create_leaderboard_embed("Sailed", "waterTravelledBlocks") await ctx.send(embed=embed) @top.command(name="walked", case_insensitive=True) async def top_walked(self, ctx): embed = await self.create_leaderboard_embed("Walked", "travelledBlocks") await ctx.send(embed=embed) @top.command(name="quiz", case_insensitive=True) async def top_quiz(self, ctx): embed = await self.create_leaderboard_embed("Quiz wins", "quizWins") await ctx.send(embed=embed) def setup(client): client.add_cog(Leaderboards(client))