Metadata-Version: 2.5
Name: remandochka
Version: 0.1.1
Summary: RM (ReMandochka) — Высокопроизводительная библиотека хукинга, обхода защит ART/R8 и KDL v2 рантайма для плагинов exteraGram
Author: swagnonher
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Requires-Python: >=3.8
Description-Content-Type: text/markdown

# RM (ReMandochka) v0.1.1 — Elyx-фреймворк хукинга, обхода защит ART/R8, UI и KDL v2
### (PyPI: `remandochka` | Python import: `import rm` или `import remandochka`)

**ReMandochka (RM)** — высокопроизводительный фреймворк, созданный **эксклюзивно для Elyx-плагинов (`.elyx` / `.eaf`)** клиента **exteraGram**:
- Прямая интеграция с системой локализаций `elyx.strings` (`rm.tr`, `rm.strings`) и ассетами `elyx.assets`.
- Автоматическая трансляция KDL-файлов настроек (`settings.kdl`) в нативные элементы exteraGram.
- Поддержка кастомных нативных Android View (`Custom`).
- Обход барьеров Android Runtime (ART) и компилятора R8 (`rm.Bypass`).
- Архитектурный каркас компонентов интерфейса (`views`, `cells`, `fragment`, `layout`, `components`).

- **PyPI**: `remandochka` (установка: `pip install remandochka`).
- **Сборщик**: Hatchling (PEP 621 / `pyproject.toml`).
- **Архитектура**: ровно 1 `__init__.py` на всю библиотеку без оверинжиниринга.
- **Поддерживаемый формат**: **Строго Elyx (.elyx / .eaf)**.

---

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

- **`remandochka.core`**:
  - `rm.parse_kdl(text)` / `rm.dumps_kdl(doc)`: моментальный парсер KDL 2.0.0 (~100 микросекунд с LRU-кэшем).
  - `rm.tr(key, **kwargs)` / `rm.strings`: прямая связка с локализацией Elyx (`locales/strings_*.json`).
  - `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("settings.kdl", context=self)` — автоматическое чтение KDL-файлов настроек Elyx.
  - **`views`**: `View`, `SheetView`, `DialogView`, `PanelView`.
  - **`cells`**: `Cell`, `HeaderCell`, `TextCell`, `ButtonCell`, `SwitchCell`, `SelectorCell`, `InputCell`, `DividerCell`, `CustomCell`.
  - **`fragment`**: `BaseFragment`, `SettingsFragment`, `TabFragment`.
  - **`layout`**: `LinearLayout`, `FrameLayout`, `ScrollLayout`, `StackLayout`.
  - **`components`**: `BadgeComponent`, `AvatarComponent`, `ProgressBarComponent`, `SearchBarComponent`, `DividerComponent`, `IconComponent`, `ActionSheetComponent`.

---

## 🛠️ Как писать Elyx-плагин на ReMandochka

### 1. Декларативные настройки (`src/settings.kdl`)

Плагин просто кладёт рядом файл `settings.kdl` — локализация авто-подтягивается из `locales/strings_*.json`:

```kdl
header "@settings_header"
switch key="turbo" text="@feature_title" default=#true subtext="@feature_sub" icon="msg_permissions" on_change="on_turbo_toggle"
input key="api_key" text="@api_token_title" default="" hint="@api_token_hint" icon="msg_link"

selector key="render_mode" text="@render_mode_title" default=1 icon="msg_theme" {
    item "Энергосберегающий"
    item "Сбалансированный"
    item "Максимальная плавность (120 FPS)"
}

divider text="@custom_section"

// ОБЯЗАТЕЛЬНО С КАСТОМОМ: внедрение нативного Android View!
custom key="banner_view" view="create_elyx_banner"

divider
button text="@test_button" icon="msg_retry" action="on_test"
button text="@reset_button" icon="msg_clear" red=#true action="on_reset"
```

### 2. Код плагина (`src/main.py`)

```python
from base_plugin import BasePlugin, MethodHook
import rm

class RMElyxPlugin(BasePlugin):
    def on_plugin_load(self):
        rm.dev_log(self, f"Elyx Plugin {rm.get_plugin_id(self)} загружен!")

        # Перехват через rm.Bypass
        self.bypass = rm.Bypass(self)

        @self.bypass.hook("InstallPluginBottomSheet", "<init>")
        class InstallDialogHook(MethodHook):
            def before_hooked_method(self, param):
                if len(param.args) > 2 and param.args[2]:
                    param.args[2].setTrusted(True)

            def after_hooked_method(self, param):
                rm.dev_log(self, f"Шторка перехвачена: {param.thisObject}")

        self.bypass.install()

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

    def create_settings(self):
        # Передаем файл 'settings.kdl' напрямую — ReMandochka сделает всё остальное!
        return rm.build_settings("settings.kdl", context=self)

    def on_turbo_toggle(self, val: bool):
        rm.set_setting("turbo", val)
        rm.dev_log(self, f"Турбо режим: {val}")

    def on_test(self, view=None):
        rm.dev_log(self, "Кнопка нажата!")

    def on_reset(self, view=None):
        rm.set_setting("turbo", True)

    def create_elyx_banner(self, context=None):
        TextView = rm.core.get_java_class("android.widget.TextView")
        app_ctx = getattr(rm.core.get_java_class("org.telegram.messenger.ApplicationLoader"), "applicationContext", None)
        if TextView and app_ctx:
            tv = TextView(app_ctx)
            tv.setText(rm.tr("banner_text", default="✨ Нативный баннер Elyx!"))
            tv.setPadding(32, 24, 32, 24)
            return tv
        return "CustomBanner(Active)"
```

---

## 🏗️ Сборка плагина через ElyxBuilder (`elyb`)

Структура проекта плагина в `examples/elyx_plugin/`:
- `refmap.yml` (в корне)
- `RMElyxPlugin/meta.yml`
- `RMElyxPlugin/.elyxbuilder/config.yml`
- `RMElyxPlugin/locales/strings_en.json` и `strings_ru.json`
- `RMElyxPlugin/res/wave.svg`
- `RMElyxPlugin/src/main.py`
- `RMElyxPlugin/src/settings.kdl`

Команда сборки:
```bash
elyb build -v
```
Результат компилируется в `builds/RM Elyx Plugin Example-1.0.0.eaf` (и `.elyx`).

  requirements: "remandochka 0.1.1"

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

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

---

## 📦 Спецификация зависимостей для Elyx

- В `meta.yml` / `metainfo.json`:
  ```yaml
  requirements: "remandochka 0.1.0"
  ```
