Skip to content

Commit 94e0ebc

Browse files
Initial attempt at normalising perms
1 parent 942b8b4 commit 94e0ebc

File tree

1 file changed

+83
-5
lines changed

1 file changed

+83
-5
lines changed

tanjun/permissions.py

Lines changed: 83 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,84 @@
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

73151
def _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

97175
def _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

288366
async 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

Comments
 (0)