清理线程

This commit is contained in:
Bluemangoo 2026-06-22 19:13:02 +08:00
parent 61b73d0bef
commit 737249b0d7
Signed by: Bluemangoo
GPG Key ID: F2F7E46880A1C4CF
3 changed files with 44 additions and 6 deletions

View File

@ -21,3 +21,8 @@ def startup():
rlib.set_ghp(pconfig.github_token)
rlib.boot(str(Path.cwd()), "nonebot_plugin_sekai_update_notify", pconfig.assets_studio_path)
scheduler.add_job(sync, "interval", seconds=10, id="sekai_update_sync", replace_existing=True)
@driver.on_shutdown
def shutdown():
rlib.stop()

14
lib.py
View File

@ -39,9 +39,13 @@ class SekaiSyncLib:
self.lib.ghp.argtypes = [ctypes.c_char_p]
self.lib.ghp.restype = None
# boot(cwd: *const c_char, name: *const c_char, as_path: *const c_char) -> i32
# boot(cwd: *const c_char, name: *const c_char, as_path: *const c_char) -> c_int
self.lib.boot.argtypes = [ctypes.c_char_p, ctypes.c_char_p, ctypes.c_char_p]
self.lib.boot.restype = ctypes.c_int32
self.lib.boot.restype = ctypes.c_int
# stop() -> c_int
self.lib.stop.argtypes = []
self.lib.stop.restype = ctypes.c_int
# fetch_data() -> *mut c_char
# ⚠️ 这里必须用 c_void_p不能用 c_char_p否则会丢失指针地址导致内存泄漏
@ -77,6 +81,12 @@ class SekaiSyncLib:
self._str_to_bytes(as_path)
)
def stop(self) -> int:
"""
停止主循环与清理状态
"""
return self.lib.stop()
def fetch_data(self) -> Optional[FetchData]:
# 1. 获取裸指针
ptr = self.lib.fetch_data()

31
sync.py
View File

@ -1,9 +1,11 @@
import json
from pathlib import Path
from nonebot import get_bot
from nonebot.adapters.onebot.v11 import Message, MessageSegment
from nonebot_plugin_apscheduler import scheduler
from nonebot import get_bot, logger
from nonebot.adapters.onebot.v11 import Message, MessageSegment, GroupMessageEvent
from nonebot.internal.matcher import Matcher
from nonebot.permission import SUPERUSER
from nonebot.plugin.on import on_command
from .config import pconfig
from .lib import rlib
@ -33,7 +35,7 @@ async def sync():
if data is None:
return
message = Message()
inner = [MessageSegment.text(f"活动 {data.event_id} 的卡牌更新了!\n")]
inner = [MessageSegment.text(f"活动 {data.event_id} 的卡牌更新了!")]
for item in data.card_paths:
p = Path(item)
n = MessageSegment.image(file=item)
@ -49,5 +51,26 @@ async def sync():
for group in enabled_groups:
await get_bot().send_group_msg(message=message, group_id=group)
for path in data.card_paths:
try:
Path(path).unlink()
except Exception as e:
logger.error(f"删除文件 {path} 失败: {e}")
subscribe = on_command("订阅烤leak", permission=SUPERUSER)
unsubscribe = on_command("退订烤leak", permission=SUPERUSER)
@subscribe.handle()
async def _(event: GroupMessageEvent, matcher: Matcher):
group_id = event.group_id
add_group(group_id)
await matcher.send(f"已订阅烤leak更新")
@unsubscribe.handle()
async def _(event: GroupMessageEvent, matcher: Matcher):
group_id = event.group_id
remove_group(group_id)
await matcher.send(f"已退订烤leak更新")