Archived
1
0
Fork 0
This repository has been archived on 2024-04-26. You can view files and clone it, but cannot push or open issues or pull requests.
akari-bot/core/builtins/tasks.py
2023-06-29 21:54:59 +08:00

77 lines
3.2 KiB
Python

from datetime import datetime
from core.logger import Logger
from core.types import MessageSession
class MessageTaskManager:
_list = {}
@classmethod
def add_task(cls, session: MessageSession, flag, all_=False, reply=None):
sender = session.target.senderId
task_type = 'reply' if reply is not None else 'wait'
if all_:
sender = 'all'
if session.target.targetId not in cls._list:
cls._list[session.target.targetId] = {}
if sender not in cls._list[session.target.targetId]:
cls._list[session.target.targetId][sender] = {}
cls._list[session.target.targetId][sender][session] = {session: {
'flag': flag, 'active': True, 'type': task_type, 'reply': reply, 'ts': datetime.now().timestamp()}}
Logger.debug(cls._list)
@classmethod
def get_result(cls, session: MessageSession):
if 'result' in cls._list[session.target.targetId][session.target.senderId][session]:
return cls._list[session.target.targetId][session.target.senderId][session]['result']
else:
return None
@classmethod
def get(cls):
return cls._list
@classmethod
async def bg_check(cls):
for target in cls._list:
for sender in cls._list[target]:
for session in cls._list[target][sender]:
if cls._list[target][sender][session]['active']:
if datetime.now().timestamp() - cls._list[target][sender][session]['ts'] > 3600:
cls._list[target][sender][session]['active'] = False
cls._list[target][sender][session]['flag'].set() # no result = cancel
@classmethod
async def check(cls, session: MessageSession):
if session.target.targetId in cls._list:
senders = []
if session.target.senderId in cls._list[session.target.targetId]:
senders.append(session.target.senderId)
if 'all' in cls._list[session.target.targetId]:
senders.append('all')
if senders is not None:
for sender in senders:
for s in cls._list[session.target.targetId][sender]:
get_ = cls._list[session.target.targetId][sender][s]
if get_['type'] == 'wait':
get_['result'] = session
get_['active'] = False
get_['flag'].set()
elif get_['type'] == 'reply':
if isinstance(get_['reply'], list):
for reply in get_['reply']:
if reply == s.target.replyId:
get_['result'] = session
get_['active'] = False
get_['flag'].set()
break
else:
if get_['reply'] == s.target.replyId:
get_['result'] = session
get_['active'] = False
get_['flag'].set()
__all__ = ['MessageTaskManager']