Skip to content

Commit 65eba05

Browse files
authored
feat(quote): support quote messages (#33)
* feat: support reply message by srvid * feat: add new emoticon conversions * fix: refer msg is not found if sent from telegram * feat: support reply the quoted message * fix: fix list index out of range * fix: fix variable type * feat: support ews style qutoed message * feat: eager load contact list
1 parent cd726cb commit 65eba05

4 files changed

Lines changed: 59 additions & 18 deletions

File tree

efb_wechat_comwechat_slave/ComWechat.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
import re
1313
import json
14-
from ehforwarderbot.chat import SystemChat, PrivateChat , SystemChatMember, ChatMember
14+
from ehforwarderbot.chat import SystemChat, PrivateChat , SystemChatMember, ChatMember, SelfChatMember
1515
from typing import Tuple, Optional, Collection, BinaryIO, Dict, Any , Union , List
1616
from datetime import datetime
1717
from cachetools import TTLCache
@@ -30,7 +30,7 @@
3030

3131
from .ChatMgr import ChatMgr
3232
from .CustomTypes import EFBGroupChat, EFBPrivateChat, EFBGroupMember, EFBSystemUser
33-
from .MsgDeco import efb_text_simple_wrapper
33+
from .MsgDeco import qutoed_text
3434
from .MsgProcess import MsgProcess
3535
from .Utils import download_file , load_config , load_temp_file_to_local , WC_EMOTICON_CONVERSION
3636

@@ -565,7 +565,7 @@ def scheduled_job(self):
565565
count = 1
566566
while True:
567567
time.sleep(1)
568-
if count % 1800 == 0:
568+
if count % 1800 == 1:
569569
self.GetGroupListBySql()
570570
self.GetContactListBySql()
571571
count = 1
@@ -695,7 +695,15 @@ def send_message(self, msg : Message) -> Message:
695695
else:
696696
self.bot.SendText(wxid = chat_uid , msg = msg.text)
697697
else:
698-
res = self.bot.SendText(wxid = chat_uid , msg = msg.text)
698+
text = msg.text
699+
if isinstance(msg.target, Message):
700+
qt_txt = msg.target.text or msg.target.type.name
701+
if self.group_members.get(msg.chat.uid, None) is not None and not isinstance(msg.target.author, SelfChatMember):
702+
tgt_alias = "@%s\u2005:" % msg.target.author.display_name
703+
else:
704+
tgt_alias = ""
705+
text = qutoed_text(qt_txt, msg.text, tgt_alias)
706+
res = self.bot.SendText(wxid = chat_uid , msg = text)
699707
elif msg.type in [MsgType.Link]:
700708
self.bot.SendText(wxid = chat_uid , msg = msg.text)
701709
elif msg.type in [MsgType.Image , MsgType.Sticker]:

efb_wechat_comwechat_slave/MsgDeco.py

Lines changed: 44 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,14 @@
88
from ehforwarderbot import MsgType, Chat
99
from ehforwarderbot.chat import ChatMember
1010
from ehforwarderbot.message import Substitutions, Message, LinkAttribute, LocationAttribute
11+
from ehforwarderbot.types import MessageID
12+
13+
QUOTE_DIVIDER = " - - - - - - - - - - - - - - - "
14+
15+
def qutoed_text(qutoed_text: str, text: str, prefix: str = "") -> str:
16+
if QUOTE_DIVIDER in qutoed_text:
17+
qutoed_text = qutoed_text.split(QUOTE_DIVIDER)[-1]
18+
return f"「{prefix}{qutoed_text}\n{QUOTE_DIVIDER}\n{text}"
1119

1220
def efb_text_simple_wrapper(text: str, ats: Union[Mapping[Tuple[int, int], Union[Chat, ChatMember]], None] = None) -> Message:
1321
"""
@@ -138,7 +146,7 @@ def efb_mp_post_wrapper(item: etree.Element, show_name: str = None) -> Message:
138146
text=f'{title}\n - - - - - - - - - - - - - - - \n{digest}' if digest else str(title),
139147
)
140148

141-
def efb_share_link_wrapper(text: str) -> Message:
149+
def efb_share_link_wrapper(message: dict, chat) -> Message:
142150
"""
143151
处理msgType49消息 - 复合xml, xml 中 //appmsg/type 指示具体消息类型.
144152
/msg/appmsg/type
@@ -164,10 +172,11 @@ def efb_share_link_wrapper(text: str) -> Message:
164172
//appmsg/type = 74 : 文件 (收到文件的第一个提示)
165173
//appmsg/type = 87 : 群公告
166174
//appmsg/type = 2000 : 转账
167-
:param text: The content of the message
175+
:param message: The message
168176
:return: EFB Message
169177
"""
170178

179+
text: str = message['message']
171180
xml = etree.fromstring(text)
172181
result_text = ""
173182
try:
@@ -383,19 +392,43 @@ def efb_share_link_wrapper(text: str) -> Message:
383392
elif type == 57: # 引用(回复)消息
384393
msg = xml.xpath('/msg/appmsg/title/text()')[0]
385394
refer_msgType = int(xml.xpath('/msg/appmsg/refermsg/type/text()')[0]) # 被引用消息类型
395+
e = xml.xpath('/msg/appmsg/refermsg/svrid/text()') # 被引用消息 id
396+
refer_svrid = len(e) > 0 and e[0] or None
386397
# refer_fromusr = xml.xpath('/msg/appmsg/refermsg/fromusr/text()')[0] # 被引用消息所在房间
387-
# refer_fromusr = xml.xpath('/msg/appmsg/refermsg/chatusr/text()')[0] # 被引用消息发送人微信号
388-
refer_displayname = xml.xpath('/msg/appmsg/refermsg/displayname/text()')[0] # 被引用消息发送人微信名称
389-
if refer_msgType == 1: # 被引用的消息是文本
390-
refer_content = xml.xpath('/msg/appmsg/refermsg/content/text()')[0] # 被引用消息内容
391-
result_text += f"「{refer_displayname}: {refer_content}\n - - - - - - - - - - - - - - - \n{msg}"
392-
else: # 被引用的消息非文本,提示不支持
393-
result_text += f"「{refer_displayname}: 系统消息: 被引用的消息不是文本,暂不支持展示」\n - - - - - - - - - - - - - - - \n{msg}"
398+
e = xml.xpath('/msg/appmsg/refermsg/chatusr/text()') # 被引用消息发送人微信号
399+
refer_chatusr = len(e) > 0 and e[0] or None
400+
e = xml.xpath('/msg/appmsg/refermsg/displayname/text()') # 被引用消息发送人微信名称
401+
refer_displayname = len(e) > 0 and e[0] or refer_chatusr
394402
efb_msg = Message(
395403
type=MsgType.Text,
396-
text=result_text,
404+
text=msg,
397405
vendor_specific={ "is_refer": True }
398406
)
407+
prefix = ""
408+
if refer_displayname is not None:
409+
prefix = f"{refer_displayname}:"
410+
if refer_svrid is None or refer_chatusr == message["self"]:
411+
if refer_msgType == 1: # 被引用的消息是文本
412+
refer_content = xml.xpath('/msg/appmsg/refermsg/content/text()')[0] # 被引用消息内容
413+
result_text = qutoed_text(refer_content, msg, prefix)
414+
elif refer_msgType == 49: # 被引用的消息也是引用消息
415+
try:
416+
refer_msg_content = xml.xpath('/msg/appmsg/refermsg/content/text()')[0] # 被引用消息引用的消息
417+
refer_msg_xml = etree.fromstring(refer_msg_content)
418+
type = int(refer_msg_xml.xpath('/msg/appmsg/type/text()')[0])
419+
if type == 57:
420+
refer_msg_text = refer_msg_xml.xpath('/msg/appmsg/title/text()')[0]
421+
result_text = qutoed_text(refer_msg_text, msg, prefix)
422+
except Exception as e:
423+
print_exc()
424+
else: # 被引用的消息非文本,提示不支持
425+
result_text = qutoed_text(" 系统消息: 被引用的消息不是文本,暂不支持展示", msg, prefix)
426+
efb_msg.text = result_text
427+
else:
428+
efb_msg.target = Message(
429+
uid=MessageID(refer_svrid),
430+
chat=chat,
431+
)
399432
elif type == 63: # 直播(微信视频号分享)
400433
title = xml.xpath('/msg/appmsg/title/text()')[0]
401434
url = xml.xpath('/msg/appmsg/url/text()')[0]
@@ -634,4 +667,4 @@ def efb_other_wrapper(text: str) -> Union[Message, None]:
634667
if efb_msg:
635668
return efb_msg
636669
else:
637-
return None
670+
return None

efb_wechat_comwechat_slave/MsgProcess.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ def MsgProcess(msg : dict , chat) -> Union[Message, List[Message]]:
4949
if ("FileStorage" in msg["filepath"]) and ("Cache" not in msg["filepath"]):
5050
file = load_local_file_to_temp(msg["filepath"])
5151
return efb_file_wrapper(file , msg["filepath"].split("/")[-1])
52-
return efb_share_link_wrapper(msg['message']) # may return msgs in a list
52+
return efb_share_link_wrapper(msg, chat) # may return msgs in a list
5353

5454
elif msg["type"] == "voice":
5555
file = convert_silk_to_mp3(load_local_file_to_temp(msg["filepath"]))

efb_wechat_comwechat_slave/Utils.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -187,8 +187,8 @@ def convert_silk_to_mp3(file : tempfile) -> tempfile:
187187
'[月亮]': '🌃', '[Moon]': '🌃',
188188
'[太阳]': '🌞', '[Sun]': '🌞',
189189
'[拥抱]': '🤗', '[Hug]': '🤗',
190-
'[强]': '👍', '[Strong]': '👍',
191-
'[弱]': '👎', '[Weak]': '👎',
190+
'[强]': '👍', '[Strong]': '👍', '[ThumbsUp]': '👍',
191+
'[弱]': '👎', '[Weak]': '👎', '[ThumbsDown]': '👎',
192192
'[握手]': '🤝', '[Shake]': '🤝',
193193
'[胜利]': '✌️', '[Victory]': '✌️',
194194
'[抱拳]': '🙏', '[Salute]': '🙏',

0 commit comments

Comments
 (0)