0

Создаём Discord-бота на Python

Всем привет, сегодня мы напишем Discord-бота на Python и discord.py + бонусом посмотрим на примеры ботов. Приступим 🙂

Перед работой

Перед тем, как начать, вам нужны:

  1. Python 3;
  2. discord.py;
  3. Discord-аккаунт и свой сервер.

Для установки discord.py воспользуйтесь пакетным менеджером:

pip3 install discord.py

Создаём нашего бота

Перейдите на Developer Portal и нажмите на New application.

Вы создали своё приложение, на странице приложение перейдите в Bot >> Add Bot и создайте своего Discord-бота.

Сохраните токен бота! Дальше он нам понадобится!

Если всё прошло успешно, поздравляю, половина дела сделана 😀

Добавление бота на сервер

Теперь можно добавить бота на сервер.

Перейдите в OAuth2 >> URL Generator, в Scopes выбираем Bot и ниже — права бота, копируем сгенерированный URL. Вставляем в браузер, и добавляем на наш сервер.

Эхо-бот

Напишем традиционного эхо-бота, и разберём каждую строчку кода.

Код:

import discord
from discord.ext import commands

config = {
    'token': 'your-token',
    'prefix': 'prefix',
}

bot = commands.Bot(command_prefix=config['prefix'])

@bot.event
async def on_message(ctx):
    if ctx.author != bot.user:
        await ctx.reply(ctx.content)

bot.run(config['token'])

Пример работы:

Разбор:

import discord
from discord.ext import commands

Нужные нам импорты.

config = {
    'token': 'your-token',
    'prefix': 'prefix',
}

Вспомогательный словарь config в котором храним токен и префикс команд (далее расскажу зачем нужен префикс команд).

bot = commands.Bot(command_prefix=config['prefix'])

Создаём нашего бота, в аргументе передаём префикс.

@bot.event

Декоратор, предназначенный для обработки событий, подробнее здесь.

async def on_message(ctx):

Создаём асинхронную функцию, с параметром ctx, представляет из себя сообщение.

if ctx.author != bot.user:

Проверка, не является ли автор сообщения нашим Discord-ботом. Дело в том, что если бот отправит сообщение, это будет новым событием, и тогда получается цикл.

await ctx.reply(ctx.content)

Отвечаем на сообщение (ctx.reply), в аргументы передаём сообщение (ctx.content).

bot.run(config['token'])

Запускаем нашего бота, в аргументы передаём токен бота.

Надеюсь вы разобрались с кодом, и мы можем переходить далее.

Обработка команд

Перед тем, как обрабатывать команды, нам пригодится наш префикс.

Рассмотрим код:

import random
import discord
from discord.ext import commands

config = {
    'token': 'your-token',
    'prefix': '$',
}

bot = commands.Bot(command_prefix=config['prefix'])

@bot.command()
async def rand(ctx, *arg):
    await ctx.reply(random.randint(0, 100))

bot.run(config['token'])

Результат работы:

Разбор:

@bot.command()

Декоратор обработки команд

async def rand(ctx, *arg):

Асинхронная функция rand

await ctx.reply(random.randint(0, 100))

Отвечаем на сообщение, в аргументы передаём случайное число от 0 до 100

Бонус

Проверка роли:

import random
import discord
from discord.ext import commands

config = {
    'token': 'your-token',
    'prefix': '$',
}

bot = commands.Bot(command_prefix=config['prefix'])

@bot.command()
@commands.has_role("Хозяин")
async def rand(ctx, *arg):
    await ctx.reply(random.randint(0, 100))

bot.run(config['token'])

Выгнать пользователя

import discord
from discord.ext import commands

config = {
    'token': 'your-token',
    'prefix': '$',
}

bot = commands.Bot(command_prefix=config['prefix'])

@bot.command()
async def kick(ctx, user : discord.User(), *arg, reason='Причина не указана'):
    await bot.kick(user)
    await ctx.send('Пользователь {user.name} был изгнан по причине "{reason}"')

bot.run(config['token'])