This commit is contained in:
2025-12-22 18:03:28 +08:00
parent 6ec800f88c
commit c2be32b4ff
5 changed files with 108 additions and 3 deletions
+58 -2
View File
@@ -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"]) # 休眠指定时间
+28
View File
@@ -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()