Skip to main content

RM (ReMandochka) v0.0.8 — Библиотека хукинга, обхода защит ART/R8, UI и KDL v2 рантайма

(PyPI: remandochka | Python import: import rm или import remandochka)

ReMandochka (RM) — высокопроизводительная инструментальная библиотека для разработчиков плагинов exteraGram, решающая проблемы с защитами, барьерами Android Runtime (ART), компилятора R8, предоставляющая архитектурный каркас UI компонентов, декларативный DSL построитель настроек на KDL/Python с поддержкой Custom View, встроенный ультра-быстрый парсер документов KDL v2 (2.0.0) и безопасную Java-рефлексию.

  • PyPI: remandochka (установка: pip install remandochka).
  • Сборщик: Hatchling (PEP 621 / pyproject.toml).
  • Архитектура: 1 единственный __init__.py на всю библиотеку без лишнего бойлерплейта.
  • Производительность: оптимизирована под мульти-плагинный сценарий (кэширование дескрипторов полей, JNI-классов, версий, memoization KDL, мультиплексирование хуков).
  • Импорт в плагинах: import rm или import remandochka.

⚡ Структура библиотеки (src/)

  • remandochka.core:
    • rm.parse_kdl(text) / rm.dumps_kdl(doc): моментальный парсер KDL 2.0.0 (~100 микросекунд с LRU-кэшем).
    • rm.is_dev_mode(), rm.dev_log(plugin, msg): Zero Log Spam логирование (TTL-кэшировано).
    • rm.get_app_version(): автоопределение версии клиента Telegram / exteraGram.
    • rm.get_field(), rm.set_field(), rm.get_java_class(): безопасная Java-рефлексия с кэшированием Field и JNI-классов.
  • remandochka.bypass:
    • rm.Bypass(plugin): фасад управления хуками с защитой от дублирования и безопасной выгрузкой плагинов.
    • @bypass.hook("ClassName", "methodName"): декоратор для классов MethodHook или функций.
    • Внешняя база правил: remandochka/resources/rules.jsonl.
  • remandochka.ui:
    • settings: build_settings(kdl_text, context=self) — моментальная сборка настроек exteraGram из KDL с поддержкой Custom View.
    • views: View, SheetView, DialogView, PanelView.
    • cells: Cell, HeaderCell, TextCell, ButtonCell, SwitchCell, SelectorCell, InputCell, DividerCell, CustomCell с методами .to_setting() и .to_kdl().
    • fragment: BaseFragment, SettingsFragment (с методом .load_kdl()), TabFragment.
    • layout: LinearLayout, FrameLayout, ScrollLayout, StackLayout.
    • components: BadgeComponent, AvatarComponent, ProgressBarComponent, SearchBarComponent, DividerComponent, IconComponent, ActionSheetComponent.

🛠️ Декларативные настройки плагина на чистом KDL

Плагин может полностью описать свои настройки на чистом KDL — библиотека автоматически преобразует их в нативные элементы exteraGram, привяжет коллбэки и внедрит Custom View:

from base_plugin import BasePlugin
import rm

class MyPlugin(BasePlugin):
    def create_settings(self):
        # Вся конфигурация экрана настроек в 1 вызов KDL!
        return rm.build_settings("""
            header "Основные параметры"
            switch key="enabled" text="Включить плагин" default=#true subtext="Активирует фоновую работу" icon="msg_permissions" on_change="on_toggle"
            input key="api_key" text="API Токен" default="" hint="Вставьте секретный ключ" icon="msg_link"
            selector key="quality" text="Качество" default=1 icon="msg_media" {
                item "720p"
                item "1080p"
                item "4K"
            }
            divider text="Интерфейс"
            // ОБЯЗАТЕЛЬНО С КАСТОМОМ: встраивает произвольный нативный View плагина!
            custom key="banner" view="create_banner_widget"
            divider
            button text="Проверить соединение" icon="msg_retry" action="on_test_connection"
        """, context=self)

    def on_toggle(self, val: bool):
        rm.dev_log(self, f"Переключатель: {val}")

    def on_test_connection(self, view=None):
        rm.dev_log(self, "Тест соединения вызван!")

    def create_banner_widget(self, context=None):
        # Возвращает любой нативный Android View
        return my_native_android_view

🛡️ Модуль обхода блокировок ART/R8 (rm.Bypass)

from base_plugin import BasePlugin, MethodHook
import rm

class MyPlugin(BasePlugin):
    def on_plugin_load(self):
        self.bypass = rm.Bypass(self)

        @self.bypass.hook("InstallPluginBottomSheet", "<init>")
        class CtorHook(MethodHook):
            def before_hooked_method(self, param):
                # param.args[2] — PluginInstallParams
                param.args[2].setTrusted(True)

            def after_hooked_method(self, param):
                sheet = param.thisObject # живой экземпляр шторки

        @self.bypass.hook("InstallPluginBottomSheet", "applyButtonState")
        class ButtonHook(MethodHook):
            def after_hooked_method(self, param):
                sheet = param.thisObject
                # кастомизация кнопки

        self.bypass.install()

    def on_plugin_unload(self):
        self.bypass.uninstall()

📁 Пример готового плагина

В папке examples/sample_plugin/ расположен рабочий пример:

  • metainfo.json: манифест плагина с зависимостью remandochka 0.0.7.
  • main.py: реализация create_settings через KDL, перехвата хуков и Custom View.
  • settings.kdl: внешняя KDL-декларация всех элементов настроек.

🔇 Интеллектуальное логирование (Zero Log Spam)

Библиотека не засоряет логи приложения:

  • Логи выводятся ТОЛЬКО тогда, когда в настройках плагин-системы включен Режим разработчика (rm.is_dev_mode() == True).
  • При выключенном режиме разработчика библиотека работает в режиме полной тишины.

📦 Спецификация для плагинов exteraGram

  • В файлах .plugin:
    __requirements__ = ["remandochka 0.0.8"]
    
  • В архивах .elyx (metainfo.json):
    "requirements": "remandochka 0.0.8"
    

Metadata

Release files for remandochka 0.0.9

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for remandochka 0.0.9
File Size Uploaded Provenance
remandochka-0.0.9.tar.gz 28.3 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for remandochka 0.0.9
File Interpreter ABI Platform
remandochka-0.0.9-py3-none-any.whl Python 3 none any Details

Total release size: 58.0 kB

Release files / remandochka-0.0.9.tar.gz

Download URL remandochka-0.0.9.tar.gz
Size 28.3 kB
Tags Source
SHA-256 checksum
How to use checksums
f1d3b5a1152fa0cb7f109656d61641cd3f62a66792f7f09c81a3d37beb037ca0
BLAKE2b-256 checksum
How to use checksums
59a01cd522278e10a04e95b1b41546ebe73a841c43174c6788815f4f2f7337c6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.11.9

Release files / remandochka-0.0.9-py3-none-any.whl

Download URL remandochka-0.0.9-py3-none-any.whl
Size 29.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
1c53a8de980f3d963d5719433212a8b618099f8fa58e0140cf1d5d6390750363
BLAKE2b-256 checksum
How to use checksums
369c1160582bdebb35b0f3bfac1e3339e404278f003c2df7b90789b5726c7d60
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.11.9

Security for remandochka 0.0.9

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page