1- __version__ = "3.3.0-dev4 "
1+ __version__ = "3.3.0-dev5 "
22
33import asyncio
44import logging
4646
4747ch = logging .StreamHandler (stream = sys .stdout )
4848ch .setLevel (logging .INFO )
49- formatter = logging .Formatter ("%(asctime)s %(filename)s[%(lineno)d] - %(levelname)s: %(message)s" ,
50- datefmt = "%b %d %H:%M:%S" )
49+ formatter = logging .Formatter (
50+ "%(asctime)s %(filename)s[%(lineno)d] - %(levelname)s: %(message)s" ,
51+ datefmt = "%b %d %H:%M:%S" ,
52+ )
5153ch .setFormatter (formatter )
5254logger .addHandler (ch )
5355
@@ -123,7 +125,7 @@ def startup(self):
123125 logger .info ("┴ ┴└─┘─┴┘┴ ┴┴ ┴┴┴─┘" )
124126 logger .info ("v%s" , __version__ )
125127 logger .info ("Authors: kyb3r, fourjr, Taaku18" )
126- logger .line (' debug' )
128+ logger .line (" debug" )
127129
128130 for cog in self .loaded_cogs :
129131 logger .debug ("Loading %s." , cog )
@@ -132,7 +134,7 @@ def startup(self):
132134 logger .debug ("Successfully loaded %s." , cog )
133135 except Exception :
134136 logger .exception ("Failed to load %s." , cog )
135- logger .line (' debug' )
137+ logger .line (" debug" )
136138
137139 def _configure_logging (self ):
138140 level_text = self .config ["log_level" ].upper ()
@@ -144,9 +146,7 @@ def _configure_logging(self):
144146 "DEBUG" : logging .DEBUG ,
145147 }
146148
147- ch_debug = logging .FileHandler (
148- self .log_file_name , mode = "a+"
149- )
149+ ch_debug = logging .FileHandler (self .log_file_name , mode = "a+" )
150150
151151 ch_debug .setLevel (logging .DEBUG )
152152 formatter_debug = FileFormatter (
@@ -460,7 +460,10 @@ async def on_ready(self):
460460 logger .debug ("Client ready." )
461461 logger .info ("Logged in as: %s" , self .user )
462462 logger .info ("Bot ID: %s" , self .user .id )
463- owners = ", " .join (getattr (self .get_user (owner_id ), "name" , str (owner_id )) for owner_id in self .owner_ids )
463+ owners = ", " .join (
464+ getattr (self .get_user (owner_id ), "name" , str (owner_id ))
465+ for owner_id in self .owner_ids
466+ )
464467 logger .info ("Owners: %s" , owners )
465468 logger .info ("Prefix: %s" , self .prefix )
466469 logger .info ("Guild Name: %s" , self .guild .name )
@@ -504,10 +507,12 @@ async def on_ready(self):
504507 )
505508
506509 for log in await self .api .get_open_logs ():
507- if self .get_channel (int (log ['channel_id' ])) is None :
508- logger .debug ("Unable to resolve thread with channel %s." , log ['channel_id' ])
510+ if self .get_channel (int (log ["channel_id" ])) is None :
511+ logger .debug (
512+ "Unable to resolve thread with channel %s." , log ["channel_id" ]
513+ )
509514 log_data = await self .api .post_log (
510- log [' channel_id' ],
515+ log [" channel_id" ],
511516 {
512517 "open" : False ,
513518 "closed_at" : str (datetime .utcnow ()),
@@ -522,9 +527,14 @@ async def on_ready(self):
522527 },
523528 )
524529 if log_data :
525- logger .debug ("Successfully closed thread with channel %s." , log ['channel_id' ])
530+ logger .debug (
531+ "Successfully closed thread with channel %s." , log ["channel_id" ]
532+ )
526533 else :
527- logger .debug ("Failed to close thread with channel %s, skipping." , log ['channel_id' ])
534+ logger .debug (
535+ "Failed to close thread with channel %s, skipping." ,
536+ log ["channel_id" ],
537+ )
528538
529539 self .metadata_loop = tasks .Loop (
530540 self .post_metadata ,
@@ -573,21 +583,17 @@ async def retrieve_emoji(self) -> typing.Tuple[str, str]:
573583
574584 return sent_emoji , blocked_emoji
575585
576- async def _process_blocked (self , message : discord .Message ) -> bool :
586+ async def _process_blocked (
587+ self , message : discord .Message
588+ ) -> typing .Tuple [bool , str ]:
577589 sent_emoji , blocked_emoji = await self .retrieve_emoji ()
578590
579591 if str (message .author .id ) in self .blocked_whitelisted_users :
580592 if str (message .author .id ) in self .blocked_users :
581593 self .blocked_users .pop (str (message .author .id ))
582594 await self .config .update ()
583595
584- if sent_emoji != "disable" :
585- try :
586- await message .add_reaction (sent_emoji )
587- except (discord .HTTPException , discord .InvalidArgument ):
588- logger .warning ("Failed to add sent_emoji." , exc_info = True )
589-
590- return False
596+ return False , sent_emoji
591597
592598 now = datetime .utcnow ()
593599
@@ -682,8 +688,10 @@ async def _process_blocked(self, message: discord.Message) -> bool:
682688 # backwards compat
683689 end_time = re .search (r"%([^%]+?)%" , reason )
684690 if end_time is not None :
685- logger .warning (r"Deprecated time message for user %s, block and unblock again to update." ,
686- message .author )
691+ logger .warning (
692+ r"Deprecated time message for user %s, block and unblock again to update." ,
693+ message .author ,
694+ )
687695
688696 if end_time is not None :
689697 after = (
@@ -702,19 +710,62 @@ async def _process_blocked(self, message: discord.Message) -> bool:
702710 reaction = sent_emoji
703711
704712 await self .config .update ()
713+ return str (message .author .id ) in self .blocked_users , reaction
714+
715+ @staticmethod
716+ async def add_reaction (msg , reaction ):
705717 if reaction != "disable" :
706718 try :
707- await message .add_reaction (reaction )
719+ await msg .add_reaction (reaction )
708720 except (discord .HTTPException , discord .InvalidArgument ):
709721 logger .warning ("Failed to add reaction %s." , reaction , exc_info = True )
710- return str (message .author .id ) in self .blocked_users
711722
712723 async def process_dm_modmail (self , message : discord .Message ) -> None :
713724 """Processes messages sent to the bot."""
714- blocked = await self ._process_blocked (message )
715- if not blocked :
716- thread = await self .threads .find_or_create (message .author )
717- await thread .send (message )
725+ blocked , reaction = await self ._process_blocked (message )
726+ if blocked :
727+ return await self .add_reaction (message , reaction )
728+ thread = await self .threads .find (recipient = message .author )
729+ if thread is None :
730+ if self .config ["dm_disabled" ] >= 1 :
731+ embed = discord .Embed (
732+ title = self .config ["disabled_new_thread_title" ],
733+ color = self .error_color ,
734+ description = self .config ["disabled_new_thread_response" ],
735+ )
736+ embed .set_footer (
737+ text = self .config ["disabled_new_thread_footer" ],
738+ icon_url = self .guild .icon_url ,
739+ )
740+ logger .info (
741+ "A new thread was blocked from %s due to disabled Modmail." ,
742+ message .author ,
743+ )
744+ _ , blocked_emoji = await self .retrieve_emoji ()
745+ await self .add_reaction (message , blocked_emoji )
746+ return await message .channel .send (embed = embed )
747+ thread = self .threads .create (message .author )
748+ else :
749+ if self .config ["dm_disabled" ] == 2 :
750+ embed = discord .Embed (
751+ title = self .config ["disabled_current_thread_title" ],
752+ color = self .error_color ,
753+ description = self .config ["disabled_current_thread_response" ],
754+ )
755+ embed .set_footer (
756+ text = self .config ["disabled_current_thread_footer" ],
757+ icon_url = self .guild .icon_url ,
758+ )
759+ logger .info (
760+ "A message was blocked from %s due to disabled Modmail." ,
761+ message .author ,
762+ )
763+ _ , blocked_emoji = await self .retrieve_emoji ()
764+ await self .add_reaction (message , blocked_emoji )
765+ return await message .channel .send (embed = embed )
766+
767+ await self .add_reaction (message , reaction )
768+ await thread .send (message )
718769
719770 async def get_contexts (self , message , * , cls = commands .Context ):
720771 """
@@ -898,13 +949,13 @@ async def _void(*_args, **_kwargs):
898949
899950 thread = await self .threads .find (channel = channel )
900951 if thread is not None and thread .recipient :
901- if await self . _process_blocked (
902- SimpleNamespace (
903- author = thread . recipient ,
904- channel = SimpleNamespace (send = _void ),
905- add_reaction = _void ,
952+ if (
953+ await self . _process_blocked (
954+ SimpleNamespace (
955+ author = thread . recipient , channel = SimpleNamespace (send = _void )
956+ )
906957 )
907- ):
958+ )[ 0 ] :
908959 return
909960 await thread .recipient .trigger_typing ()
910961
@@ -1111,7 +1162,7 @@ async def validate_database_connection(self):
11111162 raise
11121163 else :
11131164 logger .debug ("Successfully connected to the database." )
1114- logger .line (' debug' )
1165+ logger .line (" debug" )
11151166
11161167 async def post_metadata (self ):
11171168 owner = (await self .application_info ()).owner
@@ -1137,7 +1188,7 @@ async def post_metadata(self):
11371188 async def before_post_metadata (self ):
11381189 await self .wait_for_connected ()
11391190 logger .debug ("Starting metadata loop." )
1140- logger .line (' debug' )
1191+ logger .line (" debug" )
11411192 if not self .guild :
11421193 self .metadata_loop .cancel ()
11431194
0 commit comments