Перейти к содержанию

Разделение кода

Разделение кода - очень важная вещь для создания структуры проекта

Чтобы делать это в vkbottle предусмотрен инструмент Blueprint.

Blueprint - точная копия (в данном случае бота), но при всей идентичности с интерфесом бота, блупринт не может быть индивидуально запущен как агент поллинга, он может лишь имплементировать хендлеры и другие labeler definition'ы

Атрибуты api, polling и state_dispenser могут быть использованы только в среде (хендлера например), до момента того, как блупринт был сконструирован они равны None, для определения сконструирован блупринт или нет в среде в которой находитесь вы, вы можете использовать атрибут constructed

Разделение кода, кроме того может быть очень грамотно использовано для создания локальных изменений в аплоадере, например auto_rules поможет установить правила, которые будут накладываться на все хендлеры блупринта

Стандартная иерархия файлов

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

* bot.py

* blueprints
- chat.py
- admin.py

bot.py

Сначала разберем код файла bot.py, самый простой коллектор, который можно использовать - коллектор из коробки load_blueprints_from_package, он принимает только название пакеты из которого следует загружать блупринты

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

from vkbottle import Bot, load_blueprints_from_package

Далее нужно создать самого бота:

bot = Bot("token")

Теперь с помощью коллектора и бота можно сконструировать все блупринты:

for bp in load_blueprints_from_package("blueprints"):
    bp.load(bot)

Осталось только запустить бота:

bot.run_forever()

chat.py

  1. Добавим в auto_rules правило которое будет следить чтобы все сообщения шли только из чата
  2. Создадим правило и добавим его в auto_rules, которое будет получать информацию о чате и возвращать ее для всех хендлеров этого блупринта
  3. Добавим несколько хендлеров
from vkbottle.bot import Blueprint, Message, rules
from vkbottle_types.objects import MessagesConversation

class ChatInfoRule(rules.ABCMessageRule):
    async def check(self, message: Message) -> dict:
        chats_info = await bp.api.messages.get_conversations_by_id(message.peer_id)
        return {"chat": chats_info.items[0]}

bp = Blueprint("for chat commands")
bp.labeler.vbml_ignore_case = True
bp.labeler.auto_rules = [rules.PeerRule(from_chat=True), ChatInfoRule()]

@bp.on.message(command="самобан")
async def kick(message: Message, chat: MessagesConversation):
    await bp.api.messages.remove_chat_user(message.chat_id, message.from_id)
    await message.answer(f"Участник самоустранился из {chat.chat_settings.title} по собственному желанию")

@bp.on.message(text="где я")
async def where_am_i(message: Message, chat: MessagesConversation):
    await message.answer(f"Вы в <<{chat.chat_settings.title}>>")

admin.py

Пусть команды из этого блупринта будут доступны только, например, создателю бота

  1. Создадим проверку на id пользователя, написавшего сообщение
  2. Добавим несколько хендлеров
from vkbottle.bot import Blueprint, Message, rules

bp = Blueprint("for admin commands")
bp.labeler.auto_rules = [rules.FromPeerRule(1)] # Допустим, вы являетесь Павлом Дуровым

@bp.on.message(command="halt")
async def halt(_):
    exit(0)

Экзамплы по этой части туториала