diff --git a/bridge/context.py b/bridge/context.py index 7a857b3..7eac9c1 100644 --- a/bridge/context.py +++ b/bridge/context.py @@ -8,6 +8,7 @@ class ContextType(Enum): VOICE = 2 # 音频消息 IMAGE = 3 # 图片消息 IMAGE_CREATE = 10 # 创建图片命令 + JOIN_GROUP = 20 # 加入群聊 def __str__(self): return self.name diff --git a/channel/wechat/wechat_channel.py b/channel/wechat/wechat_channel.py index 52c8ee3..b3099f6 100644 --- a/channel/wechat/wechat_channel.py +++ b/channel/wechat/wechat_channel.py @@ -28,18 +28,23 @@ from plugins import * @itchat.msg_register([TEXT, VOICE, PICTURE]) def handler_single_msg(msg): - # logger.debug("handler_single_msg: {}".format(msg)) - if msg["Type"] == PICTURE and msg["MsgType"] == 47: + try: + cmsg = WeChatMessage(msg, False) + except NotImplementedError as e: + logger.debug("[WX]single message {} skipped: {}".format(msg["MsgId"], e)) return None - WechatChannel().handle_single(WeChatMessage(msg)) + WechatChannel().handle_single(cmsg) return None -@itchat.msg_register([TEXT, VOICE, PICTURE], isGroupChat=True) +@itchat.msg_register([TEXT, VOICE, PICTURE, NOTE], isGroupChat=True) def handler_group_msg(msg): - if msg["Type"] == PICTURE and msg["MsgType"] == 47: + try: + cmsg = WeChatMessage(msg, True) + except NotImplementedError as e: + logger.debug("[WX]group message {} skipped: {}".format(msg["MsgId"], e)) return None - WechatChannel().handle_group(WeChatMessage(msg, True)) + WechatChannel().handle_group(cmsg) return None @@ -186,6 +191,8 @@ class WechatChannel(ChatChannel): logger.debug("[WX]receive voice for group msg: {}".format(cmsg.content)) elif cmsg.ctype == ContextType.IMAGE: logger.debug("[WX]receive image for group msg: {}".format(cmsg.content)) + elif cmsg.ctype == ContextType.JOIN_GROUP: + logger.debug("[WX]receive join group msg: {}".format(cmsg.content)) else: # logger.debug("[WX]receive group msg: {}, cmsg={}".format(json.dumps(cmsg._rawmsg, ensure_ascii=False), cmsg)) pass diff --git a/channel/wechat/wechat_message.py b/channel/wechat/wechat_message.py index 92182bd..6bfd9f2 100644 --- a/channel/wechat/wechat_message.py +++ b/channel/wechat/wechat_message.py @@ -1,3 +1,5 @@ +import re + from bridge.context import ContextType from channel.chat_message import ChatMessage from common.log import logger @@ -24,9 +26,31 @@ class WeChatMessage(ChatMessage): self.ctype = ContextType.IMAGE self.content = TmpDir().path() + itchat_msg["FileName"] # content直接存临时目录路径 self._prepare_fn = lambda: itchat_msg.download(self.content) + elif itchat_msg["Type"] == NOTE and itchat_msg["MsgType"] == 10000: + if is_group and ( + "加入群聊" in itchat_msg["Content"] or "加入了群聊" in itchat_msg["Content"] + ): + self.ctype = ContextType.JOIN_GROUP + logger.debug("[WX]join group message: " + itchat_msg["Content"]) + self.content = itchat_msg["Content"] + # 这里只能得到nickname, actual_user_id还是机器人的id + if "加入了群聊" in itchat_msg["Content"]: + self.actual_user_nickname = re.findall( + r"\"(.*?)\"", itchat_msg["Content"] + )[-1] + elif "加入群聊" in itchat_msg["Content"]: + self.actual_user_nickname = re.findall( + r"\"(.*?)\"", itchat_msg["Content"] + )[0] + else: + raise NotImplementedError( + "Unsupported note message: " + itchat_msg["Content"] + ) else: raise NotImplementedError( - "Unsupported message type: {}".format(itchat_msg["Type"]) + "Unsupported message type: Type:{} MsgType:{}".format( + itchat_msg["Type"], itchat_msg["MsgType"] + ) ) self.from_user_id = itchat_msg["FromUserName"] @@ -58,4 +82,5 @@ class WeChatMessage(ChatMessage): if self.is_group: self.is_at = itchat_msg["IsAt"] self.actual_user_id = itchat_msg["ActualUserName"] - self.actual_user_nickname = itchat_msg["ActualNickName"] + if self.ctype != ContextType.JOIN_GROUP: + self.actual_user_nickname = itchat_msg["ActualNickName"] diff --git a/plugins/hello/hello.py b/plugins/hello/hello.py index 4067c2a..00732ec 100644 --- a/plugins/hello/hello.py +++ b/plugins/hello/hello.py @@ -23,7 +23,16 @@ class Hello(Plugin): logger.info("[Hello] inited") def on_handle_context(self, e_context: EventContext): - if e_context["context"].type != ContextType.TEXT: + if e_context["context"].type not in [ContextType.TEXT, ContextType.JOIN_GROUP]: + return + + if e_context["context"].type == ContextType.JOIN_GROUP: + e_context["context"].type = ContextType.TEXT + msg: ChatMessage = e_context["context"]["msg"] + e_context[ + "context" + ].content = f'请你随机使用一种风格说一句问候语来欢迎新用户"{msg.actual_user_nickname}"加入群聊。' + e_context.action = EventAction.CONTINUE # 事件继续,交付给下个插件或默认逻辑 return content = e_context["context"].content