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