Командный движок - VK-SDK-DEV/VK-SDK GitHub Wiki

Командный движок - основа любого бота. К счастью, VK-SDK предоставляет удобные инструменты работы с движком.


Команды

Обычные команды создаются так:

@command(name, fixTypo=True, aliases=[])

name - текст команды (с маленькой буквы)
fixTypo - SDK попробует исправить ошибки, допущенные пользователем при наборе команды (например со случаем, команда "пополнить баланс", пользоватль написал "пополнить баланм", SDK справится на ура; внутри бота (self), текст сообщения останется неизменным)
aliases - дополнительные имена для команды

Пример использования:

@command("баланс")
def handler(self):
    self.reply("no bobux?")

After Func

Начнем с примера использования:

@command("пополнть баланс")
def handle_balance("ввести имя"):
    self.reply("Как скажешь, босс!") 
    self.set_after("enter_name")

@after_text_matcher("enter_name", "василий")
def enter_name_1(self):
    self.reply("Красиове")

@after_text_matcher("enter_name", "алексей")
def enter_name_2(self):
    self.reply("ну ты и алеша")

@after_func("enter_name")
def default_behaviour(self):
    self.reply("Тебя не зовут Алексей или Василий :(")

Этот код будет аналагом для:

c = input().lower()
if c == "василий":
    print(...)
elif c == "алексей":
    print(...)
else:
   print(...)

но работает с сообщениями вк
Если по-умному, то set_after регистрирует, что дальнейшие действия продолжатся после следующего сообщения от пользователя. Декораторы after_func и after_text_matcher определяют поведение программы для различного текста следующего сообщения.
По умолчанию, после исполнения обработчика поведения after_func, управление текстом перейдет другим командам.
Вы можете вернуть True из обработчика поведения, тогда управление текстом останется за этой after_func

Декоратор:

@after_func(name, circular = None)

name - имя для after_func
circular - циркулярный билдер


Wait

Эксперементальная технология
Базовая функция - самая верхняя функция в AST
Wait-функция - Фунция, заключенная как аргумент wait()
Результат wait-функции - последнее выражение из массива результата или одно выражение
Ограничения:
Не вызывать wait.wait, только self.wait
Некоторые ограничения устранимы и возможно будут реализованы в будущем
wait не преднозначен для слишком развлетвленной бизнес-логики, в конце концов, у вас всё ещё есть after_func, а wait как раз внутреннее их и исползует

Панели

Относительно новая технология, позволяющая создавать панели.
Для начала, объявите вашу панель:

my_panel = Panel("базовая панель", aliases = ["базированная панель"])

Здесь базовая панель - команда, по котороый можно будет попасть в панель
aliases - дополнительные имена для панели

Каждая панель должна иметь функцию функцию вхождения:

def enter_my_panel(self):
    self.reply("О, вы из панели")

Вы также можете объявить свою функцию проверки на то, может ли пользователь войти в панель:

class User(Struct):
     user_id = ""
     admin = 0
     save_by = "user_id"

@my_panel.allow_enter()
def my_panel_allow_enter(self):
    return User(user_id=self.user.id).admin

Наконец, можно добавлять команды в панель:

@my_panel.command("hello")
def say_hello(self):
    self.reply("Привки!")

Обработчики невалидности

Кроме этого, для панели можно добавить обработчики невалидности:

@my_panel.circular.register_invalid_handler()
def no_commands_matched(self):
    self.reply("Упс, ни одна из команд панели не была набрана")

если не передать имя обработчика в register_invalid_handler, обработчик будет вызван, когда ни одна из команд панели не была вызвана.
Обработчики также можно вызывать: my_panel.circular.invalid_handler()

circular - циркулярный билдер, присваивается автоматически каждой панели