Passed
Push — main ( 4d254e...b95c28 )
by Bartosz
02:30 queued 01:14
created

LeaderboardsCog.get_stats()   A

Complexity

Conditions 1

Size

Total Lines 10
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 7
nop 2
dl 0
loc 10
rs 10
c 0
b 0
f 0
1
import discord
2
from discord.utils import get
3
from discord_slash import cog_ext
4
5
import cogs.cogbase as cogbase
6
from discord.ext import commands, tasks
7
import pandas as pd
8
9
from cogs.databasecog import DatabaseCog
10
11
legend_multiplier = 5
12
13
14
class LeaderboardsCog(cogbase.BaseCog):
15
    def __init__(self, base):
16
        super().__init__(base)
17
        self.update_leaderboards_loop.start()
18
19
    async def update_leaderboards(self, channel: int, ch_type: str):
20
        top_ch = self.bot.get_channel(channel)
21
22
        spots_df = await DatabaseCog.db_get_spots_df()
23
        spots_df["total"] = spots_df["legendary"] * legend_multiplier + spots_df["rare"]
24
        spots_df_top = spots_df.sort_values(ch_type, ascending=False, ignore_index=True).head(15)
25
        spots_df_top = spots_df_top[["display_name", ch_type]]
26
27
        await top_ch.purge(limit=10)
28
29
        top_print = []
30
        for index, row in spots_df_top.iterrows():
31
            member_stats = [f"**[{index}]**.  {row['display_name']} - {row[ch_type]}"]
32
            top_print.append(member_stats)
33
        top_print = ['\n'.join([elem for elem in sublist]) for sublist in top_print]
34
        top_print = "\n".join(top_print)
35
        embed_command = discord.Embed(title="TOP 15", description=top_print,
36
                                      color=0x00ff00)
37
        await top_ch.send(embed=embed_command)
38
39
    @tasks.loop(minutes=15)
40
    async def update_leaderboards_loop(self):
41
        await self.update_leaderboards(self.bot.ch_leaderboards, "total")
42
        await self.update_leaderboards(self.bot.ch_leaderboards_common, "common")
43
        await self.update_role()
44
        print(f'[{self.__class__.__name__}]: Leaderboards updated')
45
46
    @update_leaderboards_loop.before_loop
47
    async def before_update_leaderboards_loop(self):
48
        print(f'[{self.__class__.__name__}]: Waiting until Bot is ready')
49
        await self.bot.wait_until_ready()
50
51
    @cog_ext.cog_slash(name="myStats", guild_ids=cogbase.GUILD_IDS,
52
                       description="Function for",
53
                       default_permission=True)
54
    async def get_stats(self, ctx):
55
        spots_df = await DatabaseCog.db_get_member_stats(ctx.author.id)
56
        message = f"**Legends**: {spots_df.at[0, 'legendary']}\n" \
57
                  f"**Rares**: {spots_df.at[0, 'rare']}\n" \
58
                  f"**Commons**: {spots_df.at[0, 'common']}"
59
        # TODO: role progress
60
        await ctx.send(f"{ctx.author.mention} stats:\n{message}", hidden=True)
61
62
    async def update_role(self):
63
        guild = self.bot.get_guild(self.bot.guild[0])
64
        spot_roles = self.bot.config["milestones"][0]
65
        for guild_member in guild.members:
66
            spots_df = await DatabaseCog.db_get_member_stats(guild_member.id)
67
            spots_df["total"] = spots_df["legendary"] * legend_multiplier + spots_df["rare"]
68
            role_list = [key for (key, value) in spot_roles.items() if spots_df.at[0, "total"] >= value]
69
            if role_list:
70
                role_new = get(guild.roles, name=role_list[-1])
71
                role_old = get(guild.roles, name=role_list[-2])
72
                await guild_member.add_roles(role_new)
73
                await guild_member.remove_roles(role_old)
74
            else:
75
                pass
76
            # check progress
77
            # if progress update role
78
79
80
def setup(bot: commands.Bot):
81
    bot.add_cog(LeaderboardsCog(bot))
82