Skip to content

Commit 27d8233

Browse files
authored
feat: add the client, command, and extension to CommandContext instances (#1093)
* feat: add the client, command, and extension to CommandContext instances * docs(docstrings): Update ivars
1 parent 66a028d commit 27d8233

File tree

3 files changed

+21
-7
lines changed

3 files changed

+21
-7
lines changed

interactions/client/bot.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1055,6 +1055,7 @@ def decorator(coro: Callable[..., Coroutine]) -> Command:
10551055
description_localizations=description_localizations,
10561056
default_scope=default_scope,
10571057
)
1058+
cmd.client = self
10581059
self._commands.append(cmd)
10591060
return cmd
10601061

@@ -1641,6 +1642,7 @@ def __new__(cls, client: Client, *args, **kwargs) -> "Extension":
16411642
continue
16421643

16431644
cmd.extension = self
1645+
cmd.client = self.client
16441646
self.client._commands.append(cmd)
16451647

16461648
commands = self._commands.get(cmd.name, [])

interactions/client/context.py

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
from logging import Logger
2-
from typing import List, Optional, Union
2+
from typing import TYPE_CHECKING, List, Optional, Union
33

44
from ..api.error import LibraryException
5-
from ..api.http.client import HTTPClient
65
from ..api.models.channel import Channel
76
from ..api.models.flags import Permissions
87
from ..api.models.guild import Guild
@@ -18,6 +17,10 @@
1817
from .models.component import ActionRow, Button, Modal, SelectMenu, _build_components
1918
from .models.misc import InteractionData
2019

20+
if TYPE_CHECKING:
21+
from .bot import Client, Extension
22+
from .models.command import Command
23+
2124
log: Logger = get_logger("context")
2225

2326
__all__ = (
@@ -43,7 +46,6 @@ class _Context(ClientSerializerMixin):
4346
:ivar Optional[Guild] guild: The guild data model.
4447
"""
4548

46-
client: HTTPClient = field(default=None)
4749
message: Optional[Message] = field(converter=Message, default=None, add_client=True)
4850
author: Member = field(converter=Member, default=None, add_client=True)
4951
member: Member = field(converter=Member, add_client=True)
@@ -66,9 +68,6 @@ class _Context(ClientSerializerMixin):
6668
app_permissions: Permissions = field(converter=convert_int(Permissions), default=None)
6769

6870
def __attrs_post_init__(self) -> None:
69-
# backwards compatibility
70-
self.client = self._client
71-
7271
if self.member:
7372
if self.guild_id:
7473
self.member._extras["guild_id"] = self.guild_id
@@ -372,10 +371,17 @@ class CommandContext(_Context):
372371
:ivar str locale?: The selected language of the user invoking the interaction.
373372
:ivar str guild_locale?: The guild's preferred language, if invoked in a guild.
374373
:ivar str app_permissions?: Bitwise set of permissions the bot has within the channel the interaction was sent from.
374+
:ivar Client client: The client instance that the command belongs to.
375+
:ivar Command command: The command object that is being invoked.
376+
:ivar Extension extension: The extension the command belongs to.
375377
"""
376378

377379
target: Optional[Union[Message, Member, User]] = field(default=None)
378380

381+
client: "Client" = field(default=None, init=False)
382+
command: "Command" = field(default=None, init=False)
383+
extension: "Extension" = field(default=None, init=False)
384+
379385
def __attrs_post_init__(self) -> None:
380386
super().__attrs_post_init__()
381387

interactions/client/models/command.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
if TYPE_CHECKING:
1919
from ...api.dispatch import Listener
20-
from ..bot import Extension
20+
from ..bot import Client, Extension
2121
from ..context import CommandContext
2222

2323
__all__ = (
@@ -413,6 +413,7 @@ class Command(DictSerializerMixin):
413413
:ivar Optional[str] recent_group: The name of the group most recently utilized.
414414
:ivar bool resolved: Whether the command is synced. Defaults to ``False``.
415415
:ivar Optional[Extension] extension: The extension that the command belongs to, if any.
416+
:ivar Client client: The client that the command belongs to.
416417
:ivar Optional[Listener] listener: The listener, used for dispatching command errors.
417418
"""
418419

@@ -437,6 +438,7 @@ class Command(DictSerializerMixin):
437438
error_callback: Optional[Callable[..., Awaitable]] = field(default=None, init=False)
438439
resolved: bool = field(default=False, init=False)
439440
extension: Optional["Extension"] = field(default=None, init=False)
441+
client: "Client" = field(default=None, init=False)
440442
listener: Optional["Listener"] = field(default=None, init=False)
441443

442444
def __attrs_post_init__(self) -> None:
@@ -927,6 +929,10 @@ def __wrap_coro(
927929

928930
@wraps(coro)
929931
async def wrapper(ctx: "CommandContext", *args, **kwargs):
932+
ctx.client = self.client
933+
ctx.command = self
934+
ctx.extension = self.extension
935+
930936
try:
931937
if self.extension:
932938
return await coro(self.extension, ctx, *args, **kwargs)

0 commit comments

Comments
 (0)