from __future__ import annotations from dataclasses import dataclass, field from typing import Any @dataclass class GroupEntry: group_id: str enabled: bool = True require_mention: bool = False tools: list[str] | None = None system_prompt: str | None = None @classmethod def from_config(cls, group_id: str, config: dict[str, Any]) -> GroupEntry: if isinstance(config, bool): return cls(group_id=group_id, enabled=config) if isinstance(config, dict): return cls( group_id=group_id, enabled=config.get("enabled", True), require_mention=config.get("requireMention", False), tools=config.get("tools"), system_prompt=config.get("systemPrompt"), ) return cls(group_id=group_id) @dataclass class PerGroupConfig: entries: dict[str, GroupEntry] = field(default_factory=dict) @classmethod def from_config(cls, config: dict) -> PerGroupConfig: groups_cfg = config.get("groups", {}) entries = {} if isinstance(groups_cfg, dict): for gid, gcfg in groups_cfg.items(): entries[gid] = GroupEntry.from_config(gid, gcfg) return cls(entries=entries) def get(self, group_jid: str) -> GroupEntry | None: jid_base = group_jid.split("@")[0] if "@" in group_jid else group_jid for key, entry in self.entries.items(): if key == jid_base or key == group_jid: return entry return None def is_enabled(self, group_jid: str) -> bool: entry = self.get(group_jid) return entry.enabled if entry else True def require_mention(self, group_jid: str) -> bool: entry = self.get(group_jid) return entry.require_mention if entry else False def allowed_tools(self, group_jid: str) -> list[str] | None: entry = self.get(group_jid) return entry.tools if entry else None def system_prompt(self, group_jid: str) -> str | None: entry = self.get(group_jid) return entry.system_prompt if entry else None