1
- __version__ = "3.2.3-pre "
1
+ __version__ = "3.3.0-dev "
2
2
3
3
import asyncio
4
4
import logging
19
19
from aiohttp import ClientSession
20
20
from emoji import UNICODE_EMOJI
21
21
from motor .motor_asyncio import AsyncIOMotorClient
22
+ from pkg_resources import parse_version
22
23
from pymongo .errors import ConfigurationError
23
24
24
25
try :
32
33
from core import checks
33
34
from core .clients import ApiClient , PluginDatabaseClient
34
35
from core .config import ConfigManager
35
- from core .utils import human_join , strtobool , parse_alias
36
+ from core .utils import human_join , parse_alias
36
37
from core .models import PermissionLevel , ModmailLogger , SafeFormatter
37
38
from core .thread import ThreadManager
38
39
from core .time import human_timedelta
@@ -70,6 +71,7 @@ def __init__(self):
70
71
self ._api = None
71
72
self .metadata_loop = None
72
73
self .formatter = SafeFormatter ()
74
+ self .loaded_cogs = ['cogs.modmail' , 'cogs.plugins' , 'cogs.utility' ]
73
75
74
76
self ._connected = asyncio .Event ()
75
77
self .start_time = datetime .utcnow ()
@@ -97,17 +99,7 @@ def __init__(self):
97
99
sys .exit (0 )
98
100
99
101
self .plugin_db = PluginDatabaseClient (self )
100
-
101
- logger .line ()
102
- logger .info ("┌┬┐┌─┐┌┬┐┌┬┐┌─┐┬┬" )
103
- logger .info ("││││ │ │││││├─┤││" )
104
- logger .info ("┴ ┴└─┘─┴┘┴ ┴┴ ┴┴┴─┘" )
105
- logger .info ("v%s" , __version__ )
106
- logger .info ("Authors: kyb3r, fourjr, Taaku18" )
107
- logger .line ()
108
-
109
- self ._load_extensions ()
110
- logger .line ()
102
+ self .startup ()
111
103
112
104
@property
113
105
def uptime (self ) -> str :
@@ -123,6 +115,24 @@ def uptime(self) -> str:
123
115
124
116
return self .formatter .format (fmt , d = days , h = hours , m = minutes , s = seconds )
125
117
118
+ def startup (self ):
119
+ logger .line ()
120
+ logger .info ("┌┬┐┌─┐┌┬┐┌┬┐┌─┐┬┬" )
121
+ logger .info ("││││ │ │││││├─┤││" )
122
+ logger .info ("┴ ┴└─┘─┴┘┴ ┴┴ ┴┴┴─┘" )
123
+ logger .info ("v%s" , __version__ )
124
+ logger .info ("Authors: kyb3r, fourjr, Taaku18" )
125
+ logger .line ()
126
+
127
+ for cog in self .loaded_cogs :
128
+ logger .info ("Loading %s." , cog )
129
+ try :
130
+ self .load_extension (cog )
131
+ logger .info ("Successfully loaded %s." , cog )
132
+ except Exception :
133
+ logger .exception ("Failed to load %s." , cog )
134
+ logger .line ()
135
+
126
136
def _configure_logging (self ):
127
137
level_text = self .config ["log_level" ].upper ()
128
138
logging_levels = {
@@ -161,8 +171,8 @@ def _configure_logging(self):
161
171
logger .debug ("Successfully configured logging." )
162
172
163
173
@property
164
- def version (self ) -> str :
165
- return __version__
174
+ def version (self ):
175
+ return parse_version ( __version__ )
166
176
167
177
@property
168
178
def session (self ) -> ClientSession :
@@ -179,18 +189,6 @@ def api(self):
179
189
async def get_prefix (self , message = None ):
180
190
return [self .prefix , f"<@{ self .user .id } > " , f"<@!{ self .user .id } > " ]
181
191
182
- def _load_extensions (self ):
183
- """Adds commands automatically"""
184
- for file in os .listdir ("cogs" ):
185
- if not file .endswith (".py" ):
186
- continue
187
- cog = f"cogs.{ file [:- 3 ]} "
188
- logger .info ("Loading %s." , cog )
189
- try :
190
- self .load_extension (cog )
191
- except Exception :
192
- logger .exception ("Failed to load %s." , cog )
193
-
194
192
def run (self , * args , ** kwargs ):
195
193
try :
196
194
self .loop .run_until_complete (self .start (self .token ))
@@ -366,25 +364,17 @@ def blocked_whitelisted_users(self) -> typing.List[str]:
366
364
def prefix (self ) -> str :
367
365
return str (self .config ["prefix" ])
368
366
369
- def _parse_color (self , conf_name ):
370
- color = self .config [conf_name ]
371
- try :
372
- return int (color .lstrip ("#" ), base = 16 )
373
- except ValueError :
374
- logger .error ("Invalid %s provided." , conf_name )
375
- return int (self .config .remove (conf_name ).lstrip ("#" ), base = 16 )
376
-
377
367
@property
378
368
def mod_color (self ) -> int :
379
- return self ._parse_color ("mod_color" )
369
+ return self .config . get ("mod_color" )
380
370
381
371
@property
382
372
def recipient_color (self ) -> int :
383
- return self ._parse_color ("recipient_color" )
373
+ return self .config . get ("recipient_color" )
384
374
385
375
@property
386
376
def main_color (self ) -> int :
387
- return self ._parse_color ("main_color" )
377
+ return self .config . get ("main_color" )
388
378
389
379
def command_perm (self , command_name : str ) -> PermissionLevel :
390
380
level = self .config ["override_command_level" ].get (command_name )
@@ -518,7 +508,6 @@ async def on_ready(self):
518
508
loop = None ,
519
509
)
520
510
self .metadata_loop .before_loop (self .before_post_metadata )
521
- self .metadata_loop .after_loop (self .after_post_metadata )
522
511
self .metadata_loop .start ()
523
512
524
513
async def convert_emoji (self , name : str ) -> str :
@@ -574,38 +563,14 @@ async def _process_blocked(self, message: discord.Message) -> bool:
574
563
575
564
now = datetime .utcnow ()
576
565
577
- account_age = self .config [ "account_age" ]
578
- guild_age = self .config [ "guild_age" ]
566
+ account_age = self .config . get ( "account_age" )
567
+ guild_age = self .config . get ( "guild_age" )
579
568
580
569
if account_age is None :
581
570
account_age = isodate .Duration ()
582
571
if guild_age is None :
583
572
guild_age = isodate .Duration ()
584
573
585
- if not isinstance (account_age , isodate .Duration ):
586
- try :
587
- account_age = isodate .parse_duration (account_age )
588
- except isodate .ISO8601Error :
589
- logger .warning (
590
- "The account age limit needs to be a "
591
- "ISO-8601 duration formatted duration string "
592
- 'greater than 0 days, not "%s".' ,
593
- str (account_age ),
594
- )
595
- account_age = self .config .remove ("account_age" )
596
-
597
- if not isinstance (guild_age , isodate .Duration ):
598
- try :
599
- guild_age = isodate .parse_duration (guild_age )
600
- except isodate .ISO8601Error :
601
- logger .warning (
602
- "The guild join age limit needs to be a "
603
- "ISO-8601 duration formatted duration string "
604
- 'greater than 0 days, not "%s".' ,
605
- str (guild_age ),
606
- )
607
- guild_age = self .config .remove ("guild_age" )
608
-
609
574
reason = self .blocked_users .get (str (message .author .id )) or ""
610
575
min_guild_age = min_account_age = now
611
576
@@ -860,14 +825,7 @@ async def process_commands(self, message):
860
825
861
826
thread = await self .threads .find (channel = ctx .channel )
862
827
if thread is not None :
863
- try :
864
- reply_without_command = strtobool (
865
- self .config ["reply_without_command" ]
866
- )
867
- except ValueError :
868
- reply_without_command = self .config .remove ("reply_without_command" )
869
-
870
- if reply_without_command :
828
+ if self .config .get ('reply_without_command' ):
871
829
await thread .reply (message )
872
830
else :
873
831
await self .api .append_log (message , type_ = "internal" )
@@ -887,23 +845,15 @@ async def _void(*_args, **_kwargs):
887
845
pass
888
846
889
847
if isinstance (channel , discord .DMChannel ):
890
- try :
891
- user_typing = strtobool (self .config ["user_typing" ])
892
- except ValueError :
893
- user_typing = self .config .remove ("user_typing" )
894
- if not user_typing :
848
+ if not self .config .get ("user_typing" ):
895
849
return
896
850
897
851
thread = await self .threads .find (recipient = user )
898
852
899
853
if thread :
900
854
await thread .channel .trigger_typing ()
901
855
else :
902
- try :
903
- mod_typing = strtobool (self .config ["mod_typing" ])
904
- except ValueError :
905
- mod_typing = self .config .remove ("mod_typing" )
906
- if not mod_typing :
856
+ if not self .config .get ('mod_typing' ):
907
857
return
908
858
909
859
thread = await self .threads .find (channel = channel )
@@ -941,15 +891,7 @@ async def on_raw_reaction_add(self, payload):
941
891
942
892
if isinstance (channel , discord .DMChannel ):
943
893
if str (reaction ) == str (close_emoji ): # closing thread
944
- try :
945
- recipient_thread_close = strtobool (
946
- self .config ["recipient_thread_close" ]
947
- )
948
- except ValueError :
949
- recipient_thread_close = self .config .remove (
950
- "recipient_thread_close"
951
- )
952
- if not recipient_thread_close :
894
+ if not self .config .get ('recipient_thread_close' ):
953
895
return
954
896
thread = await self .threads .find (recipient = user )
955
897
ts = message .embeds [0 ].timestamp if message .embeds else None
@@ -1146,7 +1088,7 @@ async def post_metadata(self):
1146
1088
"member_count" : len (self .guild .members ),
1147
1089
"uptime" : (datetime .utcnow () - self .start_time ).total_seconds (),
1148
1090
"latency" : f"{ self .ws .latency * 1000 :.4f} " ,
1149
- "version" : self .version ,
1091
+ "version" : str ( self .version ) ,
1150
1092
"selfhosted" : True ,
1151
1093
"last_updated" : str (datetime .utcnow ()),
1152
1094
}
@@ -1161,10 +1103,6 @@ async def before_post_metadata(self):
1161
1103
if not self .guild :
1162
1104
self .metadata_loop .cancel ()
1163
1105
1164
- @staticmethod
1165
- async def after_post_metadata ():
1166
- logger .info ("Metadata loop has been cancelled." )
1167
-
1168
1106
1169
1107
if __name__ == "__main__" :
1170
1108
try :
0 commit comments