message.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  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(Enum):
  9. # DEFAULT = (-1, "未分类的消息")
  10. # TEXT = (1, "文本")
  11. # VOICE = (2, "语音")
  12. # GIF = (3, "GIF")
  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. #
  27. # ACTIVE_TRIGGER = (101, "主动触发器")
  28. # AGGREGATION_TRIGGER = (102, "消息聚合触发器")
  29. #
  30. # def __init__(self, code, description):
  31. # self.code = code
  32. # self.description = description
  33. #
  34. # def __repr__(self):
  35. # return f"{self.__class__.__name__}.{self.name}"
  36. class MessageType(int, Enum):
  37. DEFAULT = -1
  38. TEXT = 1
  39. VOICE = 2
  40. GIF = 3
  41. IMAGE_GW = 4
  42. IMAGE_QW = 5
  43. MINI_PROGRAM = 6
  44. LINK = 7
  45. SHI_PIN_HAO = 8
  46. NAME_CARD = 9
  47. POSITION = 10
  48. RED_PACKET = 11
  49. FILE_GW = 12
  50. FILE_QW = 13
  51. VIDEO_GW = 14
  52. VIDEO_QW = 15
  53. AGGREGATION_MSG = 16
  54. ACTIVE_TRIGGER = 101
  55. AGGREGATION_TRIGGER = 102
  56. def __init__(self, code):
  57. self.description = {
  58. -1: "未分类的消息",
  59. 1: "文本",
  60. 2: "语音",
  61. 3: "GIF",
  62. 4: "个微图片",
  63. 5: "企微图片",
  64. 6: "小程序",
  65. 7: "链接",
  66. 8: "视频号",
  67. 9: "名片",
  68. 10: "位置",
  69. 11: "红包",
  70. 12: "个微文件",
  71. 13: "企微文件",
  72. 14: "个微视频",
  73. 15: "企微视频",
  74. 16: "聚合消息",
  75. 101: "主动触发器",
  76. 102: "消息聚合触发器"
  77. }[code]
  78. # class MessageChannel(Enum):
  79. # CORP_WECHAT = (1, "企业微信")
  80. # MINI_PROGRAM = (2, "小程序")
  81. #
  82. # SYSTEM = (101, "系统内部")
  83. #
  84. # def __init__(self, code, description):
  85. # self.code = code
  86. # self.description = description
  87. #
  88. # def __repr__(self):
  89. # return f"{self.__class__.__name__}.{self.name}"
  90. class MessageChannel(int, Enum):
  91. CORP_WECHAT = 1
  92. MINI_PROGRAM = 2
  93. SYSTEM = 101
  94. def __init__(self, code):
  95. self.description = {
  96. 1: "企业微信",
  97. 2: "小程序",
  98. 101: "系统内部"
  99. }[code]
  100. class Message(BaseModel):
  101. msgId: Optional[int] = None
  102. type: MessageType
  103. channel: MessageChannel
  104. sender: Optional[str] = None
  105. senderUnionId: Optional[str] = None
  106. receiver: str
  107. content: Optional[str] = None
  108. # 由于需要和其它语言如Java进行序列化和反序列化交互,因此使用camelCase命名法
  109. sendTime: int
  110. refMsgId: Optional[int] = None
  111. # 原始的RocketMQ消息体,用于ack
  112. _rmq_message: Optional[rocketmq.Message] = None
  113. @staticmethod
  114. def build(type, channel, sender, receiver, content, timestamp):
  115. return Message(
  116. msgId=0,
  117. type=type,
  118. channel=channel,
  119. sender=sender,
  120. receiver=receiver,
  121. content=content,
  122. sendTime=timestamp
  123. )
  124. def to_json(self):
  125. return self.model_dump_json(include={
  126. "msgId", "type", "channel", "sender", "senderUnionId",
  127. "receiver", "content", "sendTime", "refMsgId"
  128. })
  129. @staticmethod
  130. def from_json(json_str):
  131. return Message.model_validate_json(json_str)