FTG
March 31, 2021

Как правильно писать модули для 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

Так же использовать декоратор и наследовать класс от loader.Module обязательно

В теле класса нужно указать описание всего модуля. В словаре strings обязательно нужно указать ключ и значение ему "name": "Имя вашего модуля"

Все строки которые вы хотите использовать следует хранить в strings и далее обращаться к self.strings, что бы переводить и редактировать модуль было проще всего

В "что-либо_doc" указываются поля которые будут отображаться при конфигурации модуля, но что бы они там отобразились нужно в __init__(self) указать его, имя переменной и стандартное значение

Где "CONFIG_STRING" это имя переменной, а "hello" значение

Что бы добавить команду модуля, создайте асинхронную функцию, обязательно должно заканчиваться на cmd

Никогда не используйте time.sleep(), оно остановит работу всего FTG

Декоратор @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) запускается при каждой загрузке модуля, в том числе при рестарте и первой загрузке. Можно указать переменные которые не меняются

Что бы получить к ним доступ

Объявлять дополнительные функции следует вне класса модуля

to_voice я благородно спиздил

Полезные ссылки

Документация telethon

Модуль dTTS который я использовал как пример

Модуль _skeleton из официального репозитория

Модуль откуда я благородно спиздил функцию to_voice

Как установить FTG

Новый мод FTG - geekFTG

Оригинальный FTG

Документация FTG

Если вы что-то не поняли или вам нужна помощь, можете написать мне

По поводу улучшения статьи так же можете написать мне

Немного о своём

Пока писал статью, из-за своего рукажопства потерял большую часть статьи и пришлось писать заново ахахахах. Только что отредактировал часть текста с телефона, если есть опечатки, напишите мне пожалуйста.