@rithien/comfy_adapter
v0.1.7
Published
Clusterio plugin: parses Comfy/factorio-polska scenario stdout tags ([DISCORD*], [ANTIGRIEF-LOG], [DATA-SET/GET]) and bridges to Discord + JSON datastore; global ban list (adapter_bans.json) enforced lazily on join
Maintainers
Readme
@rithien/comfy_adapter — clusterio plugin
Adapter między tag-stream stdout scenariusza factorio-polska (../scenario/) a clusterio bus + Discord (przez współistniejący ../discord-bridge/).
Stan
Faza 2.5 ukończona (statyczna walidacja) — v0.1.0 zaimplementowane, nieopublikowane. Publish + runtime test na zdalnym clusterio → Faza 2.7.
Zakres
| Tag z scenariusza | Akcja w plugin'ie |
| --- | --- |
| [DISCORD]<msg> / [-RAW] / [-BOLD] | channel.send({content}) na kanał instancji (przez discord_bridge.getChannelForInstance) |
| [DISCORD-ADMIN]<msg> / [-RAW] | jak wyżej, z prefiksem [ADMIN] (configurable) |
| [DISCORD-EMBED]<msg> / [-RAW] | embed z description=msg |
| [DISCORD-EMBED-PARSED]<json> | JSON.parse → embed z {title, description, color?, fields?} |
| [DISCORD-ADMIN-EMBED]<msg> / [-RAW] | embed z description=admin_prefix+msg |
| [ANTIGRIEF-LOG]{category, action} | embed z color-coded category (lub plain [ANTIGRIEF: cat] action jeśli antigrief_log_as_embed=false) |
| [DATA-SET]{data_set, key, value?} | UPSERT do JSON storage (debounce fsync). value=nil → DELETE |
| [DATA-GET]<token>{data_set, key} | Read JSON, RCON callback /cc Token.get(<token>)(d); Server.raise_data_set(d) (dual-path) |
| [DATA-GET-AND-PRINT]<token>{...,to_print} | jak wyżej + to_print w callback data |
| [DATA-GET-ALL]<token>{data_set} | Read whole dataset, RCON callback z entries table |
Pozostałe tagi ([BAN-SYNC], [PING], [START-SCENARIO]) — silent skip (bany robi clusterio natywnie, lifecycle nieużywany).
Architektura
info.js— manifest + schema 4 eventów instance→controller (ScenarioDiscordEvent,AntigriefLogEvent,DataSetEvent,DataGetRequest) + controller config fields.instance.js— hookonOutput, regex tag-stream parser, mini-parser pseudo-Lua-JSON (parseComfyPayload), message queue dla disconnected controller.controller.js— 4 handlery + Discord client sharing (delegacja dodiscord_bridge) + JSON storage manager (atomic write, debounce, load on init).- Storage: pojedynczy plik JSON (
comfy_adapter_storage.jsonconfigurable), schema{ "<dataset>": { "<key>": <value> } }.
Config (controller-side)
| Klucz | Default | Opis |
|---|---|---|
| comfy_adapter.storage_path | comfy_adapter_storage.json | Plik JSON datastore (relative do CWD kontrolera) |
| comfy_adapter.write_debounce_ms | 1000 | Coalesce multiple [DATA-SET] writes |
| comfy_adapter.antigrief_log_as_embed | true | Embed vs plain message dla anti-grief log |
| comfy_adapter.admin_prefix | [ADMIN] | Prefix dla [DISCORD-ADMIN*] tagów |
Zależności runtime
@rithien/discord_bridge(Faza 1,^0.3.1) — channel routing per instancja + shared Discord client. Bez niego: Discord eventy są no-op (log verbose), datastore nadal działa.clusterioalpha 14+ — API hooksonOutput,controller.handle,controller.plugins.get,InstanceSendRconRequest.
Pełna spec
Szczegóły w ../PLAN.md sekcja "Faza 2.5". Architektoniczne decyzje w ../DECISIONS.md (search "Faza 2.5").
