Я разработал бота, который слушает сообщения через DM. Пользователю задаются различные вопросы, на которые он должен ответить в течение 30 секунд. Бот отправляет вопросы пока что, но иногда отправляет сразу два вопроса и потом засчитывает собственное сообщение как ответ. Как я могу этого избежать?
@commands.command(aliases=["sap"])
@commands.cooldown(1, 100, BucketType.user)
async def sendapply(self, ctx):
await ctx.author.send("Bitte beantworte jede Frage innerhalb von **30 Sekunden.**")
questions = ["**Wie heißt du?**",
"**Erzähl uns etwas von dir.**",
"**Warum hast du dich beworben?**"]
answers = []
for i in questions:
await ctx.author.send(i)
try:
msg = await self.bot.wait_for('message', timeout=30.0)
except asyncio.TimeoutError:
await ctx.author.send("Du hast die Frage nicht rechtzeitig beantwortet. Bitte erneut probieren.")
return
else:
answers.append(msg) # append the message object instead of the content
channel = self.bot.get_channel(790190364522184724)
e = discord.Embed(color=ctx.author.color)
e.title = "Neue Bewerbung!"
e.description = f"**Wie heißt du?:** {answers[0].content}\n **Zu dir:** {answers[1].content}\n **Warum hast du dich beworben?:** {answers[2].content}"
e.set_footer(text=f"ID: {ctx.author.id}")
e.timestamp = datetime.datetime.utcnow()
await channel.send(embed=e)
Должен ли я использовать что-то вроде прослушивателя процессов?
wait_for
принимает аргумент проверки, используйте его.
def check(m):
return m.id == ctx.author.id
msg = await self.bot.wait_for('message', timeout=30.0, check=check)
Подробнее об этом можно прочитать здесь
Чтобы прочитать личное сообщение и избежать чтения ботом собственных сообщений, можно использовать следующий метод:
def check(m):
return ctx.author == m.author and isinstance(m.channel, discord.DMChannel)
Здесь мы сначала проверяем, что человек, отвечающий на вопросы, также выполнил команду, а затем, что эти ответы также отправляются в личном сообщении.
Почему-то бот не читает мои сообщения, которые я ему отправил, он просто выдает мне сообщение о тайм-ауте. Тем временем я просмотрел документы.