Back to top

hikari.events.member_events

Events concerning manipulation of members within guilds.

View Source
# -*- coding: utf-8 -*-
# cython: language_level=3
# Copyright (c) 2020 Nekokatt
# Copyright (c) 2021-present davfsa
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
"""Events concerning manipulation of members within guilds."""
from __future__ import annotations

__all__: typing.Sequence[str] = ("MemberEvent", "MemberCreateEvent", "MemberUpdateEvent", "MemberDeleteEvent")

import abc
import typing

import attr

from hikari import intents
from hikari import traits
from hikari.events import base_events
from hikari.events import shard_events
from hikari.internal import attr_extensions

if typing.TYPE_CHECKING:
    from hikari import guilds
    from hikari import snowflakes
    from hikari import users
    from hikari.api import shard as gateway_shard


@base_events.requires_intents(intents.Intents.GUILD_MEMBERS)
class MemberEvent(shard_events.ShardEvent, abc.ABC):
    """Event base for any events that concern guild members."""

    __slots__: typing.Sequence[str] = ()

    @property
    def app(self) -> traits.RESTAware:
        # <<inherited docstring from Event>>.
        return self.user.app

    @property
    @abc.abstractmethod
    def guild_id(self) -> snowflakes.Snowflake:
        """ID of the guild that this event relates to."""

    @property
    @abc.abstractmethod
    def user(self) -> users.User:
        """User object for the member this event concerns."""

    @property
    def user_id(self) -> snowflakes.Snowflake:
        """ID of the user that this event concerns."""
        return self.user.id

    def get_guild(self) -> typing.Optional[guilds.GatewayGuild]:
        """Get the cached view of the guild this member event occurred in.

        If the guild itself is not cached, this will return `None`.

        Returns
        -------
        typing.Optional[hikari.guilds.GatewayGuild]
            The guild that this event occurred in, if known, else
            `None`.
        """
        if not isinstance(self.app, traits.CacheAware):
            return None

        return self.app.cache.get_available_guild(self.guild_id) or self.app.cache.get_unavailable_guild(self.guild_id)


@attr_extensions.with_copy
@attr.define(kw_only=True, weakref_slot=False)
@base_events.requires_intents(intents.Intents.GUILD_MEMBERS)
class MemberCreateEvent(MemberEvent):
    """Event that is fired when a member joins a guild."""

    shard: gateway_shard.GatewayShard = attr.field(metadata={attr_extensions.SKIP_DEEP_COPY: True})
    # <<inherited docstring from ShardEvent>>.

    member: guilds.Member = attr.field()
    """Member object for the member that joined the guild."""

    @property
    def guild_id(self) -> snowflakes.Snowflake:
        # <<inherited docstring from MemberEvent>>.
        return self.member.guild_id

    @property
    def user(self) -> users.User:
        # <<inherited docstring from MemberEvent>>.
        return self.member.user


@attr_extensions.with_copy
@attr.define(kw_only=True, weakref_slot=False)
@base_events.requires_intents(intents.Intents.GUILD_MEMBERS)
class MemberUpdateEvent(MemberEvent):
    """Event that is fired when a member is updated in a guild.

    This may occur if roles are amended, or if the nickname is changed.
    """

    shard: gateway_shard.GatewayShard = attr.field(metadata={attr_extensions.SKIP_DEEP_COPY: True})
    # <<inherited docstring from ShardEvent>>.

    old_member: typing.Optional[guilds.Member] = attr.field()
    """The old member object.

    This will be `None` if the member missing from the cache.
    """

    member: guilds.Member = attr.field()
    """Member object for the member that was updated."""

    @property
    def guild_id(self) -> snowflakes.Snowflake:
        # <<inherited docstring from MemberEvent>>.
        return self.member.guild_id

    @property
    def user(self) -> users.User:
        # <<inherited docstring from MemberEvent>>.
        return self.member.user


@attr_extensions.with_copy
@attr.define(kw_only=True, weakref_slot=False)
@base_events.requires_intents(intents.Intents.GUILD_MEMBERS)
class MemberDeleteEvent(MemberEvent):
    """Event fired when a member is kicked from or leaves a guild."""

    shard: gateway_shard.GatewayShard = attr.field(metadata={attr_extensions.SKIP_DEEP_COPY: True})
    # <<inherited docstring from ShardEvent>>.

    guild_id: snowflakes.Snowflake = attr.field()
    # <<inherited docstring from MemberEvent>>.

    user: users.User = attr.field()
    # <<inherited docstring from MemberEvent>>.

    old_member: typing.Optional[guilds.Member] = attr.field()
    """The old member object.

    This will be `None` if the member was missing from the cache.
    """
#  
@attr_extensions.with_copy
@attr.define(kw_only=True, weakref_slot=False)
@base_events.requires_intents(intents.Intents.GUILD_MEMBERS)
class MemberCreateEvent(MemberEvent):
View Source
@attr_extensions.with_copy
@attr.define(kw_only=True, weakref_slot=False)
@base_events.requires_intents(intents.Intents.GUILD_MEMBERS)
class MemberCreateEvent(MemberEvent):
    """Event that is fired when a member joins a guild."""

    shard: gateway_shard.GatewayShard = attr.field(metadata={attr_extensions.SKIP_DEEP_COPY: True})
    # <<inherited docstring from ShardEvent>>.

    member: guilds.Member = attr.field()
    """Member object for the member that joined the guild."""

    @property
    def guild_id(self) -> snowflakes.Snowflake:
        # <<inherited docstring from MemberEvent>>.
        return self.member.guild_id

    @property
    def user(self) -> users.User:
        # <<inherited docstring from MemberEvent>>.
        return self.member.user

Event that is fired when a member joins a guild.

This requires one of the following combinations of intents in order to be dispatched:

Variables and properties

App instance for this application.

ID of the guild that this event relates to.

Member object for the member that joined the guild.

User object for the member this event concerns.

ID of the user that this event concerns.

Methods
#  def __init__(
   self,
   *,
   shard: hikari.api.shard.GatewayShard,
   member: hikari.guilds.Member
):
View Source
def __init__(self, *, shard, member):
    self.shard = shard
    self.member = member

Method generated by attrs for class MemberCreateEvent.

#  
@classmethod
def bitmask(cls) -> int:
View Source
    @classmethod
    def bitmask(cls) -> int:
        """Bitmask for this event."""
        return cls.__bitmask

Bitmask for this event.

#  
@classmethod
def dispatches(cls) -> Sequence[Type[hikari.events.base_events.Event]]:
View Source
    @classmethod
    def dispatches(cls) -> typing.Sequence[typing.Type[Event]]:
        """Sequence of the event classes this event is dispatched as."""
        return cls.__dispatches

Sequence of the event classes this event is dispatched as.

#  def get_guild(self) -> Optional[hikari.guilds.GatewayGuild]:
View Source
    def get_guild(self) -> typing.Optional[guilds.GatewayGuild]:
        """Get the cached view of the guild this member event occurred in.

        If the guild itself is not cached, this will return `None`.

        Returns
        -------
        typing.Optional[hikari.guilds.GatewayGuild]
            The guild that this event occurred in, if known, else
            `None`.
        """
        if not isinstance(self.app, traits.CacheAware):
            return None

        return self.app.cache.get_available_guild(self.guild_id) or self.app.cache.get_unavailable_guild(self.guild_id)

Get the cached view of the guild this member event occurred in.

If the guild itself is not cached, this will return None.

Returns
#  
@attr_extensions.with_copy
@attr.define(kw_only=True, weakref_slot=False)
@base_events.requires_intents(intents.Intents.GUILD_MEMBERS)
class MemberDeleteEvent(MemberEvent):
View Source
@attr_extensions.with_copy
@attr.define(kw_only=True, weakref_slot=False)
@base_events.requires_intents(intents.Intents.GUILD_MEMBERS)
class MemberDeleteEvent(MemberEvent):
    """Event fired when a member is kicked from or leaves a guild."""

    shard: gateway_shard.GatewayShard = attr.field(metadata={attr_extensions.SKIP_DEEP_COPY: True})
    # <<inherited docstring from ShardEvent>>.

    guild_id: snowflakes.Snowflake = attr.field()
    # <<inherited docstring from MemberEvent>>.

    user: users.User = attr.field()
    # <<inherited docstring from MemberEvent>>.

    old_member: typing.Optional[guilds.Member] = attr.field()
    """The old member object.

    This will be `None` if the member was missing from the cache.
    """

Event fired when a member is kicked from or leaves a guild.

This requires one of the following combinations of intents in order to be dispatched:

Variables and properties

App instance for this application.

#  old_member: Optional[hikari.guilds.Member]

The old member object.

This will be None if the member was missing from the cache.

ID of the user that this event concerns.

Methods
#  def __init__(
   self,
   *,
   shard: hikari.api.shard.GatewayShard,
   guild_id: hikari.snowflakes.Snowflake,
   user: hikari.users.User,
   old_member: Optional[hikari.guilds.Member]
):
View Source
def __init__(self, *, shard, guild_id, user, old_member):
    self.shard = shard
    self.guild_id = guild_id
    self.user = user
    self.old_member = old_member

Method generated by attrs for class MemberDeleteEvent.

#  
@classmethod
def bitmask(cls) -> int:
View Source
    @classmethod
    def bitmask(cls) -> int:
        """Bitmask for this event."""
        return cls.__bitmask

Bitmask for this event.

#  
@classmethod
def dispatches(cls) -> Sequence[Type[hikari.events.base_events.Event]]:
View Source
    @classmethod
    def dispatches(cls) -> typing.Sequence[typing.Type[Event]]:
        """Sequence of the event classes this event is dispatched as."""
        return cls.__dispatches

Sequence of the event classes this event is dispatched as.

#  def get_guild(self) -> Optional[hikari.guilds.GatewayGuild]:
View Source
    def get_guild(self) -> typing.Optional[guilds.GatewayGuild]:
        """Get the cached view of the guild this member event occurred in.

        If the guild itself is not cached, this will return `None`.

        Returns
        -------
        typing.Optional[hikari.guilds.GatewayGuild]
            The guild that this event occurred in, if known, else
            `None`.
        """
        if not isinstance(self.app, traits.CacheAware):
            return None

        return self.app.cache.get_available_guild(self.guild_id) or self.app.cache.get_unavailable_guild(self.guild_id)

Get the cached view of the guild this member event occurred in.

If the guild itself is not cached, this will return None.

Returns
#  
@base_events.requires_intents(intents.Intents.GUILD_MEMBERS)
class MemberEvent(hikari.events.shard_events.ShardEvent, abc.ABC):
View Source
@base_events.requires_intents(intents.Intents.GUILD_MEMBERS)
class MemberEvent(shard_events.ShardEvent, abc.ABC):
    """Event base for any events that concern guild members."""

    __slots__: typing.Sequence[str] = ()

    @property
    def app(self) -> traits.RESTAware:
        # <<inherited docstring from Event>>.
        return self.user.app

    @property
    @abc.abstractmethod
    def guild_id(self) -> snowflakes.Snowflake:
        """ID of the guild that this event relates to."""

    @property
    @abc.abstractmethod
    def user(self) -> users.User:
        """User object for the member this event concerns."""

    @property
    def user_id(self) -> snowflakes.Snowflake:
        """ID of the user that this event concerns."""
        return self.user.id

    def get_guild(self) -> typing.Optional[guilds.GatewayGuild]:
        """Get the cached view of the guild this member event occurred in.

        If the guild itself is not cached, this will return `None`.

        Returns
        -------
        typing.Optional[hikari.guilds.GatewayGuild]
            The guild that this event occurred in, if known, else
            `None`.
        """
        if not isinstance(self.app, traits.CacheAware):
            return None

        return self.app.cache.get_available_guild(self.guild_id) or self.app.cache.get_unavailable_guild(self.guild_id)

Event base for any events that concern guild members.

This requires one of the following combinations of intents in order to be dispatched:

Variables and properties

App instance for this application.

ID of the guild that this event relates to.

Shard that received this event.

User object for the member this event concerns.

ID of the user that this event concerns.

Methods
#  
@classmethod
def bitmask(cls) -> int:
View Source
    @classmethod
    def bitmask(cls) -> int:
        """Bitmask for this event."""
        return cls.__bitmask

Bitmask for this event.

#  
@classmethod
def dispatches(cls) -> Sequence[Type[hikari.events.base_events.Event]]:
View Source
    @classmethod
    def dispatches(cls) -> typing.Sequence[typing.Type[Event]]:
        """Sequence of the event classes this event is dispatched as."""
        return cls.__dispatches

Sequence of the event classes this event is dispatched as.

#  def get_guild(self) -> Optional[hikari.guilds.GatewayGuild]:
View Source
    def get_guild(self) -> typing.Optional[guilds.GatewayGuild]:
        """Get the cached view of the guild this member event occurred in.

        If the guild itself is not cached, this will return `None`.

        Returns
        -------
        typing.Optional[hikari.guilds.GatewayGuild]
            The guild that this event occurred in, if known, else
            `None`.
        """
        if not isinstance(self.app, traits.CacheAware):
            return None

        return self.app.cache.get_available_guild(self.guild_id) or self.app.cache.get_unavailable_guild(self.guild_id)

Get the cached view of the guild this member event occurred in.

If the guild itself is not cached, this will return None.

Returns
#  
@attr_extensions.with_copy
@attr.define(kw_only=True, weakref_slot=False)
@base_events.requires_intents(intents.Intents.GUILD_MEMBERS)
class MemberUpdateEvent(MemberEvent):
View Source
@attr_extensions.with_copy
@attr.define(kw_only=True, weakref_slot=False)
@base_events.requires_intents(intents.Intents.GUILD_MEMBERS)
class MemberUpdateEvent(MemberEvent):
    """Event that is fired when a member is updated in a guild.

    This may occur if roles are amended, or if the nickname is changed.
    """

    shard: gateway_shard.GatewayShard = attr.field(metadata={attr_extensions.SKIP_DEEP_COPY: True})
    # <<inherited docstring from ShardEvent>>.

    old_member: typing.Optional[guilds.Member] = attr.field()
    """The old member object.

    This will be `None` if the member missing from the cache.
    """

    member: guilds.Member = attr.field()
    """Member object for the member that was updated."""

    @property
    def guild_id(self) -> snowflakes.Snowflake:
        # <<inherited docstring from MemberEvent>>.
        return self.member.guild_id

    @property
    def user(self) -> users.User:
        # <<inherited docstring from MemberEvent>>.
        return self.member.user

Event that is fired when a member is updated in a guild.

This may occur if roles are amended, or if the nickname is changed.

This requires one of the following combinations of intents in order to be dispatched:

Variables and properties

App instance for this application.

ID of the guild that this event relates to.

Member object for the member that was updated.

#  old_member: Optional[hikari.guilds.Member]

The old member object.

This will be None if the member missing from the cache.

User object for the member this event concerns.

ID of the user that this event concerns.

Methods
#  def __init__(
   self,
   *,
   shard: hikari.api.shard.GatewayShard,
   old_member: Optional[hikari.guilds.Member],
   member: hikari.guilds.Member
):
View Source
def __init__(self, *, shard, old_member, member):
    self.shard = shard
    self.old_member = old_member
    self.member = member

Method generated by attrs for class MemberUpdateEvent.

#  
@classmethod
def bitmask(cls) -> int:
View Source
    @classmethod
    def bitmask(cls) -> int:
        """Bitmask for this event."""
        return cls.__bitmask

Bitmask for this event.

#  
@classmethod
def dispatches(cls) -> Sequence[Type[hikari.events.base_events.Event]]:
View Source
    @classmethod
    def dispatches(cls) -> typing.Sequence[typing.Type[Event]]:
        """Sequence of the event classes this event is dispatched as."""
        return cls.__dispatches

Sequence of the event classes this event is dispatched as.

#  def get_guild(self) -> Optional[hikari.guilds.GatewayGuild]:
View Source
    def get_guild(self) -> typing.Optional[guilds.GatewayGuild]:
        """Get the cached view of the guild this member event occurred in.

        If the guild itself is not cached, this will return `None`.

        Returns
        -------
        typing.Optional[hikari.guilds.GatewayGuild]
            The guild that this event occurred in, if known, else
            `None`.
        """
        if not isinstance(self.app, traits.CacheAware):
            return None

        return self.app.cache.get_available_guild(self.guild_id) or self.app.cache.get_unavailable_guild(self.guild_id)

Get the cached view of the guild this member event occurred in.

If the guild itself is not cached, this will return None.

Returns