6868)
6969"""Bitfield of the permissions which are accessibly within DM channels."""
7070
71+ _CHANNEL_SEND_PERMS = ~ (
72+ hikari .Permissions .SEND_TTS_MESSAGES
73+ | hikari .Permissions .EMBED_LINKS
74+ | hikari .Permissions .ATTACH_FILES
75+ | hikari .Permissions .MENTION_ROLES
76+ )
77+
78+
79+ # TODO: which threads are on channels?
80+ _CHANNEL_VIEW_PERMS = ~ (
81+ hikari .Permissions .CREATE_INSTANT_INVITE
82+ | hikari .Permissions .MANAGE_CHANNELS
83+ | hikari .Permissions .ADD_REACTIONS
84+ | hikari .Permissions .SEND_MESSAGES
85+ | hikari .Permissions .MANAGE_MESSAGES
86+ | hikari .Permissions .READ_MESSAGE_HISTORY
87+ | hikari .Permissions .USE_EXTERNAL_EMOJIS # TODO: does this effect reactions???
88+ # TODO: technically this is a per-channel perm but that might not be what ppl expect
89+ | hikari .Permissions .MANAGE_WEBHOOKS
90+ # TODO: do context menus get blocked if you can't send messages like slash commands
91+ # also what about buttons?
92+ | hikari .Permissions .USE_APPLICATION_COMMANDS
93+ | hikari .Permissions .CREATE_PRIVATE_THREADS
94+ | hikari .Permissions .USE_EXTERNAL_STICKERS
95+ | hikari .Permissions .CREATE_PUBLIC_THREADS
96+ | hikari .Permissions .MODERATE_MEMBERS
97+ | ~ _CHANNEL_SEND_PERMS
98+ )
99+
100+
101+ # TODO: this can't be all right?
102+ _MUTE_PERMISSIONS = hikari .Permissions .VIEW_CHANNEL | hikari .Permissions .READ_MESSAGE_HISTORY
103+
104+ _THREAD_CHANNEL_TYPES = frozenset (
105+ (
106+ hikari .ChannelType .GUILD_NEWS_THREAD ,
107+ hikari .ChannelType .GUILD_PUBLIC_THREAD ,
108+ hikari .ChannelType .GUILD_PRIVATE_THREAD ,
109+ )
110+ )
111+ _MOVABLE_CHANNEL_TYPES = frozenset (
112+ (* _THREAD_CHANNEL_TYPES , hikari .ChannelType .GUILD_VOICE , hikari .ChannelType .GUILD_STAGE )
113+ )
114+
115+
116+ def _normalise_permissions (
117+ permissions : hikari .Permissions ,
118+ / ,
119+ * ,
120+ member : typing .Optional [hikari .Member ] = None ,
121+ channel_type : typing .Union [hikari .ChannelType , int , None ] = None ,
122+ ) -> hikari .Permissions :
123+ if member and member .communication_disabled_until ():
124+ return permissions & _MUTE_PERMISSIONS
125+
126+ not_permissions = ~ permissions
127+ if not_permissions & hikari .Permissions .CONNECT :
128+ pass
129+ # permissions &= ~hikari.Permissions.MANAGE_CHANNELS
130+ # TODO: what perms???
131+
132+ # TODO: how to handle when channel_type is None???
133+
134+ if not_permissions & hikari .Permissions .VIEW_CHANNEL :
135+ if channel_type and channel_type not in _MOVABLE_CHANNEL_TYPES :
136+ permissions &= _CHANNEL_VIEW_PERMS
137+
138+ else :
139+ send_perm = (
140+ hikari .Permissions .SEND_MESSAGES_IN_THREADS
141+ if channel_type in _THREAD_CHANNEL_TYPES
142+ else hikari .Permissions .SEND_MESSAGES
143+ )
144+ if not_permissions & send_perm :
145+ permissions &= _CHANNEL_SEND_PERMS
146+
147+ return permissions
148+
71149
72150def _calculate_channel_overwrites (
73151 channel : hikari .PermissibleGuildChannel , member : hikari .Member , permissions : hikari .Permissions , /
@@ -90,7 +168,7 @@ def _calculate_channel_overwrites(
90168 permissions &= ~ member_overwrite .deny
91169 permissions |= member_overwrite .allow
92170
93- return permissions
171+ return _normalise_permissions ( permissions , channel_type = channel . type , member = member )
94172
95173
96174def _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 :
@@ -281,7 +359,7 @@ def calculate_everyone_permissions(
281359 permissions &= ~ everyone_overwrite .deny
282360 permissions |= everyone_overwrite .allow
283361
284- return permissions
362+ return _normalise_permissions ( permissions , channel_type = channel . type if channel else None )
285363
286364
287365async def fetch_everyone_permissions (
@@ -348,4 +426,4 @@ async def fetch_everyone_permissions(
348426 permissions &= ~ everyone_overwrite .deny
349427 permissions |= everyone_overwrite .allow
350428
351- return permissions
429+ return _normalise_permissions ( permissions , channel_type = channel . type if channel else None )
0 commit comments