Passed
Branch BonHowi (fae701)
by Bartosz
03:28
created

build.cogs.leaderboardcog   A

Complexity

Total Complexity 20

Size/Duplication

Total Lines 112
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 20
eloc 93
dl 0
loc 112
rs 10
c 0
b 0
f 0

10 Methods

Rating   Name   Duplication   Size   Complexity  
A LeaderboardsCog.__init__() 0 3 1
A LeaderboardsCog.update_member_roles() 0 7 2
A LeaderboardsCog.update_leaderboards() 0 9 1
A LeaderboardsCog.update_role() 0 11 5
A LeaderboardsCog.update_role_ext() 0 10 4
A LeaderboardsCog.update_leaderboards_loop() 0 3 1
A LeaderboardsCog.cog_unload() 0 2 1
A LeaderboardsCog.before_update_leaderboards_loop() 0 5 1
A LeaderboardsCog.reload_leaderboards() 0 6 1
A LeaderboardsCog.update_leaderboard() 0 25 2

1 Function

Rating   Name   Duplication   Size   Complexity  
A setup() 0 2 1
1
import discord
2
import pandas as pd
3
from discord.ext import commands, tasks
4
from discord.utils import get
5
from discord_slash import cog_ext
6
7
import cogs.cogbase as cogbase
8
from cogs.databasecog import DatabaseCog
9
from modules.utils import get_dominant_color
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
    def cog_unload(self):
20
        self.update_leaderboards_loop.cancel()
21
22
    # Send leaderboards to specified channel
23
    async def update_leaderboard(self, channel: int, ch_type: str):
24
        top_ch = self.bot.get_channel(channel)
25
        spots_df = await DatabaseCog.db_get_spots_df()
26
        spots_df = pd.DataFrame(spots_df)
27
        spots_df["total"] = spots_df["legendary"] * legend_multiplier + spots_df["rare"]
28
        spots_df_top = spots_df.sort_values(ch_type, ascending=False).head(15)
29
        spots_df_top = spots_df_top.reset_index(drop=True)
30
        await top_ch.purge()
31
32
        top_print = []
33
        for index, row in spots_df_top.iterrows():
34
            member_stats = [f"**[{index + 1}]**  {row['display_name']} - {row[ch_type]}"]
35
            top_print.append(member_stats)
36
        top_print = ['\n'.join([elem for elem in sublist]) for sublist in top_print]
37
        top_print = "\n".join(top_print)
38
        ch_type = ''.join([i for i in ch_type if not i.isdigit()])
39
40
        top_user_id = int(spots_df_top.at[0, 'member_id'])
41
        top_user = get(self.bot.get_all_members(), id=top_user_id)
42
        top_user_color = get_dominant_color(top_user.avatar_url)
43
        embed_command = discord.Embed(title=f"TOP 15 {ch_type.upper()}", description=top_print,
44
                                      color=top_user_color)
45
        member = self.bot.get_user(spots_df_top['member_id'].iloc[0])
46
        embed_command.set_thumbnail(url=f'{member.avatar_url}')
47
        await top_ch.send(embed=embed_command)
48
49
    # Update member spotting role(total/common)
50
    async def update_role(self, guild, guild_member, spot_roles, common: bool):
51
        roles_type = "common" if common else "total"
52
        try:
53
            spots_df = await DatabaseCog.db_get_member_stats(guild_member.id)
54
            if not common:
55
                spots_df["total"] = spots_df["legendary"] * legend_multiplier + spots_df["rare"]
56
            roles_list = [key for (key, value) in spot_roles.items() if spots_df.loc[0, roles_type] >= value]
57
            if roles_list:
58
                await self.update_role_ext(guild, roles_list, guild_member)
59
        except KeyError as e:
60
            print(e)
61
62
    async def update_role_ext(self, guild, roles_list, guild_member):
63
        await self.create_role(guild, roles_list[-1])
64
        role_new = get(guild.roles, name=roles_list[-1])
65
        if role_new not in guild_member.roles:
66
            await guild_member.add_roles(role_new)
67
        if len(roles_list) > 1:
68
            await self.create_role(guild, roles_list[-2])
69
            role_old = get(guild.roles, name=roles_list[-2])
70
            if role_old in guild_member.roles:
71
                await guild_member.remove_roles(role_old)
72
73
    # Update members' spotting roles
74
    async def update_member_roles(self):
75
        guild = self.bot.get_guild(self.bot.guild[0])
76
        spot_roles_total = self.bot.config["total_milestones"][0]
77
        spot_roles_common = self.bot.config["common_milestones"][0]
78
        for guild_member in guild.members:
79
            await self.update_role(guild, guild_member, spot_roles_total, False)
80
            await self.update_role(guild, guild_member, spot_roles_common, True)
81
82
    async def update_leaderboards(self):
83
        await self.update_leaderboard(self.bot.ch_leaderboards, "total")
84
        await self.update_leaderboard(self.bot.ch_leaderboards_common, "common")
85
        await self.update_leaderboard(self.bot.ch_leaderboards_event, "event1")
86
        dt_string = self.bot.get_current_time()
87
        print(f'({dt_string})\t[{self.__class__.__name__}]: Leaderboards updated')
88
        await self.update_member_roles()
89
        dt_string = self.bot.get_current_time()
90
        print(f"({dt_string})\t[{self.__class__.__name__}]: Members' roles updated")
91
92
    @tasks.loop(minutes=15)
93
    async def update_leaderboards_loop(self):
94
        await self.update_leaderboards()
95
96
    @update_leaderboards_loop.before_loop
97
    async def before_update_leaderboards_loop(self):
98
        dt_string = self.bot.get_current_time()
99
        print(f'({dt_string})\t[{self.__class__.__name__}]: Waiting until Bot is ready')
100
        await self.bot.wait_until_ready()
101
102
    @cog_ext.cog_slash(name="reloadLeaderboards", guild_ids=cogbase.GUILD_IDS,
103
                       description=" ",
104
                       default_permission=True)
105
    async def reload_leaderboards(self, ctx):
106
        await self.update_leaderboards()
107
        await ctx.send(f"Leaderboards reloaded", hidden=True)
108
109
110
def setup(bot: commands.Bot):
111
    bot.add_cog(LeaderboardsCog(bot))
112