Browse Source

Require passing intents to Client and its subclasses

pull/7849/head
Rapptz 3 years ago
parent
commit
76cc2c2272
  1. 8
      discord/client.py
  2. 4
      discord/ext/commands/bot.py
  3. 5
      discord/shard.py
  4. 23
      docs/migrating.rst

8
discord/client.py

@ -140,9 +140,11 @@ class Client:
intents: :class:`Intents` intents: :class:`Intents`
The intents that you want to enable for the session. This is a way of The intents that you want to enable for the session. This is a way of
disabling and enabling certain gateway events from triggering and being sent. disabling and enabling certain gateway events from triggering and being sent.
If not given, defaults to a regularly constructed :class:`Intents` class.
.. versionadded:: 1.5 .. versionadded:: 1.5
.. versionchanged:: 2.0
Parameter is now required.
member_cache_flags: :class:`MemberCacheFlags` member_cache_flags: :class:`MemberCacheFlags`
Allows for finer control over how the library caches members. Allows for finer control over how the library caches members.
If not given, defaults to cache as much as possible with the If not given, defaults to cache as much as possible with the
@ -203,7 +205,7 @@ class Client:
The websocket gateway the client is currently connected to. Could be ``None``. The websocket gateway the client is currently connected to. Could be ``None``.
""" """
def __init__(self, **options: Any) -> None: def __init__(self, *, intents: Intents, **options: Any) -> None:
self.loop: asyncio.AbstractEventLoop = _loop self.loop: asyncio.AbstractEventLoop = _loop
# self.ws is set in the connect method # self.ws is set in the connect method
self.ws: DiscordWebSocket = None # type: ignore self.ws: DiscordWebSocket = None # type: ignore
@ -232,7 +234,7 @@ class Client:
} }
self._enable_debug_events: bool = options.pop('enable_debug_events', False) self._enable_debug_events: bool = options.pop('enable_debug_events', False)
self._connection: ConnectionState = self._get_state(**options) self._connection: ConnectionState = self._get_state(intents=intents, **options)
self._connection.shard_count = self.shard_count self._connection.shard_count = self.shard_count
self._closed: bool = False self._closed: bool = False
self._ready: asyncio.Event = MISSING self._ready: asyncio.Event = MISSING

4
discord/ext/commands/bot.py

@ -155,12 +155,14 @@ class BotBase(GroupMixin[None]):
def __init__( def __init__(
self, self,
command_prefix: PrefixType[BotT], command_prefix: PrefixType[BotT],
*,
help_command: Optional[HelpCommand] = _default, help_command: Optional[HelpCommand] = _default,
tree_cls: Type[app_commands.CommandTree[Any]] = app_commands.CommandTree, tree_cls: Type[app_commands.CommandTree[Any]] = app_commands.CommandTree,
description: Optional[str] = None, description: Optional[str] = None,
intents: discord.Intents,
**options: Any, **options: Any,
) -> None: ) -> None:
super().__init__(**options) super().__init__(intents=intents, **options)
self.command_prefix: PrefixType[BotT] = command_prefix self.command_prefix: PrefixType[BotT] = command_prefix
self.extra_events: Dict[str, List[CoroFunc]] = {} self.extra_events: Dict[str, List[CoroFunc]] = {}
# Self doesn't have the ClientT bound, but since this is a mixin it technically does # Self doesn't have the ClientT bound, but since this is a mixin it technically does

5
discord/shard.py

@ -48,6 +48,7 @@ from typing import TYPE_CHECKING, Any, Callable, Tuple, Type, Optional, List, Di
if TYPE_CHECKING: if TYPE_CHECKING:
from .gateway import DiscordWebSocket from .gateway import DiscordWebSocket
from .activity import BaseActivity from .activity import BaseActivity
from .flags import Intents
__all__ = ( __all__ = (
'AutoShardedClient', 'AutoShardedClient',
@ -316,10 +317,10 @@ class AutoShardedClient(Client):
if TYPE_CHECKING: if TYPE_CHECKING:
_connection: AutoShardedConnectionState _connection: AutoShardedConnectionState
def __init__(self, *args: Any, **kwargs: Any) -> None: def __init__(self, *args: Any, intents: Intents, **kwargs: Any) -> None:
kwargs.pop('shard_id', None) kwargs.pop('shard_id', None)
self.shard_ids: Optional[List[int]] = kwargs.pop('shard_ids', None) self.shard_ids: Optional[List[int]] = kwargs.pop('shard_ids', None)
super().__init__(*args, **kwargs) super().__init__(*args, intents=intents, **kwargs)
if self.shard_ids is not None: if self.shard_ids is not None:
if self.shard_count is None: if self.shard_count is None:

23
docs/migrating.rst

@ -115,6 +115,29 @@ With this change, constructor of :class:`Client` no longer accepts ``connector``
In parallel with this change, changes were made to loading and unloading of commands extension extensions and cogs, In parallel with this change, changes were made to loading and unloading of commands extension extensions and cogs,
see :ref:`migrating_2_0_commands_extension_cog_async` for more information. see :ref:`migrating_2_0_commands_extension_cog_async` for more information.
Intents Are Now Required
--------------------------
In earlier versions, the ``intents`` keyword argument was optional and defaulted to :meth:`Intents.default`. In order to better educate users on their intents and to also make it more explicit, this parameter is now required to pass in.
For example:
.. code-block:: python3
# before
client = discord.Client()
# after
intents = discord.Intents.default()
client = discord.Client(intents=intents)
This change applies to **all** subclasses of :class:`Client`.
- :class:`AutoShardedClient`
- :class:`~discord.ext.commands.Bot`
- :class:`~discord.ext.commands.AutoShardedBot`
Abstract Base Classes Changes Abstract Base Classes Changes
------------------------------- -------------------------------

Loading…
Cancel
Save