Discord.py Хранение и вывод записей/предупреждений

#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, который сначала получает команду, а затем начинает запрашивать другие вещи после этого, если вы хотите получить все данные в одной команде, используйте аргументы в своей команде, а затем