133 lines
4.3 KiB
Python
133 lines
4.3 KiB
Python
|
|
from .attr import *
|
||
|
|
from .type import OtherMessage
|
||
|
|
from . import self as selfmsg
|
||
|
|
from . import friend as friendmsg
|
||
|
|
from wxauto.languages import *
|
||
|
|
from wxauto.param import WxParam
|
||
|
|
from wxauto import uiautomation as uia
|
||
|
|
from typing import Literal
|
||
|
|
import re
|
||
|
|
|
||
|
|
class MESSAGE_ATTRS:
|
||
|
|
SYS_TEXT_HEIGHT = 33
|
||
|
|
TIME_TEXT_HEIGHT = 34
|
||
|
|
CHAT_TEXT_HEIGHT = 52
|
||
|
|
FILE_MSG_HEIGHT = 115
|
||
|
|
LINK_MSG_HEIGHT = 115
|
||
|
|
VOICE_MSG_HEIGHT = 55
|
||
|
|
|
||
|
|
TEXT_MSG_CONTROL_NUM = (8, 9, 10, 11)
|
||
|
|
TIME_MSG_CONTROL_NUM = (1,)
|
||
|
|
SYS_MSG_CONTROL_NUM = (4,5,6)
|
||
|
|
IMG_MSG_CONTROL_NUM = (9, 10, 11, 12)
|
||
|
|
FILE_MSG_CONTROL_NUM = tuple(i for i in range(15, 30))
|
||
|
|
LINK_MSG_CONTROL_NUM = tuple(i for i in range(15, 30))
|
||
|
|
VOICE_MSG_CONTROL_NUM = tuple(i for i in range(10, 30))
|
||
|
|
VIDEO_MSG_CONTROL_NUM = (13, 14, 15, 16)
|
||
|
|
QUOTE_MSG_CONTROL_NUM = tuple(i for i in range(16, 30))
|
||
|
|
LINK_MSG_CONTROL_NUM = tuple(i for i in range(15, 30))
|
||
|
|
|
||
|
|
def _lang(text: str) -> str:
|
||
|
|
return MESSAGES.get(text, {WxParam.LANGUAGE: text}).get(WxParam.LANGUAGE)
|
||
|
|
|
||
|
|
SEPICIAL_MSGS = [
|
||
|
|
_lang(i)
|
||
|
|
for i in [
|
||
|
|
'[图片]', # ImageMessage
|
||
|
|
'[视频]', # VideoMessage
|
||
|
|
'[语音]', # VoiceMessage
|
||
|
|
'[文件]', # FileMessage
|
||
|
|
'[链接]', # LinkMessage
|
||
|
|
]
|
||
|
|
]
|
||
|
|
|
||
|
|
def parse_msg_attr(
|
||
|
|
control: uia.Control,
|
||
|
|
parent,
|
||
|
|
):
|
||
|
|
msg_rect = control.BoundingRectangle
|
||
|
|
height = msg_rect.height()
|
||
|
|
mid = (msg_rect.left + msg_rect.right) / 2
|
||
|
|
for length, _ in enumerate(uia.WalkControl(control)):length += 1
|
||
|
|
|
||
|
|
# TimeMessage
|
||
|
|
if (
|
||
|
|
length in MESSAGE_ATTRS.TIME_MSG_CONTROL_NUM
|
||
|
|
):
|
||
|
|
return TimeMessage(control, parent)
|
||
|
|
|
||
|
|
# FriendMessage or SelfMessage
|
||
|
|
if (head_control := control.ButtonControl(searchDepth=2)).Exists(0):
|
||
|
|
head_rect = head_control.BoundingRectangle
|
||
|
|
if head_rect.left < mid:
|
||
|
|
return parse_msg_type(control, parent, 'Friend')
|
||
|
|
else:
|
||
|
|
return parse_msg_type(control, parent, 'Self')
|
||
|
|
|
||
|
|
# SystemMessage or TickleMessage
|
||
|
|
else:
|
||
|
|
if length in MESSAGE_ATTRS.SYS_MSG_CONTROL_NUM:
|
||
|
|
return SystemMessage(control, parent)
|
||
|
|
elif control.ListItemControl(RegexName=_lang('re_拍一拍')).Exists(0):
|
||
|
|
return TickleMessage(control, parent)
|
||
|
|
else:
|
||
|
|
return OtherMessage(control, parent)
|
||
|
|
|
||
|
|
def parse_msg_type(
|
||
|
|
control: uia.Control,
|
||
|
|
parent,
|
||
|
|
attr: Literal['Self', 'Friend']
|
||
|
|
):
|
||
|
|
for length, _ in enumerate(uia.WalkControl(control)):length += 1
|
||
|
|
content = control.Name
|
||
|
|
wxlog.debug(f'content: {content}, length: {length}')
|
||
|
|
|
||
|
|
if attr == 'Friend':
|
||
|
|
msgtype = friendmsg
|
||
|
|
else:
|
||
|
|
msgtype = selfmsg
|
||
|
|
|
||
|
|
# Special Message Type
|
||
|
|
if content in SEPICIAL_MSGS:
|
||
|
|
# ImageMessage
|
||
|
|
if content == _lang('[图片]') and length in MESSAGE_ATTRS.IMG_MSG_CONTROL_NUM:
|
||
|
|
return getattr(msgtype, f'{attr}ImageMessage')(control, parent)
|
||
|
|
|
||
|
|
# VideoMessage
|
||
|
|
elif content == _lang('[视频]') and length in MESSAGE_ATTRS.VIDEO_MSG_CONTROL_NUM:
|
||
|
|
return getattr(msgtype, f'{attr}VideoMessage')(control, parent)
|
||
|
|
|
||
|
|
# FileMessage
|
||
|
|
elif content == _lang('[文件]') and length in MESSAGE_ATTRS.FILE_MSG_CONTROL_NUM:
|
||
|
|
return getattr(msgtype, f'{attr}FileMessage')(control, parent)
|
||
|
|
|
||
|
|
# LinkMessage
|
||
|
|
elif content == _lang('[链接]') and length in MESSAGE_ATTRS.LINK_MSG_CONTROL_NUM:
|
||
|
|
return getattr(msgtype, f'{attr}LinkMessage')(control, parent)
|
||
|
|
|
||
|
|
# TextMessage
|
||
|
|
if length in MESSAGE_ATTRS.TEXT_MSG_CONTROL_NUM:
|
||
|
|
return getattr(msgtype, f'{attr}TextMessage')(control, parent)
|
||
|
|
|
||
|
|
# QuoteMessage
|
||
|
|
elif (
|
||
|
|
rematch := re.compile(_lang('re_引用消息'), re.DOTALL).match(content)
|
||
|
|
and length in MESSAGE_ATTRS.QUOTE_MSG_CONTROL_NUM
|
||
|
|
):
|
||
|
|
return getattr(msgtype, f'{attr}QuoteMessage')(control, parent)
|
||
|
|
|
||
|
|
# VoiceMessage
|
||
|
|
elif (
|
||
|
|
rematch := re.compile(_lang('re_语音')).match(content)
|
||
|
|
and length in MESSAGE_ATTRS.VOICE_MSG_CONTROL_NUM
|
||
|
|
):
|
||
|
|
return getattr(msgtype, f'{attr}VoiceMessage')(control, parent)
|
||
|
|
|
||
|
|
return getattr(msgtype, f'{attr}OtherMessage')(control, parent)
|
||
|
|
|
||
|
|
def parse_msg(
|
||
|
|
control: uia.Control,
|
||
|
|
parent
|
||
|
|
):
|
||
|
|
result = parse_msg_attr(control, parent)
|
||
|
|
return result
|