1
- __version__ = "3.3.0-dev4 "
1
+ __version__ = "3.3.0-dev5 "
2
2
3
3
import asyncio
4
4
import logging
46
46
47
47
ch = logging .StreamHandler (stream = sys .stdout )
48
48
ch .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
+ )
51
53
ch .setFormatter (formatter )
52
54
logger .addHandler (ch )
53
55
@@ -123,7 +125,7 @@ def startup(self):
123
125
logger .info ("┴ ┴└─┘─┴┘┴ ┴┴ ┴┴┴─┘" )
124
126
logger .info ("v%s" , __version__ )
125
127
logger .info ("Authors: kyb3r, fourjr, Taaku18" )
126
- logger .line (' debug' )
128
+ logger .line (" debug" )
127
129
128
130
for cog in self .loaded_cogs :
129
131
logger .debug ("Loading %s." , cog )
@@ -132,7 +134,7 @@ def startup(self):
132
134
logger .debug ("Successfully loaded %s." , cog )
133
135
except Exception :
134
136
logger .exception ("Failed to load %s." , cog )
135
- logger .line (' debug' )
137
+ logger .line (" debug" )
136
138
137
139
def _configure_logging (self ):
138
140
level_text = self .config ["log_level" ].upper ()
@@ -144,9 +146,7 @@ def _configure_logging(self):
144
146
"DEBUG" : logging .DEBUG ,
145
147
}
146
148
147
- ch_debug = logging .FileHandler (
148
- self .log_file_name , mode = "a+"
149
- )
149
+ ch_debug = logging .FileHandler (self .log_file_name , mode = "a+" )
150
150
151
151
ch_debug .setLevel (logging .DEBUG )
152
152
formatter_debug = FileFormatter (
@@ -460,7 +460,10 @@ async def on_ready(self):
460
460
logger .debug ("Client ready." )
461
461
logger .info ("Logged in as: %s" , self .user )
462
462
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
+ )
464
467
logger .info ("Owners: %s" , owners )
465
468
logger .info ("Prefix: %s" , self .prefix )
466
469
logger .info ("Guild Name: %s" , self .guild .name )
@@ -504,10 +507,12 @@ async def on_ready(self):
504
507
)
505
508
506
509
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
+ )
509
514
log_data = await self .api .post_log (
510
- log [' channel_id' ],
515
+ log [" channel_id" ],
511
516
{
512
517
"open" : False ,
513
518
"closed_at" : str (datetime .utcnow ()),
@@ -522,9 +527,14 @@ async def on_ready(self):
522
527
},
523
528
)
524
529
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
+ )
526
533
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
+ )
528
538
529
539
self .metadata_loop = tasks .Loop (
530
540
self .post_metadata ,
@@ -573,21 +583,17 @@ async def retrieve_emoji(self) -> typing.Tuple[str, str]:
573
583
574
584
return sent_emoji , blocked_emoji
575
585
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 ]:
577
589
sent_emoji , blocked_emoji = await self .retrieve_emoji ()
578
590
579
591
if str (message .author .id ) in self .blocked_whitelisted_users :
580
592
if str (message .author .id ) in self .blocked_users :
581
593
self .blocked_users .pop (str (message .author .id ))
582
594
await self .config .update ()
583
595
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
591
597
592
598
now = datetime .utcnow ()
593
599
@@ -682,8 +688,10 @@ async def _process_blocked(self, message: discord.Message) -> bool:
682
688
# backwards compat
683
689
end_time = re .search (r"%([^%]+?)%" , reason )
684
690
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
+ )
687
695
688
696
if end_time is not None :
689
697
after = (
@@ -702,19 +710,62 @@ async def _process_blocked(self, message: discord.Message) -> bool:
702
710
reaction = sent_emoji
703
711
704
712
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 ):
705
717
if reaction != "disable" :
706
718
try :
707
- await message .add_reaction (reaction )
719
+ await msg .add_reaction (reaction )
708
720
except (discord .HTTPException , discord .InvalidArgument ):
709
721
logger .warning ("Failed to add reaction %s." , reaction , exc_info = True )
710
- return str (message .author .id ) in self .blocked_users
711
722
712
723
async def process_dm_modmail (self , message : discord .Message ) -> None :
713
724
"""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 )
718
769
719
770
async def get_contexts (self , message , * , cls = commands .Context ):
720
771
"""
@@ -898,13 +949,13 @@ async def _void(*_args, **_kwargs):
898
949
899
950
thread = await self .threads .find (channel = channel )
900
951
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
+ )
906
957
)
907
- ):
958
+ )[ 0 ] :
908
959
return
909
960
await thread .recipient .trigger_typing ()
910
961
@@ -1111,7 +1162,7 @@ async def validate_database_connection(self):
1111
1162
raise
1112
1163
else :
1113
1164
logger .debug ("Successfully connected to the database." )
1114
- logger .line (' debug' )
1165
+ logger .line (" debug" )
1115
1166
1116
1167
async def post_metadata (self ):
1117
1168
owner = (await self .application_info ()).owner
@@ -1137,7 +1188,7 @@ async def post_metadata(self):
1137
1188
async def before_post_metadata (self ):
1138
1189
await self .wait_for_connected ()
1139
1190
logger .debug ("Starting metadata loop." )
1140
- logger .line (' debug' )
1191
+ logger .line (" debug" )
1141
1192
if not self .guild :
1142
1193
self .metadata_loop .cancel ()
1143
1194
0 commit comments