This commit is contained in:
qsc
2025-12-05 13:44:40 +08:00
parent 2ebf83680b
commit 7725d4c866
2 changed files with 70 additions and 51 deletions
+62
View File
@@ -0,0 +1,62 @@
import asyncio
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
async def cycle_kaifjiankong(self):
"""开服监控后台程序"""
# 获取配置信息
time_int = self.conf.get("jx3_kfjk_time", 10)
self.kfjk_en = self.conf.get("jx3_kfjk_en", True)
self.kfjk_umos = self.conf.get("jx3_kfjk_list", [])
kfjk_test = self.conf.get("jx3_kfjk_test", False)
self.kfjk_server_state = True # 上一次查询的状态
self.kfjk_server_state_new = False # 最新查询的状态
if self.kfjk_en:
logger.info(f"开服监控功能开启")
while self.kfjk_en:
data = await self.jx3fun.kaifu("梦江南")
if kfjk_test:
self.kfjk_server_state_new = False
else:
self.kfjk_server_state_new = data["status"]
# logger.info(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_umos:
for umo in self.kfjk_umos:
await self.context.send_message(umo, message_chain)
self.kfjk_server_state = self.kfjk_server_state_new
await asyncio.sleep(time_int)
+8 -51
View File
@@ -13,7 +13,7 @@ from astrbot.api import AstrBotConfig
from .core.aiosqlite import AsyncSQLite from .core.aiosqlite import AsyncSQLite
from .core.jx3_service import JX3Service from .core.jx3_service import JX3Service
from .core.async_task import AsyncTask
@register("astrbot_plugin_jx3", @register("astrbot_plugin_jx3",
@@ -42,13 +42,12 @@ class Jx3ApiPlugin(Star):
# 处理默认文件丢失的严重错误 # 处理默认文件丢失的严重错误
logger.critical(f"插件初始化失败:{e}") logger.critical(f"插件初始化失败:{e}")
raise # 中断初始化 raise # 中断初始化
# 读取配置文件 # 读取API配置文件
self.api_file_path = Path(__file__).parent / "data" / "api_config.json" self.api_file_path = Path(__file__).parent / "data" / "api_config.json"
with open(self.api_file_path, 'r', encoding='utf-8') as f: with open(self.api_file_path, 'r', encoding='utf-8') as f:
self.api_config = json.load(f) self.api_config = json.load(f)
# 初始化数据 # 初始化数据
self.inidata() #self.kf_task = asyncio.create_task(self.cycle_kaifjiankong())
self.kf_task = asyncio.create_task(self.cycle_kaifjiankong())
logger.info("jx3api插件初始化完成") logger.info("jx3api插件初始化完成")
@@ -57,9 +56,10 @@ class Jx3ApiPlugin(Star):
#创建类实例 #创建类实例
self.db = AsyncSQLite(str(self.file_local_data)) self.db = AsyncSQLite(str(self.file_local_data))
self.jx3fun = JX3Service(self.api_config,self.db) self.jx3fun = JX3Service(self.api_config,self.db)
self.at = AsyncTask(self.context, self.conf, self.jx3fun)
# 周期函数调用 # 周期函数调用
self.kf_task = asyncio.create_task(self.at.cycle_kaifjiankong())
logger.info("jx3api插件创建实例完成") logger.info("jx3api异步插件初始化完成")
def check_and_copy_db(self, local_data_dir: Union[str, Path], db_filename: str, default_db_dir: Union[str, Path]) -> pathlib.Path: def check_and_copy_db(self, local_data_dir: Union[str, Path], db_filename: str, default_db_dir: Union[str, Path]) -> pathlib.Path:
@@ -96,50 +96,6 @@ class Jx3ApiPlugin(Star):
return target_file_path return target_file_path
def inidata(self):
"""数据初始化"""
self.test_server = False
logger.info("数据初始化完成")
async def cycle_kaifjiankong(self):
"""开服监控后台程序"""
# 获取配置信息
time_int = self.conf.get("jx3_kfjk_time", 10)
self.kfjk_en = self.conf.get("jx3_kfjk_en", True)
self.kfjk_umos = self.conf.get("jx3_kfjk_list", [])
self.kfjk_servername = self.conf.get("jx3_kfjk_server", "梦江南")
kfjk_test = self.conf.get("jx3_kfjk_test", False)
self.kfjk_server_state = True # 上一次查询的状态
self.kfjk_server_state_new = False # 最新查询的状态
if self.kfjk_en:
logger.info(f"开服监控功能开启")
while self.kfjk_en:
data = await self.jx3fun.kaifu(self.kfjk_servername)
if kfjk_test:
self.kfjk_server_state_new = self.test_server
else:
self.kfjk_server_state_new = data["status"]
# logger.info(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(f"{self.kfjk_servername}服务器已关闭\n休息一会把,开服了喊你!")
if self.kfjk_server_state_new and not self.kfjk_server_state:
message_chain = MessageChain().message(f"{self.kfjk_servername}服务器已开启\n快冲!快冲!")
if self.kfjk_umos:
for umo in self.kfjk_umos:
await self.context.send_message(umo, message_chain)
self.kfjk_server_state = self.kfjk_server_state_new
await asyncio.sleep(time_int)
if not self.kfjk_en:
# 销毁进程
self.kf_task.cancel()
logger.info(f"开服监控功能关闭")
@filter.command_group("剑三") @filter.command_group("剑三")
def jx3(self): def jx3(self):
pass pass
@@ -300,7 +256,8 @@ class Jx3ApiPlugin(Star):
except ValueError as e: except ValueError as e:
yield event.plain_result(f"开服监控已关闭") yield event.plain_result(f"开服监控已关闭")
elif en == "状态": elif en == "状态":
yield event.plain_result(f"开服监控后台状态:{self.kfjk_en}\n监控服务器:{self.kfjk_servername}\n上次询问服务器状态{self.kfjk_server_state}\n本次询问的服务器状态{self.kfjk_server_state_new}\n推送会话列表:\n{self.kfjk_umos}") #yield event.plain_result(f"开服监控后台状态:{self.kfjk_en}\n监控服务器:{self.kfjk_servername}\n上次询问服务器状态{self.kfjk_server_state}\n本次询问的服务器状态{self.kfjk_server_state_new}\n推送会话列表:\n{self.kfjk_umos}")
yield event.plain_result(f"开服监控后台状态:")
else: else:
yield event.plain_result("开服监控指令错误,请输入 开启/关闭") yield event.plain_result("开服监控指令错误,请输入 开启/关闭")