Skip to content

Commit 0b03ea0

Browse files
Initial attempt at normalising perms
1 parent d924ccf commit 0b03ea0

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
@@ -68,6 +68,84 @@
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

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

96174
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:
@@ -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

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

Comments
 (0)