Я разрабатываю бота Discord, который выполняет следующие действия: 1) перехватывает ссылку в определенных текстовых каналах и удаляет ее 2) отправляет встраивание в канал «журнала», предоставляющее информацию о нарушении. 3) Затем бот отправляет второе встраивание, к которому он добавляет две реакции, встраивание спрашивает, хотите ли вы заблокировать пользователя или нет. 4) Реагирование с помощью эмодзи: успех: пользователь забанен, реакция: отказано: пользователь не забанен. В обоих случаях второе встраиваемое сообщение модифицируется результатом выполненного действия.
Все это работает идеально только в том случае, если в канале «журнал» находится только один запрос подтверждения бана. Если есть несколько ожидающих запросов, все перестает работать должным образом. I wi sh может быть несколько запросов на подтверждение блокировки. Как я могу это сделать?
Код начинается с функции on_message, внутри я вспоминаю две функции, которые выполняют то, что я описал выше:
@commands.Cog.listener()
async def on_message(self, message):
await self.bot.process_commands(message)
if re.findall('http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', message.content.lower()):
if str(message.channel.id) not in channel_id:
await message.delete()
await filter_logs(message, "**MESSAGGIO FILTRATO**", None, message.author, message.channel.mention, message.content, "**BAN**", message.author.id, "**LINK**")
await emoji_react(message, "ban", message.author.id, "SPAM", self.bot)
Ниже приведены две функции, вызываемые в on_message :
channel_id = ["713828556374802512", "713828588071157812"]
async def filter_logs(message, title, motivation, user, channel, content, action, user_id, filter):
embed = discord.Embed(title=title, color=0xe74c3c)
embed.add_field(name="Utente:", value=user.mention+" ({})".format(user_id), inline=False)
embed.add_field(name="Canale:", value=channel, inline=False)
embed.add_field(name="Filtro:", value=filter, inline=False)
embed.add_field(name="Messaggio:", value=content, inline=False)
embed.add_field(name="Provvedimento:", value=action, inline=False)
for channels in message.guild.channels:
if str(channels) == "log":
await channels.send(embed=embed)
async def emoji_react(message, action, user, reason, bot):
embed = discord.Embed(title="**Effettuare il**"+" **{}**?".format(action), color=0xe74c3c)
success = bot.get_emoji(714190878641619084)
denied = bot.get_emoji(714190866465685525)
bot_id = bot.get_user(635136137966387210)
guild = bot.get_guild(701228747495309312)
for channels in message.guild.channels:
if str(channels) == "log":
if(success != None):
global msg
msg = await channels.send(embed=embed)
await msg.add_reaction(success)
await msg.add_reaction(denied)
else:
print("error")
def check(reaction, user_12):
if (user_12 != bot_id):
return (reaction.emoji == success) or (reaction.emoji == denied)
try:
reaction, user_12 = await bot.wait_for('reaction_add', check=check)
if reaction.emoji == success:
await msg.clear_reactions()
await guild.ban(discord.Object(id=user), reason = reason)
embed_ban = discord.Embed(title="**UTENTE BANNATO**", color=0xe74c3c)
await msg.edit(embed=embed_ban)
elif reaction.emoji == denied:
embed_null = discord.Embed(title="**BAN UTENTE ANNULLATO**", color=0xe74c3c)
await msg.edit(embed=embed_null)
await msg.clear_reactions()
except asyncio.TimeoutError:
return
Спасибо тем, кто потратит свое время, чтобы помочь мне решить эту проблему.
Вот изображение вставок, отправленное в «лог»: