git clone https://github.com/scream-dev/discord-modules-bot.git
cd discord-modules-bot- Запустите установщик:
python setup.py- Введите данные, которые запросит установщик:
- Токен бота
- Канал для логов (необязательно)
- ID администратора бота
Вы также можете вручную создать файл .env со следующим содержимым:
DISCORD_TOKEN=ваш_токен_бота
LOG_CHANNEL_ID=0
BOT_OWNER_ID=ваш_id_администратораПримечание: использование setup.py проще для новичков.
- Для запуска бота используйте:
python main.py| Команда | Описание | Пример |
|---|---|---|
!add [файл] |
Добавить новый модуль | !add my_module.py |
!remove [файл] |
Удалить модуль | !remove old_module.py |
!update |
Перезагрузить все модули | !update |
!modules |
Показать список модулей | !modules |
!status |
Показать статус бота | !status |
!shutdown |
Выключить бота | !shutdown |
Каждый модуль должен быть классом, унаследованным от commands.Cog и содержать:
__init__– инициализация (настройки, переменные)setup– функция для загрузки модуля (обязательная)- Команды (
@commands.command()) - Обработчики событий (
@commands.Cog.listener())
Пример минимального модуля:
import discord
from discord.ext import commands
class MyCog(commands.Cog):
def __init__(self, bot):
self.bot = bot # Передаем бота в модуль
@commands.command(name="test")
async def test_command(self, ctx):
await ctx.send("Тестовая команда работает!")
@commands.Cog.listener()
async def on_message(self, message):
if message.author.bot:
return
print(f"Получено сообщение: {message.content}")
async def setup(bot):
await bot.add_cog(MyCog(bot)) # Обязательная функция для загрузки- Должен наследоваться от
commands.Cog. - В
__init__обязательно передаватьbotи сохранять его вself.bot.
- Обязательная для загрузки модуля.
- Должна быть асинхронной (
async def). - Должна содержать
await bot.add_cog(MyCog(bot)).
- Все команды и события должны иметь
try-exceptс логированием. - Пример:
@commands.command(name="ping")
async def ping(self, ctx):
try:
await ctx.send("Pong!")
except Exception as e:
print(f"Ошибка в команде ping: {e}")- Все необходимые библиотеки (
discord,asyncioи др.) должны быть в начале файла. - Если модуль использует
.env, добавьте:
from dotenv import load_dotenv
load_dotenv()- Если модуль требует настройки (ID каналов, токены), выносите их в верхние переменные:
class MyCog(commands.Cog):
def __init__(self, bot):
self.bot = bot
self.ADMIN_ID = 123456789 # Пример ID админа
self.LOG_CHANNEL_ID = 987654321 # Пример ID канала для логов- Все команды должны быть методами класса.
- Используйте
name="название", если хотите изменить имя команды. - Пример:
@commands.command(name="hello")
async def hello(self, ctx):
await ctx.send(f"Привет, {ctx.author.mention}!")- Если модуль должен реагировать на сообщения/ивенты, используйте:
@commands.Cog.listener()
async def on_message(self, message):
if message.author.bot:
return
print(f"Новое сообщение: {message.content}")- Если модулю нужно загрузить данные при старте (БД, конфиги), используйте:
async def cog_load(self):
"""Вызывается при загрузке модуля"""
print("Модуль загружен!")
self.data = await self.load_data() # Пример асинхронной загрузки❌ Не создавайте глобальных переменных бота
Вместо:
bot = commands.Bot(...) # ❌ НеправильноИспользуйте:
class MyCog(commands.Cog):
def __init__(self, bot):
self.bot = bot # ✅ Правильно❌ Не используйте on_message без @commands.Cog.listener()
Неправильно:
async def on_message(message): # ❌ Не сработаетПравильно:
@commands.Cog.listener()
async def on_message(self, message): # ✅ Работает❌ Не забывайте про await в асинхронных функциях
Неправильно:
@commands.command()
def test(ctx): # ❌ Без async/await
ctx.send("Test") # ❌ Без awaitПравильно:
@commands.command()
async def test(self, ctx): # ✅
await ctx.send("Test") # ✅import discord
from discord.ext import commands
import asyncio
class ExampleCog(commands.Cog):
def __init__(self, bot):
self.bot = bot
self.settings = {
"PREFIX": "!",
"ADMIN_ROLE": "Admin"
}
async def cog_load(self):
print(f"Модуль {self.__class__.__name__} загружен!")
@commands.command(name="greet")
async def greet_user(self, ctx, user: discord.Member):
try:
await ctx.send(f"Привет, {user.mention}!")
except Exception as e:
print(f"Ошибка: {e}")
@commands.Cog.listener()
async def on_member_join(self, member):
print(f"{member.name} зашел на сервер!")
async def setup(bot):
await bot.add_cog(ExampleCog(bot))Бот использует систему логирования Python. Все логи сохраняются в файл bot.log и выводятся в консоль.
Формат логов:
2024-01-01 12:00:00 - bot - INFO - Бот успешно подключился к Discord!
2024-01-01 12:00:01 - bot - INFO - Модуль example.py успешно загружен
- Структура: Класс +
setup(bot). - Команды:
@commands.command(). - События:
@commands.Cog.listener(). - Ошибки: Всегда
try-except. - Асинхронность: Все команды с
async/await. - Конфиги: Выносите настройки в
__init__.