Compare commits

...

2 Commits

Author SHA1 Message Date
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

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,12 +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
]
logger.info(f"LongTask 工作完成 UUID={self.uuid} callback={self.callback}")
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