mirror of
https://github.com/A-Minos/nonebot-plugin-tetris-stats.git
synced 2026-03-05 05:36:54 +08:00
🐛 修复在事件响应器异常退出后 Recorder 继续执行的bug
This commit is contained in:
@@ -70,6 +70,9 @@ class Processor(ABC):
|
|||||||
|
|
||||||
def __del__(self) -> None:
|
def __del__(self) -> None:
|
||||||
finish_time = datetime.now(tz=UTC)
|
finish_time = datetime.now(tz=UTC)
|
||||||
|
if Recorder.is_error_event(self.event_id):
|
||||||
|
Recorder.del_error_event(self.event_id)
|
||||||
|
return
|
||||||
historical_data = Recorder.get_historical_data(self.event_id)
|
historical_data = Recorder.get_historical_data(self.event_id)
|
||||||
historical_data.game_platform = self.game_platform
|
historical_data.game_platform = self.game_platform
|
||||||
historical_data.command_type = self.command_type
|
historical_data.command_type = self.command_type
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ driver = get_driver()
|
|||||||
class Recorder:
|
class Recorder:
|
||||||
matchers: ClassVar[set[type[Matcher]]] = set()
|
matchers: ClassVar[set[type[Matcher]]] = set()
|
||||||
historical_data: ClassVar[dict[int, tuple[HistoricalData, bool]]] = {}
|
historical_data: ClassVar[dict[int, tuple[HistoricalData, bool]]] = {}
|
||||||
|
error_event: ClassVar[set[int]] = set()
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def create_historical_data(cls, event_id: int, historical_data: HistoricalData) -> None:
|
def create_historical_data(cls, event_id: int, historical_data: HistoricalData) -> None:
|
||||||
@@ -32,17 +33,27 @@ class Recorder:
|
|||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
async def save_historical_data(cls, event_id: int) -> None:
|
async def save_historical_data(cls, event_id: int) -> None:
|
||||||
if event_id not in cls.historical_data:
|
historical_data, completed = cls.del_historical_data(event_id)
|
||||||
raise KeyError
|
|
||||||
historical_data, completed = cls.historical_data.pop(event_id)
|
|
||||||
if completed:
|
if completed:
|
||||||
async with get_session() as session:
|
async with get_session() as session:
|
||||||
session.add(historical_data)
|
session.add(historical_data)
|
||||||
await session.commit()
|
await session.commit()
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def del_historical_data(cls, event_id: int) -> None:
|
def del_historical_data(cls, event_id: int) -> tuple[HistoricalData, bool]:
|
||||||
cls.historical_data.pop(event_id)
|
return cls.historical_data.pop(event_id)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def add_error_event(cls, event_id: int) -> None:
|
||||||
|
cls.error_event.add(event_id)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def del_error_event(cls, event_id: int) -> None:
|
||||||
|
cls.error_event.remove(event_id)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def is_error_event(cls, event_id: int) -> bool:
|
||||||
|
return event_id in cls.error_event
|
||||||
|
|
||||||
|
|
||||||
@driver.on_startup
|
@driver.on_startup
|
||||||
@@ -73,7 +84,9 @@ def _(bot: Bot, event: Event, matcher: Matcher):
|
|||||||
@run_postprocessor
|
@run_postprocessor
|
||||||
async def _(event: Event, matcher: Matcher, exception: Exception | None):
|
async def _(event: Event, matcher: Matcher, exception: Exception | None):
|
||||||
if isinstance(matcher, tuple(Recorder.matchers)):
|
if isinstance(matcher, tuple(Recorder.matchers)):
|
||||||
|
event_id = id(event)
|
||||||
if exception is not None:
|
if exception is not None:
|
||||||
Recorder.del_historical_data(id(event))
|
Recorder.add_error_event(event_id)
|
||||||
|
Recorder.del_historical_data(event_id)
|
||||||
else:
|
else:
|
||||||
await Recorder.save_historical_data(id(event))
|
await Recorder.save_historical_data(event_id)
|
||||||
|
|||||||
Reference in New Issue
Block a user