Skip to content

Latest commit

 

History

History
208 lines (153 loc) · 17.7 KB

README.md

File metadata and controls

208 lines (153 loc) · 17.7 KB

discord_economy_bot_rus

Guide Book по созданию Discord бота с использованием sqlite3

Дата написания данного гайда 05.05.2021 Библиотека discord.py может обновляться, поэтому после крупных патчей разработка бота может отличаться. В любом случае ближайшие несколько месяцев данный гайд будет актуален.

Что нам потребуется?:

  1. Стабильное интернет соединение
  2. Знания языка Python на неплохом уровне
  3. Умение "гуглить" и находить нужную информацию
  4. Среда для написания кода
  5. Желательно понимать что такое DataBase и как с ним работать используя библиотеку sqlite3

Я советую для разработки бота создать отдельный сервер в Дискорде, где мы будем проверять нашего бота, потому что почти ни у кого не получается запустить сложный код с первого раза, а спамить другим не очень хочется.

Создание Application'a:

Для начала нам нужно создать Discord Application, для этого мы должны перейти по этой ссылке: https://discord.com/developers/applications. После успешного входа в ваш аккаунт Discord, вам нужно нажать на кнопку New Application и выбрать имя для приложения. ВАЖНО: ИМЯ ДЛЯ САМОГО БОТА ДИСКОРДА МЫ БДЕМ НАСТРАИВАТЬ ПОЗЖЕ.

После создания Application'а мы должны перейти во вкладку Bot, а затем нажать на кнопку Add Bot.

Если у вас появилось зеленая надпись по типу: A wild bot has appeared!, значит вы всё сделали правильно и бот у вас уже создан.

Подключаем нашего бота к серверу:

Для того чтобы подключить бота к вашему серверу Дискорд, нужно следовать простым инструкциям:

  1. Нужно получить Client_ID вашего бота. Для этого мы переходим во вкладку General Information и копируем его нажав на кнопку Copy.

  2. Копируем эту ссылку ==> https://discordapp.com/oauth2/authorize?&client_id=(тут)&scope=bot&permissions=8

  3. В эту ссылку вместо слова "тут" вставляем наш Client_ID. Скобки естественно убираем. Доп. информация: В нашей ссылке bot&permissions=8 означает что наш permissions integer равен 8. Проще говоря, это число отвечает за то, какие права будут выданы боту при подключении. Этот код можно узнать во вкладке Bot (в которой мы создавали бота). Пролистав вниз, вы сможете сами выбрать нужные вам права, но я советую оставить 8, так как если вы будете сами выбирать права, могут произойти казусные ситуации при работе с ботом.

  4. После создания нашей ссылки мы переходим по ней, выбираем сервер на который хотите пригласить бота и нажимаем кнопку Авторизовать. После прохождения капчи наш бот успешно присоединится к серверу, но будет оффлайн. Не пугайтесь, это нормально, ведь наш бот еще не запущен.

Создание проекта:

Ну вот мы и готовы начать писать код для нашего прекрасного бота. Если вы знаете Python на ОЧЕНЬ низком уровне, я советую воздержаться от создания ботов и заняться чем нибудь более простым.

Для начала я советую создать пустую папку где мы будем хранить все файлы для нашего бота.

Затем если у вас не установлена библиотека discord.py, вам нужно её устновить. Для этого переходим в командную строку и пишем: pip install discord.py Внимание, для установки библиотек требуется pip, если он у вас не установлен, то гугл в помощь ^_^

После успешной установки библиотеки, переходим в вашу любимую среду разработки, в моём случае это PyCharm. Затем создаем новый файл Python файл с названием "main" (такое название не даст вам запутаться) и расширением .py и сразу сохраняем его в нашей папке с проектом.

Создаем еще один файлик .py названием config, для хранения в нём опасных данных. Почему мы не можем просто создать переменные с этими данными? Всё очень просто. Это самый простой способ защитить себя от злоумышленников. Если кто-то каким-то образом получит ваш код, то не сможет управлять вашим ботом. Все наши токены будут хранится в отдельном файлике.

В файле config.py создаем словарь, к которому мы будем обращаться при работе в ботом:

settings = {
    'token': 'Введите ваш токен',
    'bot': 'Название вашего бота',
    'id': 'id вашего бота (без кавычек)',
    'prefix': 'префикс'
}

Подготовка к работе с sqlite3:

Для того чтобы нам работать с sqlite3 мы можем использовать cmd (Командную строку) или же использовать очень удобное приложение которое называется DB Browser for sqlite3. Установить его можно здесь: https://sqlitebrowser.org/ (Создание таблиц я буду проводить в этой программе)

Переходим в установленный DB Browser и нажимаем на кнопку "Новая база данных". Затем выбираем путь к нашему проекту и указываем название, я поставил "bot_test".

Можно переходить к созданию таблиц для работы. Самая первая таблица будет называться users, в неё мы будем записывать данные и пользователях (никнеймы, id, "упоминания и т.д.")

Нажимаем на кнопку создать таблицу и указываем в названии "users". Затем записываем в таблицу наши данные, а именно:

  • "id" INTEGER,
  • "nickname" TEXT,
  • "mention" TEXT,
  • "money" INTEGER

После всех махинаций наша таблица в режиме пред.осмотра должна выглядеть так:

CREATE TABLE "users" (
	"id"	INTEGER,
	"nickname"	TEXT,
	"mention"	TEXT,
	"money"	INTEGER
);

Создаем вторую таблицу, которая называется shop (в нем будем хранить данные о товарах):

CREATE TABLE "shop" (
	"name"	TEXT,
	"type"	TEXT,
	"cost"	INTEGER,
	"id"	INTEGER
);

Ну вот мы и готовы начинать писать код:

Для начала нам нужно импортировать все нужные библиотеки:

import discord
import sqlite3
from discord.ext import commands
from config import *

Написание "тела" для бота и первый запуск:

Я буду стараться объяснять подробно каждый шаг и каждую строчку, потому что на первый взгляд это может показаться сложным, хотя таковым не является.

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

Переменная bot - это "тело" нашего бота. Ему мы присваиваем значение commands.Bot с определёнными аргументами.

command_prefix=settings['prefix'] - это аргумент, в который мы вписываем значение нашего префикса. settings['prefix'] означает, кто мы обращаемся к словарю settings (который мы импортировали из файла config.py) и обращаемся к ключу prefix, в котором вписано нужное нам значение.

intents = discord.Intents.all()

Этой строчкой мы подключаем намерения к Discord боту. ВАЖНО: ЕСЛИ ВЫ ПОДКЛЮЧАЕТЕ НАМЕРЕНИЯ ВЫ ДОЛЖНЫ ТАК-ЖЕ ВКЛЮЧИТЬ ИХ НА САЙТЕ DISCORD DEVELOPERS В НАСТРОЙКАХ ВАШЕГО БОТА.

В discord py как и во всех мессенджерах есть ивенты. К примеру в discord.py есть ивент, который называется on_ready. Он срабатывает, когда бот подключился к серверам Discord и готов к работе.

@bot.event
async def on_ready():
    print('Bot launched successfully :)')
    print(f'My name is {bot.user.name}')
    print(f'My client id is {bot.user.id}')
    for guild in bot.guilds:
        print(f'Connected to server, id is: {guild.id}')
        for member in guild.members:
            cursor.execute(f"SELECT id FROM users where id={member.id}")
            if cursor.fetchone() is None:
                cursor.execute(
                    f"INSERT INTO users VALUES ({member.id}, '{member.name}', '<@{member.id}>', 0)")
            else:
                pass
            data_base.commit()

Ниже я написал пример того, как может быть написан ивент on_ready с использованием sqlite3. Такой метод работает только для одного сервера. Так-же у объекта bot, который мы создали есть большое количество методов, о которых я не вижу смысла рассказывать, так как это займет большое количество времени. Но если вам интересно то вот ссылка на документацию: https://discordpy.readthedocs.io/en/stable/#

В данном фрагменте кода мы просто перечисляем всех участников сервера и добавляем в базу данных, если их еще там нет. В качестве аргументов в таблицу BD мы указываем: ID пользователя, Отображаемое имя, mention(то есть упоминание пользователя), а так-же количество денег которое ему дается при старте.

Мне кажется вам уже не терпится протестировать бота, поэтому мы в конце должны добавить еще одну строчку кода, которая запустит нашего бота.

bot.run(settings['token'])

Ну тут мы просто используем метод run, который запускает бота. В качестве аргумента используем токен, который у нас хранится в файлике config в словаре settings.

Если вы всё сделали правильно у вас есть база данных со всеми пользователями. Только есть небольшая проблемка: Пользователи даже не могут проверить сколько денег у них на балансе :(

Предлагаю создать команду !balance, которая позволит нам проверять сколько денег на данный момент у пользователя, написавшего команду.

@bot.command()
async def balance(ctx):
    for row in cursor.execute(f"SELECT nickname, money FROM users where id={ctx.author.id}"):
        embed = discord.Embed(title=f'Аккаунт пользователя {row[0]}', color=0x42f566)
        embed.add_field(name='Баланс:', value=f'{row[1]} SH', inline=False)
        await ctx.send(embed=embed)

Тут я использую крутую фишку Discord'a, которая называется Embed. По факту это красивый вывод информации, который можно кастомизировать.

Просто создаем объект класса Embed и используем большое кол-во разнообразных методов которые сделают из неё конфетку. Как это работает можно так-же посмотреть на оф.сайте discord.py, хотя тут по названиям и аргументам и так понятно что к чему.

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

Исходя из предыдущих функций и ивентов мы научились получать информацию из BD и заносить её в таблицу. Давайте научимся ОБНОВЛЯТЬ информацию с помощью sqlite. Покажу на примере функции, которая выдает какое-либо количество денег пользователю.

async def give_money(ctx, mention, money):
    try:
        mention = str(mention).replace('!', '')
        for row in cursor.execute(f'SELECT money FROM users where mention=?', (mention,)):
            cursor.execute(f'UPDATE users SET money={int(money) + row[0]} where mention=?', (mention,))
        data_base.commit()
        for row in cursor.execute(f'SELECT nickname FROM users where mention=?', (mention,)):
            embed = discord.Embed(title='Пополнение баланса', color=0x42f566)
            embed.set_author(name='Community Bot')
            embed.add_field(name='Оповещение', value=f'Баланс пользователя {row[0]} пополнен на {money} SH')
            await ctx.send(embed=embed)
    except Exception as E:
        print(f'give_money command error: {E}')
        embed = discord.Embed(title='Оповещение', color=0xFF0000)
        embed.add_field(name='Оповещение', value='Ошибка при выполнение программы.')
        await ctx.send(embed=embed)

Прошу заметить что в данном случае в качестве аргументов: ctx (который является объектов класса Contex, упоминание (То есть mention) и кол-во денег). Советую всегда использовать Try при создании крупных функций для того чтобы быстро понять где вы допустили ошибку. В моем случае если человек ввел неправильные данные при использовании команды ему выводиться красивое оповещение об этом. Так-же не забываем про переводы переменных в другие типы данных, чтобы избежать казусов со складыванием str и int.

При использовании Discord Embed, а именно в выборе цвета при создании объекта, я долго тупил как поменять цвет. Discord Embed использует hex colors, то есть Web colors, которые используются например в HTML и т.д. и т.п.

Я думаю что я довольно подробно рассказал о слиянии Discord.py и sqlite3. Это очень просто. Я понимаю что тут могут быть люди, которые вообще ничего не понимают в Discord.py, поэтому я советую посетить им мой другой репозиторий https://github.com/MishaSok/discord_bot_quick_start_rus, в котором вы сможете найти мой подробный гайд о том как начать писать ботов для Discord.