Skip to content

Commit 5322c56

Browse files
Improve MixinWSApi.on_message
1 parent 3baa617 commit 5322c56

File tree

6 files changed

+77
-42
lines changed

6 files changed

+77
-42
lines changed
File renamed without changes.

examples/ws_example.py

Lines changed: 19 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -4,29 +4,29 @@
44
import asyncio
55
import base64
66
import logging
7+
from typing import Optional
78

89
logging.basicConfig(level=logging.INFO, format='%(asctime)s %(levelname)s %(module)s %(lineno)d %(message)s')
910
logger = logging.getLogger(__name__)
1011

11-
from pymixin.mixin_ws_api import MixinWSApi
12+
from pymixin.mixin_ws_api import MixinWSApi, MessageView, Category, MessageStatus
1213

1314
bot_config = None
1415

1516
with open(sys.argv[1]) as f:
1617
bot_config = f.read()
1718
bot_config = json.loads(bot_config)
1819

20+
1921
class MixinBot(MixinWSApi):
2022
def __init__(self):
2123
super().__init__(bot_config, on_message=self.on_message)
2224

23-
async def on_message(self, message):
24-
logger.info(message)
25-
if 'error' in message:
26-
return
27-
action = message["action"]
25+
async def on_message(self, id: str, action: str, msg: Optional[MessageView]) -> None:
26+
logger.info("on_message: %s %s %s", id, action, msg)
27+
2828
if action not in ["ACKNOWLEDGE_MESSAGE_RECEIPT", "CREATE_MESSAGE", "LIST_PENDING_MESSAGES"]:
29-
logger.info("unknow action %s", action)
29+
logger.info("unknown action %s", action)
3030
return
3131

3232
if action == "ACKNOWLEDGE_MESSAGE_RECEIPT":
@@ -35,37 +35,29 @@ async def on_message(self, message):
3535
if not action == "CREATE_MESSAGE":
3636
return
3737

38-
data = message["data"]
39-
msgid = data["message_id"]
40-
typeindata = data["type"]
41-
categoryindata = data["category"]
42-
user_id = data["user_id"]
43-
conversation_id = data["conversation_id"]
38+
if not msg:
39+
return
4440

45-
created_at = data["created_at"]
46-
updated_at = data["updated_at"]
41+
msgid = msg.message_id
42+
created_at = msg.created_at
43+
updated_at = msg.updated_at
4744

4845
await self.echoMessage(msgid)
4946

50-
logger.info('user_id %s', user_id)
47+
logger.info('user_id %s', msg.user_id)
5148
logger.info("created_at %s",created_at)
5249

53-
if 'error' in message:
50+
if not msg.category in ["SYSTEM_ACCOUNT_SNAPSHOT", "PLAIN_TEXT", "SYSTEM_CONVERSATION", "PLAIN_STICKER", "PLAIN_IMAGE", "PLAIN_CONTACT"]:
51+
logger.info("unknown category: %s", msg.category)
5452
return
5553

56-
if not categoryindata in ["SYSTEM_ACCOUNT_SNAPSHOT", "PLAIN_TEXT", "SYSTEM_CONVERSATION", "PLAIN_STICKER", "PLAIN_IMAGE", "PLAIN_CONTACT"]:
57-
logger.info("unknown category: %s", categoryindata)
54+
if not msg.category == "PLAIN_TEXT" and msg.type == "message":
5855
return
5956

60-
if not categoryindata == "PLAIN_TEXT" and typeindata == "message":
61-
return
62-
63-
data = data["data"]
64-
logger.info(data)
65-
data = base64.urlsafe_b64decode(data)
57+
logger.info(msg.data)
58+
data = base64.urlsafe_b64decode(msg.data)
6659
logger.info(data)
67-
data = data.decode()
68-
await self.sendUserText(conversation_id, user_id, data)
60+
await self.sendUserText(msg.conversation_id, msg.user_id, data.decode())
6961

7062
bot = MixinBot()
7163

pysrc/mixin_bot_api.py

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,7 @@ async def send_messages(self, messages):
311311
'''
312312
return await self.post('/messages', messages)
313313

314-
async def send_message(self, conversation_id: str, category: str, data: str):
314+
async def send_message(self, conversation_id: str, category: str, data: Union[str, bytes]):
315315
if isinstance(data, str):
316316
data = data.encode()
317317
msg = {
@@ -338,24 +338,21 @@ async def send_sticker_message(self, conversation_id: str, name: str, album_id:
338338
"album_id": album_id,
339339
"sticker_id": sticker_id
340340
}
341-
data = json.dumps(data)
342-
return await self.send_message(conversation_id, "PLAIN_STICKER", data)
341+
return await self.send_message(conversation_id, "PLAIN_STICKER", json.dumps(data))
343342

344343
async def send_contract_message(self, conversation_id: str, user_id: str):
345344
data = {
346345
"user_id": user_id
347346
}
348-
data = json.dumps(data)
349-
return await self.send_message(conversation_id, "PLAIN_CONTACT", data)
347+
return await self.send_message(conversation_id, "PLAIN_CONTACT", json.dumps(data))
350348

351349
async def send_button_group_message(self, conversation_id: str, label: str, color: str, action: str):
352350
data = {
353351
"label": label,
354352
"action": action,
355353
"color": color
356354
}
357-
data = json.dumps([data])
358-
return await self.send_message(conversation_id, "APP_BUTTON_GROUP", data)
355+
return await self.send_message(conversation_id, "APP_BUTTON_GROUP", json.dumps([data]))
359356

360357
@staticmethod
361358
def _convert_object_to_dict(x):

pysrc/mixin_ws_api.py

Lines changed: 52 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,23 +8,63 @@
88
import uuid
99
import gzip
1010
import time
11-
from typing import Union
11+
from typing import Union, Callable, Awaitable, Optional, Literal
1212
from io import BytesIO
1313
import base64
1414
import websockets
1515

16-
from pymixin import mixin_config
17-
from pymixin.mixin_bot_api import MixinBotApi
18-
from pymixin import log
16+
from dataclasses import dataclass
17+
from dataclasses_json import dataclass_json
18+
19+
from . import mixin_config
20+
from .mixin_bot_api import MixinBotApi
21+
from . import log
1922

2023
logger = log.get_logger(__name__)
2124

22-
class MixinWSApi:
25+
Category = Literal[
26+
'PLAIN_TEXT',
27+
'PLAIN_AUDIO',
28+
'PLAIN_POST',
29+
'PLAIN_IMAGE',
30+
'PLAIN_DATA',
31+
'PLAIN_STICKER',
32+
'PLAIN_LIVE',
33+
'PLAIN_LOCATION',
34+
'PLAIN_VIDEO',
35+
'PLAIN_CONTACT',
36+
'APP_CARD',
37+
'APP_BUTTON_GROUP',
38+
'MESSAGE_RECALL',
39+
'SYSTEM_CONVERSATION',
40+
'SYSTEM_ACCOUNT_SNAPSHOT'
41+
]
42+
43+
MessageStatus = Literal['SENT', 'DELIVERED', 'READ']
44+
45+
@dataclass_json
46+
@dataclass
47+
class MessageView:
48+
type: str
49+
representative_id: str
50+
quote_message_id: str
51+
conversation_id: str
52+
user_id: str
53+
session_id: str
54+
message_id: str
55+
category: Category
56+
data: str
57+
data_base64: str
58+
status: MessageStatus
59+
source: str
60+
created_at: str
61+
updated_at: str
2362

24-
def __init__(self, bot_config, on_message):
63+
class MixinWSApi:
64+
def __init__(self, bot_config, on_message: Callable[[str, str, Optional[MessageView]], Awaitable[None]]):
2565
self.bot = MixinBotApi(bot_config)
2666
self.ws = None
27-
self.on_message = on_message
67+
self._on_message = on_message
2868

2969
async def connect(self):
3070
if self.ws:
@@ -67,7 +107,11 @@ async def run(self):
67107
msg = gzip.GzipFile(mode="rb", fileobj=msg)
68108
msg = msg.read()
69109
msg = json.loads(msg)
70-
await self.on_message(msg)
110+
try:
111+
view = MessageView.from_dict(msg['data'])
112+
except KeyError:
113+
view = None
114+
await self._on_message(msg['id'], msg['action'], view)
71115

72116
"""
73117
=================

requirements-dev.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ python-dateutil>=2.7.5
55
requests>=2.21.0
66
websocket-client>=0.54.0
77
websockets
8+
dataclasses-json
89

910
scikit-build
1011
cython

requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,5 @@ python-dateutil>=2.7.5
55
requests>=2.21.0
66
websockets>=9.1
77
cryptography>=3.4.7
8+
dataclasses-json
89

0 commit comments

Comments
 (0)