async def _send_stats(self, ctx, preamble): placings = 5 database_key = f"race.scores:{str(ctx.channel.id)}" if database.zcard(database_key) is 0: logger.info(f"no users in {database_key}") await ctx.send("There are no users in the database.") return if placings > database.zcard(database_key): placings = database.zcard(database_key) leaderboard_list = database.zrevrangebyscore( database_key, "+inf", "-inf", 0, placings, True) embed = discord.Embed( type="rich", colour=discord.Color.blurple(), title=preamble) embed.set_author(name="Bird ID - An Ornithology Bot") leaderboard = "" for i, stats in enumerate(leaderboard_list): if ctx.guild is not None: user = ctx.guild.get_member(int(stats[0])) else: user = None if user is None: user = self.bot.get_user(int(stats[0])) if user is None: user = "******" else: user = f"**{user.name}#{user.discriminator}**" else: user = f"**{user.name}#{user.discriminator}** ({str(user.mention)})" leaderboard += f"{str(i+1)}. {user} - {str(int(stats[1]))}\n" start = int(database.hget(f"race.data:{str(ctx.channel.id)}", "start")) elapsed = str(datetime.timedelta(seconds=round(time.time()) - start)) embed.add_field(name="Options", value=await self._get_options(ctx), inline=False) embed.add_field( name="Stats", value=f"**Race Duration:** `{elapsed}`", inline=False) embed.add_field(name="Leaderboard", value=leaderboard, inline=False) if database.zscore(database_key, str(ctx.author.id)) is not None: placement = int(database.zrevrank( database_key, str(ctx.author.id))) + 1 embed.add_field( name="You:", value=f"You are #{str(placement)}.", inline=False) else: embed.add_field( name="You:", value="You haven't answered any correctly.") await ctx.send(embed=embed)
async def _send_stats(self, ctx, preamble): database_key = f"session.incorrect:{str(ctx.author.id)}" embed = discord.Embed(type="rich", colour=discord.Color.blurple(), title=preamble) embed.set_author(name="Bird ID - An Ornithology Bot") if database.zcard(database_key) is not 0: leaderboard_list = database.zrevrangebyscore( database_key, "+inf", "-inf", 0, 5, True) leaderboard = "" for i, stats in enumerate(leaderboard_list): leaderboard += f"{str(i+1)}. **{str(stats[0])[2:-1]}** - {str(int(stats[1]))}\n" else: logger.info(f"no birds in {database_key}") leaderboard = "**There are no missed birds.**" embed.add_field(name="Options", value=await self._get_options(ctx), inline=False) embed.add_field(name="Stats", value=await self._get_stats(ctx), inline=False) embed.add_field(name=f"Top Missed Birds", value=leaderboard, inline=False) await ctx.send(embed=embed)
async def missed(self, ctx, scope="", page=1): logger.info("command: missed") await channel_setup(ctx) await user_setup(ctx) try: page = int(scope) except ValueError: if scope is "": scope = "global" scope = scope.lower() else: scope = "global" logger.info(f"scope: {scope}") logger.info(f"page: {page}") if not scope in ("global", "server", "me", "g", "s", "m"): logger.info("invalid scope") await ctx.send(f"**{scope} is not a valid scope!**\n*Valid Scopes:* `global, server, me`") return if page < 1: logger.info("invalid page") await ctx.send("Not a valid number. Pick a positive integer!") return database_key = "" if scope in ("server", "s"): if ctx.guild is not None: database_key = f"incorrect.server:{ctx.guild.id}" scope = "server" else: logger.info("dm context") await ctx.send("**Server scopes are not avaliable in DMs.**\n*Showing global leaderboard instead.*") scope = "global" database_key = "incorrect:global" elif scope in ("me", "m"): database_key = f"incorrect.user:{ctx.author.id}" scope = "me" else: database_key = "incorrect:global" scope = "global" user_amount = int(database.zcard(database_key)) page = (page * 10) - 10 if user_amount is 0: logger.info(f"no users in {database_key}") await ctx.send("There are no birds in the database.") return if page > user_amount: page = user_amount - (user_amount % 10) leaderboard_list = database.zrevrangebyscore(database_key, "+inf", "-inf", page, 10, True) embed = discord.Embed(type="rich", colour=discord.Color.blurple()) embed.set_author(name="Bird ID - An Ornithology Bot") leaderboard = "" for i, stats in enumerate(leaderboard_list): leaderboard += f"{str(i+1+page)}. **{str(stats[0])[2:-1]}** - {str(int(stats[1]))}\n" embed.add_field(name=f"Top Missed Birds ({scope})", value=leaderboard, inline=False) await ctx.send(embed=embed)
async def leaderboard(self, ctx, scope="", page=1): logger.info("command: leaderboard") await channel_setup(ctx) await user_setup(ctx) try: page = int(scope) except ValueError: if scope is "": scope = "global" scope = scope.lower() else: scope = "global" logger.info(f"scope: {scope}") logger.info(f"page: {page}") if not scope in ("global", "server", "g", "s"): logger.info("invalid scope") await ctx.send(f"**{scope} is not a valid scope!**\n*Valid Scopes:* `global, server`") return if page < 1: logger.info("invalid page") await ctx.send("Not a valid number. Pick a positive integer!") return database_key = "" if scope in ("server", "s"): if ctx.guild is not None: database_key = f"users.server:{ctx.guild.id}" scope = "server" else: logger.info("dm context") await ctx.send("**Server scopes are not avaliable in DMs.**\n*Showing global leaderboard instead.*") scope = "global" database_key = "users:global" else: database_key = "users:global" scope = "global" user_amount = int(database.zcard(database_key)) page = (page * 10) - 10 if user_amount is 0: logger.info(f"no users in {database_key}") await ctx.send("There are no users in the database.") return if page > user_amount: page = user_amount - (user_amount % 10) leaderboard_list = database.zrevrangebyscore(database_key, "+inf", "-inf", page, 10, True) embed = discord.Embed(type="rich", colour=discord.Color.blurple()) embed.set_author(name="Bird ID - An Ornithology Bot") leaderboard = "" for i, stats in enumerate(leaderboard_list): if ctx.guild is not None: user = ctx.guild.get_member(int(stats[0])) else: user = None if user is None: user = self.bot.get_user(int(stats[0])) if user is None: user = "******" else: user = f"**{user.name}#{user.discriminator}**" else: user = f"**{user.name}#{user.discriminator}** ({str(user.mention)})" leaderboard += f"{str(i+1+page)}. {user} - {str(int(stats[1]))}\n" embed.add_field(name=f"Leaderboard ({scope})", value=leaderboard, inline=False) if database.zscore(database_key, str(ctx.author.id)) is not None: placement = int(database.zrevrank(database_key, str(ctx.author.id))) + 1 distance = int(database.zrevrange(database_key, placement-2, placement-2, True)[0 ][1]) - int(database.zscore(database_key, str(ctx.author.id))) if placement is 1: embed.add_field(name="You:", value=f"You are #{str(placement)} on the leaderboard.\n" + f"You are in first place.", inline=False) elif distance is 0: embed.add_field(name="You:", value=f"You are #{str(placement)} on the leaderboard.\n" + f"You are tied with #{str(placement-1)}", inline=False) else: embed.add_field(name="You:", value=f"You are #{str(placement)} on the leaderboard.\n" + f"You are {str(distance)} away from #{str(placement-1)}", inline=False) else: embed.add_field(name="You:", value="You haven't answered any correctly.") await ctx.send(embed=embed)
async def leaderboard(self, ctx, scope="", placings=5): logger.info("command: leaderboard") await channel_setup(ctx) await user_setup(ctx) try: placings = int(scope) except ValueError: if scope is "": scope = "global" scope = scope.lower() else: scope = "global" logger.info(f"scope: {scope}") logger.info(f"placings: {placings}") if not scope in ("global", "server", "g", "s"): logger.info("invalid scope") await ctx.send( f"**{scope} is not a valid scope!**\n*Valid Scopes:* `global, server`" ) return if placings > 10 or placings < 1: logger.info("invalid placings") await ctx.send("Not a valid number. Pick one between 1 and 10!") return database_key = "" if scope in ("server", "s"): if ctx.guild is not None: database_key = f"users.server:{ctx.guild.id}" scope = "server" else: logger.info("dm context") await ctx.send( "**Server scopes are not avaliable in DMs.**\n*Showing global leaderboard instead.*" ) scope = "global" database_key = "users:global" else: database_key = "users:global" scope = "global" if database.zcard(database_key) is 0: logger.info(f"no users in {database_key}") await ctx.send("There are no users in the database.") return if placings > database.zcard(database_key): placings = database.zcard(database_key) leaderboard_list = database.zrevrangebyscore(database_key, "+inf", "-inf", 0, placings, True) embed = discord.Embed(type="rich", colour=discord.Color.blurple()) embed.set_author(name=bot_name) leaderboard = "" for i, stats in enumerate(leaderboard_list): if ctx.guild is not None: user = ctx.guild.get_member(int(stats[0])) else: user = None if user is None: user = self.bot.get_user(int(stats[0])) if user is None: user = "******" else: user = f"**{user.name}#{user.discriminator}**" else: user = f"**{user.name}#{user.discriminator}** ({str(user.mention)})" leaderboard += f"{str(i+1)}. {user} - {str(int(stats[1]))}\n" embed.add_field(name=f"Leaderboard ({scope})", value=leaderboard, inline=False) if database.zscore(database_key, str(ctx.author.id)) is not None: placement = int(database.zrevrank(database_key, str( ctx.author.id))) + 1 embed.add_field( name="You:", value=f"You are #{str(placement)} on the leaderboard.", inline=False) else: embed.add_field(name="You:", value="You haven't answered any correctly.") await ctx.send(embed=embed)
async def missed(self, ctx, scope="", placings=5): logger.info("command: missed") await channel_setup(ctx) await user_setup(ctx) try: placings = int(scope) except ValueError: if scope is "": scope = "global" scope = scope.lower() else: scope = "global" logger.info(f"scope: {scope}") logger.info(f"placings: {placings}") if not scope in ("global", "server", "me", "g", "s", "m"): logger.info("invalid scope") await ctx.send( f"**{scope} is not a valid scope!**\n*Valid Scopes:* `global, server, me`" ) return if placings > 10 or placings < 1: logger.info("invalid placings") await ctx.send("Not a valid number. Pick one between 1 and 10!") return database_key = "" if scope in ("server", "s"): if ctx.guild is not None: database_key = f"incorrect.server:{ctx.guild.id}" scope = "server" else: logger.info("dm context") await ctx.send( "**Server scopes are not avaliable in DMs.**\n*Showing global leaderboard instead.*" ) scope = "global" database_key = "incorrect:global" elif scope in ("me", "m"): database_key = f"incorrect.user:{ctx.author.id}" scope = "me" else: database_key = "incorrect:global" scope = "global" if database.zcard(database_key) is 0: logger.info(f"no users in {database_key}") await ctx.send("There are no fossils in the database.") return if placings > database.zcard(database_key): placings = database.zcard(database_key) leaderboard_list = database.zrevrangebyscore(database_key, "+inf", "-inf", 0, placings, True) embed = discord.Embed(type="rich", colour=discord.Color.blurple()) embed.set_author(name=bot_name) leaderboard = "" for i, stats in enumerate(leaderboard_list): leaderboard += f"{str(i+1)}. **{str(stats[0])[2:-1]}** - {str(int(stats[1]))}\n" embed.add_field(name=f"Top Missed Fossils ({scope})", value=leaderboard, inline=False) await ctx.send(embed=embed)