diff --git a/astrbot/core/config/astrbot_config.py b/astrbot/core/config/astrbot_config.py index 6a61193de..e6111bd76 100644 --- a/astrbot/core/config/astrbot_config.py +++ b/astrbot/core/config/astrbot_config.py @@ -37,20 +37,12 @@ class QQOfficialPlatformConfig(PlatformConfig): enable_group_c2c: bool = True enable_guild_direct_message: bool = True -@dataclass -class NakuruPlatformConfig(PlatformConfig): - host: str = "172.0.0.1", - port: int = 5700, - websocket_port: int = 6700, - enable_group: bool = True, - enable_guild: bool = True, - enable_direct_message: bool = True, - enable_group_increase: bool = True - @dataclass class AiocqhttpPlatformConfig(PlatformConfig): ws_reverse_host: str = "" ws_reverse_port: int = 6199 + qq_id_whitelist: List[str] = field(default_factory=list) + qq_group_id_whitelist: List[str] = field(default_factory=list) @dataclass class ModelConfig: @@ -161,12 +153,8 @@ class AstrBotConfig(): continue if p["name"] == "qq_official": self.platform.append(QQOfficialPlatformConfig(**p)) - elif p["name"] == "nakuru": - self.platform.append(NakuruPlatformConfig(**p)) elif p["name"] == "aiocqhttp": self.platform.append(AiocqhttpPlatformConfig(**p)) - else: - self.platform.append(PlatformConfig(**p)) self.platform_settings=PlatformSettings(**data.get("platform_settings", {})) self.llm=[LLMConfig(**l) for l in data.get("llm", [])] self.llm_settings=LLMSettings(**data.get("llm_settings", {})) diff --git a/astrbot/core/config/default.py b/astrbot/core/config/default.py index 9854d4b06..9f0f747a3 100644 --- a/astrbot/core/config/default.py +++ b/astrbot/core/config/default.py @@ -20,6 +20,8 @@ DEFAULT_CONFIG_VERSION_2 = { "enable": False, "ws_reverse_host": "", "ws_reverse_port": 6199, + "qq_id_whitelist": [], + "qq_group_id_whitelist": [] } ], "platform_settings": { @@ -93,20 +95,16 @@ CONFIG_METADATA_2 = { "type": "list", "items": { "id": {"description": "ID", "type": "string", "hint": "提供商 ID 名,用于在多实例下方便管理和识别。自定义,ID 不能重复。"}, - "name": {"description": "适配器类型", "type": "string", "hint": "当前版本下,支持 `qq_official`(QQ 官方机器人), `aiocqhttp`(Onebot 适用), `nakuru` 三种适配器类型。", "options": ["qq_official", "aiocqhttp", "nakuru"]}, + "name": {"description": "适配器类型", "type": "string", "hint": "当前版本下,内置支持 `qq_official`(QQ 官方机器人), `aiocqhttp`(Onebot 适用) 适配器类型。", "options": ["qq_official", "aiocqhttp"]}, "enable": {"description": "启用", "type": "bool", "hint": "是否启用该适配器。未启用的适配器对应的消息平台将不会接收到消息。"}, "appid": {"description": "appid", "type": "string", "hint": "必填项。QQ 官方机器人平台的 appid。如何获取请参考文档。"}, "secret": {"description": "secret", "type": "string", "hint": "必填项。QQ 官方机器人平台的 secret。如何获取请参考文档。"}, "enable_group_c2c": {"description": "启用消息列表单聊", "type": "bool", "hint": "启用后,机器人可以接收到 QQ 消息列表中的私聊消息。你可能需要在 QQ 机器人平台上通过扫描二维码的方式添加机器人为你的好友。详见文档。"}, "enable_guild_direct_message": {"description": "启用频道私聊", "type": "bool", "hint": "启用后,机器人可以接收到频道的私聊消息。"}, - "host": {"description": "主机地址", "type": "string", "hint": "Nakuru 适配器的服务器 IP 地址,不包含端口号。"}, - "port": {"description": "端口", "type": "int", "hint": "Nakuru 适配器的 HTTP 端口。"}, - "websocket_port": {"description": "Websocket 端口", "type": "int", "hint": "Nakuru 适配器的 Websocket 端口。"}, "ws_reverse_host": {"description": "反向 Websocket 主机地址", "type": "string", "hint": "aiocqhttp 适配器的反向 Websocket 服务器 IP 地址,不包含端口号。"}, "ws_reverse_port": {"description": "反向 Websocket 端口", "type": "int", "hint": "aiocqhttp 适配器的反向 Websocket 端口。"}, - "enable_group": {"description": "接收群组消息", "type": "bool", "hint": "启用后,机器人可以接收到群组消息。"}, - "enable_guild": {"description": "接收频道消息", "type": "bool", "hint": "启用后,机器人可以接收到频道消息。"}, - "enable_direct_message": {"description": "接收频道私聊", "type": "bool", "hint": "启用后,机器人可以接收到频道的私聊消息。"}, + "qq_id_whitelist": {"description": "QQ 号白名单", "type": "list", "items": {"type": "string"}, "hint": "填写后,将只处理所填写的 QQ 号发来的消息事件。为空时表示不启用白名单过滤。"}, + "qq_group_id_whitelist": {"description": "QQ 群号白名单", "type": "list", "items": {"type": "string"}, "hint": "填写后,将只处理所填写的 QQ 群发来的消息事件。为空时表示不启用白名单过滤。"}, } }, "platform_settings": { @@ -214,7 +212,7 @@ CONFIG_METADATA_2 = { "log_level": {"description": "控制台日志级别", "type": "string", "hint": "控制台输出日志的级别。", "options": ["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"]}, "t2i_endpoint": {"description": "文本转图像服务接口", "type": "string", "hint": "为空时使用 AstrBot API 服务"}, "pip_install_arg": {"description": "pip 安装参数", "type": "string", "hint": "安装插件依赖时,会使用 Python 的 pip 工具。这里可以填写额外的参数,如 `--break-system-package` 等。"}, - "plugin_repo_mirror": {"description": "插件仓库镜像", "type": "string", "hint": "插件仓库的镜像地址,用于加速插件的下载。", "options": ["default", "https://github-mirror.us.kg/"]}, + "plugin_repo_mirror": {"description": "插件仓库镜像", "type": "string", "hint": "插件仓库的镜像地址,用于加速插件的下载。", "options": ["default", "https://ghp.ci/", "https://github-mirror.us.kg/"]}, } DEFAULT_VALUE_MAP = { diff --git a/astrbot/core/utils/metrics.py b/astrbot/core/utils/metrics.py index 939010bd3..371bf86b4 100644 --- a/astrbot/core/utils/metrics.py +++ b/astrbot/core/utils/metrics.py @@ -21,9 +21,8 @@ class Metric(): } try: async with aiohttp.ClientSession() as session: - logger.debug(f"Uploading metric: {kwargs}") async with session.post(base_url, json=payload, timeout=3) as response: if response.status != 200: - logger.error(f"Failed to upload metric: {response.status} {response.reason}") + pass except Exception as e: - logger.error(f"Failed to upload metric: {e}") \ No newline at end of file + pass \ No newline at end of file diff --git a/astrbot/core/zip_updator.py b/astrbot/core/zip_updator.py index eaf2ca2c5..439ad9b92 100644 --- a/astrbot/core/zip_updator.py +++ b/astrbot/core/zip_updator.py @@ -112,11 +112,13 @@ class RepoZipUpdator(): release_url = releases[0]['zipball_url'] # 镜像站点 - if self.repo_mirror: - if self.repo_mirror == 'default': - pass - elif self.repo_mirror == 'https://github-mirror.us.kg/': + match self.repo_mirror: + case 'https://github-mirror.us.kg/': release_url = self.repo_mirror + release_url + case "https://ghp.ci/": + release_url = self.repo_mirror + release_url + case _: + pass await download_file(release_url, target_path + ".zip") diff --git a/packages/astrbot_adapter_aiocqhttp/aiocqhttp_platform_adapter.py b/packages/astrbot_adapter_aiocqhttp/aiocqhttp_platform_adapter.py index d5826b467..1158cf727 100644 --- a/packages/astrbot_adapter_aiocqhttp/aiocqhttp_platform_adapter.py +++ b/packages/astrbot_adapter_aiocqhttp/aiocqhttp_platform_adapter.py @@ -90,19 +90,35 @@ class AiocqhttpAdapter(Platform): abm.message_str = message_str abm.raw_message = event return abm - + + def handle_whitelist(self, event: Event) -> bool: + match event['message_type']: + case "group": + if self.config.qq_group_id_whitelist and str(event.group_id) in self.config.qq_group_id_whitelist: + return True + case "private": + if self.config.qq_id_whitelist and str(event.sender['user_id']) in self.config.qq_id_whitelist: + return True + return False + def run(self) -> Awaitable[Any]: if not self.host or not self.port: return self.bot = CQHttp(use_ws_reverse=True, import_name='aiocqhttp', api_timeout_sec=180) @self.bot.on_message('group') async def group(event: Event): + if not self.handle_whitelist(event): + logger.debug(f"一个群消息({event.group_id})事件由于不在白名单而被过滤。") + return abm = self.convert_message(event) if abm: await self.handle_msg(abm) @self.bot.on_message('private') async def private(event: Event): + if not self.handle_whitelist(event): + logger.debug(f"一个私聊消息({event.sender['nickname']}/{event.sender['user_id']})事件由于不在白名单而被过滤。") + return abm = self.convert_message(event) if abm: await self.handle_msg(abm)