Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Программирование простого дискорд бота на пайтоне

Матвей Матвиенко Знаток (437), на голосовании 4 месяца назад
import discord

TOKEN = 'ТОКЕН БОТА'

intents = discord.Intents.default()
intents.message_content = True
client = discord.Client(intents=intents)

message_number = 1

def check_message(message):
if '0' in message.content:
return True
return False

@client.event
async def on_ready():
print(f'Logged in as {client.user}')

@client.event
async def on_message(message):
global message_number

if message.author == client.user or not isinstance(message.channel, discord.DMChannel):
return

if check_message(message):
user = await client.fetch_user(id)
sent_message = await user.send(f'Запрос #{message_number}: {message.content}')
message_number += 1
await sent_message.add_reaction('✅')

@client.event
async def on_reaction_add(reaction, user):
global message_number

if user == client.user:
return

if str(reaction.emoji) == '✅' and reaction.message.author.id == id and reaction.message.content.startswith('Запрос #'):
message_number -= 1
await reaction.message.delete()
user = await client.fetch_user(id)
await user.send(f'Запрос выполнен ({message_number})')

client.run (TOKEN)


Работа с ботом осуществляется в личных сообщениях дискорда

Основная задача бота:
Сбор запросов с участников некоторого сервера и передача администратору.


Проблема:
не выполняется блок, который отвечает за то что:

по нажатию реакции, которую бот добавляет сразу после того как отправил сообщение, должно удалиться сообщение, под которым была добавлена реакция, а также вывод сообщения о том, что запрос выполнен
----
Подскажите пожалуйста, как исправить проблему, код вроде правильно написан, но не работает.

Ломаю над этим голову уже второй день
Голосование за лучший ответ
Денис природа Просветленный (20379) 5 месяцев назад
ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ
Татьяна Просветленный (36384) 5 месяцев назад
Ваш код выглядит практически верным, но есть несколько моментов, которые следует поправить и улучшить:
Использование id без определения.
Обработка проверки сообщений и реакции должна быть чуть лучше структурирована.
Добавление некоторого улучшения для отладки.
Используйте актуальные версии API.
исправленный и улучшенный вариант вашего кода:
 import discord 
from discord.ext import commands

# Замените это на реальный токен вашего бота
TOKEN = 'ТОКЕН БОТА'

# Создаём объект бота
intents = discord.Intents.default()
intents.message_content = True
bot = commands.Bot(command_prefix='!', intents=intents)

message_number = 1

def check_message(message):
if '0' in message.content:
return True
return False

@bot.event
async def on_ready():
print(f'Logged in as {bot.user}')

@bot.event
async def on_message(message):
global message_number

if message.author == bot.user or not isinstance(message.channel, discord.DMChannel):
return

if check_message(message):
user = await bot.fetch_user(message.author.id)
sent_message = await user.send(f'Запрос #{message_number}: {message.content}')
message_number += 1
await sent_message.add_reaction('✅')

await bot.process_commands(message) # добавлено для обработки команд

@bot.event
async def on_reaction_add(reaction, user):
global message_number

if user == bot.user:
return

if str(reaction.emoji) == '✅' and reaction.message.author == bot.user and reaction.message.content.startswith('Запрос #'):
message_number -= 1
await reaction.message.delete()
user = await bot.fetch_user(reaction.message.channel.recipient.id)
await user.send(f'Запрос выполнен ({message_number})')

bot.run(TOKEN)
Некоторые моменты, на которые следует обратить внимание:
  1. Переход на commands.Bot: Использование commands.Bot предоставляет более функциональные возможности, такие как обработка команд.
  2. Исправление использования id: Теперь message.author.id и reaction.message.channel.recipient.id используются для получения идентификатора пользователя.
  3. Проверка bot.process_commands: Добавляем вызов bot.process_commands(message), чтобы позволить боту обрабатывать команды, даже если вы не используете их в данном коде.
Похожие вопросы