Командный движок - 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
- циркулярный билдер, присваивается автоматически каждой панели