133 lines
5.3 KiB
Python
133 lines
5.3 KiB
Python
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
|
|
from astrbot.api import AstrBotConfig
|
|
|
|
from .jx3_service import JX3Service
|
|
|
|
class AsyncTask:
|
|
"""
|
|
异步后台任务类(asyncio版)
|
|
- 支持后台异步循环执行
|
|
- 支持 start/stop
|
|
- 支持设定间隔
|
|
"""
|
|
|
|
def __init__(self, context: Context, config: AstrBotConfig, jx3fun: JX3Service):
|
|
"""
|
|
Args:
|
|
coro: 异步任务函数
|
|
interval: 每次执行间隔(秒)
|
|
auto_start: 是否自动启动
|
|
"""
|
|
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):
|
|
"""开服监控后台程序"""
|
|
# 获取配置信息
|
|
conf = self.conf.get("kfjk", {})
|
|
self.kfjk_conf = {
|
|
"enable": conf.get("enable", True),
|
|
"time": conf.get("time", 10),
|
|
"umos": conf.get("umos", []),
|
|
}
|
|
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"开服监控功能开启")
|
|
else:
|
|
logger.info(f"开服监控功能关闭")
|
|
return
|
|
while self.kfjk_conf["enable"]:
|
|
try:
|
|
# 获取最新服务状态
|
|
data = await self.jx3fun.kaifu("梦江南")
|
|
self.kfjk_server_state_new = data["status"]
|
|
logger.debug(f"开服监控功能循环中,上次询问服务器状态{self.kfjk_server_state},本次询问的服务器状态{self.kfjk_server_state_new}")
|
|
# 判断状态是否变化
|
|
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"]) # 休眠指定时间
|
|
|
|
|
|
async def get_kfjk_conf(self) -> str:
|
|
"""获取开服监控配置信息"""
|
|
return_msg = f"开服监控后台状态:{self.kfjk_conf['enable']}\n"
|
|
return_msg += f"周期询问时间:{self.kfjk_conf['time']}秒\n"
|
|
return_msg += f"上次询问服务器状态{self.kfjk_server_state}\n"
|
|
return_msg += f"本次询问的服务器状态{self.kfjk_server_state_new}\n"
|
|
return_msg += f"推送会话列表:\n{self.kfjk_conf['umos']}"
|
|
return return_msg |