Бот дискорд добавляет эмоции на чужие сообщения и пытается их отредактить (python)

Недавно я сделал функцию опроса в боте. По идее она должна работать так: ты отправил сообщение kb!poll Почему я не могу заснуть?%%Я выпил слишком много кофе%%Просто так и бот отправит сообщение Soon, а потом изменит его на голосование и добавит реакции. Но бот добавляет реакции на сообщение с командой и пытается его отредактить. Как исправить? Вот код:

client = discord.Client()

@client.event

 if message.content.startswith("kb!poll "): #Опрос
  await message.channel.send("Soon...")
  msg = message.content.replace("jb!poll ", "")
  args = msg.split("%%")
  if len(args) > 1 and len(args) <= 10:
   title = args[0]
   del args[0]
   answers = args
   emojis = ["1️⃣", "2️⃣", "3️⃣", "4️⃣", "5️⃣", "6️⃣", "7️⃣", "8️⃣", "9️⃣", "?"]
   content = ""
   for c in range(len(answers)):
    emote = emojis[c]
    a = answers[c]
    content += emote 
    content += a
    content += "\n"
    await message.add_reaction(emote)
   emb = discord.Embed(title=title, description=content)
   emb.set_author(name="Голосование!")
   await message.edit(content=f"Голосование от {message.author.mention}", embed=emb)
  else:
   await message.channel.send(content=f'Неверное кол-во аргументов в "{message.content}". Если не знаешь как это сделать, то вот пример: kb!poll Заголовок%%1й вариант%%2й вариант. Максимальное количество вариантов: 10')

Ответы (1 шт):

Автор решения: denisnumb

Проблема в том, что бот не имеет права редактировать чужое сообщение. Событие on_message(message) отлавливает объект сообщения message, который вы потом пытаетесь изменить через бота.


Наверное, здесь лучшим решением будет отправить сформированный опрос от лица бота и уже туда поставить реакции.

Рабочий код:

@client.event
async def on_message(message):
    if message.content.startswith("kb!poll "): #Опрос
        await message.channel.send("Soon...")
        msg = message.content.replace("jb!poll ", "")
        args = msg.split("%%")
        if len(args) > 1 and len(args) <= 10:
            title = args[0]
            del args[0]
            answers = args
            emojis = ["1️⃣", "2️⃣", "3️⃣", "4️⃣", "5️⃣", "6️⃣", "7️⃣", "8️⃣", "9️⃣", "?"]
            content = ""
            for c in range(len(answers)):
                emote = emojis[c]
                a = answers[c]
                content += emote 
                content += a
                content += "\n"
            emb = discord.Embed(title=title, description=content)
            emb.set_author(name="Голосование!")
            bot_message = await message.channel.send(content=f"Голосование от {message.author.mention}", embed=emb)
            for c in range(len(answers)): await bot_message.add_reaction(emojis[c])
        else:
            await message.channel.send(content=f'Неверное кол-во аргументов в "{message.content}". Если не знаешь как это сделать, то вот пример: kb!poll Заголовок%%1й вариант%%2й вариант. Максимальное количество вариантов: 10')

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


Также на вашем месте я бы посмотрел на discord.ext.commands.Bot Это по сути тот же самый discord.Client(), только этот бот умеет также обрабатывать отдельные команды, начинающиеся в чате с указанного префикса. В вашем случае префикс - kb!poll

Тогда команду можно было бы оформить в отдельную функцию. Например так:

import discord
from discord.ext import commands
from discord import utils

bot = commands.Bot(command_prefix='kb!poll ')

emoji = ['1️⃣', '2️⃣', '3️⃣', '4️⃣', '5️⃣', '6️⃣', '7️⃣', '8️⃣', '9️⃣', '?']

@bot.command()
async def opros(ctx, anon, title, *, var):
    if anon == '+':
        anon = True
    else:
        anon = False

    embed = discord.Embed(title=f"{title}", color=discord.Colour.gold(), timestamp=ctx.message.created_at)
    if anon:
        embed.add_field(name=f'Анонимный опрос', value='*Голосование через реакции*', inline=True)
    else:
        embed.add_field(name=f'Публичный опрос', value='*Голосование через реакции*', inline=True)
    embed.set_footer(text=f'{ctx.message.author.name} создал опрос', icon_url = ctx.message.author.avatar_url)
    
    variants = var.split('\n')

    i = 0
    for var in variants:
        if i < 10:
            i += 1
            embed.add_field(name=f'{i}. {var}', value='Голоса: 0', inline=False)
    try:
        embed.set_image(url = ctx.message.attachments[0].url)
    except:
        pass

    msg = await ctx.send(embed=embed)
    for i in range(len(variants)):
        await msg.add_reaction(emoji[i])


@bot.event
async def on_raw_reaction_add(payload):
    global guild
    if payload.user_id != bot.user.id:
        channel = bot.get_channel(payload.channel_id)
        message = await channel.fetch_message(payload.message_id)
        member = utils.get(message.guild.members, id=post[0])
        emoji = str(payload.emoji)

Результат: введите сюда описание изображения

→ Ссылка