Как правильно писать модули для FTG
Сначала расскажу одну проблему практически всех модулей где ответ на сообщение происходит несколько раз
Модули не адаптивные
Большинство модулей не адаптивные под все ситуации. К примеру я выдал себе owner на своём твинке и использую FTG через твинк. Проблемы начинаются даже с встроенными модулями.
Почему так происходит ?
Дело в том что utils.answer не меняет входящие объекты, но возвращает новый объект сообщения. То есть мы просто 2 раза отвечаем реплаем на одно и то же сообщение, что и происходит.
Как решить ?
Очень простое решение, которое кардинально меняет поведение модуля
Так же оно ничего не ломает, так как utils.answer всегда возвращает правильный объект сообщения или список из объектов
Если функция получает список, тогда он удалит все сообщения и оставит одно, после отредактирует его, если это невозможно, тогда удалит все и отправит новый
Советы для тех кто только начинает писать модули
message = await utils.answer(message, "I am doing something")
await utils.answer(message, "Results of doing")
Если вы сразу выдаёте результат, тогда можно просто
await utils.answer(message, "Results of doing")
Но если работа utils.answer не удовлетворяет вас, пишите модули так, что бы они были адаптивными и работали правильно кто бы их не запускал
К примеру при написании модуля dText to speach, мне нужно было сразу удалить сообщение и только после отправить голосовое. Но если модулем пользовался не только владелец аккаунта в PM, оно отправлялось не ему, а владельцу в избранные
Модуль не удалит сообщение если оно было отправлено не владельцем аккаунта. Если пользоваться модулем в PM, оно отправиться в тот же чат где было написано, а не в избранные
О различиях message.to_id и message.chat_id можете прочитать тут
Если вы используете сторонние библиотеки, укажите их в модуле что бы FTG автоматически установил их:
# requires: pydub requests
Можно это написать где угодно, но лучше в самом начале модуля. Но обязательно должно быть написано в самом начале строки
Ориентируйтесь на скелет модулей
Самое первое что вам нужно сделать, импортировать loader и utils, модуль logging
Имя класса модуля должно заканчиваться на Mod и должно наследоваться от loader.Module, так же иметь декоратор @loader.tds
В теле класса нужно указать описание всего модуля. В словаре strings обязательно нужно указать ключ и значение ему "name": "Имя вашего модуля"
Все строки которые вы хотите использовать следует хранить в strings и далее обращаться к self.strings, что бы переводить и редактировать модуль было проще всего
В "что-либо_doc" указываются поля которые будут отображаться при конфигурации модуля, но что бы они там отобразились нужно в __init__(self) указать его, имя переменной и стандартное значение
Что бы добавить команду модуля, создайте асинхронную функцию, обязательно должно заканчиваться на cmd
Декоратор @loader.unrestricted указывает что все могут использовать модуль, если группы включены в settings(только web mode, не знаю почему, но в cli режиме невозможно это сделать) Подробнее о группах тут
Что бы получить данные из конфигурации:
self.config["CONFIG_STRING"]
Что бы получить данные из словаря strings
:
self.strings("after_sleep", message)
Если вам нужно остановить функцию используйте return
async def examplecmd(message):
if message.out:
return utils.answer(message, self.strings("не подходит", message))
Обязательно указывайте описание вашей команды в __doc__
функции
Прилично будет логировать действия модуля с помощью logger
Подробнее о логировании тут
Если вам нужно использовать клиент или базу данных FTG, используйте client_ready(self, client, db)
В случае когда вы переназначаете message с помощью utils.answer, он может вернуть list и вы не получите доступ к сообщению так просто. Поэтому, все нужны вам данные из message следует получить заранее, а клиент использовать через
self.client
client_ready(self, client, db) запускается при каждой загрузке модуля, в том числе при рестарте и первой загрузке. Можно указать переменные которые не меняются
Объявлять дополнительные функции следует вне класса модуля
Полезные ссылки
Модуль dTTS который я использовал как пример
Модуль _skeleton из официального репозитория
Модуль откуда я благородно спиздил функцию to_voice
Новый мод FTG - geekFTG
Если вы что-то не поняли или вам нужна помощь, можете написать мне
По поводу улучшения статьи так же можете написать мне
Немного о своём
Пока писал статью, из-за своего рукажопства потерял большую часть статьи и пришлось писать заново ахахахах. Только что отредактировал часть текста с телефона, если есть опечатки, напишите мне пожалуйста.