> ## Documentation Index
> Fetch the complete documentation index at: https://docs.lampac.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Пользовательские модули Lampac: Roslyn-компиляция

> Создавайте собственные модули в каталоге mods/. Roslyn компилирует .cs-файлы при старте; dynamic:true включает горячую пересборку.

Lampac NextGen позволяет расширять функциональность через пользовательские модули. Достаточно создать каталог в `mods/`, добавить `manifest.json` и файлы `.cs` — Roslyn скомпилирует код при запуске сервера. С включённым флагом `dynamic: true` пересборка происходит автоматически при изменении исходников, без перезапуска.

<Steps>
  <Step title="Создайте каталог модуля">
    Создайте папку внутри `mods/` с произвольным именем, например `mods/MyModule/`.
  </Step>

  <Step title="Напишите manifest.json">
    Манифест описывает метаданные модуля и управляет его загрузкой.

    ```json theme={null}
    {
      "enable": true,
      "dynamic": true,
      "tree": [
        "Controller.cs",
        "ModInit.cs"
      ]
    }
    ```

    | Поле      | Тип       | Описание                               |
    | --------- | --------- | -------------------------------------- |
    | `enable`  | boolean   | Включён ли модуль                      |
    | `dynamic` | boolean   | Горячая пересборка при изменении `.cs` |
    | `tree`    | string\[] | Файлы, включаемые в Roslyn-компиляцию  |
  </Step>

  <Step title="Напишите .cs-файлы">
    Добавьте в `mods/MyModule/` один или несколько `.cs`-файлов с логикой модуля. Используйте интерфейсы `IModuleLoaded` и `IModuleConfigure` для интеграции с жизненным циклом приложения.

    ```csharp theme={null}
    using Shared.Models.Events;
    using Shared.Models.Module;
    using Shared.Models.Module.Interfaces;
    using Shared.Services;

    namespace MyModule
    {
        public class ModInit : IModuleLoaded
        {
            public static ModuleBaseConf conf;

            public void Loaded(InitspaceModel baseconf)
            {
                updateConf();
                EventListener.UpdateInitFile += updateConf;
            }

            public void Dispose()
            {
                EventListener.UpdateInitFile -= updateConf;
            }

            void updateConf()
            {
                conf = ModuleInvoke.Init("MyModule", new ModuleBaseConf { enable = true });
            }
        }
    }
    ```
  </Step>

  <Step title="Перезапустите сервер">
    При первой загрузке Roslyn скомпилирует ваш модуль. Если `dynamic` включён, последующие изменения `.cs`-файлов будут пересобираться автоматически.
  </Step>
</Steps>

## Фильтрация модулей через LoadModules

Состав загружаемых модулей можно ограничить с помощью `BaseModule.LoadModules` в `init.conf`. Поддерживаются имя модуля, группа (например, `OnlineUKR`) или маска по регулярному выражению.

| Паттерн    | Пример      | Описание                                  |
| ---------- | ----------- | ----------------------------------------- |
| Имя модуля | `MyModule`  | Загружает конкретный модуль               |
| Группа     | `OnlineUKR` | Загружает все модули группы               |
| Маска      | `LME.*`     | Загружает модули по регулярному выражению |

```json theme={null}
{
  "BaseModule": {
    "LoadModules": [".*"]
  }
}
```

## Монтирование в Docker

При запуске в Docker примонтируйте каталог с пользовательским модулем как том:

```yaml theme={null}
services:
  lampac:
    image: ghcr.io/lampac-nextgen/lampac
    volumes:
      - ./lampac-docker/mods/MyModule:/lampac/mods/MyModule
```

<Tip>
  Установите `"dynamic": true` в `manifest.json`. Roslyn отслеживает изменения `.cs`-файлов в каталоге модуля и пересобирает сборку на лету. Это удобно для разработки и отладки.
</Tip>
