#python #discord.py
#python #discord.py
Вопрос:
Итак, в настоящее время я пытаюсь создать команду blacklist (в основном команду warn), в которой владельцы серверов могут использовать команду для публикации запретов, с которыми они имели дело. Я попытался переписать свою исходную команду warn, но проблема в том, что результат получается не таким, каким я хотел, и если я действительно хотел это исправить, мне пришлось переписать большую часть кода, поэтому я хотел создать для него новую свежую команду.
Итак, проблема, с которой я сталкиваюсь при создании команды, заключается в использовании нескольких аргументов.
Например: (Процесс внесения в черный список)
User: >blacklist (user/id)
BOT: Gamertag?
User: *Sends an Xbox username*
BOT: Banned from?
User: *Sends server name*
BOT: Reason for the ban?
User: *Sends ban reason*
Это пример диалога, который будут проходить бот и пользователь. Главное — иметь возможность сохранять ответы пользователя и отправлять все в виде вставки.
В настоящее время у меня есть это:
@commands.command()
async def blacklist(self, ctx):
embed = discord.Embed(title = "Blacklist Report")
#Then something here to collect responses
Примечание: я могу создать встраивание просто отлично, но мне просто нужна помощь в сборе ответов от пользователя. Любая помощь была бы потрясающей!
Ответ №1:
Я решил отправить вам 2 функции, которые я всегда использую, чтобы помочь вам
def check_message(author: discord.User, channel: discord.TextChannel, forbid: bool = False):
def check(message: discord.Message):
if forbid and message.channel.id == channel.id and message.author.id != author.id and message.author.id != bot.user.id:
embed = discord.Embed(title='**ERROR**', description=f'Only {author.mention} can send message here', colour=discord.Colour.red())
asyncio.ensure_future(message.delete())
asyncio.ensure_future(channel.send(embed=embed, delete_after=20))
return message.author.id == author.id and channel.id == message.channel.id
return check
async def get_answer(ctx: discord.TextChannel, user: discord.User, embed: discord.Embed, timeout: Optional[int] = None, delete_after: bool = False) -> Optional[str]:
message: discord.Message = await ctx.send(embed=embed)
try:
respond: discord.Message = await bot.wait_for('message', check=check_message(user, ctx), timeout=timeout)
if delete_after:
await try_delete(message)
await try_delete(respond)
return respond.content
except asyncio.TimeoutError:
if delete_after:
await try_delete(message)
return None
Вам даже не нужно вызывать check_message
, вам просто нужно дождаться get_answer
и получить то, что вы хотите, в виде строки
Вот пример:
@commands.command('example')
async def example(self, ctx):
embed = discord.Embed(title='What is your name?')
response = await get_answer(ctx.channel, ctx.author, embed)
print(f'His name was {response}') # or any other thing you want to use it for
Это timeout
позволяет вам закрыть процесс через несколько секунд без ответа и продолжить код, в этом случае вы получите None
результат этой функции.
delete_after
Позволяет удалить как сообщение с вопросом, так и ответное сообщение после тайм-аута или получения ответа, чтобы сохранить чат чистым.
Комментарии:
1. Разве это не отправило бы вставку для каждого вопроса / ответа? Есть ли способ сгруппировать все ответы в одно вложение вместо отправки нескольких сообщений.
2. @SpaceTurtle0 Вы запросили sth, который сначала получает команду, а затем начинает запрашивать другие вещи после этого, если вы хотите получить все данные в одной команде, используйте аргументы в своей команде, а затем