From bd402dc4ca00af0435679d0c52100f19414ac760 Mon Sep 17 00:00:00 2001 From: GeomKid <51281740+GeomKid@users.noreply.github.com> Date: Wed, 26 Oct 2022 14:51:41 +0800 Subject: [PATCH 01/15] fix the multiple client mode --- interactions/client/bot.py | 3 +-- interactions/client/models/command.py | 5 ++--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/interactions/client/bot.py b/interactions/client/bot.py index 480ba068e..259ed98a3 100644 --- a/interactions/client/bot.py +++ b/interactions/client/bot.py @@ -509,7 +509,7 @@ def __resolve_commands(self) -> None: This is an internal method. Do not call it unless you know what you are doing! """ for cmd in self._commands: - if cmd.resolved: + if cmd.coro.__qualname__ in [Cmd.__qualname__ for Cmd in self.__command_coroutines]: continue cmd.listener = self._websocket._dispatch @@ -555,7 +555,6 @@ def __resolve_commands(self) -> None: self._scopes.add(cmd.scope if isinstance(cmd.scope, int) else cmd.scope.id) self.event(coro, name=f"command_{cmd.name}") - cmd.resolved = True async def __sync(self) -> None: # sourcery no-metrics """ diff --git a/interactions/client/models/command.py b/interactions/client/models/command.py index c92d3cabf..9264cb96b 100644 --- a/interactions/client/models/command.py +++ b/interactions/client/models/command.py @@ -411,7 +411,6 @@ class Command(DictSerializerMixin): :ivar Dict[str, int] num_options: The dictionary of the number of options per subcommand. :ivar Dict[str, Union[Callable[..., Awaitable], str]] autocompletions: The dictionary of autocompletions for the command. :ivar Optional[str] recent_group: The name of the group most recently utilized. - :ivar bool resolved: Whether the command is synced. Defaults to ``False``. :ivar Optional[Extension] extension: The extension that the command belongs to, if any. :ivar Client client: The client that the command belongs to. :ivar Optional[Listener] listener: The listener, used for dispatching command errors. @@ -436,7 +435,6 @@ class Command(DictSerializerMixin): ) recent_group: Optional[str] = field(default=None, init=False) error_callback: Optional[Callable[..., Awaitable]] = field(default=None, init=False) - resolved: bool = field(default=False, init=False) extension: Optional["Extension"] = field(default=None, init=False) client: "Client" = field(default=None, init=False) listener: Optional["Listener"] = field(default=None, init=False) @@ -862,7 +860,8 @@ async def __call( if has_args: # foo(ctx, ..., *args, ..., **kwargs) OR foo(ctx, *args, ...) return await _coro( ctx, - *(kwargs[opt] for opt in par_opts if opt in kwargs), # pos before *args + # pos before *args + *(kwargs[opt] for opt in par_opts if opt in kwargs), *args, *( kwargs[opt] From cdf2c1aab913120278f19652f34ebc4bb952a93f Mon Sep 17 00:00:00 2001 From: GeomKid <51281740+GeomKid@users.noreply.github.com> Date: Mon, 31 Oct 2022 12:59:22 +0800 Subject: [PATCH 02/15] Update bot.py --- interactions/client/bot.py | 1 + 1 file changed, 1 insertion(+) diff --git a/interactions/client/bot.py b/interactions/client/bot.py index 259ed98a3..001ab70ac 100644 --- a/interactions/client/bot.py +++ b/interactions/client/bot.py @@ -1386,6 +1386,7 @@ def load( else: log.debug(f"Loaded extension {name}.") self._extensions[_name] = module + del sys.modules[name] return extension def remove( From 57b895d07680d6843dc6928fd854a81155714aca Mon Sep 17 00:00:00 2001 From: GeomKid <51281740+GeomKid@users.noreply.github.com> Date: Mon, 31 Oct 2022 21:07:20 +0800 Subject: [PATCH 03/15] Remove some IDE format accident --- interactions/client/models/command.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/interactions/client/models/command.py b/interactions/client/models/command.py index 9264cb96b..5f486c13f 100644 --- a/interactions/client/models/command.py +++ b/interactions/client/models/command.py @@ -860,8 +860,7 @@ async def __call( if has_args: # foo(ctx, ..., *args, ..., **kwargs) OR foo(ctx, *args, ...) return await _coro( ctx, - # pos before *args - *(kwargs[opt] for opt in par_opts if opt in kwargs), + *(kwargs[opt] for opt in par_opts if opt in kwargs), # pos before *args *args, *( kwargs[opt] From f49b2c07ade6a641880de74b1cac94c74e3e8746 Mon Sep 17 00:00:00 2001 From: GeomKid <51281740+GeomKid@users.noreply.github.com> Date: Sat, 5 Nov 2022 01:49:59 +0800 Subject: [PATCH 04/15] fix: sys.module deleting modules twice --- interactions/client/bot.py | 1 - 1 file changed, 1 deletion(-) diff --git a/interactions/client/bot.py b/interactions/client/bot.py index 001ab70ac..13fc21336 100644 --- a/interactions/client/bot.py +++ b/interactions/client/bot.py @@ -1424,7 +1424,6 @@ def remove( self._loop.create_task( _extension.teardown(remove_commands=remove_commands) ) # made for Extension, usable by others - del sys.modules[_name] else: with contextlib.suppress(AttributeError): From bcb66ea061caf1895e86211f66dd9fe97a493501 Mon Sep 17 00:00:00 2001 From: GeomKid <51281740+GeomKid@users.noreply.github.com> Date: Sat, 5 Nov 2022 11:36:35 +0800 Subject: [PATCH 05/15] Update interactions/client/bot.py Co-authored-by: Damego --- interactions/client/bot.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interactions/client/bot.py b/interactions/client/bot.py index 13fc21336..8a5aaab5a 100644 --- a/interactions/client/bot.py +++ b/interactions/client/bot.py @@ -509,7 +509,7 @@ def __resolve_commands(self) -> None: This is an internal method. Do not call it unless you know what you are doing! """ for cmd in self._commands: - if cmd.coro.__qualname__ in [Cmd.__qualname__ for Cmd in self.__command_coroutines]: + if cmd.coro.__qualname__ in [_cmd.__qualname__ for _cmd in self.__command_coroutines]: continue cmd.listener = self._websocket._dispatch From 620e6a516e614a0cd5837d068924a1c01a96e93f Mon Sep 17 00:00:00 2001 From: GeomKid <51281740+GeomKid@users.noreply.github.com> Date: Mon, 28 Nov 2022 00:47:20 +0800 Subject: [PATCH 06/15] feat: add defered_ephemeral property --- interactions/client/context.py | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/interactions/client/context.py b/interactions/client/context.py index eb4a52246..58566ef7c 100644 --- a/interactions/client/context.py +++ b/interactions/client/context.py @@ -66,6 +66,7 @@ class _Context(ClientSerializerMixin): responded: bool = field(default=False) deferred: bool = field(default=False) app_permissions: Permissions = field(converter=convert_int(Permissions), default=None) + deferred_ephemeral: bool = field(default=False) def __attrs_post_init__(self) -> None: if self.member: @@ -369,6 +370,7 @@ class CommandContext(_Context): :ivar bool responded: Whether an original response was made or not. :ivar bool deferred: Whether the response was deferred or not. :ivar str locale?: The selected language of the user invoking the interaction. + :ivar bool deferred_ephemeral: Whether the response was deferred and ephemeral. :ivar str guild_locale?: The guild's preferred language, if invoked in a guild. :ivar str app_permissions?: Bitwise set of permissions the bot has within the channel the interaction was sent from. :ivar Client client: The client instance that the command belongs to. @@ -472,13 +474,20 @@ async def defer(self, ephemeral: Optional[bool] = False) -> None: self.deferred = True _ephemeral: int = (1 << 6) if ephemeral else 0 self.callback = InteractionCallbackType.DEFERRED_CHANNEL_MESSAGE_WITH_SOURCE - + self.deferred_ephemeral = bool(_ephemeral) await self._client.create_interaction_response( token=self.token, application_id=int(self.id), data={"type": self.callback.value, "data": {"flags": _ephemeral}}, ) - + try: + _msg = await self._client.get_original_interaction_response( + self.token, str(self.application_id) + ) + except LibraryException: + pass + else: + self.message = Message(**_msg, _client=self._client) self.responded = True async def send(self, content: Optional[str] = MISSING, **kwargs) -> Message: @@ -694,7 +703,7 @@ async def defer( self.deferred = True _ephemeral: int = (1 << 6) if bool(ephemeral) else 0 - + self.deferred_ephemeral = bool(_ephemeral) # ephemeral doesn't change callback typings. just data json if edit_origin: self.callback = InteractionCallbackType.DEFERRED_UPDATE_MESSAGE @@ -706,7 +715,14 @@ async def defer( application_id=int(self.id), data={"type": self.callback.value, "data": {"flags": _ephemeral}}, ) - + try: + _msg = await self._client.get_original_interaction_response( + self.token, str(self.application_id) + ) + except LibraryException: + pass + else: + self.message = Message(**_msg, _client=self._client) self.responded = True async def disable_all_components( From 7563e46d39fd90127be4a64b6ec063830da6c99f Mon Sep 17 00:00:00 2001 From: GeomKid <51281740+GeomKid@users.noreply.github.com> Date: Mon, 28 Nov 2022 01:38:46 +0800 Subject: [PATCH 07/15] fix: change to property using flags --- interactions/client/context.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/interactions/client/context.py b/interactions/client/context.py index 3c142b003..a7f560939 100644 --- a/interactions/client/context.py +++ b/interactions/client/context.py @@ -60,10 +60,16 @@ class _Context(ClientSerializerMixin): responded: bool = field(default=False) deferred: bool = field(default=False) app_permissions: Permissions = field(converter=convert_int(Permissions), default=None) - deferred_ephemeral: bool = field(default=False) locale: Optional[Locale] = field(converter=Locale, default=None) guild_locale: Optional[Locale] = field(converter=Locale, default=None) + @property + def deferred_ephemeral(self) -> bool: + return bool( + self.message.flags & MessageFlags.EPHEMERAL + and self.message.flags & MessageFlags.LOADING + ) + def __attrs_post_init__(self) -> None: if self.member and self.guild_id: self.member._extras["guild_id"] = self.guild_id @@ -501,7 +507,6 @@ async def defer(self, ephemeral: Optional[bool] = False) -> None: self.deferred = True _ephemeral: int = MessageFlags.EPHEMERAL.value if ephemeral else 0 self.callback = InteractionCallbackType.DEFERRED_CHANNEL_MESSAGE_WITH_SOURCE - self.deferred_ephemeral = bool(_ephemeral) await self._client.create_interaction_response( token=self.token, application_id=int(self.id), @@ -751,7 +756,6 @@ async def defer( self.deferred = True _ephemeral: int = MessageFlags.EPHEMERAL.value if bool(ephemeral) else 0 - self.deferred_ephemeral = bool(_ephemeral) # ephemeral doesn't change callback typings. just data json if edit_origin: self.callback = InteractionCallbackType.DEFERRED_UPDATE_MESSAGE From 7ff7be11c71e8d19dfb8f04b8903db1e249a778c Mon Sep 17 00:00:00 2001 From: GeomKid <51281740+GeomKid@users.noreply.github.com> Date: Mon, 28 Nov 2022 01:51:44 +0800 Subject: [PATCH 08/15] docs: Add the docs at right place --- interactions/client/context.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/interactions/client/context.py b/interactions/client/context.py index a7f560939..abf2f1eb2 100644 --- a/interactions/client/context.py +++ b/interactions/client/context.py @@ -65,6 +65,9 @@ class _Context(ClientSerializerMixin): @property def deferred_ephemeral(self) -> bool: + """ + Returns whether the current interaction was deferred ephemerally. + """ return bool( self.message.flags & MessageFlags.EPHEMERAL and self.message.flags & MessageFlags.LOADING @@ -391,7 +394,6 @@ class CommandContext(_Context): :ivar bool responded: Whether an original response was made or not. :ivar bool deferred: Whether the response was deferred or not. :ivar Optional[Locale] locale: The selected language of the user invoking the interaction. - :ivar bool deferred_ephemeral: Whether the response was deferred and ephemeral. :ivar Optional[Locale] guild_locale: The guild's preferred language, if invoked in a guild. :ivar str app_permissions: Bitwise set of permissions the bot has within the channel the interaction was sent from. :ivar Client client: From 2303df7379f1165c0eca0e702350db2fcbddf0d8 Mon Sep 17 00:00:00 2001 From: GeomKid <51281740+GeomKid@users.noreply.github.com> Date: Mon, 28 Nov 2022 02:07:50 +0800 Subject: [PATCH 09/15] feat: Upgrade defer to return the Message --- interactions/client/context.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/interactions/client/context.py b/interactions/client/context.py index abf2f1eb2..0a9b587ae 100644 --- a/interactions/client/context.py +++ b/interactions/client/context.py @@ -66,6 +66,7 @@ class _Context(ClientSerializerMixin): @property def deferred_ephemeral(self) -> bool: """ + .. versionadded:: 4.4.0 Returns whether the current interaction was deferred ephemerally. """ return bool( @@ -498,12 +499,14 @@ async def edit( return msg if msg is not None else Message(**payload, _client=self._client) - async def defer(self, ephemeral: Optional[bool] = False) -> None: + async def defer(self, ephemeral: Optional[bool] = False) -> Message: """ This "defers" an interaction response, allowing up to a 15-minute delay between invocation and responding. :param Optional[bool] ephemeral: Whether the deferred state is hidden or not. + :return: The defering message + :rtype: Message """ if not self.responded: self.deferred = True @@ -523,6 +526,7 @@ async def defer(self, ephemeral: Optional[bool] = False) -> None: else: self.message = Message(**_msg, _client=self._client) self.responded = True + return self.message async def send(self, content: Optional[str] = MISSING, **kwargs) -> Message: payload, files = await super().send(content, **kwargs) @@ -746,13 +750,15 @@ async def send(self, content: Optional[str] = MISSING, **kwargs) -> Message: async def defer( self, ephemeral: Optional[bool] = False, edit_origin: Optional[bool] = False - ) -> None: + ) -> Message: """ This "defers" a component response, allowing up to a 15-minute delay between invocation and responding. :param Optional[bool] ephemeral: Whether the deferred state is hidden or not. :param Optional[bool] edit_origin: Whether you want to edit the original message or send a followup message + :return: The defering message + :rtype: Message """ if not self.responded: @@ -778,6 +784,7 @@ async def defer( else: self.message = Message(**_msg, _client=self._client) self.responded = True + return self.message async def disable_all_components( self, respond_to_interaction: Optional[bool] = True, **other_kwargs: Optional[dict] From 38eec9cd50e105128bacecc08b4d626a264f6f46 Mon Sep 17 00:00:00 2001 From: EdVraz <88881326+EdVraz@users.noreply.github.com> Date: Sun, 27 Nov 2022 19:09:20 +0100 Subject: [PATCH 10/15] Update interactions/client/context.py --- interactions/client/context.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/interactions/client/context.py b/interactions/client/context.py index 0a9b587ae..0733b56d5 100644 --- a/interactions/client/context.py +++ b/interactions/client/context.py @@ -66,6 +66,8 @@ class _Context(ClientSerializerMixin): @property def deferred_ephemeral(self) -> bool: """ + .. versionadded:: 4.4.0 + .. versionadded:: 4.4.0 Returns whether the current interaction was deferred ephemerally. """ From e49df2c051bd999c42c431dd78facda79b397490 Mon Sep 17 00:00:00 2001 From: GeomKid <51281740+GeomKid@users.noreply.github.com> Date: Mon, 28 Nov 2022 02:28:10 +0800 Subject: [PATCH 11/15] docs: Add Version added --- interactions/client/context.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/interactions/client/context.py b/interactions/client/context.py index 0733b56d5..b56f5647c 100644 --- a/interactions/client/context.py +++ b/interactions/client/context.py @@ -68,7 +68,6 @@ def deferred_ephemeral(self) -> bool: """ .. versionadded:: 4.4.0 - .. versionadded:: 4.4.0 Returns whether the current interaction was deferred ephemerally. """ return bool( @@ -503,11 +502,13 @@ async def edit( async def defer(self, ephemeral: Optional[bool] = False) -> Message: """ + .. versionchanged::; 4.4.0 + Now returns the created message object This "defers" an interaction response, allowing up to a 15-minute delay between invocation and responding. :param Optional[bool] ephemeral: Whether the deferred state is hidden or not. - :return: The defering message + :return: The defered message :rtype: Message """ if not self.responded: @@ -754,12 +755,14 @@ async def defer( self, ephemeral: Optional[bool] = False, edit_origin: Optional[bool] = False ) -> Message: """ + .. versionchanged::; 4.4.0 + Now returns the created message object This "defers" a component response, allowing up to a 15-minute delay between invocation and responding. :param Optional[bool] ephemeral: Whether the deferred state is hidden or not. :param Optional[bool] edit_origin: Whether you want to edit the original message or send a followup message - :return: The defering message + :return: The defered message :rtype: Message """ if not self.responded: From cfffaa86e598c6bf7a2c40a5f6dafe5909f1f9df Mon Sep 17 00:00:00 2001 From: GeomKid <51281740+GeomKid@users.noreply.github.com> Date: Mon, 28 Nov 2022 02:29:26 +0800 Subject: [PATCH 12/15] docs: Fix typo --- interactions/client/context.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interactions/client/context.py b/interactions/client/context.py index b56f5647c..3a6ccf6e4 100644 --- a/interactions/client/context.py +++ b/interactions/client/context.py @@ -508,7 +508,7 @@ async def defer(self, ephemeral: Optional[bool] = False) -> Message: to a 15-minute delay between invocation and responding. :param Optional[bool] ephemeral: Whether the deferred state is hidden or not. - :return: The defered message + :return: The deferred message :rtype: Message """ if not self.responded: @@ -762,7 +762,7 @@ async def defer( :param Optional[bool] ephemeral: Whether the deferred state is hidden or not. :param Optional[bool] edit_origin: Whether you want to edit the original message or send a followup message - :return: The defered message + :return: The deferred message :rtype: Message """ if not self.responded: From 3ab45924fef2c2855163bc9a44239a49a106b9a3 Mon Sep 17 00:00:00 2001 From: GeomKid <51281740+GeomKid@users.noreply.github.com> Date: Mon, 28 Nov 2022 02:31:54 +0800 Subject: [PATCH 13/15] docs: make consistency --- interactions/client/context.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/interactions/client/context.py b/interactions/client/context.py index 3a6ccf6e4..eceec7a7a 100644 --- a/interactions/client/context.py +++ b/interactions/client/context.py @@ -504,6 +504,7 @@ async def defer(self, ephemeral: Optional[bool] = False) -> Message: """ .. versionchanged::; 4.4.0 Now returns the created message object + This "defers" an interaction response, allowing up to a 15-minute delay between invocation and responding. @@ -757,6 +758,7 @@ async def defer( """ .. versionchanged::; 4.4.0 Now returns the created message object + This "defers" a component response, allowing up to a 15-minute delay between invocation and responding. From ca760c59eb712df772fcedd97c7df59ebb778fe8 Mon Sep 17 00:00:00 2001 From: GeomKid <51281740+GeomKid@users.noreply.github.com> Date: Mon, 28 Nov 2022 02:35:47 +0800 Subject: [PATCH 14/15] fix:typo Co-authored-by: EdVraz <88881326+EdVraz@users.noreply.github.com> --- interactions/client/context.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interactions/client/context.py b/interactions/client/context.py index eceec7a7a..e85de0fc3 100644 --- a/interactions/client/context.py +++ b/interactions/client/context.py @@ -502,7 +502,7 @@ async def edit( async def defer(self, ephemeral: Optional[bool] = False) -> Message: """ - .. versionchanged::; 4.4.0 + .. versionchanged:: 4.4.0 Now returns the created message object This "defers" an interaction response, allowing up From bed17d70ce6414d597a8b1e0a6bf7e7457a1d3de Mon Sep 17 00:00:00 2001 From: GeomKid <51281740+GeomKid@users.noreply.github.com> Date: Mon, 28 Nov 2022 02:35:57 +0800 Subject: [PATCH 15/15] fix:typo Co-authored-by: EdVraz <88881326+EdVraz@users.noreply.github.com> --- interactions/client/context.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interactions/client/context.py b/interactions/client/context.py index e85de0fc3..d638b9b04 100644 --- a/interactions/client/context.py +++ b/interactions/client/context.py @@ -756,7 +756,7 @@ async def defer( self, ephemeral: Optional[bool] = False, edit_origin: Optional[bool] = False ) -> Message: """ - .. versionchanged::; 4.4.0 + .. versionchanged:: 4.4.0 Now returns the created message object This "defers" a component response, allowing up