@@ -44,17 +44,19 @@ def ready(self, flag):
44
44
45
45
async def _close_after (self , after , ** kwargs ):
46
46
await asyncio .sleep (after )
47
+ kwargs ['scheduled' ] = True
47
48
await self .close (** kwargs )
48
49
49
- async def close (self , * , closer , after = 0 , silent = False , delete_channel = True , message = None ):
50
+ async def close (self , * , closer , after = 0 , silent = False , delete_channel = True , message = None , scheduled = False ):
50
51
'''Close a thread now or after a set time in seconds'''
51
- if after > 0 :
52
- if self . close_task is not None and not self . close_task . cancelled () :
52
+ if self . close_task is not None and not self . close_task . cancelled () :
53
+ if not scheduled or after > 0 :
53
54
self .close_task .cancel ()
55
+
56
+ if after > 0 :
54
57
self .close_task = asyncio .create_task (self ._close_after (after , closer = closer , silent = silent , message = message ))
55
58
return
56
59
57
-
58
60
del self .manager .cache [self .id ]
59
61
60
62
# Logging
@@ -83,11 +85,16 @@ async def close(self, *, closer, after=0, silent=False, delete_channel=True, mes
83
85
desc = f"[`{ log_data ['key' ]} `]({ log_url } ) { user } : { sneak_peak } "
84
86
85
87
em = discord .Embed (description = desc , color = discord .Color .red ())
86
- em .set_author (name = 'Thread closed' , url = log_url )
88
+
89
+ event = 'Scheduled thread close' if scheduled else 'Thread close'
90
+ em .set_author (name = f'Event: { event } ' , url = log_url )
87
91
em .set_footer (text = f'Closed by: { closer } ({ closer .id } )' )
92
+ em .timestamp = datetime .datetime .utcnow ()
88
93
89
94
tasks = [self .bot .log_channel .send (embed = em )]
90
95
96
+ # Thread closed message
97
+
91
98
em = discord .Embed (title = 'Thread Closed' )
92
99
em .description = message or f'{ closer .mention } has closed this modmail thread.'
93
100
em .color = discord .Color .red ()
@@ -122,8 +129,8 @@ def edit_message(self, message_id, message):
122
129
async def reply (self , message ):
123
130
if not message .content and not message .attachments :
124
131
raise commands .UserInputError
125
- if self .recipient not in self .bot .guild . members :
126
- return await message .channel .send ('This user is no longer in the server and is thus unreachable.' )
132
+ if all ( not g . get_member ( self .id ) for g in self .bot .guilds ) :
133
+ return await message .channel .send (embed = discord . Embed ( color = discord . Color . red (), description = 'This user shares no servers with me and is thus unreachable.' ) )
127
134
128
135
tasks = [
129
136
self .send (message , self .channel , from_mod = True ), # in thread channel
@@ -202,13 +209,33 @@ async def send(self, message, destination=None, from_mod=False, delete_message=T
202
209
em .set_footer (text = f'User' )
203
210
204
211
await destination .trigger_typing ()
205
- await destination .send (embed = em )
212
+
213
+ if not from_mod :
214
+ mentions = self .get_notifications ()
215
+ else :
216
+ mentions = None
217
+
218
+ await destination .send (mentions , embed = em )
206
219
207
220
if delete_message :
208
221
try :
209
222
await message .delete ()
210
223
except :
211
224
pass
225
+
226
+ def get_notifications (self ):
227
+ config = self .bot .config
228
+ key = str (self .id )
229
+
230
+ mentions = []
231
+ mentions .extend (config ['subscriptions' ].get (key , []))
232
+
233
+ if key in config ['notification_squad' ]:
234
+ mentions .extend (config ['notification_squad' ][key ])
235
+ del config ['notification_squad' ][key ]
236
+ asyncio .create_task (config .update ())
237
+
238
+ return ' ' .join (mentions )
212
239
213
240
214
241
class ThreadManager :
0 commit comments