Гайд Курс по написанию дискорд бота на библиотеке PyCord №1

Начинающий
Статус
Оффлайн
Регистрация
15 Окт 2023
Сообщения
4
Реакции[?]
3
Поинты[?]
2K
Итак! всем привет, моя первая тема на этом аккаунте :CoolCat:
Сегодня речь пойдет и написании дискорд бота, с использованием мини-стека а т.е PyCord и Motor (Async Pymongo, библиотека для работы с базой данных MongoDB)

Сначала объясню почему я выбрал именно этим библиотеки

Pycord - Неплохой форк discord.py, ранее пользовался и буду пользоваться nextcord`om, но он более нудный и в каких то ситуациях отличается от пайкорда, но все же новичкам в Python и вообще в этой теме я 100% могу порекомендовать пайкорд, ну и даже если вы захотите написать на другой библиотеке которая является форком Discord.py, вы спокойно сможете адаптировать код написанный в этой теме

Motor - Ничем не отличается от Pymongo, НО! Это асинхронная библиотека, благодаря которой в некоторых ситуациях действия связанные с DB могут производиться быстрее

В моем случае я буду использовать Visual Studio Code, а вы используете любой другой IDE или же текстовый редактор

создаем папку с любым названием и заходим в нее в vscode
после чего создаем файл с названием base.py

Отлично! уже пол работы сделано, жмем на 3 точки сверху, и нажимаем на Terminal -> New terminal
Или просто нажимаем горячие клавиши CTRL+SHIFT+`

в терминал мы вводим команду для создания виртуального окружения
python -m venv .bot

после чего мы должны зайти в каталог с нашим окружением, если этого не произошло и появилась ошибка, советую зайти в Windows Powershell и ввести туда эту команду Set-ExecutionPolicy -Scope CurrentUser RemoteSigned, это должно вылечить ошибку

И ВОТ ТЕПЕРЬ можем начинать нашу групповую мастурбацию с установкой

качаем данные библиотеки :
pip install py-cord, pip install python-dotenv, pip install motor, pip install Pillow

практический все, теперь в каталоге где находится base.py, нужно создать файл .env, туда мы впишем такое

TOKEN='Токен вашего бота'


И наконец то мы можем приступать к коду

Начальный код бота будет примерно вот таким

Python:
from dotenv import load_dotenv
from os import getenv # Метод для получения переменных из ENV
import discord

bot = discord.Bot(
    intents=discord.Intents.default()
) # Инициализируем бота
load_dotenv() # Загружаем все переменные ENV

@bot.event # Событие при запуске
async def on_ready():
    print(f"{bot.user} Запущен, Задержка -> {bot.latency}ms")

bot.run(getenv('TOKEN'))
Бот уже будет работать, но ему же нужен какой то функционал? правда же?

Предлагаю реализовать небольшую команду под названием Shakal / CompressJPG

Её функционал будет заключаться в изменении качества фото благодаря библиотеке PILLOW

Вот собственно ее код:
Код:
@bot.slash_command(description='Уменьшение качества картинки', name='shakal') # Декоратор команды
@option(name='image',
        type=discord.Attachment, # Тип аргумента
        description='Фото для шакализации',
        required=True) # Декоратор для настройки аргумента
@option(name='quality',
        type=int, # Тип аргумента
        description='Сила сжатия (100 Слабо, 0 Сильно)',
        required=True) # Декоратор для настройки аргумента
async def compress(interaction: discord.ApplicationContext, attachment: discord.Attachment, quality: int):
    data = io.BytesIO(await attachment.read()) # Читаем по байтам наше фото

    image = Image.open(fp=data).convert('RGB') # Создаем экземпляр фото, т.е открываем через байты

    data_compress = io.BytesIO() # Создаем новый буфер
    image.save(fp=data_compress, format='JPEG', quality=quality) # Сохраняем фото в буфер, но с новым качеством
    data_compress.seek(0) # Открытие файла

    await interaction.response.send_message(file=discord.File(fp=data_compress,
                                                              filename='compress.png')) # Отправка нового фото
Алгоритм довольно легкий, и еще тут за место сохранения файла на ваш ПК, идет сохранение в буфере, ведь это удобнее и более оптимизированное решение

Вот такой результат мы имеем



И вот такой небольшой код:

Python:
from dotenv import load_dotenv
from os import getenv # Метод для получения переменных из ENV
import io
from PIL import Image

import discord
from discord import option

bot = discord.Bot(
    intents=discord.Intents.default()
) # Инициализируем бота
load_dotenv() # Загружаем все переменные ENV

@bot.event # Событие при запуске
async def on_ready():
    print(f"{bot.user} Запущен, Задержка -> {bot.latency}ms")

@bot.slash_command(description='Уменьшение качества картинки', name='shakal') # Декоратор команды
@option(name='image',
        type=discord.Attachment, # Тип аргумента
        description='Фото для шакализации',
        required=True) # Декоратор для настройки аргумента
@option(name='quality',
        type=int, # Тип аргумента
        description='Сила сжатия (100 Слабо, 0 Сильно)',
        required=True) # Декоратор для настройки аргумента
async def compress(interaction: discord.ApplicationContext, attachment: discord.Attachment, quality: int):
    data = io.BytesIO(await attachment.read()) # Читаем по байтам наше фото

    image = Image.open(fp=data).convert('RGB') # Создаем экземпляр фото, т.е открываем через байты

    data_compress = io.BytesIO() # Создаем новый буфер
    image.save(fp=data_compress, format='JPEG', quality=quality) # Сохраняем фото в буфер, но с новым качеством
    data_compress.seek(0) # Открытие файла

    await interaction.response.send_message(file=discord.File(fp=data_compress,
                                                              filename='compress.png')) # Отправка нового фото


bot.run(getenv('TOKEN'))

Вот такой небольшой гайдец вышел, если вам понравится то напишу вторую часть где мы задействуем Motor (пока можно не устанавливать)
 
Пользователь
Статус
Оффлайн
Регистрация
28 Фев 2019
Сообщения
650
Реакции[?]
141
Поинты[?]
30K
Такими гайдами плодятся говноводы на югейме, гайд сплошной бессмысленный текст, где требуется ctrl+c+ctrl+v, если уж на то пошло, то самым адекватным решением будет выучить питон до уровня понимания ооп и асинхронности, научиться читать документацию я можно глянуть нормальный гайд от самого пайкорда
Пожалуйста, авторизуйтесь для просмотра ссылки.
 
Сверху Снизу