mq_message.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. #! /usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # vim:fenc=utf-8
  4. from enum import Enum, auto
  5. from typing import Optional
  6. import rocketmq
  7. from pydantic import BaseModel
  8. class MessageType(int, Enum):
  9. DEFAULT = -1
  10. TEXT = 1
  11. VOICE = 2
  12. GIF = 3
  13. IMAGE_GW = 4
  14. IMAGE_QW = 5
  15. MINI_PROGRAM = 6
  16. LINK = 7
  17. SHI_PIN_HAO = 8
  18. NAME_CARD = 9
  19. POSITION = 10
  20. RED_PACKET = 11
  21. FILE_GW = 12
  22. FILE_QW = 13
  23. VIDEO_GW = 14
  24. VIDEO_QW = 15
  25. AGGREGATION_MSG = 16
  26. VOICE_VIDEO_CALL = 17
  27. ACTIVE_TRIGGER = 101
  28. AGGREGATION_TRIGGER = 102
  29. HUMAN_INTERVENTION_END = 103
  30. ENTER_HUMAN_INTERVENTION = 104
  31. def __init__(self, code):
  32. self.description = {
  33. -1: "未分类的消息",
  34. 1: "文本",
  35. 2: "语音",
  36. 3: "表情包",
  37. 4: "个微图片",
  38. 5: "企微图片",
  39. 6: "小程序",
  40. 7: "链接",
  41. 8: "视频号",
  42. 9: "名片",
  43. 10: "位置",
  44. 11: "红包",
  45. 12: "个微文件",
  46. 13: "企微文件",
  47. 14: "个微视频",
  48. 15: "企微视频",
  49. 16: "聚合消息",
  50. 17: "语音视频通话",
  51. 101: "主动触发器",
  52. 102: "消息聚合触发器",
  53. 103: "人工介入结束事件",
  54. 104: "进入人工介入状态"
  55. }[code]
  56. # class MessageChannel(Enum):
  57. # CORP_WECHAT = (1, "企业微信")
  58. # MINI_PROGRAM = (2, "小程序")
  59. #
  60. # SYSTEM = (101, "系统内部")
  61. #
  62. # def __init__(self, code, description):
  63. # self.code = code
  64. # self.description = description
  65. #
  66. # def __repr__(self):
  67. # return f"{self.__class__.__name__}.{self.name}"
  68. class MessageChannel(int, Enum):
  69. CORP_WECHAT = 1
  70. MINI_PROGRAM = 2
  71. SYSTEM = 101
  72. def __init__(self, code):
  73. self.description = {
  74. 1: "企业微信",
  75. 2: "小程序",
  76. 101: "系统内部"
  77. }[code]
  78. class Message(BaseModel):
  79. msgId: Optional[int] = None
  80. type: MessageType
  81. channel: MessageChannel
  82. sender: Optional[str] = None
  83. senderUnionId: Optional[str] = None
  84. receiver: str
  85. content: Optional[str] = None
  86. # 由于需要和其它语言如Java进行序列化和反序列化交互,因此使用camelCase命名法
  87. sendTime: int
  88. refMsgId: Optional[int] = None
  89. # 原始的RocketMQ消息体,用于ack
  90. _rmq_message: Optional[rocketmq.Message] = None
  91. @staticmethod
  92. def build(type, channel, sender, receiver, content, timestamp):
  93. return Message(
  94. msgId=0,
  95. type=type,
  96. channel=channel,
  97. sender=sender,
  98. receiver=receiver,
  99. content=content,
  100. sendTime=timestamp
  101. )
  102. def to_json(self):
  103. return self.model_dump_json(include={
  104. "msgId", "type", "channel", "sender", "senderUnionId",
  105. "receiver", "content", "sendTime", "refMsgId"
  106. })
  107. @staticmethod
  108. def from_json(json_str):
  109. return Message.model_validate_json(json_str)