|
import asyncio |
|
import re |
|
|
|
from wechaty import MessageType |
|
from wechaty.user import Message |
|
|
|
from bridge.context import ContextType |
|
from channel.chat_message import ChatMessage |
|
from common.log import logger |
|
from common.tmp_dir import TmpDir |
|
|
|
|
|
class aobject(object): |
|
"""Inheriting this class allows you to define an async __init__. |
|
|
|
So you can create objects by doing something like `await MyClass(params)` |
|
""" |
|
|
|
async def __new__(cls, *a, **kw): |
|
instance = super().__new__(cls) |
|
await instance.__init__(*a, **kw) |
|
return instance |
|
|
|
async def __init__(self): |
|
pass |
|
|
|
|
|
class WechatyMessage(ChatMessage, aobject): |
|
async def __init__(self, wechaty_msg: Message): |
|
super().__init__(wechaty_msg) |
|
|
|
room = wechaty_msg.room() |
|
|
|
self.msg_id = wechaty_msg.message_id |
|
self.create_time = wechaty_msg.payload.timestamp |
|
self.is_group = room is not None |
|
|
|
if wechaty_msg.type() == MessageType.MESSAGE_TYPE_TEXT: |
|
self.ctype = ContextType.TEXT |
|
self.content = wechaty_msg.text() |
|
elif wechaty_msg.type() == MessageType.MESSAGE_TYPE_AUDIO: |
|
self.ctype = ContextType.VOICE |
|
voice_file = await wechaty_msg.to_file_box() |
|
self.content = TmpDir().path() + voice_file.name |
|
|
|
def func(): |
|
loop = asyncio.get_event_loop() |
|
asyncio.run_coroutine_threadsafe(voice_file.to_file(self.content), loop).result() |
|
|
|
self._prepare_fn = func |
|
|
|
else: |
|
raise NotImplementedError("Unsupported message type: {}".format(wechaty_msg.type())) |
|
|
|
from_contact = wechaty_msg.talker() |
|
self.from_user_id = from_contact.contact_id |
|
self.from_user_nickname = from_contact.name |
|
|
|
|
|
|
|
|
|
|
|
|
|
if self.is_group: |
|
self.to_user_id = room.room_id |
|
self.to_user_nickname = await room.topic() |
|
else: |
|
to_contact = wechaty_msg.to() |
|
self.to_user_id = to_contact.contact_id |
|
self.to_user_nickname = to_contact.name |
|
|
|
if self.is_group or wechaty_msg.is_self(): |
|
self.other_user_id = self.to_user_id |
|
self.other_user_nickname = self.to_user_nickname |
|
else: |
|
self.other_user_id = self.from_user_id |
|
self.other_user_nickname = self.from_user_nickname |
|
|
|
if self.is_group: |
|
self.is_at = await wechaty_msg.mention_self() |
|
if not self.is_at: |
|
name = wechaty_msg.wechaty.user_self().name |
|
pattern = f"@{re.escape(name)}(\u2005|\u0020)" |
|
if re.search(pattern, self.content): |
|
logger.debug(f"wechaty message {self.msg_id} include at") |
|
self.is_at = True |
|
|
|
self.actual_user_id = self.from_user_id |
|
self.actual_user_nickname = self.from_user_nickname |
|
|