From c2be32b4ffb492cc039706bc64b3498b8bf2fd62 Mon Sep 17 00:00:00 2001 From: qsc20001102 Date: Mon, 22 Dec 2025 18:03:28 +0800 Subject: [PATCH] 111 --- core/async_task.py | 60 +++++++++++++++++++++++++++++++++++++++++-- core/jx3_service.py | 28 ++++++++++++++++++++ data/api_config.json | 16 ++++++++++++ data/local_async.json | 5 ++++ main.py | 2 +- 5 files changed, 108 insertions(+), 3 deletions(-) create mode 100644 data/local_async.json diff --git a/core/async_task.py b/core/async_task.py index f3d9a2a..1177cf9 100644 --- a/core/async_task.py +++ b/core/async_task.py @@ -1,6 +1,9 @@ import asyncio +from pathlib import Path +import json from typing import Callable, Awaitable, Optional + from astrbot.api.event import filter, AstrMessageEvent, MessageEventResult, MessageChain from astrbot.api.star import Context, Star, register, StarTools from astrbot.api import logger @@ -26,6 +29,51 @@ class AsyncTask: self.context = context self.conf = config self.jx3fun = jx3fun + self.file_path = StarTools.get_data_dir("astrbot_plugin_jx3") / "local_async.json" + self._file_lock = asyncio.Lock() + logger.info(f"获取后台数据缓存文件路径成功:{self.file_path}") + + + async def set_local_data(self, key: str, value): + """异步安全写入本地 JSON""" + async with self._file_lock: + try: + self.file_path.parent.mkdir(parents=True, exist_ok=True) + + if not self.file_path.exists(): + local_data = {} + else: + with open(self.file_path, 'r', encoding='utf-8') as f: + local_data = json.load(f) + + local_data[key] = value + + with open(self.file_path, 'w', encoding='utf-8') as f: + json.dump(local_data, f, ensure_ascii=False, indent=4) + + logger.debug(f"后台数据写入完成: {key}--{value}") + + except Exception as e: + logger.error(f"数据写入文件失败:{e}") + + + async def get_local_data(self, key: str, default=None): + """异步安全读取本地 JSON""" + async with self._file_lock: + try: + if not self.file_path.exists(): + return default + + with open(self.file_path, 'r', encoding='utf-8') as f: + local_data = json.load(f) + + value = local_data.get(key, default) + logger.debug(f"读取数据成功: {key}--{value}") + return value + + except Exception as e: + logger.error(f"读取数据文件失败:{e}") + return default async def cycle_kfjk(self): @@ -37,8 +85,10 @@ class AsyncTask: "time": conf.get("time", 10), "umos": conf.get("umos", []), } - - self.kfjk_server_state = True # 上一次查询的状态 + try: + self.kfjk_server_state = await self.get_local_data("kfjk") # 上一次查询的状态 + except Exception as e: + logger.error(f"获取本地缓存数据失败: {e}") if self.kfjk_conf["enable"]: logger.info(f"开服监控功能开启") @@ -54,14 +104,20 @@ class AsyncTask: # 判断状态是否变化 if self.kfjk_server_state != self.kfjk_server_state_new: logger.info(f"开服监控功能循环中,上次询问服务器状态{self.kfjk_server_state},本次询问的服务器状态{self.kfjk_server_state_new}") + # 构建不同的推送小时 if self.kfjk_server_state and not self.kfjk_server_state_new: message_chain = MessageChain().message("剑网三服务器已关闭\n休息一会把,开服了喊你!") if self.kfjk_server_state_new and not self.kfjk_server_state: message_chain = MessageChain().message("剑网三服务器已开启\n快冲!快冲!") + # 推送消息 if self.kfjk_conf["umos"]: for umo in self.kfjk_conf["umos"]: await self.context.send_message(umo, message_chain) + + await self.set_local_data("kfjk", self.kfjk_server_state_new) + self.kfjk_server_state = self.kfjk_server_state_new + except Exception as e: logger.error(f"开服监控循环异常: {e}") await asyncio.sleep(self.kfjk_conf["time"]) # 休眠指定时间 diff --git a/core/jx3_service.py b/core/jx3_service.py index 0119689..7a1bb60 100644 --- a/core/jx3_service.py +++ b/core/jx3_service.py @@ -250,6 +250,34 @@ class JX3Service: return return_data + async def xinwei(self) -> Dict[str, Any]: + """新闻资讯""" + return_data = self._init_return_data() + + # 提取字段可能返回列表 + data: Optional[List[Dict[str, Any]]] = await self._base_request("jx3_jigai", "GET") + + if not data or not isinstance(data, list): + return_data["msg"] = "获取接口信息失败或数据格式错误" + return return_data + + try: + result_msg = "剑网三最近技改\n" + # 仅展示前1条,避免消息过长 + for i, item in enumerate(data[:1], 1): + result_msg += f"{i}. {item.get('title', '无标题')}\n" + result_msg += f"时间:{item.get('time', '未知时间')}\n" + result_msg += f"链接:{item.get('url', '无链接')}\n\n" + + return_data["data"] = result_msg + return_data["code"] = 200 + except Exception as e: + logger.error(f"jigai 数据处理时出错: {e}") + return_data["msg"] = "处理接口返回信息时出错" + + return return_data + + async def jinjia(self, server: str, limit:str) -> Dict[str, Any]: """区服金价""" return_data = self._init_return_data() diff --git a/data/api_config.json b/data/api_config.json index d7d5b4b..ce47beb 100644 --- a/data/api_config.json +++ b/data/api_config.json @@ -238,5 +238,21 @@ "name": "飞翔大野猪", "token":"" } + }, + "jx3_xinweng":{ + "url":"https://www.jx3api.com/data/news/allnews", + "method":"GET", + "description":"此接口用于获取官方最新公告及新闻内容,包括新闻分类、标题及链接等信息。", + "params":{ + "limit": 1 + } + }, + "jx3_weihu":{ + "url":"https://www.jx3api.com/data/news/announce", + "method":"GET", + "description":"此接口用于获取官方最新维护公告,包括公告标题、发布日期及链接等信息。", + "params":{ + "limit": 1 + } } } \ No newline at end of file diff --git a/data/local_async.json b/data/local_async.json new file mode 100644 index 0000000..af3e31e --- /dev/null +++ b/data/local_async.json @@ -0,0 +1,5 @@ +{ + "kfjk": true, + "xwzx": 0, + "whgg": 0 +} \ No newline at end of file diff --git a/main.py b/main.py index 1158be9..656dbf0 100644 --- a/main.py +++ b/main.py @@ -39,7 +39,7 @@ class Jx3ApiPlugin(Star): try: self.file_local_data = self.check_and_copy_db( local_data_dir=local_data_dir, - db_filename="local_data.db", + db_filename="local_async.json", default_db_dir=data_file_path ) except FileNotFoundError as e: