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 (
@@ -150,7 +228,7 @@ def calculate_permissions(
150228 return ALL_PERMISSIONS
151229
152230 if not channel :
153- return permissions
231+ return _normalise_permissions ( permissions , member = member )
154232
155233 return _calculate_channel_overwrites (channel , member , permissions )
156234
@@ -239,7 +317,7 @@ async def fetch_permissions(
239317 return ALL_PERMISSIONS
240318
241319 if not channel :
242- return permissions
320+ return _normalise_permissions ( permissions , member = member )
243321
244322 channel = await _fetch_channel (client , channel )
245323 if channel .guild_id != guild .id :
@@ -282,7 +360,7 @@ def calculate_everyone_permissions(
282360 permissions &= ~ everyone_overwrite .deny
283361 permissions |= everyone_overwrite .allow
284362
285- return permissions
363+ return _normalise_permissions ( permissions , channel_type = channel . type if channel else None )
286364
287365
288366async def fetch_everyone_permissions (
@@ -349,4 +427,4 @@ async def fetch_everyone_permissions(
349427 permissions &= ~ everyone_overwrite .deny
350428 permissions |= everyone_overwrite .allow
351429
352- return permissions
430+ return _normalise_permissions ( permissions , channel_type = channel . type if channel else None )
0 commit comments