#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)