Основной класс плагина: CactusUtils.Plugin¶
Наследование от CactusUtils.Plugin (или его псевдонимов CactusModule, CactusPlugin) является ключевым моментом в разработке, так как это наделяет ваш класс множеством полезных методов и атрибутов.
🗄️ База данных¶
Каждый плагин, использующий CactusLib, получает собственное персистентное хранилище в виде JSON-файла. Вам не нужно заботиться о его создании или загрузке — просто используйте встроенные методы.
self.get(key: str, default: Any = None) -> AnyПолучает значение по ключу. Если ключ не найден, возвращаетdefault.self.set(key: str, value: Any)Сохраняет значение по ключу.self.pop(key: str) -> AnyУдаляет ключ и возвращает его значение.self.clear_db()Полностью очищает базу данных вашего плагина.
Пример: счетчик использований команды
class MyPlugin(CactusUtils.Plugin):
@command(doc="Увеличивает и показывает счетчик")
def count(self, cmd: CactusUtils.Command):
# Получаем текущее значение, если его нет, то 0
current_count = self.get("usage_count", 0)
current_count += 1
# Сохраняем новое значение
self.set("usage_count", current_count)
cmd.answer(f"Эту команду использовали {current_count} раз.")
return HookResult(strategy=HookStrategy.CANCEL)
🌍 Локализация (i18n)¶
CactusLib имеет встроенную поддержку нескольких языков. Вы можете определить строки для разных языков, и библиотека автоматически выберет нужную в зависимости от настроек пользователя.
Для этого в вашем классе нужно определить словарь strings:
class MyPlugin(CactusUtils.Plugin):
strings = {
"en": {
"GREETING": "Hello, {}!",
"__doc__": "This is a plugin description."
},
"ru": {
"GREETING": "Привет, {}!",
"__doc__": "Это описание плагина."
}
}
# ...
self.string(key: str, *args, default: str = None, **kwargs) -> strПолучает строку по ключу для текущего языка пользователя, форматируя ее с переданными аргументами.self.lstrings() -> dictВозвращает весь словарь строк для текущего языка.
Пример использования self.string:
@command(doc="Персональное приветствие")
def greet(self, cmd: CactusUtils.Command):
if not cmd.args:
cmd.answer("Пожалуйста, укажите имя.")
return HookResult(strategy=HookStrategy.CANCEL)
user_name = cmd.args[0]
# Автоматически выберет "Привет" или "Hello"
greeting_text = self.string("GREETING", user_name)
cmd.answer(greeting_text)
return HookResult(strategy=HookStrategy.CANCEL)
📥/📤 Управление данными при импорте/экспорте¶
Вы можете определять собственную логику для сохранения и восстановления сложных данных.
export_data(self) -> dictВызывается, когда пользователь экспортирует плагины с данными. Верните словарь с данными, которые вы хотите сохранить.import_data(self, data: dict)Вызывается при импорте. Вdataбудет словарь, который вы вернули изexport_data.
Примечание
Встроенная база данных хранится на устройстве в папке exteraGram в виде .json файла, а также экспортируются и импортируются самостоятельно при экспорте/импорте плагина или его загрузке.
Пример:
class MyPlugin(CactusUtils.Plugin):
def on_plugin_load(self):
super().on_plugin_load()
self.non_db_data = set() # Данные, которые не хранятся в JSON DB
def export_data(self) -> dict:
# Конвертируем set в list для JSON-сериализации
return {"my_custom_set": list(self.non_db_data)}
def import_data(self, data: dict):
# Получаем данные и конвертируем обратно в set
self.non_db_data = set(data.get("my_custom_set", []))
📝 Другие полезные атрибуты и методы¶
self.utils: Прямой доступ к объектуCactusUtilsсо всеми его статическими методами.self.log(msg),self.info(msg),self.debug(msg),self.warn(msg),self.error(msg): Методы для записи в logcat с автоматической подстановкой ID вашего плагина.__min_lib_version__: Строка, указывающая минимально требуемую версию CactusLib (например,"1.7.0"). Если версия у пользователя ниже, плагин не загрузится.UPDATE_DATA: Словарь с данными для обновления плагина.