Тема 2 из 6

События и сообщения

discord.py — библиотека для ботов Discord: модерация, музыка, игры и викторины на серверах. Как и aiogram, она асинхронная.

В курсе вы соберёте бота для мини-викторины: команды, красивые карточки-эмбеды, кнопки и подсчёт очков.

Подготовка бота

  1. Откройте Discord Developer Portal, нажмите New Application, придумайте имя.
  2. Во вкладке Bot нажмите Reset Token и скопируйте токен — это пароль бота, никому его не показывайте. Там же включите Message Content Intent.
  3. Во вкладке OAuth2 → URL Generator отметьте bot и права (Send Messages, Read Message History), откройте ссылку и добавьте бота на свой сервер.

Минимальный бот

import os
import discord

intents = discord.Intents.default()
intents.message_content = True          # разрешение читать текст сообщений
client = discord.Client(intents=intents)


@client.event
async def on_ready():
    print(f"Бот {client.user} запущен")


@client.event
async def on_message(message):
    if message.author.bot:              # не отвечаем ботам и себе
        return
    if message.content == "!ping":
        await message.channel.send("Pong!")


client.run(os.getenv("DISCORD_TOKEN"))
  • Intents — какие события бот хочет получать. Текст сообщений — «привилегированное» намерение: его включают и в коде, и в Developer Portal;
  • @client.event подписывает функцию на событие по её имени: on_ready, on_message, on_member_join, on_reaction_add…;
  • client.run(token) подключается к Discord и работает, пока программу не остановят.

Сообщение

  • message.content — текст; message.author — автор: display_name (имя на сервере), id (постоянный номер), bot (бот ли это);
  • message.channel.send(текст) — ответ в тот же канал, message.reply(текст) — ответ с цитатой, message.author.send(текст) — в личку;
  • все эти методы — корутины, их вызывают через await.

on_message получает все сообщения, включая сообщения самого бота. Поэтому первая строка почти всегда — проверка message.author.bot: иначе два бота могут отвечать друг другу бесконечно.

Как проверяются задачи

В задачах логика бота вынесена в функцию handle(message), которую вызывает on_message. Проверка подаёт ей готовые сообщения без Discord и печатает ответы бота. Чтобы запустить бота по-настоящему, задайте переменную окружения DISCORD_TOKEN и нажмите «Запустить у себя».

Итог

  • discord.Client(intents=…), message_content = True;
  • @client.event + on_ready, on_message;
  • message.content, message.author.id / display_name / bot;
  • await message.channel.send(...); ботам не отвечаем.