Skip to content

Commit bcd6f7d

Browse files
Initial attempt at normalising perms
1 parent c228683 commit bcd6f7d

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(
@@ -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

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

Comments
 (0)