Files

133 lines
4.3 KiB
Python
Raw Permalink Normal View History

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