6969)
7070"""Bitfield of the permissions which are accessibly within DM channels."""
7171
72+ _CHANNEL_SEND_PERMS = ~ (
73+ hikari .Permissions .SEND_TTS_MESSAGES
74+ | hikari .Permissions .EMBED_LINKS
75+ | hikari .Permissions .ATTACH_FILES
76+ | hikari .Permissions .MENTION_ROLES
77+ )
78+
79+
80+ # TODO: which threads are on channels?
81+ _CHANNEL_VIEW_PERMS = ~ (
82+ hikari .Permissions .CREATE_INSTANT_INVITE
83+ | hikari .Permissions .MANAGE_CHANNELS
84+ | hikari .Permissions .ADD_REACTIONS
85+ | hikari .Permissions .SEND_MESSAGES
86+ | hikari .Permissions .MANAGE_MESSAGES
87+ | hikari .Permissions .READ_MESSAGE_HISTORY
88+ | hikari .Permissions .USE_EXTERNAL_EMOJIS # TODO: does this effect reactions???
89+ # TODO: technically this is a per-channel perm but that might not be what ppl expect
90+ | hikari .Permissions .MANAGE_WEBHOOKS
91+ # TODO: do context menus get blocked if you can't send messages like slash commands
92+ # also what about buttons?
93+ | hikari .Permissions .USE_APPLICATION_COMMANDS
94+ | hikari .Permissions .CREATE_PRIVATE_THREADS
95+ | hikari .Permissions .USE_EXTERNAL_STICKERS
96+ | hikari .Permissions .CREATE_PUBLIC_THREADS
97+ | hikari .Permissions .MODERATE_MEMBERS
98+ | ~ _CHANNEL_SEND_PERMS
99+ )
100+
101+
102+ # TODO: this can't be all right?
103+ _MUTE_PERMISSIONS = hikari .Permissions .VIEW_CHANNEL | hikari .Permissions .READ_MESSAGE_HISTORY
104+
105+ _THREAD_CHANNEL_TYPES = frozenset (
106+ (
107+ hikari .ChannelType .GUILD_NEWS_THREAD ,
108+ hikari .ChannelType .GUILD_PUBLIC_THREAD ,
109+ hikari .ChannelType .GUILD_PRIVATE_THREAD ,
110+ )
111+ )
112+ _MOVABLE_CHANNEL_TYPES = frozenset (
113+ (* _THREAD_CHANNEL_TYPES , hikari .ChannelType .GUILD_VOICE , hikari .ChannelType .GUILD_STAGE )
114+ )
115+
116+
117+ def _normalise_permissions (
118+ permissions : hikari .Permissions ,
119+ / ,
120+ * ,
121+ member : typing .Optional [hikari .Member ] = None ,
122+ channel_type : typing .Union [hikari .ChannelType , int , None ] = None ,
123+ ) -> hikari .Permissions :
124+ if member and member .communication_disabled_until ():
125+ return permissions & _MUTE_PERMISSIONS
126+
127+ not_permissions = ~ permissions
128+ if not_permissions & hikari .Permissions .CONNECT :
129+ pass
130+ # permissions &= ~hikari.Permissions.MANAGE_CHANNELS
131+ # TODO: what perms???
132+
133+ # TODO: how to handle when channel_type is None???
134+
135+ if not_permissions & hikari .Permissions .VIEW_CHANNEL :
136+ if channel_type and channel_type not in _MOVABLE_CHANNEL_TYPES :
137+ permissions &= _CHANNEL_VIEW_PERMS
138+
139+ else :
140+ send_perm = (
141+ hikari .Permissions .SEND_MESSAGES_IN_THREADS
142+ if channel_type in _THREAD_CHANNEL_TYPES
143+ else hikari .Permissions .SEND_MESSAGES
144+ )
145+ if not_permissions & send_perm :
146+ permissions &= _CHANNEL_SEND_PERMS
147+
148+ return permissions
149+
72150
73151def _calculate_channel_overwrites (
74152 channel : hikari .PermissibleGuildChannel , member : hikari .Member , permissions : hikari .Permissions
@@ -91,7 +169,7 @@ def _calculate_channel_overwrites(
91169 permissions &= ~ member_overwrite .deny
92170 permissions |= member_overwrite .allow
93171
94- return permissions
172+ return _normalise_permissions ( permissions , channel_type = channel . type , member = member )
95173
96174
97175def _calculate_role_permissions (
@@ -149,7 +227,7 @@ def calculate_permissions(
149227 return ALL_PERMISSIONS
150228
151229 if not channel :
152- return permissions
230+ return _normalise_permissions ( permissions , member = member )
153231
154232 return _calculate_channel_overwrites (channel , member , permissions )
155233
@@ -238,7 +316,7 @@ async def fetch_permissions(
238316 return ALL_PERMISSIONS
239317
240318 if not channel :
241- return permissions
319+ return _normalise_permissions ( permissions , member = member )
242320
243321 channel = await _fetch_channel (client , channel )
244322 if channel .guild_id != guild .id :
@@ -284,7 +362,7 @@ def calculate_everyone_permissions(
284362 permissions &= ~ everyone_overwrite .deny
285363 permissions |= everyone_overwrite .allow
286364
287- return permissions
365+ return _normalise_permissions ( permissions , channel_type = channel . type if channel else None )
288366
289367
290368async def fetch_everyone_permissions (
@@ -351,4 +429,4 @@ async def fetch_everyone_permissions(
351429 permissions &= ~ everyone_overwrite .deny
352430 permissions |= everyone_overwrite .allow
353431
354- return permissions
432+ return _normalise_permissions ( permissions , channel_type = channel . type if channel else None )
0 commit comments