fix webhook_parser

This commit is contained in:
jxxghp
2024-09-19 21:09:07 +08:00
parent 4016295696
commit 2486b9274c
9 changed files with 79 additions and 40 deletions

View File

@@ -1,7 +1,7 @@
from abc import abstractmethod, ABCMeta
from typing import Tuple, Union, Dict, Any, Optional
from app.schemas import Notification, MessageChannel, NotificationConf
from app.schemas import Notification, MessageChannel, NotificationConf, MediaServerConf
class _ModuleBase(metaclass=ABCMeta):
@@ -66,13 +66,16 @@ class _MessageBase:
return None
return self._clients.get(name)
def get_config(self, name: str) -> Optional[NotificationConf]:
def get_config(self, name: str, ctype: str = None) -> Optional[NotificationConf]:
"""
获取配置
"""
if not name:
return None
return self._configs.get(name)
conf = self._configs.get(name)
if not ctype:
return conf
return conf if conf.type == ctype else None
def checkMessage(self, message: Notification, source: str = None) -> bool:
"""
@@ -118,9 +121,21 @@ class _MediaServerBase:
"""
_servers: Dict[str, Any] = {}
_configs: Dict[str, MediaServerConf] = {}
def get_server(self, name: str) -> Optional[Any]:
"""
获取Plex服务器
"""
return self._servers.get(name)
def get_config(self, name: str, mtype: str = None) -> Optional[MediaServerConf]:
"""
获取配置
"""
if not name:
return None
conf = self._configs.get(name)
if not mtype:
return conf
return conf if conf.type == mtype else None

View File

@@ -6,6 +6,7 @@ from app.helper.mediaserver import MediaServerHelper
from app.log import logger
from app.modules import _ModuleBase, _MediaServerBase
from app.modules.emby.emby import Emby
from app.schemas import MediaServerConf
from app.schemas.types import MediaType
@@ -17,11 +18,13 @@ class EmbyModule(_ModuleBase, _MediaServerBase):
"""
# 读取媒体服务器配置
self._servers: Dict[str, Emby] = {}
self._configs: Dict[str, MediaServerConf] = {}
mediaservers = MediaServerHelper().get_mediaservers()
if not mediaservers:
return
for server in mediaservers:
if server.type == "emby" and server.enabled:
self._configs[server.name] = server
self._servers[server.name] = Emby(**server.config, sync_libraries=server.sync_libraries)
@staticmethod
@@ -81,14 +84,22 @@ class EmbyModule(_ModuleBase, _MediaServerBase):
"""
source = args.get("source")
if source:
server_config: MediaServerConf = self.get_config(source, 'emby')
if not server_config:
return None
server: Emby = self.get_server(source)
if not server:
return None
return server.get_webhook_message(form, args)
for server in self._servers.values():
result = server.get_webhook_message(form, args)
if result:
return result
for conf in self._configs.values():
if conf.type != "emby":
continue
server = self.get_server(conf.name)
if server:
result = server.get_webhook_message(form, args)
if result:
return result
return None
def media_exists(self, mediainfo: MediaInfo, itemid: str = None) -> Optional[schemas.ExistMediaInfo]:

View File

@@ -6,6 +6,7 @@ from app.helper.mediaserver import MediaServerHelper
from app.log import logger
from app.modules import _ModuleBase, _MediaServerBase
from app.modules.jellyfin.jellyfin import Jellyfin
from app.schemas import MediaServerConf
from app.schemas.types import MediaType
@@ -17,11 +18,13 @@ class JellyfinModule(_ModuleBase, _MediaServerBase):
"""
# 读取媒体服务器配置
self._servers: Dict[str, Jellyfin] = {}
self._configs: Dict[str, MediaServerConf] = {}
mediaservers = MediaServerHelper().get_mediaservers()
if not mediaservers:
return
for server in mediaservers:
if server.type == "jellyfin" and server.enabled:
self._configs[server.name] = server
self._servers[server.name] = Jellyfin(**server.config, sync_libraries=server.sync_libraries)
@staticmethod
@@ -81,14 +84,22 @@ class JellyfinModule(_ModuleBase, _MediaServerBase):
"""
source = args.get("source")
if source:
server_config: MediaServerConf = self.get_config(source, 'jellyfin')
if not server_config:
return None
server: Jellyfin = self.get_server(source)
if not server:
return None
return server.get_webhook_message(body)
for server in self._servers.values():
result = server.get_webhook_message(body)
if result:
return result
for conf in self._configs.values():
if conf.type != "jellyfin":
continue
server = self.get_server(conf.name)
if server:
result = server.get_webhook_message(body)
if result:
return result
return None
def media_exists(self, mediainfo: MediaInfo, itemid: str = None) -> Optional[schemas.ExistMediaInfo]:

View File

@@ -6,6 +6,7 @@ from app.helper.mediaserver import MediaServerHelper
from app.log import logger
from app.modules import _ModuleBase, _MediaServerBase
from app.modules.plex.plex import Plex
from app.schemas import MediaServerConf
from app.schemas.types import MediaType
@@ -17,11 +18,13 @@ class PlexModule(_ModuleBase, _MediaServerBase):
"""
# 读取媒体服务器配置
self._servers: Dict[str, Plex] = {}
self._configs: Dict[str, MediaServerConf] = {}
mediaservers = MediaServerHelper().get_mediaservers()
if not mediaservers:
return
for server in mediaservers:
if server.type == "plex" and server.enabled:
self._configs[server.name] = server
self._servers[server.name] = Plex(**server.config, sync_libraries=server.sync_libraries)
@staticmethod
@@ -67,14 +70,22 @@ class PlexModule(_ModuleBase, _MediaServerBase):
"""
source = args.get("source")
if source:
server_config: MediaServerConf = self.get_config(source, 'plex')
if not server_config:
return None
server: Plex = self.get_server(source)
if not server:
return None
return server.get_webhook_message(body)
for server in self._servers.values():
result = server.get_webhook_message(body)
if result:
return result
for conf in self._configs.values():
if conf.type != "plex":
continue
server = self.get_server(conf.name)
if server:
result = server.get_webhook_message(body)
if result:
return result
return None
def media_exists(self, mediainfo: MediaInfo, itemid: str = None) -> Optional[schemas.ExistMediaInfo]:

View File

@@ -175,10 +175,9 @@ class SlackModule(_ModuleBase, _MessageBase):
]
}
"""
# 来源
# 获取客户端
client: Slack = self.get_client(source)
if not client:
client_config = self.get_config(source, 'slack')
if not client_config:
return None
# 校验token
token = args.get("token")

View File

@@ -61,9 +61,10 @@ class SynologyChatModule(_ModuleBase, _MessageBase):
"""
try:
# 来源
client: SynologyChat = self.get_client(source)
if not client:
client_config = self.get_config(source, 'synologychat')
if not client_config:
return None
client: SynologyChat = self.get_client(source)
# 解析消息
message: dict = form
if not message:

View File

@@ -89,13 +89,10 @@ class TelegramModule(_ModuleBase, _MessageBase):
}
"""
# 获取渠道
client_config = self.get_config(source, 'telegram')
if not client_config:
return None
client: Telegram = self.get_client(source)
if not client:
return None
# 获取配置
config = self.get_config(source)
if not config:
return None
# 校验token
token = args.get("token")
if not token or token != settings.API_TOKEN:
@@ -113,9 +110,9 @@ class TelegramModule(_ModuleBase, _MessageBase):
if text:
logger.info(f"收到来自 {source} 的Telegram消息userid={user_id}, username={user_name}, text={text}")
# 检查权限
admin_users = config.config.get("TELEGRAM_ADMINS")
user_list = config.config.get("TELEGRAM_USERS")
chat_id = config.config.get("TELEGRAM_CHAT_ID")
admin_users = client_config.config.get("TELEGRAM_ADMINS")
user_list = client_config.config.get("TELEGRAM_USERS")
chat_id = client_config.config.get("TELEGRAM_CHAT_ID")
if text.startswith("/"):
if admin_users \
and str(user_id) not in admin_users.split(',') \

View File

@@ -78,12 +78,8 @@ class VoceChatModule(_ModuleBase, _MessageBase):
}
"""
# 获取渠道
client: VoceChat = self.get_client(source)
if not client:
return None
# 获取配置
config = self.get_config(source)
if not config:
client_config = self.get_config(source, 'vocechat')
if not client_config:
return None
# 报文体
msg_body = json.loads(body)
@@ -102,7 +98,7 @@ class VoceChatModule(_ModuleBase, _MessageBase):
content = msg_body.get("detail", {}).get("content")
# 用户ID
gid = msg_body.get("target", {}).get("gid")
channel_id = config.config.get("channel_id")
channel_id = client_config.config.get("channel_id")
if gid and str(gid) == str(channel_id):
# 来自监听频道的消息
userid = f"GID#{gid}"

View File

@@ -64,12 +64,10 @@ class WechatModule(_ModuleBase, _MessageBase):
"""
try:
# 获取客户端
client: WeChat = self.get_client(source)
if not client:
return None
client_config = self.get_config(source)
client_config = self.get_config(source, 'wechat')
if not client_config:
return None
client: WeChat = self.get_client(source)
# URL参数
sVerifyMsgSig = args.get("msg_signature")
sVerifyTimeStamp = args.get("timestamp")