1.2.1 FAQ - Xoma163/petrovich GitHub Wiki
Q: Где лежит сам бот в этом django проекте?
A: apps/bot/. Обработка запросов - classes/bots/, API - views.py, команды - commands/
Q: Куда контрибьютить свою команду?
A: В папке apps/bot/commands/ нужно добавить свою команду, унаследованную от Command. Команду следует положить в ту папку, в которую она подходит логически (пример: команда для админа в AdminCommands, простая команда с простым ответом - EasyCommands, Игра - Games, ...)
Q: Правила оформления команд
A : Любая команда должна содержать метод __init__ внутри которой происходит инициализация команды. Обязательным параметром является список names - имена, на которые будет откликаться команда.
Возможные параметры базового класса:
name
: str - обязательное поле, имя команды.names
: list - необязательное поле, имена команды.name_tg
: str - имя команды для вызова команд в tghelp_text
: HelpText- текст для команды /команды и для /помощьenabled
: bool - включена ли командаsuggest_for_similar
: bool - предлагать команду в выдаче похожих командpriority
: int - приоритет обработки командыhidden
: bool - скрыта ли команда и будет ли отвечать пользователям без соответствующих прав доступаaccess
: Role - требуемый уровень прав для использования команды (user/student/terraria/minecraft/moderator/admin)pm
: bool - команда будет работать только в лсconversation
: bool - команда будет работать только в конфеfwd
: bool - требуются пересылаемые сообщенияargs
: int - требуются аргументы (количество)args_or_fwd
: bool- требуются аргументы или пересланные сообщенияint_args
: list[int] - требуются int аргументы (список, указать позиции)float_args
: list[int] - требуются float аргументы (список, указать позиции)platforms
: list[Platform] - платформы, на которых будет работать команда (api,tg,vk) (по умолчанию выбраны все)excluded_platforms
: list[Platform] - платформы, на которых не будет работать командаattachments
: list[Attachment] - требуются ли вложения (список типов)city
: bool - требуется ли город у профиля пользователяmentioned
: bool - должно ли сообщение обрабатываться только с упоминанием ботаnon_mentioned
: bool - должно ли сообщение обрабатываться только без упоминания бота
Список полей может отличаться от вышеуказанного. Уточняйте в Command
Также должен быть переопределён метод start, в котором содержится тело команды.
Возможно переопределить метод accept, чтобы изменить срабатывание команды (см. VoiceRecognition)
Внутри любой команды есть две переменные - bot и event
bot
Данная переменная - экземпляр Bot со всеми методами для работы.
event
Данная переменная - экземпляр Event со всеми полями, необходимыми для работы.
raw
- сырой евентbot
- экземпляр бота для работы с некоторыми методамиis_from_user
: bool - флажок сообщение от пользователяis_from_bot
: bool - флажок сообщение от ботаis_from_chat
: bool - флажок сообщение из чатаis_from_pm
: bool - флажок сообщение из лсuser
: Optional[User] - сущность User, информация о пользователе в конкретной поверхности (Tg, Vk, API)sender
: Optional[Profile] - сущность Profile, основная информация о пользователеchat
: Optional[Chat] - чат, откуда прислано сообщениеpeer_id
: int = peer_id - id чата, откуда прислано сообщениеfrom_id
: Optional[int] - id пользователя, откуда прислано сообщениеplatform
: Platform - платформа отправителяpayload
: dict - контент в клавиатуреaction
- какие-либо экшены в чате (человек вышел из чата, вошёл в чат, чат переименован и т.д.)message
: Optional[Message] - сообщение от пользователяfwd
: list - пересланные сообщенияattachments
: list - вложенияforce_response
: Optional[bool] - нужен ли ответ в любом случаеcommand
: Optional[Command] - точно выбранная команда (используется для команд, у которых определён accept_extra)is_fwd
: bool - является ли сообщение пересланнымmessage_thread_id
: Optional[int] - id для супергрупп в tg
Список полей Event может отличаться от вышеуказанного. Уточняйте в classes/events/Event.py
message
Данная переменная - экземпляр Message. В этом классе парсится сообщение пользователя
has_command_symbols
: bool = Falsehas_mention
: bool = Falseraw
: str - сырое сообщениеcommand
: str - название командыclear
: str - очищенное сообщение от пробелов, ё и т.д.clear_case
: str - очищенное сообщение, только с сохранением регистра
Аргументы
args_str
: str - аргументы пользователя в строкеargs
: list - аргументы пользователя спискомargs_str_case
: str - аргументы пользователя в строке с регистромargs_case
: list - аргументы пользователя списком с регистромkwargs
: dict - мапа из клавиатуры (когда пользователь жмёт на кнопку, у неё у каждой есть какие-то данные)keys
:list - ключи для команд (которые передаются в виде --something)id
- id сообщения
Q: Как возвращать ответ команды?
A:
- return ResponseMessage(ResponseMessageItem(...))
- return ResponseMessage([ResponseMessageItem(...), [ResponseMessageItem(...), ...]) Если не указывается peer_id, то оно автоматически подставит peer_id из Event.
Q: Какие существуют методы для упрощения разработки команд
A: В CommonCommand есть следующие методы:
check_sender(role)
- Проверяет роль пользователяcheck_args(count)
- Проверяет количество аргументовcheck_number_arg_range(arg,val1,val2,banned_list)
- Проверяет вхождение аргумента в диапазон[val1;val2]
и также проверяет, чтобы значение не входило в banned_listparse_int()
- Проверяет на int выбранные позиции аргументов (параметр int_args)parse_float()
- Проверяет на float выбранные позиции аргументов (параметр float_args)check_pm()
- Проверяет на личные сообщения ботуcheck_conversation()
- Проверяет на беседуcheck_fwd()
- Проверяет, есть ли пересланные сообщенияcheck_command_time(name,time)
- Проверяет, не вышло ли время для повторного использования какого-либо функционала (см Start/Stop/Restart в ModeratorCommand)check_platform()
- Проверяет на соответствие платформыcheck_attachments()
- Проверяет, есть ли вложенияhandle_menu(menu, arg)
- Метод имитирующий меню в боте. Например: мем обновить, мем переименовать, мем добавить, и т.д. и т.д..
Q: Как работать с базой данных?
A: Вкратце - в models.py у каждого приложения есть классы - модели. (Пример VkUser, VkChat, ...). Внутри этого файла описываются поля модели. Короткий гайд по работе с сущностями:
Model.objects.all()
- все записиModel.objects.filter(fieldname = value, fieldname2 = value2)
- фильтрация по полямModel(**dict)
или
model = Model();
model.field=value
model.save()
Создание сущности и её сохранение