111
This commit is contained in:
+58
-2
@@ -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"]) # 休眠指定时间
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user