Skip to content

Commit 47c4be9

Browse files
committed
✨ Allow for functools.partials and such as autocomplete
1 parent cab0a37 commit 47c4be9

File tree

2 files changed

+25
-3
lines changed

2 files changed

+25
-3
lines changed

discord/commands/core.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1095,13 +1095,13 @@ async def invoke_autocomplete_callback(self, ctx: AutocompleteContext):
10951095
ctx.value = op.get("value")
10961096
ctx.options = values
10971097

1098-
if len(inspect.signature(option.autocomplete).parameters) == 2:
1098+
if option.autocomplete._is_instance_method:
10991099
instance = getattr(option.autocomplete, "__self__", ctx.cog)
11001100
result = option.autocomplete(instance, ctx)
11011101
else:
11021102
result = option.autocomplete(ctx)
11031103

1104-
if asyncio.iscoroutinefunction(option.autocomplete):
1104+
if inspect.isawaitable(result):
11051105
result = await result
11061106

11071107
choices = [

discord/commands/options.py

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
import inspect
2828
import logging
2929
from enum import Enum
30-
from typing import TYPE_CHECKING, Literal, Optional, Type, Union
30+
from typing import TYPE_CHECKING, Any, Callable, Literal, Optional, Type, Union
3131

3232
from ..abc import GuildChannel, Mentionable
3333
from ..channel import (
@@ -272,6 +272,7 @@ def __init__(
272272
)
273273
self.default = kwargs.pop("default", None)
274274

275+
self._autocomplete: Callable[[Any], Any, Any] | None = None
275276
self.autocomplete = kwargs.pop("autocomplete", None)
276277
if len(enum_choices) > 25:
277278
self.choices: list[OptionChoice] = []
@@ -390,6 +391,27 @@ def to_dict(self) -> dict:
390391
def __repr__(self):
391392
return f"<discord.commands.{self.__class__.__name__} name={self.name}>"
392393

394+
@property
395+
def autocomplete(self) -> Callable[[Any], Any, Any] | None:
396+
return self._autocomplete
397+
398+
@autocomplete.setter
399+
def autocomplete(self, value: Callable[[Any], Any, Any] | None) -> None:
400+
self._autocomplete = value
401+
# this is done here so it does not have to be computed every time the autocomplete is invoked
402+
if self._autocomplete is not None:
403+
self._autocomplete._is_instance_method = (
404+
sum(
405+
1
406+
for param in inspect.signature(
407+
self.autocomplete
408+
).parameters.values()
409+
if param.default == param.empty
410+
and param.kind not in (param.VAR_POSITIONAL, param.VAR_KEYWORD)
411+
)
412+
== 2
413+
)
414+
393415

394416
class OptionChoice:
395417
"""

0 commit comments

Comments
 (0)