Passed
Push — main ( d12a1e...942891 )
by Bartosz
02:45 queued 01:23
created

build.main   A

Complexity

Total Complexity 24

Size/Duplication

Total Lines 159
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 117
dl 0
loc 159
rs 10
c 0
b 0
f 0
wmc 24

10 Methods

Rating   Name   Duplication   Size   Complexity  
A MyBot.update_ch_commons() 0 19 5
A MyBot.get_current_time() 0 5 1
A MyBot.on_member_remove() 0 4 1
A MyBot.on_ready() 0 5 1
A MyBot.on_message() 0 11 4
A MyBot.before_update_ch_commons() 0 3 1
A MyBot.__init__() 0 31 2
A MyBot.on_member_join() 0 8 2
A MyBot.update_member_count() 0 6 1
A MyBot.update_ch_commons_loop() 0 4 2

1 Function

Rating   Name   Duplication   Size   Complexity  
A main() 0 17 4
1
import json
2
import logging
3
import os
4
from datetime import datetime
5
import discord
6
from discord.ext import commands, tasks
7
from discord_slash import SlashCommand
8
from time import time
9
10
from modules.get_settings import get_settings
11
12
# Create logger
13
logger = logging.getLogger('discord')
14
logger.setLevel(logging.DEBUG)
15
handler = logging.FileHandler(filename='discord.log', encoding='utf-8', mode='w')
16
handler.setFormatter(logging.Formatter('%(asctime)s:%(levelname)s:%(name)s: %(message)s'))
17
logger.addHandler(handler)
18
19
# Set bot privileges
20
intents = discord.Intents.all()
21
22
23
class MyBot(commands.Bot):
24
25
    def __init__(self):
26
        super().__init__(command_prefix="!", intents=intents)
27
28
        dt_string = self.get_current_time()
29
        print(f"({dt_string})\t[{self.__class__.__name__}]: Init")
30
        print(f"({dt_string})\t[{self.__class__.__name__}]: Rate limited: {self.is_ws_ratelimited()}")
31
        self.start_time = time()
32
        self.version = "1.1"
33
34
        self.guild = get_settings("guild")
35
        self.ch_admin_posting = get_settings("CH_ADMIN_POSTING")
36
        self.ch_role_request = get_settings("CH_ROLE_REQUEST")
37
        self.ch_total_members = get_settings("CH_TOTAL_MEMBERS")
38
        self.ch_nightmare_killed = get_settings("CH_NIGHTMARE_KILLED")
39
        self.ch_leaderboards = get_settings("CH_LEADERBOARDS")
40
        self.ch_leaderboards_common = get_settings("CH_LEADERBOARDS_COMMON")
41
        self.ch_leaderboards_event = get_settings("CH_LEADERBOARDS_EVENT")
42
        self.ch_legendary_spot = get_settings("CH_LEGENDARY_SPOT")
43
        self.ch_rare_spot = get_settings("CH_RARE_SPOT")
44
        self.ch_common = get_settings("CH_COMMON")
45
        self.ch_werewolf = get_settings("CH_WEREWOLF")
46
        self.ch_wraiths = get_settings("CH_WRAITHS")
47
        self.ch_nemeton = get_settings("CH_NEMETON")
48
        self.ch_logs = get_settings("CH_LOGS")
49
        self.ch_discussion_en = get_settings("CH_DISCUSSION_EN")
50
        self.ch_spotting_stats = get_settings("CH_SPOTTING_STATS")
51
        self.cat_spotting = get_settings("CAT_SPOTTING")
52
        self.update_ch_commons_loop.start()
53
54
        with open('server_files/config.json', 'r', encoding='utf-8-sig') as fp:
55
            self.config = json.load(fp)
56
57
    # On bot ready
58
    async def on_ready(self):
59
        await MyBot.change_presence(self, activity=discord.Activity(type=discord.ActivityType.playing,
60
                                                                    name="The Witcher: Monster Slayer"))
61
        dt_string = self.get_current_time()
62
        print(f"({dt_string})\t[{self.__class__.__name__}]: Bot is ready")
63
64
    async def update_member_count(self, ctx):
65
        true_member_count = len([m for m in ctx.guild.members if not m.bot])
66
        new_name = f"Total members: {true_member_count}"
67
        channel = self.get_channel(self.ch_total_members)
68
        await discord.VoiceChannel.edit(channel, name=new_name)
69
        return true_member_count
70
71
    # On member join
72
    async def on_member_join(self, ctx):
73
        member_count = await self.update_member_count(ctx)
74
        dt_string = self.get_current_time()
75
        print(f"({dt_string})\t[{self.__class__.__name__}]: {ctx} joined")
76
77
        if (member_count % 100) == 0:
78
            channel = self.get_channel(self.ch_admin_posting)
79
            await channel.send(f"{member_count} members <:POGMARE:872496675434942484>")
80
81
    async def on_member_remove(self, ctx):
82
        await self.update_member_count(ctx)
83
        dt_string = self.get_current_time()
84
        print(f"({dt_string})\t[{self.__class__.__name__}]: {ctx} left")
85
86
    # Manage on message actions
87
    async def on_message(self, ctx):
88
        # If bot is the message author
89
        if ctx.author.id == self.user.id:
90
            return
91
92
        # If there is a message with "!" prefix
93
        if ctx.content.startswith("!") and ctx.channel.id != self.ch_role_request:
94
            await ctx.channel.send(
95
                fr"{ctx.author.mention} Please use / instead of ! to use commands on the server!",
96
                delete_after=5.0)
97
            await ctx.delete()
98
99
    # Loop tasks
100
    # Update common spotting channel name
101
    async def update_ch_commons(self):
102
        with open('./server_files/commons.txt') as f:
103
            try:
104
                commons = f.read().splitlines()
105
            except ValueError:
106
                print(ValueError)
107
108
        new_name = f"common {commons[0]}"
109
        common_ch = self.get_channel(self.ch_common)
110
        await discord.TextChannel.edit(common_ch, name=new_name)
111
        dt_string = self.get_current_time()
112
        print(f"({dt_string})\t[{self.__class__.__name__}]: Common channel name updated: {commons[0]}")
113
114
        await common_ch.send(f"Common changed: **{commons[0]}**")
115
116
        commons.append(commons.pop(commons.index(commons[0])))
117
        with open('./server_files/commons.txt', 'w') as f:
118
            for item in commons:
119
                f.write("%s\n" % item)
120
121
    # Update commons channel name every day at 12:00
122
    @tasks.loop(minutes=60.0)
123
    async def update_ch_commons_loop(self):
124
        if datetime.now().hour == 12:
125
            await self.update_ch_commons()
126
127
    @update_ch_commons_loop.before_loop
128
    async def before_update_ch_commons(self):
129
        await self.wait_until_ready()
130
131
    @staticmethod
132
    def get_current_time():
133
        now = datetime.now()
134
        dt_string = now.strftime("%d/%m/%Y %H:%M:%S")
135
        return dt_string
136
137
138
def main():
139
    pogmare = MyBot()
140
141
    # Allow slash commands
142
    slash = SlashCommand(pogmare, sync_commands=True, sync_on_cog_reload=False)
143
144
    # Load cogs
145
    for cog in os.listdir("./cogs"):
146
        if cog.endswith("cog.py"):
147
            try:
148
                cog = f"cogs.{cog.replace('.py', '')}"
149
                pogmare.load_extension(cog)
150
            except Exception as e:
151
                print(f"{cog} Could not be loaded")
152
                raise e
153
154
    pogmare.run(get_settings("token"))
155
156
157
if __name__ == "__main__":
158
    main()
159