fix message

This commit is contained in:
jxxghp 2024-03-14 20:36:15 +08:00
parent 6e607ca89f
commit a5d044d535
5 changed files with 69 additions and 13 deletions

View File

@ -8,11 +8,13 @@ from app import schemas
from app.chain.message import MessageChain from app.chain.message import MessageChain
from app.core.config import settings from app.core.config import settings
from app.core.security import verify_token from app.core.security import verify_token
from app.db.models import User
from app.db.systemconfig_oper import SystemConfigOper from app.db.systemconfig_oper import SystemConfigOper
from app.db.userauth import get_current_active_superuser
from app.log import logger from app.log import logger
from app.modules.wechat.WXBizMsgCrypt3 import WXBizMsgCrypt from app.modules.wechat.WXBizMsgCrypt3 import WXBizMsgCrypt
from app.schemas import NotificationSwitch from app.schemas import NotificationSwitch
from app.schemas.types import SystemConfigKey, NotificationType from app.schemas.types import SystemConfigKey, NotificationType, MessageChannel
router = APIRouter() router = APIRouter()
@ -36,6 +38,20 @@ async def user_message(background_tasks: BackgroundTasks, request: Request):
return schemas.Response(success=True) return schemas.Response(success=True)
@router.post("/web", summary="接收WEB消息", response_model=schemas.Response)
async def web_message(text: str, current_user: User = Depends(get_current_active_superuser)):
"""
WEB消息响应
"""
MessageChain().handle_message(
channel=MessageChannel.Web,
userid=current_user.id,
username=current_user.name,
text=text
)
return schemas.Response(success=True)
def wechat_verify(echostr: str, msg_signature: str, def wechat_verify(echostr: str, msg_signature: str,
timestamp: Union[str, int], nonce: str) -> Any: timestamp: Union[str, int], nonce: str) -> Any:
""" """
@ -103,7 +119,7 @@ def read_switchs(_: schemas.TokenPayload = Depends(verify_token)) -> Any:
def set_switchs(switchs: List[NotificationSwitch], def set_switchs(switchs: List[NotificationSwitch],
_: schemas.TokenPayload = Depends(verify_token)) -> Any: _: schemas.TokenPayload = Depends(verify_token)) -> Any:
""" """
查询通知消息渠道开关 设置通知消息渠道开关
""" """
switch_list = [] switch_list = []
for switch in switchs: for switch in switchs:

View File

@ -12,9 +12,11 @@ from app.core.config import settings
from app.core.context import MediaInfo, Context from app.core.context import MediaInfo, Context
from app.core.event import EventManager from app.core.event import EventManager
from app.core.meta import MetaBase from app.core.meta import MetaBase
from app.db.message_oper import MessageOper
from app.helper.message import MessageHelper
from app.helper.torrent import TorrentHelper from app.helper.torrent import TorrentHelper
from app.log import logger from app.log import logger
from app.schemas import Notification, NotExistMediaInfo from app.schemas import Notification, NotExistMediaInfo, CommingMessage
from app.schemas.types import EventType, MessageChannel, MediaType from app.schemas.types import EventType, MessageChannel, MediaType
from app.utils.string import StringUtils from app.utils.string import StringUtils
@ -43,6 +45,8 @@ class MessageChain(ChainBase):
self.mediachain = MediaChain() self.mediachain = MediaChain()
self.eventmanager = EventManager() self.eventmanager = EventManager()
self.torrenthelper = TorrentHelper() self.torrenthelper = TorrentHelper()
self.messagehelper = MessageHelper()
self.messageoper = MessageOper()
def __get_noexits_info( def __get_noexits_info(
self, self,
@ -100,10 +104,8 @@ class MessageChain(ChainBase):
def process(self, body: Any, form: Any, args: Any) -> None: def process(self, body: Any, form: Any, args: Any) -> None:
""" """
识别消息内容执行操作 调用模块识别消息内容
""" """
# 申明全局变量
global _current_page, _current_meta, _current_media
# 获取消息内容 # 获取消息内容
info = self.message_parser(body=body, form=form, args=args) info = self.message_parser(body=body, form=form, args=args)
if not info: if not info:
@ -122,10 +124,35 @@ class MessageChain(ChainBase):
if not text: if not text:
logger.debug(f'未识别到消息内容::{body}{form}{args}') logger.debug(f'未识别到消息内容::{body}{form}{args}')
return return
# 处理消息
self.handle_message(channel=channel, userid=userid, username=username, text=text)
def handle_message(self, channel: MessageChannel, userid: Union[str, int], username: str, text: str) -> None:
"""
识别消息内容执行操作
"""
# 申明全局变量
global _current_page, _current_meta, _current_media
# 加载缓存 # 加载缓存
user_cache: Dict[str, dict] = self.load_cache(self._cache_file) or {} user_cache: Dict[str, dict] = self.load_cache(self._cache_file) or {}
# 处理消息 # 处理消息
logger.info(f'收到用户消息内容,用户:{userid},内容:{text}') logger.info(f'收到用户消息内容,用户:{userid},内容:{text}')
# 保存消息
self.messagehelper.put(
CommingMessage(
userid=userid,
username=username,
channel=channel,
text=text
), role="user")
self.messageoper.add(
channel=channel,
userid=userid,
username=username,
text=text,
action=0
)
# 处理消息
if text.startswith('/'): if text.startswith('/'):
# 执行命令 # 执行命令
self.eventmanager.send_event( self.eventmanager.send_event(

View File

@ -1,8 +1,7 @@
import json import json
import queue import queue
from typing import Any, Union, Optional from typing import Optional, Any
from app.schemas import Notification
from app.utils.singleton import Singleton from app.utils.singleton import Singleton
@ -14,7 +13,7 @@ class MessageHelper(metaclass=Singleton):
self.sys_queue = queue.Queue() self.sys_queue = queue.Queue()
self.user_queue = queue.Queue() self.user_queue = queue.Queue()
def put(self, message: Union[str, Notification], role: str = "sys"): def put(self, message: Any, role: str = "sys"):
""" """
存消息 存消息
:param message: 消息 :param message: 消息
@ -23,10 +22,10 @@ class MessageHelper(metaclass=Singleton):
if role == "sys": if role == "sys":
self.sys_queue.put(message) self.sys_queue.put(message)
else: else:
if isinstance(message, Notification): if isinstance(message, str):
self.user_queue.put(json.dumps(message.dict()))
else:
self.user_queue.put(message) self.user_queue.put(message)
elif hasattr(message, "dict"):
self.user_queue.put(json.dumps(message.dict()))
def get(self, role: str = "sys") -> Optional[str]: def get(self, role: str = "sys") -> Optional[str]:
""" """

View File

@ -18,6 +18,18 @@ class CommingMessage(BaseModel):
# 消息体 # 消息体
text: Optional[str] = None text: Optional[str] = None
def dict(self):
"""
转换为字典
"""
return {
"userid": self.userid,
"username": self.username,
"channel": self.channel.value if self.channel else None,
"text": self.text,
"action": 0
}
class Notification(BaseModel): class Notification(BaseModel):
""" """
@ -46,7 +58,8 @@ class Notification(BaseModel):
"text": self.text, "text": self.text,
"image": self.image, "image": self.image,
"link": self.link, "link": self.link,
"userid": self.userid "userid": self.userid,
"action": 1
} }

View File

@ -117,3 +117,4 @@ class MessageChannel(Enum):
Slack = "Slack" Slack = "Slack"
SynologyChat = "SynologyChat" SynologyChat = "SynologyChat"
VoceChat = "VoceChat" VoceChat = "VoceChat"
Web = "Web"