Source code for lightbulb.utils.permissions

# -*- coding: utf-8 -*-
# Copyright © tandemdude 2020-present
#
# This file is part of Lightbulb.
#
# Lightbulb is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Lightbulb is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with Lightbulb. If not, see <https://www.gnu.org/licenses/>.
from __future__ import annotations

__all__ = ["permissions_for", "permissions_in"]

import hikari


[docs] def permissions_for(member: hikari.Member) -> hikari.Permissions: """ Get the guild permissions for the given member. Args: member (:obj:`hikari.Member`): Member to get permissions for. Returns: :obj:`hikari.Permissions`: Member's guild permissions. Warning: This method relies on the cache to work. If the cache is not available then :obj:`hikari.Permissions.NONE` will be returned. """ permissions = hikari.Permissions.NONE for role in member.get_roles(): permissions |= role.permissions guild = member.get_guild() if hikari.Permissions.ADMINISTRATOR in permissions or guild and member.id == guild.owner_id: return hikari.Permissions.all_permissions() return permissions
[docs] def permissions_in( channel: hikari.PermissibleGuildChannel, member: hikari.Member, include_guild_permissions: bool = True ) -> hikari.Permissions: """ Get the permissions for the given member in the given guild channel. Args: channel (:obj:`hikari.GuildChannel`): Channel to get the permissions in. member (:obj:`hikari.Member`): Member to get the permissions for. include_guild_permissions (:obj:`bool`): Whether or not to include the member's guild permissions. If ``False``, only permissions granted by overwrites will be included. Defaults to ``True``. Returns: :obj:`hikari.Permissions`: Member's permissions in the given channel. """ allowed_perms = hikari.Permissions.NONE if include_guild_permissions: allowed_perms |= permissions_for(member) guild = member.get_guild() if hikari.Permissions.ADMINISTRATOR in allowed_perms or guild and member.id == guild.owner_id: return hikari.Permissions.all_permissions() overwrites = channel.permission_overwrites permissions = allowed_perms if overwrite_everyone := overwrites.get(member.guild_id): permissions &= ~overwrite_everyone.deny permissions |= overwrite_everyone.allow allow = hikari.Permissions.NONE deny = hikari.Permissions.NONE for role_id in member.role_ids: if overwrite_role := overwrites.get(role_id): allow |= overwrite_role.allow deny |= overwrite_role.deny permissions &= ~deny permissions |= allow if overwrite_member := overwrites.get(member.id): permissions &= ~overwrite_member.deny permissions |= overwrite_member.allow return permissions