Всем привет, сегодня мы напишем Discord-бота на Python и discord.py + бонусом посмотрим на примеры ботов. Приступим 🙂
Перед работой
Перед тем, как начать, вам нужны:
- Python 3;
- discord.py;
- 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'])