wechaty-puppet-matrix 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (352) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +14 -0
  3. package/dist/cjs/package.json +3 -0
  4. package/dist/cjs/src/cleanup.d.ts +4 -0
  5. package/dist/cjs/src/cleanup.d.ts.map +1 -0
  6. package/dist/cjs/src/cleanup.js +31 -0
  7. package/dist/cjs/src/config.d.ts +5 -0
  8. package/dist/cjs/src/config.d.ts.map +1 -0
  9. package/dist/cjs/src/config.js +10 -0
  10. package/dist/cjs/src/engine-schema.d.ts +76 -0
  11. package/dist/cjs/src/engine-schema.d.ts.map +1 -0
  12. package/dist/cjs/src/engine-schema.js +14 -0
  13. package/dist/cjs/src/matrix/cache-manager.d.ts +58 -0
  14. package/dist/cjs/src/matrix/cache-manager.d.ts.map +1 -0
  15. package/dist/cjs/src/matrix/cache-manager.js +286 -0
  16. package/dist/cjs/src/matrix/events/event-friendship.d.ts +6 -0
  17. package/dist/cjs/src/matrix/events/event-friendship.d.ts.map +1 -0
  18. package/dist/cjs/src/matrix/events/event-friendship.js +109 -0
  19. package/dist/cjs/src/matrix/events/event-message.d.ts +6 -0
  20. package/dist/cjs/src/matrix/events/event-message.d.ts.map +1 -0
  21. package/dist/cjs/src/matrix/events/event-message.js +5 -0
  22. package/dist/cjs/src/matrix/events/event-room-invite.d.ts +6 -0
  23. package/dist/cjs/src/matrix/events/event-room-invite.d.ts.map +1 -0
  24. package/dist/cjs/src/matrix/events/event-room-invite.js +55 -0
  25. package/dist/cjs/src/matrix/events/event-room-join.d.ts +6 -0
  26. package/dist/cjs/src/matrix/events/event-room-join.d.ts.map +1 -0
  27. package/dist/cjs/src/matrix/events/event-room-join.js +127 -0
  28. package/dist/cjs/src/matrix/events/event-room-leave.d.ts +8 -0
  29. package/dist/cjs/src/matrix/events/event-room-leave.d.ts.map +1 -0
  30. package/dist/cjs/src/matrix/events/event-room-leave.js +83 -0
  31. package/dist/cjs/src/matrix/events/event-room-topic.d.ts +6 -0
  32. package/dist/cjs/src/matrix/events/event-room-topic.d.ts.map +1 -0
  33. package/dist/cjs/src/matrix/events/event-room-topic.js +56 -0
  34. package/dist/cjs/src/matrix/events/event.d.ts +28 -0
  35. package/dist/cjs/src/matrix/events/event.d.ts.map +1 -0
  36. package/dist/cjs/src/matrix/events/event.js +42 -0
  37. package/dist/cjs/src/matrix/events/mod.d.ts +3 -0
  38. package/dist/cjs/src/matrix/events/mod.d.ts.map +1 -0
  39. package/dist/cjs/src/matrix/events/mod.js +21 -0
  40. package/dist/cjs/src/matrix/messages/message-appmsg.d.ts +57 -0
  41. package/dist/cjs/src/matrix/messages/message-appmsg.d.ts.map +1 -0
  42. package/dist/cjs/src/matrix/messages/message-appmsg.js +60 -0
  43. package/dist/cjs/src/matrix/messages/message-audio.d.ts +32 -0
  44. package/dist/cjs/src/matrix/messages/message-audio.d.ts.map +1 -0
  45. package/dist/cjs/src/matrix/messages/message-audio.js +17 -0
  46. package/dist/cjs/src/matrix/messages/message-emotion.d.ts +13 -0
  47. package/dist/cjs/src/matrix/messages/message-emotion.d.ts.map +1 -0
  48. package/dist/cjs/src/matrix/messages/message-emotion.js +32 -0
  49. package/dist/cjs/src/matrix/messages/message-image.d.ts +33 -0
  50. package/dist/cjs/src/matrix/messages/message-image.d.ts.map +1 -0
  51. package/dist/cjs/src/matrix/messages/message-image.js +14 -0
  52. package/dist/cjs/src/matrix/messages/message-miniprogram.d.ts +4 -0
  53. package/dist/cjs/src/matrix/messages/message-miniprogram.d.ts.map +1 -0
  54. package/dist/cjs/src/matrix/messages/message-miniprogram.js +21 -0
  55. package/dist/cjs/src/matrix/messages/message-sysmsg.d.ts +18 -0
  56. package/dist/cjs/src/matrix/messages/message-sysmsg.d.ts.map +1 -0
  57. package/dist/cjs/src/matrix/messages/message-sysmsg.js +76 -0
  58. package/dist/cjs/src/matrix/messages/message-video.d.ts +43 -0
  59. package/dist/cjs/src/matrix/messages/message-video.d.ts.map +1 -0
  60. package/dist/cjs/src/matrix/messages/message-video.js +20 -0
  61. package/dist/cjs/src/matrix/messages/sysmsg/message-pat.d.ts +14 -0
  62. package/dist/cjs/src/matrix/messages/sysmsg/message-pat.d.ts.map +1 -0
  63. package/dist/cjs/src/matrix/messages/sysmsg/message-pat.js +11 -0
  64. package/dist/cjs/src/matrix/messages/sysmsg/message-revokemsg.d.ts +19 -0
  65. package/dist/cjs/src/matrix/messages/sysmsg/message-revokemsg.d.ts.map +1 -0
  66. package/dist/cjs/src/matrix/messages/sysmsg/message-revokemsg.js +48 -0
  67. package/dist/cjs/src/matrix/messages/sysmsg/message-sysmsgtemplate.d.ts +59 -0
  68. package/dist/cjs/src/matrix/messages/sysmsg/message-sysmsgtemplate.d.ts.map +1 -0
  69. package/dist/cjs/src/matrix/messages/sysmsg/message-sysmsgtemplate.js +61 -0
  70. package/dist/cjs/src/matrix/messages/sysmsg/message-todo.d.ts +31 -0
  71. package/dist/cjs/src/matrix/messages/sysmsg/message-todo.d.ts.map +1 -0
  72. package/dist/cjs/src/matrix/messages/sysmsg/message-todo.js +16 -0
  73. package/dist/cjs/src/matrix/schema-mapper/contact.d.ts +4 -0
  74. package/dist/cjs/src/matrix/schema-mapper/contact.d.ts.map +1 -0
  75. package/dist/cjs/src/matrix/schema-mapper/contact.js +62 -0
  76. package/dist/cjs/src/matrix/schema-mapper/message/message-parser-appmsg.d.ts +3 -0
  77. package/dist/cjs/src/matrix/schema-mapper/message/message-parser-appmsg.d.ts.map +1 -0
  78. package/dist/cjs/src/matrix/schema-mapper/message/message-parser-appmsg.js +100 -0
  79. package/dist/cjs/src/matrix/schema-mapper/message/message-parser-refermsg.d.ts +3 -0
  80. package/dist/cjs/src/matrix/schema-mapper/message/message-parser-refermsg.d.ts.map +1 -0
  81. package/dist/cjs/src/matrix/schema-mapper/message/message-parser-refermsg.js +67 -0
  82. package/dist/cjs/src/matrix/schema-mapper/message/message-parser-room.d.ts +3 -0
  83. package/dist/cjs/src/matrix/schema-mapper/message/message-parser-room.d.ts.map +1 -0
  84. package/dist/cjs/src/matrix/schema-mapper/message/message-parser-room.js +40 -0
  85. package/dist/cjs/src/matrix/schema-mapper/message/message-parser-single-chat.d.ts +3 -0
  86. package/dist/cjs/src/matrix/schema-mapper/message/message-parser-single-chat.d.ts.map +1 -0
  87. package/dist/cjs/src/matrix/schema-mapper/message/message-parser-single-chat.js +11 -0
  88. package/dist/cjs/src/matrix/schema-mapper/message/message-parser-sysmsg.d.ts +3 -0
  89. package/dist/cjs/src/matrix/schema-mapper/message/message-parser-sysmsg.d.ts.map +1 -0
  90. package/dist/cjs/src/matrix/schema-mapper/message/message-parser-sysmsg.js +41 -0
  91. package/dist/cjs/src/matrix/schema-mapper/message/message-parser-type.d.ts +3 -0
  92. package/dist/cjs/src/matrix/schema-mapper/message/message-parser-type.d.ts.map +1 -0
  93. package/dist/cjs/src/matrix/schema-mapper/message/message-parser-type.js +65 -0
  94. package/dist/cjs/src/matrix/schema-mapper/message/message-parser.d.ts +13 -0
  95. package/dist/cjs/src/matrix/schema-mapper/message/message-parser.d.ts.map +1 -0
  96. package/dist/cjs/src/matrix/schema-mapper/message/message-parser.js +20 -0
  97. package/dist/cjs/src/matrix/schema-mapper/message/mod.d.ts +3 -0
  98. package/dist/cjs/src/matrix/schema-mapper/message/mod.d.ts.map +1 -0
  99. package/dist/cjs/src/matrix/schema-mapper/message/mod.js +17 -0
  100. package/dist/cjs/src/matrix/schema-mapper/message.d.ts +6 -0
  101. package/dist/cjs/src/matrix/schema-mapper/message.d.ts.map +1 -0
  102. package/dist/cjs/src/matrix/schema-mapper/message.js +47 -0
  103. package/dist/cjs/src/matrix/schema-mapper/room.d.ts +6 -0
  104. package/dist/cjs/src/matrix/schema-mapper/room.d.ts.map +1 -0
  105. package/dist/cjs/src/matrix/schema-mapper/room.js +27 -0
  106. package/dist/cjs/src/matrix/service/request.d.ts +290 -0
  107. package/dist/cjs/src/matrix/service/request.d.ts.map +1 -0
  108. package/dist/cjs/src/matrix/service/request.js +1315 -0
  109. package/dist/cjs/src/matrix/types.d.ts +34 -0
  110. package/dist/cjs/src/matrix/types.d.ts.map +1 -0
  111. package/dist/cjs/src/matrix/types.js +30 -0
  112. package/dist/cjs/src/matrix/utils/cached-promise.d.ts +5 -0
  113. package/dist/cjs/src/matrix/utils/cached-promise.d.ts.map +1 -0
  114. package/dist/cjs/src/matrix/utils/cached-promise.js +22 -0
  115. package/dist/cjs/src/matrix/utils/image-decrypt.d.ts +7 -0
  116. package/dist/cjs/src/matrix/utils/image-decrypt.d.ts.map +1 -0
  117. package/dist/cjs/src/matrix/utils/image-decrypt.js +158 -0
  118. package/dist/cjs/src/matrix/utils/index.d.ts +4 -0
  119. package/dist/cjs/src/matrix/utils/index.d.ts.map +1 -0
  120. package/dist/cjs/src/matrix/utils/index.js +32 -0
  121. package/dist/cjs/src/matrix/utils/is-type.d.ts +9 -0
  122. package/dist/cjs/src/matrix/utils/is-type.d.ts.map +1 -0
  123. package/dist/cjs/src/matrix/utils/is-type.js +72 -0
  124. package/dist/cjs/src/matrix/utils/regex.d.ts +3 -0
  125. package/dist/cjs/src/matrix/utils/regex.d.ts.map +1 -0
  126. package/dist/cjs/src/matrix/utils/regex.js +14 -0
  127. package/dist/cjs/src/matrix/utils/runner.d.ts +3 -0
  128. package/dist/cjs/src/matrix/utils/runner.d.ts.map +1 -0
  129. package/dist/cjs/src/matrix/utils/runner.js +12 -0
  130. package/dist/cjs/src/matrix/utils/string.d.ts +2 -0
  131. package/dist/cjs/src/matrix/utils/string.d.ts.map +1 -0
  132. package/dist/cjs/src/matrix/utils/string.js +7 -0
  133. package/dist/cjs/src/matrix/utils/xml-to-json.d.ts +5 -0
  134. package/dist/cjs/src/matrix/utils/xml-to-json.d.ts.map +1 -0
  135. package/dist/cjs/src/matrix/utils/xml-to-json.js +51 -0
  136. package/dist/cjs/src/mod.d.ts +5 -0
  137. package/dist/cjs/src/mod.d.ts.map +1 -0
  138. package/dist/cjs/src/mod.js +9 -0
  139. package/dist/cjs/src/package-json.d.ts +3 -0
  140. package/dist/cjs/src/package-json.d.ts.map +1 -0
  141. package/dist/cjs/src/package-json.js +4 -0
  142. package/dist/cjs/src/package-json.spec.d.ts +3 -0
  143. package/dist/cjs/src/package-json.spec.d.ts.map +1 -0
  144. package/dist/cjs/src/package-json.spec.js +9 -0
  145. package/dist/cjs/src/puppet-matrix.d.ts +114 -0
  146. package/dist/cjs/src/puppet-matrix.d.ts.map +1 -0
  147. package/dist/cjs/src/puppet-matrix.js +1037 -0
  148. package/dist/cjs/tests/integration.spec.d.ts +3 -0
  149. package/dist/cjs/tests/integration.spec.d.ts.map +1 -0
  150. package/dist/cjs/tests/integration.spec.js +7 -0
  151. package/dist/cjs/tests/tap.spec.d.ts +3 -0
  152. package/dist/cjs/tests/tap.spec.d.ts.map +1 -0
  153. package/dist/cjs/tests/tap.spec.js +32 -0
  154. package/dist/esm/src/cleanup.d.ts +4 -0
  155. package/dist/esm/src/cleanup.d.ts.map +1 -0
  156. package/dist/esm/src/cleanup.js +24 -0
  157. package/dist/esm/src/config.d.ts +5 -0
  158. package/dist/esm/src/config.d.ts.map +1 -0
  159. package/dist/esm/src/config.js +5 -0
  160. package/dist/esm/src/engine-schema.d.ts +76 -0
  161. package/dist/esm/src/engine-schema.d.ts.map +1 -0
  162. package/dist/esm/src/engine-schema.js +11 -0
  163. package/dist/esm/src/matrix/cache-manager.d.ts +58 -0
  164. package/dist/esm/src/matrix/cache-manager.d.ts.map +1 -0
  165. package/dist/esm/src/matrix/cache-manager.js +279 -0
  166. package/dist/esm/src/matrix/events/event-friendship.d.ts +6 -0
  167. package/dist/esm/src/matrix/events/event-friendship.d.ts.map +1 -0
  168. package/dist/esm/src/matrix/events/event-friendship.js +84 -0
  169. package/dist/esm/src/matrix/events/event-message.d.ts +6 -0
  170. package/dist/esm/src/matrix/events/event-message.d.ts.map +1 -0
  171. package/dist/esm/src/matrix/events/event-message.js +3 -0
  172. package/dist/esm/src/matrix/events/event-room-invite.d.ts +6 -0
  173. package/dist/esm/src/matrix/events/event-room-invite.d.ts.map +1 -0
  174. package/dist/esm/src/matrix/events/event-room-invite.js +53 -0
  175. package/dist/esm/src/matrix/events/event-room-join.d.ts +6 -0
  176. package/dist/esm/src/matrix/events/event-room-join.d.ts.map +1 -0
  177. package/dist/esm/src/matrix/events/event-room-join.js +125 -0
  178. package/dist/esm/src/matrix/events/event-room-leave.d.ts +8 -0
  179. package/dist/esm/src/matrix/events/event-room-leave.d.ts.map +1 -0
  180. package/dist/esm/src/matrix/events/event-room-leave.js +79 -0
  181. package/dist/esm/src/matrix/events/event-room-topic.d.ts +6 -0
  182. package/dist/esm/src/matrix/events/event-room-topic.d.ts.map +1 -0
  183. package/dist/esm/src/matrix/events/event-room-topic.js +54 -0
  184. package/dist/esm/src/matrix/events/event.d.ts +28 -0
  185. package/dist/esm/src/matrix/events/event.d.ts.map +1 -0
  186. package/dist/esm/src/matrix/events/event.js +37 -0
  187. package/dist/esm/src/matrix/events/mod.d.ts +3 -0
  188. package/dist/esm/src/matrix/events/mod.d.ts.map +1 -0
  189. package/dist/esm/src/matrix/events/mod.js +14 -0
  190. package/dist/esm/src/matrix/messages/message-appmsg.d.ts +57 -0
  191. package/dist/esm/src/matrix/messages/message-appmsg.d.ts.map +1 -0
  192. package/dist/esm/src/matrix/messages/message-appmsg.js +56 -0
  193. package/dist/esm/src/matrix/messages/message-audio.d.ts +32 -0
  194. package/dist/esm/src/matrix/messages/message-audio.d.ts.map +1 -0
  195. package/dist/esm/src/matrix/messages/message-audio.js +14 -0
  196. package/dist/esm/src/matrix/messages/message-emotion.d.ts +13 -0
  197. package/dist/esm/src/matrix/messages/message-emotion.d.ts.map +1 -0
  198. package/dist/esm/src/matrix/messages/message-emotion.js +28 -0
  199. package/dist/esm/src/matrix/messages/message-image.d.ts +33 -0
  200. package/dist/esm/src/matrix/messages/message-image.d.ts.map +1 -0
  201. package/dist/esm/src/matrix/messages/message-image.js +11 -0
  202. package/dist/esm/src/matrix/messages/message-miniprogram.d.ts +4 -0
  203. package/dist/esm/src/matrix/messages/message-miniprogram.d.ts.map +1 -0
  204. package/dist/esm/src/matrix/messages/message-miniprogram.js +18 -0
  205. package/dist/esm/src/matrix/messages/message-sysmsg.d.ts +18 -0
  206. package/dist/esm/src/matrix/messages/message-sysmsg.d.ts.map +1 -0
  207. package/dist/esm/src/matrix/messages/message-sysmsg.js +69 -0
  208. package/dist/esm/src/matrix/messages/message-video.d.ts +43 -0
  209. package/dist/esm/src/matrix/messages/message-video.d.ts.map +1 -0
  210. package/dist/esm/src/matrix/messages/message-video.js +17 -0
  211. package/dist/esm/src/matrix/messages/sysmsg/message-pat.d.ts +14 -0
  212. package/dist/esm/src/matrix/messages/sysmsg/message-pat.d.ts.map +1 -0
  213. package/dist/esm/src/matrix/messages/sysmsg/message-pat.js +8 -0
  214. package/dist/esm/src/matrix/messages/sysmsg/message-revokemsg.d.ts +19 -0
  215. package/dist/esm/src/matrix/messages/sysmsg/message-revokemsg.d.ts.map +1 -0
  216. package/dist/esm/src/matrix/messages/sysmsg/message-revokemsg.js +43 -0
  217. package/dist/esm/src/matrix/messages/sysmsg/message-sysmsgtemplate.d.ts +59 -0
  218. package/dist/esm/src/matrix/messages/sysmsg/message-sysmsgtemplate.d.ts.map +1 -0
  219. package/dist/esm/src/matrix/messages/sysmsg/message-sysmsgtemplate.js +56 -0
  220. package/dist/esm/src/matrix/messages/sysmsg/message-todo.d.ts +31 -0
  221. package/dist/esm/src/matrix/messages/sysmsg/message-todo.d.ts.map +1 -0
  222. package/dist/esm/src/matrix/messages/sysmsg/message-todo.js +13 -0
  223. package/dist/esm/src/matrix/schema-mapper/contact.d.ts +4 -0
  224. package/dist/esm/src/matrix/schema-mapper/contact.d.ts.map +1 -0
  225. package/dist/esm/src/matrix/schema-mapper/contact.js +36 -0
  226. package/dist/esm/src/matrix/schema-mapper/message/message-parser-appmsg.d.ts +3 -0
  227. package/dist/esm/src/matrix/schema-mapper/message/message-parser-appmsg.d.ts.map +1 -0
  228. package/dist/esm/src/matrix/schema-mapper/message/message-parser-appmsg.js +73 -0
  229. package/dist/esm/src/matrix/schema-mapper/message/message-parser-refermsg.d.ts +3 -0
  230. package/dist/esm/src/matrix/schema-mapper/message/message-parser-refermsg.d.ts.map +1 -0
  231. package/dist/esm/src/matrix/schema-mapper/message/message-parser-refermsg.js +40 -0
  232. package/dist/esm/src/matrix/schema-mapper/message/message-parser-room.d.ts +3 -0
  233. package/dist/esm/src/matrix/schema-mapper/message/message-parser-room.d.ts.map +1 -0
  234. package/dist/esm/src/matrix/schema-mapper/message/message-parser-room.js +36 -0
  235. package/dist/esm/src/matrix/schema-mapper/message/message-parser-single-chat.d.ts +3 -0
  236. package/dist/esm/src/matrix/schema-mapper/message/message-parser-single-chat.d.ts.map +1 -0
  237. package/dist/esm/src/matrix/schema-mapper/message/message-parser-single-chat.js +7 -0
  238. package/dist/esm/src/matrix/schema-mapper/message/message-parser-sysmsg.d.ts +3 -0
  239. package/dist/esm/src/matrix/schema-mapper/message/message-parser-sysmsg.d.ts.map +1 -0
  240. package/dist/esm/src/matrix/schema-mapper/message/message-parser-sysmsg.js +37 -0
  241. package/dist/esm/src/matrix/schema-mapper/message/message-parser-type.d.ts +3 -0
  242. package/dist/esm/src/matrix/schema-mapper/message/message-parser-type.d.ts.map +1 -0
  243. package/dist/esm/src/matrix/schema-mapper/message/message-parser-type.js +38 -0
  244. package/dist/esm/src/matrix/schema-mapper/message/message-parser.d.ts +13 -0
  245. package/dist/esm/src/matrix/schema-mapper/message/message-parser.d.ts.map +1 -0
  246. package/dist/esm/src/matrix/schema-mapper/message/message-parser.js +15 -0
  247. package/dist/esm/src/matrix/schema-mapper/message/mod.d.ts +3 -0
  248. package/dist/esm/src/matrix/schema-mapper/message/mod.d.ts.map +1 -0
  249. package/dist/esm/src/matrix/schema-mapper/message/mod.js +14 -0
  250. package/dist/esm/src/matrix/schema-mapper/message.d.ts +6 -0
  251. package/dist/esm/src/matrix/schema-mapper/message.d.ts.map +1 -0
  252. package/dist/esm/src/matrix/schema-mapper/message.js +21 -0
  253. package/dist/esm/src/matrix/schema-mapper/room.d.ts +6 -0
  254. package/dist/esm/src/matrix/schema-mapper/room.d.ts.map +1 -0
  255. package/dist/esm/src/matrix/schema-mapper/room.js +22 -0
  256. package/dist/esm/src/matrix/service/request.d.ts +290 -0
  257. package/dist/esm/src/matrix/service/request.d.ts.map +1 -0
  258. package/dist/esm/src/matrix/service/request.js +1286 -0
  259. package/dist/esm/src/matrix/types.d.ts +34 -0
  260. package/dist/esm/src/matrix/types.d.ts.map +1 -0
  261. package/dist/esm/src/matrix/types.js +27 -0
  262. package/dist/esm/src/matrix/utils/cached-promise.d.ts +5 -0
  263. package/dist/esm/src/matrix/utils/cached-promise.d.ts.map +1 -0
  264. package/dist/esm/src/matrix/utils/cached-promise.js +18 -0
  265. package/dist/esm/src/matrix/utils/image-decrypt.d.ts +7 -0
  266. package/dist/esm/src/matrix/utils/image-decrypt.d.ts.map +1 -0
  267. package/dist/esm/src/matrix/utils/image-decrypt.js +153 -0
  268. package/dist/esm/src/matrix/utils/index.d.ts +4 -0
  269. package/dist/esm/src/matrix/utils/index.d.ts.map +1 -0
  270. package/dist/esm/src/matrix/utils/index.js +24 -0
  271. package/dist/esm/src/matrix/utils/is-type.d.ts +9 -0
  272. package/dist/esm/src/matrix/utils/is-type.d.ts.map +1 -0
  273. package/dist/esm/src/matrix/utils/is-type.js +62 -0
  274. package/dist/esm/src/matrix/utils/regex.d.ts +3 -0
  275. package/dist/esm/src/matrix/utils/regex.d.ts.map +1 -0
  276. package/dist/esm/src/matrix/utils/regex.js +11 -0
  277. package/dist/esm/src/matrix/utils/runner.d.ts +3 -0
  278. package/dist/esm/src/matrix/utils/runner.d.ts.map +1 -0
  279. package/dist/esm/src/matrix/utils/runner.js +9 -0
  280. package/dist/esm/src/matrix/utils/string.d.ts +2 -0
  281. package/dist/esm/src/matrix/utils/string.d.ts.map +1 -0
  282. package/dist/esm/src/matrix/utils/string.js +3 -0
  283. package/dist/esm/src/matrix/utils/xml-to-json.d.ts +5 -0
  284. package/dist/esm/src/matrix/utils/xml-to-json.d.ts.map +1 -0
  285. package/dist/esm/src/matrix/utils/xml-to-json.js +45 -0
  286. package/dist/esm/src/mod.d.ts +5 -0
  287. package/dist/esm/src/mod.d.ts.map +1 -0
  288. package/dist/esm/src/mod.js +4 -0
  289. package/dist/esm/src/package-json.d.ts +3 -0
  290. package/dist/esm/src/package-json.d.ts.map +1 -0
  291. package/dist/esm/src/package-json.js +1 -0
  292. package/dist/esm/src/package-json.spec.d.ts +3 -0
  293. package/dist/esm/src/package-json.spec.d.ts.map +1 -0
  294. package/dist/esm/src/package-json.spec.js +7 -0
  295. package/dist/esm/src/puppet-matrix.d.ts +114 -0
  296. package/dist/esm/src/puppet-matrix.d.ts.map +1 -0
  297. package/dist/esm/src/puppet-matrix.js +1007 -0
  298. package/dist/esm/tests/integration.spec.d.ts +3 -0
  299. package/dist/esm/tests/integration.spec.d.ts.map +1 -0
  300. package/dist/esm/tests/integration.spec.js +5 -0
  301. package/dist/esm/tests/tap.spec.d.ts +3 -0
  302. package/dist/esm/tests/tap.spec.d.ts.map +1 -0
  303. package/dist/esm/tests/tap.spec.js +7 -0
  304. package/package.json +98 -0
  305. package/src/cleanup.ts +36 -0
  306. package/src/config.ts +15 -0
  307. package/src/engine-schema.ts +171 -0
  308. package/src/matrix/cache-manager.ts +359 -0
  309. package/src/matrix/events/event-friendship.ts +116 -0
  310. package/src/matrix/events/event-message.ts +7 -0
  311. package/src/matrix/events/event-room-invite.ts +64 -0
  312. package/src/matrix/events/event-room-join.ts +200 -0
  313. package/src/matrix/events/event-room-leave.ts +111 -0
  314. package/src/matrix/events/event-room-topic.ts +73 -0
  315. package/src/matrix/events/event.ts +60 -0
  316. package/src/matrix/events/mod.ts +16 -0
  317. package/src/matrix/messages/message-appmsg.ts +131 -0
  318. package/src/matrix/messages/message-audio.ts +48 -0
  319. package/src/matrix/messages/message-emotion.ts +68 -0
  320. package/src/matrix/messages/message-image.ts +46 -0
  321. package/src/matrix/messages/message-miniprogram.ts +45 -0
  322. package/src/matrix/messages/message-sysmsg.ts +106 -0
  323. package/src/matrix/messages/message-video.ts +62 -0
  324. package/src/matrix/messages/sysmsg/message-pat.ts +22 -0
  325. package/src/matrix/messages/sysmsg/message-revokemsg.ts +70 -0
  326. package/src/matrix/messages/sysmsg/message-sysmsgtemplate.ts +133 -0
  327. package/src/matrix/messages/sysmsg/message-todo.ts +45 -0
  328. package/src/matrix/schema-mapper/contact.ts +37 -0
  329. package/src/matrix/schema-mapper/message/message-parser-appmsg.ts +78 -0
  330. package/src/matrix/schema-mapper/message/message-parser-refermsg.ts +53 -0
  331. package/src/matrix/schema-mapper/message/message-parser-room.ts +62 -0
  332. package/src/matrix/schema-mapper/message/message-parser-single-chat.ts +12 -0
  333. package/src/matrix/schema-mapper/message/message-parser-sysmsg.ts +62 -0
  334. package/src/matrix/schema-mapper/message/message-parser-type.ts +48 -0
  335. package/src/matrix/schema-mapper/message/message-parser.ts +35 -0
  336. package/src/matrix/schema-mapper/message/mod.ts +17 -0
  337. package/src/matrix/schema-mapper/message.ts +30 -0
  338. package/src/matrix/schema-mapper/room.ts +28 -0
  339. package/src/matrix/service/request.ts +1944 -0
  340. package/src/matrix/types.ts +37 -0
  341. package/src/matrix/utils/cached-promise.ts +25 -0
  342. package/src/matrix/utils/image-decrypt.ts +198 -0
  343. package/src/matrix/utils/index.ts +34 -0
  344. package/src/matrix/utils/is-type.ts +72 -0
  345. package/src/matrix/utils/regex.ts +15 -0
  346. package/src/matrix/utils/runner.ts +12 -0
  347. package/src/matrix/utils/string.ts +3 -0
  348. package/src/matrix/utils/xml-to-json.ts +59 -0
  349. package/src/mod.ts +10 -0
  350. package/src/package-json.spec.ts +10 -0
  351. package/src/package-json.ts +11 -0
  352. package/src/puppet-matrix.ts +1402 -0
@@ -0,0 +1,1007 @@
1
+ import { log } from '@juzi/wechaty-puppet';
2
+ import * as PUPPET from '@juzi/wechaty-puppet';
3
+ import { FileBox } from 'file-box';
4
+ import Client from './matrix/service/request.js';
5
+ import { getUnixTime } from 'date-fns';
6
+ import { delay } from './matrix/utils/index.js';
7
+ import path from 'path';
8
+ import { CacheManager } from './matrix/cache-manager.js';
9
+ import { isIMContactId, isRoomId } from './matrix/utils/is-type.js';
10
+ import { parseAppmsgMessagePayload } from './matrix/messages/message-appmsg.js';
11
+ import { parseMiniProgramMessagePayload } from './matrix/messages/message-miniprogram.js';
12
+ import { parseEmotionMessagePayload } from './matrix/messages/message-emotion.js';
13
+ import { parseImageMessagePayload } from './matrix/messages/message-image.js';
14
+ import { parseAudioMessagePayload } from './matrix/messages/message-audio.js';
15
+ import { parseVideoMessagePayload } from './matrix/messages/message-video.js';
16
+ import { CachedPromiseFunc } from './matrix/utils/cached-promise.js';
17
+ import { engineMessageToWechaty } from './matrix/schema-mapper/message.js';
18
+ import { engineContactToWechaty } from './matrix/schema-mapper/contact.js';
19
+ import { chatRoomMemberToContact, engineRoomMemberToWechaty, engineRoomToWechaty, } from './matrix/schema-mapper/room.js';
20
+ import { parseEvent, EventType } from './matrix/events/mod.js';
21
+ import { addRunningPuppet, removeRunningPuppet } from './cleanup.js';
22
+ import { packageJson } from './package-json.js';
23
+ import { JsonToXml } from './matrix/utils/xml-to-json.js';
24
+ const VERSION = packageJson.version || '0.0.0';
25
+ const PRE = '[PuppetMatrix]';
26
+ const SEARCH_CONTACT_PREFIX = '$search$-';
27
+ const STRANGER_SUFFIX = '@stranger';
28
+ class PuppetMatrix extends PUPPET.Puppet {
29
+ options;
30
+ _cacheMgr;
31
+ _client;
32
+ _self;
33
+ _qrcodeTicket;
34
+ _printVersion = true;
35
+ _heartBeatTimer;
36
+ _qrcodeInterval;
37
+ _qrcodeStatuasInterval;
38
+ static VERSION = VERSION;
39
+ constructor(options = {}) {
40
+ super(options);
41
+ this.options = options;
42
+ this.options.engine = Client;
43
+ if (!this.options.token) {
44
+ const token = process.env['WECHATY_PUPPET_MATRIX_TOKEN'] || '';
45
+ if (token) {
46
+ this.options.token = token;
47
+ }
48
+ }
49
+ }
50
+ get client() {
51
+ return this._client;
52
+ }
53
+ async onStart() {
54
+ log.verbose(PRE, 'onStart()');
55
+ await this._startClient();
56
+ }
57
+ async _startClient() {
58
+ if (!this._client) {
59
+ this._client = await this.options.engine.create(this.options);
60
+ }
61
+ await this._startPuppetHeart(true);
62
+ if (this._client) {
63
+ this._client.on('login', this.wrapAsync(async ({ robotInfo }) => {
64
+ log.info(PRE, `login success: ${robotInfo.name}`);
65
+ await this.onLogin(robotInfo);
66
+ }));
67
+ this._client.on('message', this.wrapAsync(async (message) => {
68
+ await this._onPushMessage(message);
69
+ }));
70
+ this._client.on('contact', this.wrapAsync(async ({ contactInfo }) => {
71
+ await this._cacheMgr.setContact(contactInfo.wxid, contactInfo);
72
+ await this._cacheMgr?.setFriendshipRawPayload(contactInfo.wxid, {
73
+ id: contactInfo.wxid,
74
+ contactId: contactInfo.wxid,
75
+ timestamp: getUnixTime(Date.now()),
76
+ type: PUPPET.types.Friendship.Confirm,
77
+ });
78
+ this.emit('friendship', {
79
+ friendshipId: contactInfo.wxid,
80
+ type: PUPPET.types.Friendship.Confirm,
81
+ });
82
+ }));
83
+ this._client.on('update-contacts', this.wrapAsync(async (contactList) => {
84
+ for (const contact of contactList) {
85
+ await this._onPushContact(contact);
86
+ }
87
+ }));
88
+ this._client.on('room-leave', this.wrapAsync(async ({ roomId, leaveIds }) => {
89
+ const payload = {
90
+ roomId,
91
+ removeeIdList: leaveIds,
92
+ removerId: this._self?.wxid,
93
+ timestamp: getUnixTime(Date.now()),
94
+ };
95
+ for (const leaveId of leaveIds) {
96
+ await this._cacheMgr?.deleteSingleRoomMember(roomId, leaveId);
97
+ const roomInfo = await this._cacheMgr?.getRoom(roomId);
98
+ if (roomInfo && roomInfo.chatroommemberList) {
99
+ roomInfo.chatroommemberList = roomInfo.chatroommemberList.filter(member => member !== leaveId);
100
+ await this._cacheMgr?.setRoom(roomId, roomInfo);
101
+ }
102
+ }
103
+ this.emit('room-leave', payload);
104
+ }));
105
+ this._client.on('room-join', this.wrapAsync(async ({ roomId, inviterId, joinIds, joinUsers }) => {
106
+ const payload = {
107
+ inviteeIdList: joinIds,
108
+ inviterId,
109
+ roomId,
110
+ timestamp: getUnixTime(Date.now()),
111
+ };
112
+ for (const joinUser of joinUsers) {
113
+ await this._cacheMgr?.updateSingleRoomMember(roomId, joinUser);
114
+ const roomInfo = await this._cacheMgr?.getRoom(roomId);
115
+ if (roomInfo && roomInfo.chatroommemberList) {
116
+ roomInfo.chatroommemberList.push(joinUser.wxid);
117
+ await this._cacheMgr?.setRoom(roomId, roomInfo);
118
+ }
119
+ }
120
+ log.info(PRE, 'room-join-----: %s', JSON.stringify(payload));
121
+ this.emit('room-join', payload);
122
+ }));
123
+ this._client.on('logout', this.wrapAsync(async (message) => {
124
+ log.info(PRE, 'Logout event: %s', message);
125
+ await this.logout(message);
126
+ }));
127
+ }
128
+ addRunningPuppet(this);
129
+ void this.checkIsLogin();
130
+ if (this._printVersion) {
131
+ this._printVersion = false;
132
+ log.info(`
133
+ ============================================================
134
+ Welcome to Wechaty Matrix puppet!
135
+
136
+ - puppet-Matrix version: ${VERSION}
137
+ ============================================================
138
+ `);
139
+ }
140
+ }
141
+ async checkIsLogin() {
142
+ const info = await this._client?.getSelfInfo();
143
+ if (info) {
144
+ log.info(PRE, `login success: ${info.name}`);
145
+ await this.onLogin(info);
146
+ }
147
+ else {
148
+ if (this._qrcodeInterval) {
149
+ clearInterval(this._qrcodeInterval);
150
+ this._qrcodeInterval = null;
151
+ }
152
+ await this._getQrcode();
153
+ this._qrcodeInterval = setInterval(async () => {
154
+ await this._getQrcode();
155
+ }, 200000);
156
+ }
157
+ }
158
+ getQrcodeTicket(authurl) {
159
+ if (!authurl || !authurl.startsWith('http'))
160
+ return '';
161
+ const url = new URL(authurl);
162
+ const searchParams = new URLSearchParams(url.search.slice(1));
163
+ return searchParams.get('ticket') || '';
164
+ }
165
+ async _getQrcode() {
166
+ const qrcode = await this._client?.getQrcode();
167
+ if (qrcode) {
168
+ if (this._qrcodeStatuasInterval) {
169
+ clearInterval(this._qrcodeStatuasInterval);
170
+ this._qrcodeStatuasInterval = null;
171
+ }
172
+ this._qrcodeStatuasInterval = setInterval(async () => {
173
+ const scanStatus = await this._client?.getQrcodeStatus();
174
+ if (scanStatus.uuid === qrcode.uuid) {
175
+ if (scanStatus.authUrl) {
176
+ this._qrcodeTicket = this.getQrcodeTicket(scanStatus.authUrl);
177
+ this.emit('verify-code', scanStatus.uuid, '', 1, 1);
178
+ }
179
+ await this.onQrCodeEvent(scanStatus.status, qrcode.qrcodeUrl);
180
+ }
181
+ }, 8000);
182
+ }
183
+ }
184
+ async enterVerifyCode(id, code) {
185
+ log.verbose(PRE, 'enterVerifyCode(%s, %s)', id, code);
186
+ if (this._qrcodeTicket) {
187
+ await this._client?.verifyLoginUrl(this._qrcodeTicket, code);
188
+ return;
189
+ }
190
+ log.error(PRE, 'enterVerifyCode(%s, %s) error, no qrcodeTicket', id, code);
191
+ }
192
+ async onQrCodeEvent(status, url) {
193
+ const ScanStatusName = {
194
+ [PUPPET.types.ScanStatus.Unknown]: 'Unknown',
195
+ [PUPPET.types.ScanStatus.Cancel]: 'Cancel',
196
+ [PUPPET.types.ScanStatus.Waiting]: 'Waiting',
197
+ [PUPPET.types.ScanStatus.Scanned]: 'Scanned',
198
+ [PUPPET.types.ScanStatus.Confirmed]: 'Confirmed',
199
+ [PUPPET.types.ScanStatus.Timeout]: 'Timeout',
200
+ };
201
+ let scanStatus = PUPPET.types.ScanStatus.Unknown;
202
+ switch (status) {
203
+ case 0:
204
+ scanStatus = PUPPET.types.ScanStatus.Waiting;
205
+ break;
206
+ case 1:
207
+ scanStatus = PUPPET.types.ScanStatus.Scanned;
208
+ break;
209
+ case 2:
210
+ scanStatus = PUPPET.types.ScanStatus.Confirmed;
211
+ break;
212
+ case 3:
213
+ scanStatus = PUPPET.types.ScanStatus.Cancel;
214
+ break;
215
+ case 4:
216
+ scanStatus = PUPPET.types.ScanStatus.Timeout;
217
+ break;
218
+ }
219
+ log.silly(PRE, `scan event, status: ${ScanStatusName[scanStatus]}${url ? ', with qrcode: ' + url : ''}`);
220
+ this.emit('scan', {
221
+ qrcode: url,
222
+ status: scanStatus,
223
+ });
224
+ if (status === 4 || status === 3) {
225
+ await this.checkIsLogin();
226
+ }
227
+ }
228
+ async onLogin(user) {
229
+ try {
230
+ if (!this._client) {
231
+ this._client = await this.options.engine.create(this.options);
232
+ }
233
+ if (!this._cacheMgr) {
234
+ this._cacheMgr = new CacheManager(user.wxid);
235
+ await this._cacheMgr.init();
236
+ await this._cacheMgr.setContact(user.wxid, user);
237
+ }
238
+ if (this._qrcodeInterval) {
239
+ clearInterval(this._qrcodeInterval);
240
+ this._qrcodeInterval = null;
241
+ }
242
+ if (this._qrcodeStatuasInterval) {
243
+ clearInterval(this._qrcodeStatuasInterval);
244
+ this._qrcodeStatuasInterval = null;
245
+ }
246
+ this._self = user;
247
+ await super.login(user.wxid);
248
+ void this._client?.pushLoginNotify();
249
+ await this.ready();
250
+ }
251
+ catch (e) {
252
+ log.error('error login', e);
253
+ }
254
+ }
255
+ async ready() {
256
+ try {
257
+ await this._client?.getContactList(1, 100);
258
+ await delay(2000);
259
+ await this._client?.getGroupList(1, 100);
260
+ await delay(2000);
261
+ await this._client?.getOfficeList(1, 100);
262
+ log.silly(PRE, 'on ready');
263
+ setTimeout(() => {
264
+ this.emit('ready', {
265
+ data: 'ready',
266
+ });
267
+ }, 10000);
268
+ }
269
+ catch (e) {
270
+ log.error('ready error', e);
271
+ }
272
+ }
273
+ async onStop() {
274
+ await this._stopClient();
275
+ }
276
+ async _stopClient() {
277
+ this.__currentUserId = undefined;
278
+ this.__currentUserId = undefined;
279
+ if (this._cacheMgr) {
280
+ log.info(PRE, 'colse cache');
281
+ await this._cacheMgr.close();
282
+ this._cacheMgr = undefined;
283
+ }
284
+ removeRunningPuppet(this);
285
+ this._stopPuppetHeart();
286
+ }
287
+ async logout(reason) {
288
+ if (!this.isLoggedIn) {
289
+ return;
290
+ }
291
+ await this._client?.logout();
292
+ await super.logout(reason);
293
+ void this.checkIsLogin();
294
+ }
295
+ ding(data) {
296
+ const eventDongPayload = {
297
+ data: data ? data : 'ding-dong',
298
+ };
299
+ this.emit('dong', eventDongPayload);
300
+ }
301
+ async contactSelfName(name) {
302
+ return PUPPET.throwUnsupportedError(name);
303
+ }
304
+ async contactSelfQRCode() {
305
+ return this._client?.getUserQrcode() || '';
306
+ }
307
+ async contactSelfSignature(signature) {
308
+ return PUPPET.throwUnsupportedError(signature);
309
+ }
310
+ async contactPhone(contactId, phoneList) {
311
+ return PUPPET.throwUnsupportedError(contactId, phoneList);
312
+ }
313
+ async contactAlias(contactId, alias) {
314
+ const contact = await this.contactRawPayload(contactId);
315
+ if (alias) {
316
+ if (contact) {
317
+ if (contact.wxid.indexOf(STRANGER_SUFFIX) !== -1) {
318
+ await this._cacheMgr.setContactStrangerAlias(contact.wxid, alias);
319
+ if (contactId.startsWith(SEARCH_CONTACT_PREFIX)) {
320
+ const searchContact = await this._cacheMgr?.getContactSearch(contactId);
321
+ if (searchContact) {
322
+ searchContact.remark = alias;
323
+ await this._cacheMgr.setContactSearch(contactId, searchContact);
324
+ }
325
+ }
326
+ }
327
+ else {
328
+ await this._client?.setContactAlias(contactId, alias);
329
+ contact.remark = alias;
330
+ await this._updateContactCache(contact);
331
+ }
332
+ }
333
+ }
334
+ else {
335
+ return contact && contact.remark;
336
+ }
337
+ }
338
+ async contactAvatar(contactId, file) {
339
+ if (file) {
340
+ return PUPPET.throwUnsupportedError('set avatar is not unsupported');
341
+ }
342
+ const contact = await this.contactRawPayload(contactId);
343
+ if (contact && contact.avatar) {
344
+ return FileBox.fromUrl(contact.avatar, { name: `avatar-${contactId}.jpg` });
345
+ }
346
+ }
347
+ async contactList() {
348
+ return this._cacheMgr.getContactIds();
349
+ }
350
+ async contactCorporationRemark(contactId, corporationRemark) {
351
+ return PUPPET.throwUnsupportedError(contactId, corporationRemark);
352
+ }
353
+ async contactDescription(contactId, description) {
354
+ return PUPPET.throwUnsupportedError(contactId, description);
355
+ }
356
+ async contactDelete(contactId) {
357
+ const contact = await this._refreshContact(contactId);
358
+ if (contact && contact.isFriend === 2) {
359
+ log.warn(`can not delete contact which is not a friend:: ${contactId}`);
360
+ return;
361
+ }
362
+ await this._client?.removeContact(contactId);
363
+ await this._refreshContact(contactId, 2);
364
+ }
365
+ async tagContactTagAdd(tagIds, contactIds) {
366
+ return PUPPET.throwUnsupportedError(tagIds, contactIds);
367
+ }
368
+ async tagContactTagRemove(tagIds, contactIds) {
369
+ return PUPPET.throwUnsupportedError(tagIds, contactIds);
370
+ }
371
+ async tagTagDelete(tagIdList) {
372
+ return PUPPET.throwUnsupportedError(tagIdList);
373
+ }
374
+ async tagTagContactList(contactId) {
375
+ return PUPPET.throwUnsupportedError(contactId);
376
+ }
377
+ async friendshipAccept(friendshipId) {
378
+ const friendship = (await this.friendshipRawPayload(friendshipId));
379
+ const userName = friendship.contactId;
380
+ if (isIMContactId(userName)) {
381
+ await this._refreshContact(userName);
382
+ }
383
+ await this._client?.confirmFriendship(userName, friendship.scene, friendship.ticket);
384
+ }
385
+ async friendshipAdd(contactId, option) {
386
+ let stranger;
387
+ let ticket;
388
+ let addContactScene;
389
+ const cachedContactSearch = await this._cacheMgr.getContactSearch(contactId);
390
+ if (cachedContactSearch) {
391
+ stranger = cachedContactSearch.isFriend || undefined;
392
+ ticket = cachedContactSearch.ticket || '';
393
+ addContactScene = cachedContactSearch.scene;
394
+ }
395
+ else {
396
+ const contactPayload = await this.contactRawPayload(contactId);
397
+ const contactAlias = contactPayload?.remark;
398
+ if (!contactAlias) {
399
+ const roomIds = await this._findRoomIdForWxid(contactId);
400
+ if (!roomIds.length) {
401
+ throw new Error(`Can not find room for contact while adding friendship: ${contactId}`);
402
+ }
403
+ const res = await this._client?.searchContact([contactId]);
404
+ if (res) {
405
+ await this._updateContactCache(res);
406
+ }
407
+ addContactScene = '14';
408
+ }
409
+ const res = await this.contactRawPayload(contactId);
410
+ if (res?.isFriend === 1) {
411
+ throw new Error(`contact:${contactId} is already a friend`);
412
+ }
413
+ ticket = '';
414
+ addContactScene = '6';
415
+ }
416
+ let hello;
417
+ if (stranger === 1) {
418
+ throw new Error(`contact:${contactId} is already a friend`);
419
+ }
420
+ if (option) {
421
+ if (typeof option === 'string') {
422
+ hello = option;
423
+ }
424
+ else {
425
+ hello = option.hello;
426
+ }
427
+ }
428
+ await this._client?.addFriendByWxid({ content: hello, ticket, scene: addContactScene, wxid: contactId });
429
+ }
430
+ async friendshipSearchPhone(phone) {
431
+ return this._friendshipSearch(phone, '15');
432
+ }
433
+ async friendshipSearchHandle(qq) {
434
+ return this._friendshipSearch(qq, '1');
435
+ }
436
+ async _friendshipSearch(id, scene) {
437
+ const cachedContactSearch = await this._cacheMgr.getContactSearch(id);
438
+ if (cachedContactSearch) {
439
+ return id;
440
+ }
441
+ const res = await this._client?.searchStranger(id);
442
+ const searchId = `${SEARCH_CONTACT_PREFIX}${id}`;
443
+ if (res) {
444
+ await this._cacheMgr.setContactSearch(searchId, { ...res, scene });
445
+ }
446
+ return searchId;
447
+ }
448
+ async _findRoomIdForWxid(wxid) {
449
+ const ret = [];
450
+ const roomIds = (await this._cacheMgr?.getRoomIds()) || [];
451
+ for (const roomId of roomIds) {
452
+ const roomMember = await this._cacheMgr?.getRoomMember(roomId);
453
+ if (!roomMember) {
454
+ continue;
455
+ }
456
+ const roomMemberIds = Object.keys(roomMember);
457
+ if (roomMemberIds.indexOf(wxid) !== -1) {
458
+ ret.push(roomId);
459
+ }
460
+ }
461
+ return ret;
462
+ }
463
+ async messageContact(messageId) {
464
+ log.verbose('PuppetWeChat', 'messageContact(%s)', messageId);
465
+ return PUPPET.throwUnsupportedError(messageId);
466
+ }
467
+ async messageFile(messageId) {
468
+ const messagePayload = await this.messageRawPayload(messageId);
469
+ const message = await this.messageRawPayloadParser(messagePayload);
470
+ switch (message.type) {
471
+ case PUPPET.types.Message.Image:
472
+ return this._getMessageImageFileBox(messageId, messagePayload);
473
+ case PUPPET.types.Message.Audio:
474
+ return this._getMessageAudioFileBox(messageId, messagePayload);
475
+ case PUPPET.types.Message.Video: {
476
+ return this._getMessageVideoFileBox(messageId, messagePayload);
477
+ }
478
+ case PUPPET.types.Message.Attachment:
479
+ return this._getMessageFileFileBox(messageId, messagePayload);
480
+ case PUPPET.types.Message.Emoticon: {
481
+ const emotionPayload = await parseEmotionMessagePayload(messagePayload);
482
+ const emoticonBox = FileBox.fromUrl(emotionPayload.cdnurl, { name: `message-${messageId}-emoticon.jpg` });
483
+ emoticonBox.metadata = {
484
+ payload: emotionPayload,
485
+ type: 'emoticon',
486
+ };
487
+ return emoticonBox;
488
+ }
489
+ case PUPPET.types.Message.MiniProgram:
490
+ return PUPPET.throwUnsupportedError(messageId);
491
+ case PUPPET.types.Message.Url:
492
+ return PUPPET.throwUnsupportedError(messageId);
493
+ default:
494
+ throw new Error(`Can not get file for message: ${messageId}`);
495
+ }
496
+ }
497
+ async messageImage(messageId) {
498
+ const messagePayload = await this.messageRawPayload(messageId);
499
+ return this._getMessageImageFileBox(messageId, messagePayload);
500
+ }
501
+ async messageMiniProgram(messageId) {
502
+ const messagePayload = await this.messageRawPayload(messageId);
503
+ const message = await this.messageRawPayloadParser(messagePayload);
504
+ if (message.type !== PUPPET.types.Message.MiniProgram) {
505
+ throw new Error('message is not mini program, can not get MiniProgramPayload');
506
+ }
507
+ return parseMiniProgramMessagePayload(messagePayload);
508
+ }
509
+ async messageUrl(messageId) {
510
+ const rawPayload = await this.messageRawPayload(messageId);
511
+ const payload = await this.messageRawPayloadParser(rawPayload);
512
+ if (payload.type !== PUPPET.types.Message.Url) {
513
+ throw new Error('Can not get url from non url payload');
514
+ }
515
+ const appPayload = await parseAppmsgMessagePayload(rawPayload.msg);
516
+ return {
517
+ description: appPayload.des,
518
+ thumbnailUrl: appPayload.thumburl,
519
+ title: appPayload.title,
520
+ url: appPayload.url,
521
+ };
522
+ }
523
+ async messageSendContact(toUserId, contactId) {
524
+ log.verbose('PuppetWeChat', 'messageSend("%s", %s)', toUserId, contactId);
525
+ const contactPayload = await this.contactRawPayload(contactId);
526
+ const xmlObj = {
527
+ msg: {
528
+ antispamticket: '',
529
+ bigheadimgurl: contactPayload?.avatar,
530
+ brandFlags: '0',
531
+ certflag: '0',
532
+ city: contactPayload?.city,
533
+ fullpy: contactPayload?.name,
534
+ imagestatus: '3',
535
+ nickname: contactPayload?.name,
536
+ province: contactPayload?.province,
537
+ regionCode: 'CN_Shanghai',
538
+ scene: '17',
539
+ sex: contactPayload?.sex,
540
+ smallheadimgurl: contactPayload?.avatar,
541
+ username: contactPayload?.ticket,
542
+ },
543
+ };
544
+ const xml = JsonToXml(xmlObj);
545
+ const res = await this._client?.sendContactCard(toUserId, xml, this._self?.wxid);
546
+ if (res) {
547
+ await this._cacheMgr?.setMessage(res.id, res);
548
+ return res.id;
549
+ }
550
+ }
551
+ async messageSendFile(conversationId, fileBox) {
552
+ const metadata = fileBox.metadata;
553
+ const fileType = fileBox.mediaType && fileBox.mediaType !== 'application/octet-stream'
554
+ ? fileBox.mediaType
555
+ : path.extname(fileBox.name);
556
+ const fileUrl = fileBox.remoteUrl || '';
557
+ if (metadata.type === 'emoticon') {
558
+ PUPPET.throwUnsupportedError(conversationId, fileBox);
559
+ }
560
+ else if (fileBox.mediaType.startsWith('image/')) {
561
+ if (fileUrl) {
562
+ const msgInfo = await this._client?.sendUrlImg(conversationId, fileUrl, this._self?.wxid);
563
+ if (msgInfo) {
564
+ await this._cacheMgr?.setMessage(msgInfo.id, msgInfo);
565
+ return msgInfo.id;
566
+ }
567
+ }
568
+ }
569
+ else if (fileBox.mediaType === 'audio/silk') {
570
+ PUPPET.throwUnsupportedError(conversationId, fileBox);
571
+ }
572
+ else if (fileType.includes('video/mp4') || fileType.includes('.mp4')) {
573
+ const msgInfo = await this._client?.sendVideo(conversationId, fileUrl, this._self?.wxid);
574
+ if (msgInfo) {
575
+ await this._cacheMgr?.setMessage(msgInfo.id, msgInfo);
576
+ return msgInfo.id;
577
+ }
578
+ }
579
+ else {
580
+ if (fileUrl) {
581
+ const msgInfo = await this._client?.sendCloudFile(conversationId, fileUrl, this._self?.wxid);
582
+ if (msgInfo) {
583
+ await this._cacheMgr?.setMessage(msgInfo.id, msgInfo);
584
+ return msgInfo.id;
585
+ }
586
+ }
587
+ }
588
+ }
589
+ async messageSendMiniProgram(toUserName, mpPayload) {
590
+ const miniProgram = {
591
+ appid: mpPayload.appid,
592
+ contactId: toUserName,
593
+ content: mpPayload.description,
594
+ username: mpPayload.username,
595
+ pagePath: mpPayload.pagePath,
596
+ thumbUrl: mpPayload.thumbUrl,
597
+ iconUrl: mpPayload.iconUrl,
598
+ title: mpPayload.title,
599
+ };
600
+ if (!mpPayload.thumbUrl) {
601
+ log.warn(PRE, 'no thumb image found while sending mimi program');
602
+ }
603
+ const res = await this._client?.sendMiniProgram(miniProgram, this._self?.wxid);
604
+ if (res) {
605
+ await this._cacheMgr?.setMessage(res.id, res);
606
+ return res.id;
607
+ }
608
+ }
609
+ async messageSendText(conversationId, text, mentionIdList) {
610
+ if (mentionIdList && mentionIdList.length) {
611
+ const msgInfo = await this._client?.sendAtText(conversationId, text, mentionIdList, this._self?.wxid);
612
+ if (msgInfo) {
613
+ await this._cacheMgr?.setMessage(msgInfo.id, msgInfo);
614
+ return msgInfo.id;
615
+ }
616
+ }
617
+ const msgInfo = await this._client?.sendText(conversationId, text, this._self?.wxid);
618
+ if (msgInfo) {
619
+ await this._cacheMgr?.setMessage(msgInfo.id, msgInfo);
620
+ return msgInfo.id;
621
+ }
622
+ }
623
+ async messageSendUrl(conversationId, urlLinkPayload) {
624
+ const urlCard = {
625
+ contactId: conversationId,
626
+ content: urlLinkPayload.description,
627
+ jumpUrl: urlLinkPayload.url,
628
+ imageUrl: urlLinkPayload.thumbnailUrl,
629
+ title: urlLinkPayload.title,
630
+ };
631
+ if (!urlLinkPayload.thumbnailUrl) {
632
+ log.warn(PRE, 'no thumb image found while sending mimi program');
633
+ }
634
+ const msgInfo = await this._client?.sendShareCard(urlCard, this._self?.wxid);
635
+ if (msgInfo) {
636
+ await this._cacheMgr?.setMessage(msgInfo.id, msgInfo);
637
+ return msgInfo.id;
638
+ }
639
+ }
640
+ async messageSendPost(conversationId, postPayload) {
641
+ const msgType = postPayload.sayableList[0];
642
+ if (msgType.type !== 'Text') {
643
+ throw new Error(`Wrong Post!!! please check your Post payload to make sure it right ${conversationId}`);
644
+ }
645
+ }
646
+ async messageRecall(messageId) {
647
+ return PUPPET.throwUnsupportedError(messageId);
648
+ }
649
+ async messageForward(toUserName, messageId) {
650
+ const messagePayload = await this.messageRawPayload(messageId);
651
+ const message = await this.messageRawPayloadParser(messagePayload);
652
+ switch (message.type) {
653
+ case PUPPET.types.Message.Text:
654
+ await this.messageSendText(toUserName, message.text);
655
+ break;
656
+ case PUPPET.types.Message.Image: {
657
+ const imageFileBox = await this.messageImage(messageId);
658
+ await this.messageSendFile(toUserName, imageFileBox);
659
+ break;
660
+ }
661
+ case PUPPET.types.Message.Audio: {
662
+ const audioFileBox = await this.messageFile(messageId);
663
+ await this.messageSendFile(toUserName, audioFileBox);
664
+ break;
665
+ }
666
+ case PUPPET.types.Message.Video: {
667
+ const videoFileBox = await this.messageFile(messageId);
668
+ await this.messageSendFile(toUserName, videoFileBox);
669
+ break;
670
+ }
671
+ default:
672
+ throw new Error(`Message forwarding is unsupported for messageId:${messageId}, type:${message.type}`);
673
+ }
674
+ }
675
+ async roomAdd(roomId, contactId) {
676
+ let type = 1;
677
+ if (roomId) {
678
+ const ret = await this.roomRawPayload(roomId);
679
+ if (ret && ret.memberNum && ret.memberNum > 38) {
680
+ type = 2;
681
+ }
682
+ }
683
+ await this._client?.inviteToGroup(roomId, contactId, type);
684
+ }
685
+ async roomAvatar(roomId) {
686
+ const chatroom = await this.roomRawPayload(roomId);
687
+ if (chatroom && chatroom.avatar) {
688
+ return FileBox.fromUrl(chatroom.avatar);
689
+ }
690
+ else {
691
+ return FileBox.fromBuffer(Buffer.from(new ArrayBuffer(0)), 'room-avatar.jpg');
692
+ }
693
+ }
694
+ async roomCreate(contactIdList, topic) {
695
+ return PUPPET.throwUnsupportedError(contactIdList, topic);
696
+ }
697
+ async roomDel(roomId, contactId) {
698
+ return PUPPET.throwUnsupportedError(roomId, contactId);
699
+ }
700
+ async roomList() {
701
+ return this._cacheMgr.getRoomIds();
702
+ }
703
+ async roomQRCode(roomId) {
704
+ return PUPPET.throwUnsupportedError(roomId);
705
+ }
706
+ async roomQuit(roomId) {
707
+ return this._client?.roomQuit(roomId);
708
+ }
709
+ async roomTopic(roomId, topic) {
710
+ await this._client?.setGroupName(roomId, topic);
711
+ }
712
+ async roomAnnounce(roomId, text) {
713
+ if (text !== undefined) {
714
+ await this._client?.sendAnnouncement(roomId, text);
715
+ }
716
+ return '';
717
+ }
718
+ async roomMemberList(roomId) {
719
+ const roomMemberMap = await this._getRoomMemberList(roomId);
720
+ return Object.values(roomMemberMap).map((m) => m.wxid);
721
+ }
722
+ async roomInvitationAccept(roomInvitationId) {
723
+ return PUPPET.throwUnsupportedError(roomInvitationId);
724
+ }
725
+ async contactRawPayloadParser(payload) {
726
+ return engineContactToWechaty(payload);
727
+ }
728
+ async contactRawPayload(id) {
729
+ log.silly(PRE, 'contactRawPayload(%s) @ %s', id, this);
730
+ if (id.startsWith(SEARCH_CONTACT_PREFIX)) {
731
+ const searchContact = await this._cacheMgr?.getContactSearch(id);
732
+ return searchContact;
733
+ }
734
+ let ret = await this._cacheMgr.getContact(id);
735
+ if (!ret) {
736
+ ret = await CachedPromiseFunc(`contactRawPayload-${id}`, async () => {
737
+ const contact = await this._refreshContact(id);
738
+ return contact;
739
+ });
740
+ return ret;
741
+ }
742
+ return ret;
743
+ }
744
+ async messageRawPayloadParser(payload) {
745
+ return engineMessageToWechaty(this, payload);
746
+ }
747
+ async messageRawPayload(id) {
748
+ const ret = await this._cacheMgr.getMessage(id);
749
+ if (!ret) {
750
+ throw new Error(`can not find message in cache for messageId: ${id}`);
751
+ }
752
+ return ret;
753
+ }
754
+ async roomRawPayloadParser(payload) {
755
+ return engineRoomToWechaty(payload);
756
+ }
757
+ async roomRawPayload(id) {
758
+ let ret = await this._cacheMgr.getRoom(id);
759
+ if (!ret) {
760
+ const contact = await this._refreshContact(id);
761
+ ret = contact;
762
+ }
763
+ return ret;
764
+ }
765
+ async roomMemberRawPayload(roomId, contactId) {
766
+ const roomMemberMap = await this._getRoomMemberList(roomId);
767
+ if (roomMemberMap[contactId]) {
768
+ return roomMemberMap[contactId];
769
+ }
770
+ const newMap = await this._getRoomMemberList(roomId, true);
771
+ return newMap[contactId];
772
+ }
773
+ async roomMemberRawPayloadParser(rawPayload) {
774
+ return engineRoomMemberToWechaty(rawPayload);
775
+ }
776
+ async roomInvitationRawPayload(roomInvitationId) {
777
+ return PUPPET.throwUnsupportedError(roomInvitationId);
778
+ }
779
+ async roomInvitationRawPayloadParser(rawPayload) {
780
+ return PUPPET.throwUnsupportedError(rawPayload);
781
+ }
782
+ async friendshipRawPayloadParser(rawPayload) {
783
+ return rawPayload;
784
+ }
785
+ async friendshipRawPayload(id) {
786
+ const ret = await this._cacheMgr.getFriendshipRawPayload(id);
787
+ if (!ret) {
788
+ throw new Error(`Can not find friendship for id: ${id}`);
789
+ }
790
+ return ret;
791
+ }
792
+ async syncRoom() {
793
+ if (this.state.active() !== true) {
794
+ throw new Error('Can not sync contact before login');
795
+ }
796
+ await this._client?.getGroupList(1, 100);
797
+ }
798
+ async _getRoomMemberList(roomId, force) {
799
+ if (!this._cacheMgr) {
800
+ return {};
801
+ }
802
+ let ret = await this._cacheMgr.getRoomMember(roomId);
803
+ if (!ret || (ret && !Object.keys(ret).length) || force) {
804
+ const resMembers = await this._client?.getGroupMembers(roomId) || [];
805
+ const roomMemberMap = {};
806
+ for (const roomMember of resMembers) {
807
+ const hasContact = await this._cacheMgr.hasContact(roomMember.wxid);
808
+ let MemberInfo;
809
+ if (!hasContact) {
810
+ MemberInfo = chatRoomMemberToContact(roomMember);
811
+ await this._cacheMgr.setContact(MemberInfo.wxid, MemberInfo);
812
+ roomMemberMap[roomMember.wxid] = MemberInfo;
813
+ }
814
+ else {
815
+ MemberInfo = await this._cacheMgr.getContact(roomMember.wxid);
816
+ roomMemberMap[roomMember.wxid] = MemberInfo;
817
+ }
818
+ }
819
+ ret = roomMemberMap;
820
+ await this._updateRoomMember(roomId, roomMemberMap);
821
+ }
822
+ return ret;
823
+ }
824
+ async _updateContactCache(contact) {
825
+ if (!contact.wxid) {
826
+ log.warn(PRE, `wxid is required for contact: ${JSON.stringify(contact)}`);
827
+ return;
828
+ }
829
+ if (isRoomId(contact.wxid)) {
830
+ const oldRoomPayload = await this._cacheMgr.getRoom(contact.wxid);
831
+ const roomId = contact.wxid;
832
+ let finalPayload = contact;
833
+ if (oldRoomPayload) {
834
+ finalPayload = Object.assign(oldRoomPayload, contact);
835
+ }
836
+ await this._cacheMgr.setRoom(roomId, finalPayload);
837
+ if (!finalPayload.chatroommemberList || finalPayload.chatroommemberList.length === 0) {
838
+ const map = await this._getRoomMemberList(roomId);
839
+ await this._cacheMgr.setRoom(roomId, Object.assign(finalPayload, { chatroommemberList: Object.keys(map) }));
840
+ }
841
+ }
842
+ else {
843
+ const oldContactPaylod = await this._cacheMgr.getContact(contact.wxid);
844
+ if (oldContactPaylod) {
845
+ await this._cacheMgr.setContact(contact.wxid, Object.assign(oldContactPaylod, contact));
846
+ }
847
+ else {
848
+ await this._cacheMgr.setContact(contact.wxid, contact);
849
+ }
850
+ }
851
+ }
852
+ async _updateRoomMember(roomId, roomMemberMap) {
853
+ if (roomMemberMap) {
854
+ await this._cacheMgr.setRoomMember(roomId, roomMemberMap);
855
+ }
856
+ else {
857
+ await this._cacheMgr.deleteRoomMember(roomId);
858
+ }
859
+ }
860
+ async _updateRoom(roomId) {
861
+ if (!roomId) {
862
+ log.warn(PRE, 'roomid is required for updateRoom');
863
+ return;
864
+ }
865
+ let contact = await this._client?.searchContact([roomId]);
866
+ if (contact) {
867
+ const memeberMap = await this._getRoomMemberList(contact.wxid, true);
868
+ const chatroommemberList = Object.values(memeberMap).map(item => item.wxid);
869
+ contact = { ...contact, memberNum: Object.keys(memeberMap).length, chatroommemberList };
870
+ await this._onPushContact(contact);
871
+ }
872
+ }
873
+ async _onPushContact(contact) {
874
+ log.silly(PRE, `on push contact: ${JSON.stringify(contact)}`);
875
+ await this._updateContactCache(contact);
876
+ if (contact.wxid) {
877
+ const aliasToSet = await this._cacheMgr.getContactStrangerAlias(contact.wxid);
878
+ if (aliasToSet) {
879
+ await this.contactAlias(contact.wxid, aliasToSet);
880
+ await this._cacheMgr.deleteContactStrangerAlias(contact.wxid);
881
+ }
882
+ }
883
+ }
884
+ async _onPushMessage(message) {
885
+ const messageId = message.id;
886
+ log.silly(PRE, `on push original message: ${JSON.stringify(message)}`);
887
+ if (await this._cacheMgr.hasMessage(messageId)) {
888
+ return;
889
+ }
890
+ await this._cacheMgr.setMessage(message.id, message);
891
+ const event = await parseEvent(this, message);
892
+ log.info('event-------', JSON.stringify(event));
893
+ switch (event.type) {
894
+ case EventType.Message:
895
+ this.emit('message', {
896
+ messageId,
897
+ });
898
+ break;
899
+ case EventType.Friendship: {
900
+ await this._cacheMgr?.setFriendshipRawPayload(event.payload.contactId, event.payload);
901
+ this.emit('friendship', {
902
+ friendshipId: event.payload.contactId,
903
+ type: event.payload.type,
904
+ });
905
+ break;
906
+ }
907
+ case EventType.RoomInvite: {
908
+ const roomInvite = event.payload;
909
+ await this._cacheMgr.setRoomInvitation(messageId, roomInvite);
910
+ this.emit('room-invite', {
911
+ roomInvitationId: messageId,
912
+ });
913
+ break;
914
+ }
915
+ case EventType.RoomJoin: {
916
+ break;
917
+ }
918
+ case EventType.RoomLeave: {
919
+ break;
920
+ }
921
+ case EventType.RoomTopic: {
922
+ break;
923
+ }
924
+ }
925
+ }
926
+ async _refreshContact(wxid, isFriend) {
927
+ const contact = await this._client?.searchContactDetail([wxid]);
928
+ if (contact && !contact.wxid) {
929
+ contact.wxid = wxid;
930
+ await this._updateContactCache({ ...contact, isFriend });
931
+ return contact;
932
+ }
933
+ else if (contact) {
934
+ return contact;
935
+ }
936
+ return undefined;
937
+ }
938
+ async _startPuppetHeart(firstTime = true) {
939
+ if (firstTime && this._heartBeatTimer) {
940
+ return;
941
+ }
942
+ this.emit('heartbeat', { data: 'heartbeat@matrix' });
943
+ this._heartBeatTimer = setTimeout(async () => {
944
+ await this._startPuppetHeart(false);
945
+ return undefined;
946
+ }, 15 * 1000);
947
+ }
948
+ _stopPuppetHeart() {
949
+ if (!this._heartBeatTimer) {
950
+ return;
951
+ }
952
+ clearTimeout(this._heartBeatTimer);
953
+ this._heartBeatTimer = undefined;
954
+ }
955
+ async _getMessageImageFileBox(messageId, messagePayload) {
956
+ const imageInfo = await parseImageMessagePayload(messagePayload);
957
+ if (!imageInfo.file_id) {
958
+ log.error(`Can not get file for message: ${messageId}`);
959
+ }
960
+ const url = await this._client?.downloadImage(imageInfo);
961
+ return FileBox.fromUrl(url);
962
+ }
963
+ async _getMessageAudioFileBox(messageId, messagePayload) {
964
+ const audioInfo = await parseAudioMessagePayload(messagePayload);
965
+ if (!audioInfo.length) {
966
+ log.error(`Can not get file for message: ${messageId}`);
967
+ }
968
+ const url = await this._client?.downloadAudio(messageId, audioInfo);
969
+ return FileBox.fromUrl(url);
970
+ }
971
+ async _getMessageVideoFileBox(messageId, messagePayload) {
972
+ const videoInfo = await parseVideoMessagePayload(messagePayload);
973
+ if (!videoInfo.file_id) {
974
+ log.error(`Can not get file for message: ${messageId}`);
975
+ }
976
+ const url = await this._client?.downloadVideo(videoInfo);
977
+ log.info(PRE, '_getMessageVideoFileBox(): %s', url);
978
+ return FileBox.fromUrl(url);
979
+ }
980
+ async _getMessageFileFileBox(messageId, messagePayload) {
981
+ const appPayload = await parseAppmsgMessagePayload(messagePayload.msg);
982
+ if (!appPayload.appattach?.attachid) {
983
+ log.error(`Can not get file for message: ${messageId}`);
984
+ }
985
+ const appattach = appPayload.appattach;
986
+ const params = {
987
+ aes_key: appattach?.aeskey || '',
988
+ file_id: appattach?.attachid || '',
989
+ file_name: appPayload.title,
990
+ file_size: appattach?.totallen || '',
991
+ };
992
+ const url = await this._client?.downloadFile(params);
993
+ if (!url) {
994
+ log.error(`Can not get file url: ${JSON.stringify(params)}`);
995
+ }
996
+ return FileBox.fromUrl(url, { name: appPayload.title });
997
+ }
998
+ async syncContact() {
999
+ if (!this.currentUserId) {
1000
+ throw new Error('Can not sync contact before login');
1001
+ }
1002
+ log.info('syncContact');
1003
+ await this._client.syncContact();
1004
+ }
1005
+ }
1006
+ export { PuppetMatrix, VERSION };
1007
+ export default PuppetMatrix;