|
11 | 11 | define, |
12 | 12 | field, |
13 | 13 | ) |
| 14 | +from .flags import Permissions |
14 | 15 | from .misc import File, IDMixin, Overwrite, Snowflake |
15 | 16 | from .user import User |
16 | 17 | from .webhook import Webhook |
@@ -1207,6 +1208,67 @@ async def join(self) -> None: |
1207 | 1208 |
|
1208 | 1209 | await self._client.join_thread(int(self.id)) |
1209 | 1210 |
|
| 1211 | + async def get_permissions_for(self, member: "Member") -> Permissions: |
| 1212 | + """ |
| 1213 | + Returns the permissions of the member in this specific channel. |
| 1214 | +
|
| 1215 | + .. note:: |
| 1216 | + The permissions returned by this function take into account role and |
| 1217 | + user overwrites that can be assigned to channels or categories. If you |
| 1218 | + don't need these overwrites, look into :meth:`.Member.get_guild_permissions`. |
| 1219 | +
|
| 1220 | + :param member: The member to get the permissions from |
| 1221 | + :type member: Member |
| 1222 | + :return: Permissions of the member in this channel |
| 1223 | + :rtype: Permissions |
| 1224 | + """ |
| 1225 | + if not self.guild_id: |
| 1226 | + return Permissions.DEFAULT |
| 1227 | + |
| 1228 | + from .guild import Guild |
| 1229 | + |
| 1230 | + guild = Guild(**await self._client.get_guild(int(self.guild_id)), _client=self._client) |
| 1231 | + |
| 1232 | + permissions = await member.get_guild_permissions(guild) |
| 1233 | + |
| 1234 | + if permissions & Permissions.ADMINISTRATOR == Permissions.ADMINISTRATOR: |
| 1235 | + return Permissions.ALL |
| 1236 | + |
| 1237 | + # @everyone role overwrites |
| 1238 | + from ...client.models.utils import search_iterable |
| 1239 | + |
| 1240 | + overwrite_everyone = search_iterable( |
| 1241 | + self.permission_overwrites, lambda overwrite: int(overwrite.id) == int(self.guild_id) |
| 1242 | + ) |
| 1243 | + if overwrite_everyone: |
| 1244 | + permissions &= ~int(overwrite_everyone[0].deny) |
| 1245 | + permissions |= int(overwrite_everyone[0].allow) |
| 1246 | + |
| 1247 | + # Apply role specific overwrites |
| 1248 | + allow, deny = 0, 0 |
| 1249 | + for role_id in member.roles: |
| 1250 | + overwrite_role = search_iterable( |
| 1251 | + self.permission_overwrites, lambda overwrite: int(overwrite.id) == int(role_id) |
| 1252 | + ) |
| 1253 | + if overwrite_role: |
| 1254 | + allow |= int(overwrite_role[0].allow) |
| 1255 | + deny |= int(overwrite_role[0].deny) |
| 1256 | + |
| 1257 | + if deny: |
| 1258 | + permissions &= ~deny |
| 1259 | + if allow: |
| 1260 | + permissions |= allow |
| 1261 | + |
| 1262 | + # Apply member specific overwrites |
| 1263 | + overwrite_member = search_iterable( |
| 1264 | + self.permission_overwrites, lambda overwrite: int(overwrite.id) == int(member.id) |
| 1265 | + ) |
| 1266 | + if overwrite_member: |
| 1267 | + permissions &= ~int(overwrite_member[0].deny) |
| 1268 | + permissions |= int(overwrite_member[0].allow) |
| 1269 | + |
| 1270 | + return Permissions(permissions) |
| 1271 | + |
1210 | 1272 |
|
1211 | 1273 | @define() |
1212 | 1274 | class Thread(Channel): |
|
0 commit comments