-
Автор темы
- #1
Итак! всем привет, моя первая тема на этом аккаунте
Сегодня речь пойдет и написании дискорд бота, с использованием мини-стека а т.е PyCord и Motor (Async Pymongo, библиотека для работы с базой данных MongoDB)
Сначала объясню почему я выбрал именно этим библиотеки
Pycord - Неплохой форк discord.py, ранее пользовался и буду пользоваться nextcord`om, но он более нудный и в каких то ситуациях отличается от пайкорда, но все же новичкам в Python и вообще в этой теме я 100% могу порекомендовать пайкорд, ну и даже если вы захотите написать на другой библиотеке которая является форком Discord.py, вы спокойно сможете адаптировать код написанный в этой теме
Motor - Ничем не отличается от Pymongo, НО! Это асинхронная библиотека, благодаря которой в некоторых ситуациях действия связанные с DB могут производиться быстрее
Вот такой небольшой гайдец вышел, если вам понравится то напишу вторую часть где мы задействуем Motor (пока можно не устанавливать)
Сегодня речь пойдет и написании дискорд бота, с использованием мини-стека а т.е 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
Или просто нажимаем горячие клавиши
в терминал мы вводим команду для создания виртуального окружения
после чего мы должны зайти в каталог с нашим окружением, если этого не произошло и появилась ошибка, советую зайти в Windows Powershell и ввести туда эту команду
И ВОТ ТЕПЕРЬ можем начинать нашу групповую мастурбацию с установкой
качаем данные библиотеки :
практический все, теперь в каталоге где находится base.py, нужно создать файл .env, туда мы впишем такое
И наконец то мы можем приступать к коду
создаем папку с любым названием и заходим в нее в 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='Токен вашего бота'
И наконец то мы можем приступать к коду
Начальный код бота будет примерно вот таким
Бот уже будет работать, но ему же нужен какой то функционал? правда же?
Предлагаю реализовать небольшую команду под названием Shakal / CompressJPG
Её функционал будет заключаться в изменении качества фото благодаря библиотеке PILLOW
Вот собственно ее код:
Алгоритм довольно легкий, и еще тут за место сохранения файла на ваш ПК, идет сохранение в буфере, ведь это удобнее и более оптимизированное решение
Вот такой результат мы имеем
И вот такой небольшой код:
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 (пока можно не устанавливать)