Archived
1
0
Fork 0

rewrite message tasks manager

This commit is contained in:
yzhh 2022-06-28 01:00:00 +08:00
parent 6d3f77aa30
commit 8a80679ce6
13 changed files with 95 additions and 292 deletions

View file

@ -8,14 +8,14 @@ from aiocqhttp import Event
from bots.aiocqhttp.client import bot
from bots.aiocqhttp.message import MessageSession, FetchTarget
from bots.aiocqhttp.message_guild import MessageSession as MessageSessionGuild
from bots.aiocqhttp.tasks import MessageTaskManager, FinishedTasks
from config import Config
from core.elements import MsgInfo, Session, EnableDirtyWordCheck, PrivateAssets
from core.parser.message import parser
from core.utils import init, load_prompt, init_async
from core.utils import init, load_prompt, init_async, MessageTaskManager
from database import BotDBUtil
from database.logging_message import UnfriendlyActions
PrivateAssets.set(os.path.abspath(os.path.dirname(__file__) + '/assets'))
EnableDirtyWordCheck.status = True
init()
@ -40,8 +40,6 @@ async def _(event: Event):
filter_msg = re.match(r'.*?\[CQ:(?:json|xml).*?].*?|.*?<\?xml.*?>.*?', event.message)
if filter_msg:
return
all_tsk = MessageTaskManager.get()
user_id = event.user_id
targetId = 'QQ|' + (f'Group|{str(event.group_id)}' if event.detail_type == 'group' else str(event.user_id))
msg = MessageSession(MsgInfo(targetId=targetId,
@ -51,17 +49,7 @@ async def _(event: Event):
Session(message=event,
target=event.group_id if event.detail_type == 'group' else event.user_id,
sender=event.user_id))
if targetId in all_tsk:
add_ = None
if user_id in all_tsk[targetId]:
add_ = user_id
if 'all' in all_tsk[targetId]:
add_ = 'all'
if add_:
FinishedTasks.add_task(targetId, add_, msg)
all_tsk[targetId][add_].set()
MessageTaskManager.del_task(targetId, add_)
MessageTaskManager.check(msg)
await parser(msg, running_mention=True)
@ -85,12 +73,7 @@ async def _(event):
Session(message=event,
target=f'{str(event.guild_id)}|{str(event.channel_id)}',
sender=event.user_id))
all_tsk = MessageTaskManager.guild_get()
if targetId in all_tsk:
if tiny_id in all_tsk[targetId]:
FinishedTasks.add_guild_task(targetId, tiny_id, msg)
all_tsk[targetId][tiny_id].set()
MessageTaskManager.del_guild_task(targetId, tiny_id)
MessageTaskManager.check(msg)
await parser(msg, running_mention=True)

View file

@ -12,11 +12,10 @@ from aiocqhttp import MessageSegment
from bots.aiocqhttp.client import bot
from bots.aiocqhttp.message_guild import MessageSession as MessageSessionGuild
from bots.aiocqhttp.tasks import MessageTaskManager, FinishedTasks
from core.elements import Plain, Image, MessageSession as MS, MsgInfo, Session, Voice, FetchTarget as FT, \
from core.builtins.message import MessageSession as MS
from core.elements import Plain, Image, MsgInfo, Session, Voice, FetchTarget as FT, \
ExecutionLockList, FetchedSession as FS, FinishedSession as FinS
from core.elements.message.chain import MessageChain
from core.elements.others import confirm_command
from core.logger import Logger
from database import BotDBUtil
@ -75,35 +74,6 @@ class MessageSession(MS):
send = await bot.send_private_msg(user_id=self.session.target, message=msg)
return FinishedSession([send])
async def waitConfirm(self, msgchain=None, quote=True, delete=True):
send = None
ExecutionLockList.remove(self)
if msgchain is not None:
msgchain = MessageChain(msgchain)
msgchain.append(Plain('(发送“是”或符合确认条件的词语来确认)'))
send = await self.sendMessage(msgchain, quote)
flag = asyncio.Event()
MessageTaskManager.add_task(self.target.targetId, self.session.sender, flag)
await flag.wait()
if send is not None and delete:
await send.delete()
if FinishedTasks.get()[self.target.targetId][self.session.sender].asDisplay() in confirm_command:
return True
return False
async def waitAnyone(self, msgchain=None, delete=False):
send = None
ExecutionLockList.remove(self)
if msgchain is not None:
msgchain = MessageChain(msgchain)
send = await self.sendMessage(msgchain, quote=False)
flag = asyncio.Event()
MessageTaskManager.add_task(self.target.targetId, 'all', flag)
await flag.wait()
if send is not None and delete:
await send.delete()
return FinishedTasks.get()[self.target.targetId]['all']
async def checkPermission(self):
if self.target.targetFrom == 'QQ' \
or self.target.senderInfo.check_TargetAdmin(self.target.targetId) \

View file

@ -6,10 +6,9 @@ from pathlib import Path
from aiocqhttp import MessageSegment
from bots.aiocqhttp.client import bot
from bots.aiocqhttp.tasks import MessageTaskManager, FinishedTasks
from core.elements import Plain, Image, MessageSession as MS, ExecutionLockList, FinishedSession as FinS
from core.builtins.message import MessageSession as MS
from core.elements import Plain, Image, ExecutionLockList, FinishedSession as FinS
from core.elements.message.chain import MessageChain
from core.elements.others import confirm_command
from core.logger import Logger
@ -57,35 +56,6 @@ class MessageSession(MS):
return FinishedSession([send])
async def waitConfirm(self, msgchain=None, quote=True, delete=True):
send = None
ExecutionLockList.remove(self)
if msgchain is not None:
msgchain = MessageChain(msgchain)
msgchain.append(Plain('(发送“是”或符合确认条件的词语来确认)'))
send = await self.sendMessage(msgchain, quote)
flag = asyncio.Event()
MessageTaskManager.add_guild_task(self.target.targetId, self.session.sender, flag)
await flag.wait()
if send is not None and delete:
await send.delete()
if FinishedTasks.guild_get()[self.target.targetId][self.session.sender] in confirm_command:
return True
return False
async def waitAnyone(self, msgchain=None, delete=False):
send = None
ExecutionLockList.remove(self)
if msgchain is not None:
msgchain = MessageChain(msgchain)
send = await self.sendMessage(msgchain, quote=False)
flag = asyncio.Event()
MessageTaskManager.add_guild_task(self.target.targetId, 'all', flag)
await flag.wait()
if send is not None and delete:
await send.delete()
return FinishedTasks.guild_get()[self.target.targetId]['all']
async def checkPermission(self):
if self.target.senderInfo.check_TargetAdmin(self.target.targetId) or self.target.senderInfo.query.isSuperUser:
return True

View file

@ -1,56 +0,0 @@
class MessageTaskManager:
_list = {}
_guild_list = {}
@staticmethod
def add_task(grp, uid, tsk):
MessageTaskManager._list.update({grp: {uid: tsk}})
@staticmethod
def del_task(grp, uid):
del MessageTaskManager._list[grp][uid]
@staticmethod
def get():
return MessageTaskManager._list
@staticmethod
def add_guild_task(grp, uid, tsk):
MessageTaskManager._guild_list.update({grp: {uid: tsk}})
@staticmethod
def del_guild_task(grp, uid):
del MessageTaskManager._guild_list[grp][uid]
@staticmethod
def guild_get():
return MessageTaskManager._guild_list
class FinishedTasks:
_list = {}
_guild_list = {}
@staticmethod
def add_task(grp, uid, result):
FinishedTasks._list.update({grp: {uid: result}})
@staticmethod
def del_task(grp, uid):
del FinishedTasks._list[grp][uid]
@staticmethod
def get():
return FinishedTasks._list
@staticmethod
def add_guild_task(grp, uid, result):
FinishedTasks._guild_list.update({grp: {uid: result}})
@staticmethod
def del_guild_task(grp, uid):
del FinishedTasks._guild_list[grp][uid]
@staticmethod
def guild_get():
return FinishedTasks._guild_list

View file

@ -4,7 +4,7 @@ from aiogram import types, executor
from bots.aiogram.client import dp
from bots.aiogram.message import MessageSession, FetchTarget
from bots.aiogram.tasks import MessageTaskManager, FinishedTasks
from core.utils.tasks import MessageTaskManager
from core.elements import MsgInfo, Session, PrivateAssets, Url
from core.parser.message import parser
from core.utils import init, load_prompt, init_async
@ -16,24 +16,13 @@ Url.disable_mm = True
@dp.message_handler()
async def msg_handler(message: types.Message):
user_id = message.from_user.id
targetId = f'Telegram|{message.chat.type}|{message.chat.id}'
msg = MessageSession(MsgInfo(targetId=targetId,
senderId=f'Telegram|User|{message.from_user.id}',
targetFrom=f'Telegram|{message.chat.type}',
senderFrom='Telegram|User', senderName=message.from_user.username, clientName='Telegram'),
Session(message=message, target=message.chat.id, sender=message.from_user.id))
all_tsk = MessageTaskManager.get()
if targetId in all_tsk:
add_ = None
if user_id in all_tsk[targetId]:
add_ = user_id
if 'all' in all_tsk[targetId]:
add_ = 'all'
if add_:
FinishedTasks.add_task(targetId, add_, msg)
all_tsk[targetId][add_].set()
MessageTaskManager.del_task(targetId, add_)
MessageTaskManager.check(msg)
await parser(msg)

View file

@ -4,11 +4,10 @@ import traceback
from typing import List, Union
from bots.aiogram.client import dp, bot
from bots.aiogram.tasks import MessageTaskManager, FinishedTasks
from core.elements import Plain, Image, MessageSession as MS, MsgInfo, Session, Voice, FetchTarget as FT, \
from core.builtins.message import MessageSession as MS
from core.elements import Plain, Image, MsgInfo, Session, Voice, FetchTarget as FT, \
ExecutionLockList, FetchedSession as FS, FinishedSession as FinS
from core.elements.message.chain import MessageChain
from core.elements.others import confirm_command
from core.logger import Logger
from database import BotDBUtil
@ -71,35 +70,6 @@ class MessageSession(MS):
count += 1
return FinishedSession(send)
async def waitConfirm(self, msgchain=None, quote=True, delete=True):
ExecutionLockList.remove(self)
send = None
if msgchain is not None:
msgchain = MessageChain(msgchain)
msgchain.append(Plain('(发送“是”或符合确认条件的词语来确认)'))
send = await self.sendMessage(msgchain, quote)
flag = asyncio.Event()
MessageTaskManager.add_task(self.target.targetId, self.session.sender, flag)
await flag.wait()
if msgchain is not None and delete:
await send.delete()
if FinishedTasks.get()[self.target.targetId][self.session.sender].asDisplay() in confirm_command:
return True
return False
async def waitAnyone(self, msgchain=None, delete=False):
send = None
ExecutionLockList.remove(self)
if msgchain is not None:
msgchain = MessageChain(msgchain)
send = await self.sendMessage(msgchain, quote=False)
flag = asyncio.Event()
MessageTaskManager.add_task(self.target.targetId, 'all', flag)
await flag.wait()
if send is not None and delete:
await send.delete()
return FinishedTasks.get()[self.target.targetId]['all']
async def checkPermission(self):
if self.session.message.chat.type == 'private' or self.target.senderInfo.check_TargetAdmin(
self.target.targetId) or self.target.senderInfo.query.isSuperUser:

View file

@ -1,30 +0,0 @@
class MessageTaskManager:
_list = {}
@staticmethod
def add_task(grp, uid, tsk):
MessageTaskManager._list.update({grp: {uid: tsk}})
@staticmethod
def del_task(grp, uid):
del MessageTaskManager._list[grp][uid]
@staticmethod
def get():
return MessageTaskManager._list
class FinishedTasks:
_list = {}
@staticmethod
def add_task(grp, uid, result):
FinishedTasks._list.update({grp: {uid: result}})
@staticmethod
def del_task(grp, uid):
del FinishedTasks._list[grp][uid]
@staticmethod
def get():
return FinishedTasks._list

View file

@ -4,13 +4,12 @@ import discord
from bots.discord.client import client
from bots.discord.message import MessageSession, FetchTarget
from bots.discord.tasks import MessageTaskManager, FinishedTasks
from config import Config
from core.elements import MsgInfo, Session, PrivateAssets, Url
from core.logger import Logger
from core.parser.message import parser
from core.utils import init, init_async, load_prompt
from core.utils import init, init_async, load_prompt, MessageTaskManager
PrivateAssets.set(os.path.abspath(os.path.dirname(__file__) + '/assets'))
init()
@ -44,17 +43,7 @@ async def on_message(message):
senderName=message.author.name, targetFrom=target, senderFrom="Discord|Client",
clientName='Discord'),
session=Session(message=message, target=message.channel, sender=message.author))
all_tsk = MessageTaskManager.get()
if targetId in all_tsk:
add_ = None
if user_id in all_tsk[targetId]:
add_ = user_id
if 'all' in all_tsk[targetId]:
add_ = 'all'
if add_:
FinishedTasks.add_task(targetId, add_, msg)
all_tsk[targetId][add_].set()
MessageTaskManager.del_task(targetId, add_)
MessageTaskManager.check(msg)
await parser(msg)

View file

@ -7,12 +7,11 @@ from typing import List, Union
import discord
from bots.discord.client import client
from bots.discord.tasks import MessageTaskManager, FinishedTasks
from core.elements import Plain, Image, MessageSession as MS, MsgInfo, Session, FetchTarget as FT, ExecutionLockList, \
from core.builtins.message import MessageSession as MS
from core.elements import Plain, Image, MsgInfo, Session, FetchTarget as FT, ExecutionLockList, \
FetchedSession as FS, FinishedSession as FinS
from core.elements.message.chain import MessageChain
from core.elements.message.internal import Embed
from core.elements.others import confirm_command
from core.logger import Logger
from database import BotDBUtil
@ -101,36 +100,6 @@ class MessageSession(MS):
count += 1
return FinishedSession(send)
async def waitConfirm(self, msgchain=None, quote=True, delete=True):
ExecutionLockList.remove(self)
send = None
if msgchain is not None:
msgchain = MessageChain(msgchain)
msgchain.append(Plain('(发送“是”或符合确认条件的词语来确认)'))
send = await self.sendMessage(msgchain, quote)
flag = asyncio.Event()
MessageTaskManager.add_task(self.target.targetId, self.session.sender, flag)
await flag.wait()
if msgchain is not None and delete:
await send.delete()
if FinishedTasks.get()[self.target.targetId][self.session.sender].asDisplay() in confirm_command:
return True
return False
async def waitAnyone(self, msgchain=None, delete=False):
send = None
ExecutionLockList.remove(self)
if msgchain is not None:
msgchain = MessageChain(msgchain)
send = await self.sendMessage(msgchain, quote=False)
flag = asyncio.Event()
MessageTaskManager.add_task(self.target.targetId, 'all', flag)
await flag.wait()
if send is not None and delete:
await send.delete()
return FinishedTasks.get()[self.target.targetId]['all']
async def checkPermission(self):
if self.session.message.channel.permissions_for(self.session.message.author).administrator \
or isinstance(self.session.message.channel, discord.DMChannel) \

View file

@ -1,30 +0,0 @@
class MessageTaskManager:
_list = {}
@staticmethod
def add_task(grp, uid, tsk):
MessageTaskManager._list.update({grp: {uid: tsk}})
@staticmethod
def del_task(grp, uid):
del MessageTaskManager._list[grp][uid]
@staticmethod
def get():
return MessageTaskManager._list
class FinishedTasks:
_list = {}
@staticmethod
def add_task(grp, uid, result):
FinishedTasks._list.update({grp: {uid: result}})
@staticmethod
def del_task(grp, uid):
del FinishedTasks._list[grp][uid]
@staticmethod
def get():
return FinishedTasks._list

View file

@ -0,0 +1,40 @@
import asyncio
from core.elements import ExecutionLockList, Plain, confirm_command
from core.elements.message import *
from core.elements.message.chain import MessageChain
from core.utils import MessageTaskManager
class MessageSession(MessageSession):
async def waitConfirm(self, msgchain=None, quote=True, delete=True):
send = None
ExecutionLockList.remove(self)
if msgchain is not None:
msgchain = MessageChain(msgchain)
msgchain.append(Plain('(发送“是”或符合确认条件的词语来确认)'))
send = await self.sendMessage(msgchain, quote)
flag = asyncio.Event()
MessageTaskManager.add_task(self, flag)
await flag.wait()
if msgchain is not None and delete:
await send.delete()
if MessageTaskManager.get_result(self).asDisplay() in confirm_command:
return True
return False
async def waitAnyone(self, msgchain=None, delete=False):
send = None
ExecutionLockList.remove(self)
if msgchain is not None:
msgchain = MessageChain(msgchain)
send = await self.sendMessage(msgchain, quote=False)
flag = asyncio.Event()
MessageTaskManager.add_task(self, flag, all_=True)
await flag.wait()
if send is not None and delete:
await send.delete()
return MessageTaskManager.get()[self.target.targetId]['all']['result']
__all__ = ["MessageSession"]

View file

@ -5,3 +5,4 @@ from .image_table import *
from .message import *
from .message import *
from .storedata import *
from .tasks import *

38
core/utils/tasks.py Normal file
View file

@ -0,0 +1,38 @@
from core.elements import MessageSession
class MessageTaskManager:
_list = {}
@staticmethod
def add_task(session: MessageSession, flag, all_=False):
sender = session.target.senderId
if all_:
sender = 'all'
MessageTaskManager._list.update(
{session.target.targetId: {sender: {'flag': flag, 'active': True}}})
@staticmethod
def get_result(session: MessageSession):
return MessageTaskManager._list[session.target.targetId][session.target.senderId]['result']
@staticmethod
def get():
return MessageTaskManager._list
@staticmethod
def check(session: MessageSession):
if session.target.targetId in MessageTaskManager._list:
sender = None
if session.target.senderId in MessageTaskManager._list[session.target.targetId]:
sender = session.target.senderId
if 'all' in MessageTaskManager._list[session.target.targetId]:
sender = 'all'
if sender is not None:
MessageTaskManager._list[session.target.targetId][sender]['result'] = session
MessageTaskManager._list[session.target.targetId][sender]['active'] = False
MessageTaskManager._list[session.target.targetId][sender]['flag'].set()
__all__ = ['MessageTaskManager']