Как обращаться с несколькими пользователями, используя одну и ту же команду discord.py

#python #python-3.x #discord #discord.py

#python #python-3.x #Discord #discord.py

Вопрос:

Я пытаюсь внедрить систему отчетности на моем сервере discord, поэтому, когда модераторы не подключены к Сети, пользователи все равно могут отправлять отчет боту, и бот уведомит весь канал модератора.

Приведенный ниже код работал, когда я тестировал его от имени одного пользователя; однако я предполагал, что это будет не так просто. Когда пользователь выполняет команду !report, а другой пользователь отправляет сообщение боту, бот будет рассматривать это как один «сеанс».

Пожалуйста, посмотрите скриншоты ниже.

Я хочу, чтобы бот обрабатывал всех пользователей в их собственном «сеансе». Если кто-нибудь может указать мне правильное направление, я был бы очень признателен.

Для получения дополнительной информации первое изображение — ПОЛЬЗОВАТЕЛЬ A, 2-е изображение — ПОЛЬЗОВАТЕЛЬ B, а окончательное изображение — окончательный отчет. Как вы можете видеть, ПОЛЬЗОВАТЕЛЬ A выполняет команду, но если ПОЛЬЗОВАТЕЛЬ B также запускает DMS БОТА, он будет обрабатывать команду как один сеанс.

введите описание изображения здесь
введите описание изображения здесь
введите описание изображения здесь

 @client.event
async def on_message(message):
    if message.author == client.user:
        return
    if isinstance(message.channel, discord.DMChannel):
        if message.content.startswith("!report"):
            await message.channel.send("Who are we reporting?")
            await message.channel.send("Follow this format: n"
                                       "User: <enter user ID> (to get a user's id please right click their name and Copy ID) n"
                                       "Reason: <enter reason> (ex include but not limited too: bullying, harassment, "
                                       "offensive post ")

            msg = await client.wait_for('message')
            await message.channel.send("report received, an admin should be in contact with you soon")
            channel = client.get_channel(REPORT_CHANNEL)
            print(msg)
            await channel.send("report received from user: {}#{}, unique User ID {} ".format(msg.channel.recipient.name, msg.channel.recipient.discriminator, msg.channel.recipient.id))
            await channel.send(msg.content)
  

Ответ №1:

Это потому, что вы использовали подход к событию on_message. Лучший способ обрабатывать подобные сеансы — с помощью команд.

 q_list = [
"Question 1",
"Question 2",
"Question 3"
]

a_list = []

@client.command()
async def report(ctx):
    a_list = []
    submit_channel = client.get_channel(MODERATOR_CHANNEL_ID)
    channel = await ctx.author.create_dm()

    def check(m):
        return m.content is not None and m.channel == channel

    for question in q_list:
        asyncio.sleep(1)
        await channel.send(question)
        msg = await client.wait_for("message", check = check)
        a_list.append(msg.content)

    submit_wait = True
    while submit_wait:
        await channel.send("End of questions type 'submit' to finish")
        msg = await client.wait_for("message", check = check)
        if "submit" in msg.content.lower():
            submit_wait = False
            answers = "n".join(f"{a}. {b}" for a, b in enumerate(a_list, 1))
            submit_msg = f"Application from {ctx.author} nThe answers are:n{answers}"
            await submit_channel.send(submit_msg)