新增大量WhatsApp适配器相关代码,包括账号管理、会话处理、消息收发、验证授权、媒体处理、互动命令、审批流程、健康检测等完整功能模块,搭建基础的Baileys协议WhatsApp接入能力
65 lines
2.1 KiB
Python
65 lines
2.1 KiB
Python
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
|