Что я пытаюсь сделать: если кто-то не знает префикс, он может упомянуть бота и вместо этого использовать упоминание. После некоторых исследований я нашел Как отправлять команды боту по имени? Это заставило меня попробовать использовать функции commands.when_mentioned
или commands.when_mentioned_or
вместе с моим пользовательским префиксом.
Моя проблема: Бот либо реагирует только на упоминание (при этом выкидывая мне ошибки), либо вообще не реагирует.
Вот код пользовательского префикса, который я использую: Как получить настраиваемый префикс discord.py
Вот определение клиента с command_prefix
:
intents = discord.Intents.all()
client = commands.Bot(
command_prefix= (get_prefix),
description='A bot who wants your toes',
owner_id=(394506589350002688),
case_insensitive=True,
intents=intents
)
Ниже я перечислил то, что пробовал. Я не уверен, что попробовать дальше, поэтому я буду благодарен за любую оказанную помощь.
Испытание 1:
command_prefix= commands.when_mentioned_or((get_prefix))
Результат:
TypeError: Iterable command_prefix or list returned from get_prefix must contain only strings, not function
Испытание 2:
command_prefix= commands.when_mentioned or (get_prefix)
Результат: ошибки нет, но бот больше не реагирует на пользовательский префикс, как показано ниже.
Испытание 3:
command_prefix= commands.when_mentioned and (get_prefix)
Результат: ошибки нет, но бот больше не реагирует на упоминание, как показано ниже.
when_mentioned_or
должен быть передан список префиксов, а не функция для получения этого списка. Однако его достаточно легко изменить:
def when_mentioned_or_function(func):
def inner(bot, message):
r = func(bot, message)
r = commands.when_mentioned(bot, msg) + r
return r
return inner
@StatTrakDiamondSword первый
Я проверил пример на readthedocs, и на самом деле он очень прост. В функции get_prefix вы возвращаете commands.when_mentioned_or(prefix)(bot, message)
поэтому command_prefix = when_упомянутая_или_функция (get_prefix)? или когда_упомянутая_или_функция(команды.когда_упомянутая_или(get_prисправление))