@@ -218,6 +218,9 @@ impl Message {
218
218
219
219
/// Calculates the permissions of the message author in the current channel.
220
220
///
221
+ /// This handles the [`Permissions::SEND_MESSAGES_IN_THREADS`] permission for threads, setting
222
+ /// [`Permissions::SEND_MESSAGES`] accordingly if this message was sent in a thread.
223
+ ///
221
224
/// This may return `None` if:
222
225
/// - The [`Cache`] does not have the current [`Guild`]
223
226
/// - The [`Guild`] does not have the current channel cached (should never happen).
@@ -230,19 +233,25 @@ impl Message {
230
233
} ;
231
234
232
235
let guild = cache. as_ref ( ) . guild ( guild_id) ?;
233
- let channel = if let Some ( channel) = guild. channels . get ( & self . channel_id ) {
234
- channel
236
+ let ( channel, is_thread ) = if let Some ( channel) = guild. channels . get ( & self . channel_id ) {
237
+ ( channel, false )
235
238
} else if let Some ( thread) = guild. threads . iter ( ) . find ( |th| th. id == self . channel_id ) {
236
- thread
239
+ ( thread, true )
237
240
} else {
238
241
return None ;
239
242
} ;
240
243
241
- if let Some ( member) = & self . member {
242
- Some ( guild. partial_member_permissions_in ( channel, self . author . id , member) )
244
+ let mut permissions = if let Some ( member) = & self . member {
245
+ guild. partial_member_permissions_in ( channel, self . author . id , member)
243
246
} else {
244
- Some ( guild. user_permissions_in ( channel, guild. members . get ( & self . author . id ) ?) )
247
+ guild. user_permissions_in ( channel, guild. members . get ( & self . author . id ) ?)
248
+ } ;
249
+
250
+ if is_thread {
251
+ permissions. set ( Permissions :: SEND_MESSAGES , permissions. send_messages_in_threads ( ) ) ;
245
252
}
253
+
254
+ Some ( permissions)
246
255
}
247
256
248
257
/// Deletes the message.
0 commit comments