Passed
Branch BonHowi (242417)
by Bartosz
01:38
created

build.cogs.spotcog.SpotCog.count_spot()   D

Complexity

Conditions 12

Size

Total Lines 56
Code Lines 38

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 38
dl 0
loc 56
rs 4.8
c 0
b 0
f 0
cc 12
nop 2

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

Complexity

Complex classes like build.cogs.spotcog.SpotCog.count_spot() often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

1
"""
2
Cog with role related commands available in the Bot.
3
4
Current commands:
5
/remove_spot
6
7
"""
8
import json
9
10
import cogs
11
import discord
12
import cogs.cogbase as cogbase
13
from cogs.databasecog import DatabaseCog
14
from discord.utils import get
15
from discord.ext import commands
16
from discord_slash import SlashContext, cog_ext
17
18
monster_type_dict = {0: "rare", 1: "legendary", 2: "event1", 3: "event2", 4: "common"}
19
20
21
class SpotCog(cogbase.BaseCog):
22
    def __init__(self, base):
23
        super().__init__(base)
24
25
    # Ping monster role
26
    @commands.Cog.listener()
27
    async def on_message(self, ctx):
28
        if ctx.author.id == self.bot.user.id:
29
            return
30
31
        prefix = "/"
32
        cords_beginning = ["-", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
33
34
        # If common spotted
35
        if ctx.channel.id == self.bot.ch_common:
36
            if ctx.content[0] in cords_beginning:
37
                # await self.count_spot(ctx, 4)
38
                await DatabaseCog.db_count_spot(ctx.author.id, monster_type_dict[4])
39
                await DatabaseCog.db_save_coords(ctx.content, monster_type_dict[4])
40
            else:
41
                await ctx.delete()
42
43
        elif ctx.channel.category and ctx.channel.category.id == self.bot.cat_spotting:
44
            if ctx.content.startswith(prefix):
45
                spotted_monster = await self.get_monster(ctx, ctx.content.replace(prefix, ""))
46
                if spotted_monster:
47
                    role = get(ctx.guild.roles, name=spotted_monster["name"])
48
                    await ctx.delete()
49
                    await ctx.channel.send(f"{role.mention}")
50
                    # await self.count_spot(ctx, spotted_monster["type"])
51
                    await DatabaseCog.db_count_spot(ctx.author.id,
52
                                                    monster_type_dict[spotted_monster["type"]])
53
                    return
54
                else:
55
                    await ctx.channel.send(
56
                        f"{ctx.author.mention} monster not found; are you sure that name is correct?", delete_after=5)
57
            elif ctx.content[0] in cords_beginning:
58
                await DatabaseCog.db_save_coords(ctx.content, ctx.channel.name)
59
                return
60
61
    # @cog_ext.cog_slash(name="setMemberSpotsCounter", guild_ids=cogbase.GUILD_IDS,
62
    #                    description="Function for managing user's spots",
63
    #                    default_permission=False,
64
    #                    permissions=cogbase.PERMISSION_MODS)
65
    # async def set_spot_count(self, ctx: SlashContext, user: discord.User, monster_type: int, number: int):
66
    #     """
67
    #
68
    #     :param ctx:
69
    #     :type ctx:
70
    #     :param user:
71
    #     :type user:
72
    #     :param monster_type:
73
    #     :type monster_type:
74
    #     :param number:
75
    #     :type number:
76
    #     :return:
77
    #     :rtype:
78
    #     """
79
    #     if number < 0:
80
    #         await ctx.channel.send("Nr of spots can't be lower than 0", delete_after=2)
81
    #         return
82
    #     with open("./server_files/monster_spots.json", encoding="utf-8") as f:
83
    #         try:
84
    #             spots = json.load(f)
85
    #         except ValueError:
86
    #             spots = {"users": []}
87
    #             await ctx.channel.send("monster_spots.json created", delete_after=1)
88
    #
89
    #     # TODO: Too many ifs? actually this whole function is written in bad way
90
    #     for current_user in spots["users"]:
91
    #         if current_user["id"] == user.id:
92
    #             if monster_type == 0:
93
    #                 current_user["rare_spots"] = number
94
    #             elif monster_type == 1:
95
    #                 current_user["lege_spots"] = number
96
    #             elif monster_type == 2:
97
    #                 pass
98
    #             elif monster_type == 3:
99
    #                 pass
100
    #             elif monster_type == 4:
101
    #                 current_user["common_spots"] = number
102
    #             else:
103
    #                 print("Wrong monster type(?)")
104
    #
105
    #             current_user["total"] = current_user["lege_spots"] * 5 + current_user["rare_spots"]
106
    #             break
107
    #
108
    #     with open("./server_files/monster_spots.json", "w+") as f:
109
    #         json.dump(spots, f, indent=4)
110
    #     await ctx.channel.send(f"Nr of spots changed for {user.display_name}", delete_after=4)
111
112
113
def setup(bot: commands.Bot):
114
    bot.add_cog(SpotCog(bot))
115