Ejemplo n.º 1
0
    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)
Ejemplo n.º 2
0
    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)
Ejemplo n.º 3
0
    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)
Ejemplo n.º 4
0
    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)
Ejemplo n.º 5
0
    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)
Ejemplo n.º 6
0
    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)