Compare commits

...

4 Commits

Author SHA1 Message Date
b42385f780 修复成语接龙
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2025-10-19 18:24:03 +08:00
6cae38dea9 提升 LongTask 的健壮性
All checks were successful
continuous-integration/drone/push Build is passing
2025-10-19 16:54:59 +08:00
8594b59783 修复 LongTask 在 Discord 和控制台无法正确返回是否顺利完成任务的问题 2025-10-19 16:51:22 +08:00
f768c91430 完善 LongTask 模块
All checks were successful
continuous-integration/drone/push Build is passing
2025-10-19 16:47:50 +08:00
3 changed files with 37 additions and 17 deletions

View File

@ -1,3 +1,5 @@
from __future__ import annotations
from contextlib import asynccontextmanager
import datetime
import json
@ -89,6 +91,7 @@ class LongTaskTarget(BaseModel):
)
return False
await bot.send_message(self.channel_id, cast(Any, await msg.export()))
return True
if self.platform == "discord":
if not isinstance(bot, DCBot):
logger.warning(
@ -104,6 +107,7 @@ class LongTaskTarget(BaseModel):
),
tts=False,
)
return True
logger.warning(f"没有一个平台是期望的平台 PLATFORM={self.platform}")
return False
@ -111,7 +115,7 @@ class LongTaskTarget(BaseModel):
class LongTask(BaseModel):
uuid: str
data_json: str
target: "LongTaskTarget"
target: LongTaskTarget
callback: str
deadline: datetime.datetime
canceled: bool = False
@ -143,11 +147,25 @@ class LongTask(BaseModel):
datafile.unhandled.setdefault(self.callback, []).append(self)
return
await hdl(self)
success = False
try:
await hdl(self)
success = True
except Exception as e:
logger.exception(e)
async with longtask_data() as datafile:
datafile.to_handle[self.callback] = [
t for t in datafile.to_handle[self.callback] if t.uuid != self.uuid
]
if not success:
datafile.unhandled.setdefault(self.callback, []).append(self)
logger.info(
f"LongTask 执行失败 UUID={self.uuid} callback={self.callback}"
)
else:
logger.info(
f"LongTask 工作完成 UUID={self.uuid} callback={self.callback}"
)
def clean(self):
self._aio_task = None
@ -257,6 +275,7 @@ async def create_longtask(
deadline=deadline,
)
logger.info(f"创建了新的 LongTask UUID={task.uuid} CALLBACK={task.callback}")
await task.start()
async with longtask_data() as d:
@ -266,10 +285,17 @@ async def create_longtask(
async def init_longtask():
counter = 0
req: set[str] = set()
async with longtask_data() as data:
for v in data.to_handle.values():
for t in v:
await t.start()
counter += 1
req.add(t.callback)
logger.info(f"LongTask 启动了任务 数量={counter} 期望的门类=[{','.join(req)}]")
DepLongTaskTarget = Annotated[LongTaskTarget, Depends(get_long_task_target)]

View File

@ -1,22 +1,18 @@
import asyncio as asynkio
import base64
from pathlib import Path
import secrets
import json
import datetime
from typing import Literal, Optional
import json
import secrets
from enum import Enum
from pathlib import Path
from typing import Optional
from loguru import logger
from nonebot import on_message
from nonebot.adapters import Event as BaseEvent
from nonebot.adapters.console.event import MessageEvent as ConsoleMessageEvent
from nonebot.adapters.discord.event import MessageEvent as DiscordMessageEvent
from nonebot_plugin_alconna import (
Alconna,
Args,
Field,
Subcommand,
UniMessage,
UniMsg,
on_alconna,
@ -360,8 +356,10 @@ evt = on_alconna(
@evt.handle()
async def force_play_game(event: BaseEvent, rounds: Optional[int] = 100):
await play_game(event, force=True, rounds=rounds)
async def force_play_game(
event: BaseEvent, target: DepLongTaskTarget, rounds: Optional[int] = 100
):
await play_game(event, target, force=True, rounds=rounds)
async def end_game(event: BaseEvent, group_id: str):
@ -518,4 +516,3 @@ async def _(event: BaseEvent, target: DepLongTaskTarget):
group_id = target.channel_id
remove_banned_id(group_id)
await evt.send(await UniMessage().text("本群已开启成语接龙功能!").export())

View File

@ -4,13 +4,11 @@ import asyncio
from loguru import logger
import nonebot
# from nonebot.adapters import Bot, Event
# from nonebot_plugin_alconna import UniMessage
from konabot.common.longtask import (
# DepLongTaskTarget,
# LongTask,
# create_longtask,
# get_long_task_target,
# handle_long_task,
init_longtask,
)
@ -45,6 +43,5 @@ async def _():
# handler="test_callback_001",
# data={},
# target=target,
# deadline=datetime.datetime.now() + datetime.timedelta(seconds=2),
# deadline=datetime.datetime.now() + datetime.timedelta(seconds=20),
# )
# await target.send_message(UniMessage().text("Hello, world!"), at=True)