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,1286 @@
1
+ import axios from 'axios';
2
+ import { log } from '@juzi/wechaty-puppet';
3
+ import { EventEmitter } from 'events';
4
+ import WebSocket from 'ws';
5
+ import * as PUPPET from '@juzi/wechaty-puppet';
6
+ import { format, getUnixTime } from 'date-fns';
7
+ import { xmlToJson } from '../utils/xml-to-json.js';
8
+ import { isRoomId } from '../utils/is-type.js';
9
+ const PRE = '[PuppetMatrix]';
10
+ export var NotifyTypeEnum;
11
+ (function (NotifyTypeEnum) {
12
+ NotifyTypeEnum[NotifyTypeEnum["Ready"] = 1001] = "Ready";
13
+ NotifyTypeEnum[NotifyTypeEnum["LoginQRCodeChange"] = 1002] = "LoginQRCodeChange";
14
+ NotifyTypeEnum[NotifyTypeEnum["UserLogin"] = 1003] = "UserLogin";
15
+ NotifyTypeEnum[NotifyTypeEnum["UserLogout"] = 1004] = "UserLogout";
16
+ NotifyTypeEnum[NotifyTypeEnum["InitFinish"] = 1005] = "InitFinish";
17
+ NotifyTypeEnum[NotifyTypeEnum["HeartBeatError"] = 1006] = "HeartBeatError";
18
+ NotifyTypeEnum[NotifyTypeEnum["SessionTimeout"] = 1007] = "SessionTimeout";
19
+ NotifyTypeEnum[NotifyTypeEnum["LoginFailed"] = 1008] = "LoginFailed";
20
+ NotifyTypeEnum[NotifyTypeEnum["ContactSyncFinish"] = 1009] = "ContactSyncFinish";
21
+ NotifyTypeEnum[NotifyTypeEnum["NewMsg"] = 1010] = "NewMsg";
22
+ NotifyTypeEnum[NotifyTypeEnum["ContactInfoChange"] = 1039] = "ContactInfoChange";
23
+ NotifyTypeEnum[NotifyTypeEnum["FriendAdd"] = 1040] = "FriendAdd";
24
+ NotifyTypeEnum[NotifyTypeEnum["FriendDel"] = 1041] = "FriendDel";
25
+ NotifyTypeEnum[NotifyTypeEnum["RoomAdd"] = 1042] = "RoomAdd";
26
+ NotifyTypeEnum[NotifyTypeEnum["RoomQuit"] = 1043] = "RoomQuit";
27
+ NotifyTypeEnum[NotifyTypeEnum["RoomDelMe"] = 1044] = "RoomDelMe";
28
+ NotifyTypeEnum[NotifyTypeEnum["RoomDisband"] = 1045] = "RoomDisband";
29
+ NotifyTypeEnum[NotifyTypeEnum["RoomMemberAdd"] = 1046] = "RoomMemberAdd";
30
+ NotifyTypeEnum[NotifyTypeEnum["RoomMemberUpdate"] = 1047] = "RoomMemberUpdate";
31
+ NotifyTypeEnum[NotifyTypeEnum["RoomMemberDel"] = 1048] = "RoomMemberDel";
32
+ })(NotifyTypeEnum || (NotifyTypeEnum = {}));
33
+ var ContactGender;
34
+ (function (ContactGender) {
35
+ ContactGender[ContactGender["Unknown"] = 0] = "Unknown";
36
+ ContactGender[ContactGender["Male"] = 1] = "Male";
37
+ ContactGender[ContactGender["Female"] = 2] = "Female";
38
+ })(ContactGender || (ContactGender = {}));
39
+ var Status;
40
+ (function (Status) {
41
+ Status["normal"] = "normal";
42
+ Status["offline"] = "offline";
43
+ Status["pending"] = "pending";
44
+ Status["fail"] = "fail";
45
+ })(Status || (Status = {}));
46
+ export var WechatMessageType;
47
+ (function (WechatMessageType) {
48
+ WechatMessageType[WechatMessageType["Text"] = 1] = "Text";
49
+ WechatMessageType[WechatMessageType["Image"] = 3] = "Image";
50
+ WechatMessageType[WechatMessageType["Voice"] = 34] = "Voice";
51
+ WechatMessageType[WechatMessageType["VerifyMsg"] = 37] = "VerifyMsg";
52
+ WechatMessageType[WechatMessageType["PossibleFriendMsg"] = 40] = "PossibleFriendMsg";
53
+ WechatMessageType[WechatMessageType["ShareCard"] = 42] = "ShareCard";
54
+ WechatMessageType[WechatMessageType["Video"] = 43] = "Video";
55
+ WechatMessageType[WechatMessageType["Emoticon"] = 47] = "Emoticon";
56
+ WechatMessageType[WechatMessageType["Location"] = 48] = "Location";
57
+ WechatMessageType[WechatMessageType["App"] = 49] = "App";
58
+ WechatMessageType[WechatMessageType["VoipMsg"] = 50] = "VoipMsg";
59
+ WechatMessageType[WechatMessageType["StatusNotify"] = 51] = "StatusNotify";
60
+ WechatMessageType[WechatMessageType["VoipNotify"] = 52] = "VoipNotify";
61
+ WechatMessageType[WechatMessageType["VoipInvite"] = 53] = "VoipInvite";
62
+ WechatMessageType[WechatMessageType["MicroVideo"] = 62] = "MicroVideo";
63
+ WechatMessageType[WechatMessageType["VerifyMsgEnterprise"] = 65] = "VerifyMsgEnterprise";
64
+ WechatMessageType[WechatMessageType["Transfer"] = 2000] = "Transfer";
65
+ WechatMessageType[WechatMessageType["RedEnvelope"] = 2001] = "RedEnvelope";
66
+ WechatMessageType[WechatMessageType["MiniProgram"] = 2002] = "MiniProgram";
67
+ WechatMessageType[WechatMessageType["GroupInvite"] = 2003] = "GroupInvite";
68
+ WechatMessageType[WechatMessageType["File"] = 2004] = "File";
69
+ WechatMessageType[WechatMessageType["SysNotice"] = 9999] = "SysNotice";
70
+ WechatMessageType[WechatMessageType["Sys"] = 10000] = "Sys";
71
+ WechatMessageType[WechatMessageType["SysTemplate"] = 10002] = "SysTemplate";
72
+ })(WechatMessageType || (WechatMessageType = {}));
73
+ export var FriendshipType;
74
+ (function (FriendshipType) {
75
+ FriendshipType[FriendshipType["Unknown"] = 0] = "Unknown";
76
+ FriendshipType[FriendshipType["Confirm"] = 1] = "Confirm";
77
+ FriendshipType[FriendshipType["Receive"] = 2] = "Receive";
78
+ FriendshipType[FriendshipType["Verify"] = 3] = "Verify";
79
+ FriendshipType[FriendshipType["Delete"] = 4] = "Delete";
80
+ FriendshipType[FriendshipType["Removed"] = 5] = "Removed";
81
+ })(FriendshipType || (FriendshipType = {}));
82
+ async function getAtWxidList(source) {
83
+ if (source) {
84
+ const json = await xmlToJson(source);
85
+ return (json?.msgsource?.atuserlist?.split(',').filter((item) => item)
86
+ || []);
87
+ }
88
+ return [];
89
+ }
90
+ class Client extends EventEmitter {
91
+ options;
92
+ socket;
93
+ server;
94
+ tokenInfo;
95
+ hasEmitLogout;
96
+ emit(event, ...args) {
97
+ return super.emit(event, ...args);
98
+ }
99
+ static async create(options) {
100
+ const client = new Client(options);
101
+ await client.initServer();
102
+ return client;
103
+ }
104
+ constructor(options = {}) {
105
+ super();
106
+ this.options = options;
107
+ this.tokenInfo = null;
108
+ this.socket = null;
109
+ this.hasEmitLogout = false;
110
+ }
111
+ async getTokenInfo() {
112
+ try {
113
+ const res = await axios.get(`https://api-bot.aibotk.com/openapi/v1/token/info?secret=5be06b6f8d42a7&token=${this.options.token}`);
114
+ if (res.data.code === 0) {
115
+ this.tokenInfo = res.data.data;
116
+ return true;
117
+ }
118
+ else {
119
+ log.error('Token auth failed, reason: %s', res.data.message);
120
+ return false;
121
+ }
122
+ }
123
+ catch (e) {
124
+ log.error('error info: %s', e);
125
+ return false;
126
+ }
127
+ }
128
+ async initServer() {
129
+ await this.getTokenInfo();
130
+ if (!this.socket) {
131
+ const ws = new WebSocket(`${this.tokenInfo.endpoint}?guid=${this.tokenInfo.guid}`, { perMessageDeflate: true, maxPayload: 100 * 1024 * 1024 });
132
+ ws.on('message', (data) => {
133
+ log.silly(PRE, 'initWebSocket() ws.on(message): %s', data);
134
+ try {
135
+ const payload = JSON.parse(data);
136
+ log.info(JSON.stringify(payload));
137
+ void this.eventParse(payload);
138
+ }
139
+ catch (e) {
140
+ log.warn(PRE, 'initWebSocket() ws.on(message) exception: %s', e);
141
+ this.emit('error', e.message);
142
+ }
143
+ });
144
+ ws.on('message', () => {
145
+ });
146
+ ws.on('error', (e) => {
147
+ if (e.message.indexOf('ECONNREFUSED') !== -1) {
148
+ }
149
+ else {
150
+ log.verbose(PRE, 'initWebSocket() ws.on(error) %s', e);
151
+ this.emit('error', e);
152
+ }
153
+ });
154
+ ws.on('close', (code, reason) => {
155
+ log.warn(PRE, 'initWebSocket() ws.on(close) code: %s, reason: %s', code, reason);
156
+ });
157
+ await new Promise((resolve, reject) => {
158
+ ws.once('open', () => {
159
+ log.silly(PRE, 'initWebSocket() Promise() ws.on(open)');
160
+ return resolve({});
161
+ });
162
+ ws.once('error', (e) => {
163
+ log.silly(PRE, 'initWebSocket() Promise() ws.on(error) %s', e);
164
+ return reject(e);
165
+ });
166
+ ws.once('close', (e) => {
167
+ log.silly(PRE, 'initWebSocket() Promise() ws.on(close)');
168
+ return reject(e);
169
+ });
170
+ });
171
+ this.socket = ws;
172
+ return;
173
+ }
174
+ if (this.socket) {
175
+ throw new Error('socket had already been opened!');
176
+ }
177
+ }
178
+ async eventParse(eventData) {
179
+ const notifyType = eventData.notify_type;
180
+ const data = eventData.data;
181
+ let robotInfo, msg, contactInfo, atWxidList;
182
+ switch (notifyType) {
183
+ case NotifyTypeEnum.LoginQRCodeChange:
184
+ if (data.authUrl) {
185
+ this.emit('verify-code', {
186
+ ticket: this.getQrcodeTicket(data.authUrl),
187
+ status: PUPPET.types.ScanStatus.Scanned,
188
+ });
189
+ }
190
+ else {
191
+ void this.onQrCodeEvent(data.status, `http://weixin.qq.com/x/${data.uuid}`);
192
+ }
193
+ break;
194
+ case NotifyTypeEnum.UserLogin:
195
+ robotInfo = {
196
+ wxNum: data?.alias,
197
+ wxid: data?.username || '',
198
+ name: data?.nickname || '',
199
+ sex: data?.sex,
200
+ alias: '',
201
+ province: data?.province || '',
202
+ city: data?.city || '',
203
+ country: data?.country || '',
204
+ avatar: data?.big_headimg_url || data?.small_headimg_url || '',
205
+ description: '',
206
+ labelIdlist: '',
207
+ };
208
+ this.emit('login', {
209
+ errorCode: 0,
210
+ errorMessage: 'success',
211
+ wxid: robotInfo.wxid,
212
+ robotInfo,
213
+ });
214
+ break;
215
+ case NotifyTypeEnum.NewMsg:
216
+ if (data.is_chatroom_msg) {
217
+ atWxidList = await getAtWxidList(data.source);
218
+ }
219
+ msg = {
220
+ msg: data.content,
221
+ text: data.content,
222
+ id: data.msg_id,
223
+ atWxidList,
224
+ fromWxid: data.from_username,
225
+ msgType: data.msg_type,
226
+ timeStamp: data.create_time,
227
+ talkerId: !data.is_chatroom_msg
228
+ ? data.from_username
229
+ : data.chatroom_sender,
230
+ listenerId: data.to_username,
231
+ };
232
+ this.emit('message', msg);
233
+ break;
234
+ case NotifyTypeEnum.FriendAdd:
235
+ contactInfo = {
236
+ wxNum: data?.alias,
237
+ wxid: data?.username || '',
238
+ name: data?.nickname || '',
239
+ sex: data?.sex,
240
+ alias: '',
241
+ province: data?.province || '',
242
+ city: data?.city || '',
243
+ country: data?.country || '',
244
+ avatar: data?.big_headimg_url || data?.small_headimg_url || '',
245
+ description: '',
246
+ labelIdlist: data?.labelid_list,
247
+ };
248
+ this.emit('contact', { type: FriendshipType.Confirm, contactInfo });
249
+ break;
250
+ case NotifyTypeEnum.ContactInfoChange:
251
+ contactInfo = {
252
+ wxNum: data?.alias,
253
+ wxid: data?.username || '',
254
+ name: data?.nickname || '',
255
+ sex: data?.sex,
256
+ alias: '',
257
+ province: data?.province || '',
258
+ city: data?.city || '',
259
+ country: data?.country || '',
260
+ avatar: data?.big_headimg_url || data?.small_headimg_url || '',
261
+ description: '',
262
+ labelIdlist: data?.labelid_list,
263
+ };
264
+ this.emit('update-contacts', [contactInfo]);
265
+ break;
266
+ case NotifyTypeEnum.UserLogout:
267
+ this.emit('logout', data.errmsg);
268
+ break;
269
+ case NotifyTypeEnum.RoomMemberAdd:
270
+ this.emit('room-join', {
271
+ roomId: data.room_username,
272
+ inviterId: data.member_list[0]?.invite_username,
273
+ joinIds: data.member_list.map((item) => item.username),
274
+ joinUsers: data.member_list.map((data) => ({
275
+ wxNum: data?.alias,
276
+ wxid: data?.username || '',
277
+ name: data?.nickname || '',
278
+ sex: data?.sex,
279
+ alias: '',
280
+ province: data?.province || '',
281
+ city: data?.city || '',
282
+ country: data?.country || '',
283
+ avatar: data?.big_headimg_url || data?.small_headimg_url || '',
284
+ description: '',
285
+ labelIdlist: data?.labelid_list,
286
+ })),
287
+ });
288
+ break;
289
+ case NotifyTypeEnum.RoomMemberDel:
290
+ this.emit('room-leave', {
291
+ roomId: data.room_username,
292
+ leaveIds: data.member_list.map((item) => item.username),
293
+ });
294
+ break;
295
+ default:
296
+ log.info('other data', JSON.stringify(data));
297
+ }
298
+ }
299
+ getQrcodeTicket(authurl) {
300
+ if (!authurl || !authurl.startsWith('http'))
301
+ return '';
302
+ const url = new URL(authurl);
303
+ const searchParams = new URLSearchParams(url.search.slice(1));
304
+ return searchParams.get('ticket') || '';
305
+ }
306
+ async onQrCodeEvent(status, url) {
307
+ const ScanStatusName = {
308
+ [PUPPET.types.ScanStatus.Unknown]: 'Unknown',
309
+ [PUPPET.types.ScanStatus.Cancel]: 'Cancel',
310
+ [PUPPET.types.ScanStatus.Waiting]: 'Waiting',
311
+ [PUPPET.types.ScanStatus.Scanned]: 'Scanned',
312
+ [PUPPET.types.ScanStatus.Confirmed]: 'Confirmed',
313
+ [PUPPET.types.ScanStatus.Timeout]: 'Timeout',
314
+ };
315
+ let scanStatus = PUPPET.types.ScanStatus.Unknown;
316
+ let qrUrl = '';
317
+ switch (status) {
318
+ case 0:
319
+ scanStatus = PUPPET.types.ScanStatus.Waiting;
320
+ qrUrl = url;
321
+ break;
322
+ case 1:
323
+ scanStatus = PUPPET.types.ScanStatus.Scanned;
324
+ break;
325
+ case 2:
326
+ scanStatus = PUPPET.types.ScanStatus.Confirmed;
327
+ break;
328
+ case 3:
329
+ scanStatus = PUPPET.types.ScanStatus.Cancel;
330
+ break;
331
+ case 4:
332
+ scanStatus = PUPPET.types.ScanStatus.Timeout;
333
+ break;
334
+ }
335
+ log.silly(PRE, `scan event, status: ${ScanStatusName[scanStatus]}${url ? ', with qrcode: ' + url : ''}`);
336
+ this.emit('scan', {
337
+ qrcode: qrUrl,
338
+ status: scanStatus,
339
+ });
340
+ }
341
+ setEmitLogout(val) {
342
+ this.hasEmitLogout = val;
343
+ if (val) {
344
+ let time = setTimeout(() => {
345
+ this.hasEmitLogout = false;
346
+ clearTimeout(time);
347
+ time = null;
348
+ }, 10000);
349
+ }
350
+ }
351
+ async postData(data) {
352
+ const config = {
353
+ data: {
354
+ guid: this.tokenInfo.guid,
355
+ ...data.data,
356
+ },
357
+ headers: {
358
+ 'Content-Type': 'application/json',
359
+ },
360
+ method: 'POST',
361
+ url: this.tokenInfo.httpServer + data.path,
362
+ timeout: 600000,
363
+ };
364
+ const res = await axios(config);
365
+ if (res.data?.errcode === -102) {
366
+ log.warn('request error: %s', res.data?.errmsg);
367
+ if (!this.hasEmitLogout) {
368
+ this.setEmitLogout(true);
369
+ this.emit('logout', res.data?.errmsg);
370
+ }
371
+ return {};
372
+ }
373
+ return res.data;
374
+ }
375
+ async getStats() {
376
+ const res = await this.postData({
377
+ path: '/client/get_client_status',
378
+ data: {},
379
+ });
380
+ const { errcode, data } = res;
381
+ if (!errcode) {
382
+ return {
383
+ status: data.status === 1
384
+ ? Status.pending
385
+ : data.status === 2
386
+ ? Status.normal
387
+ : Status.offline,
388
+ };
389
+ }
390
+ else {
391
+ return { status: Status.fail };
392
+ }
393
+ }
394
+ async getQrcode() {
395
+ try {
396
+ const res = await this.postData({
397
+ path: '/login/get_login_qrcode',
398
+ data: {},
399
+ });
400
+ if (res?.qrcode) {
401
+ return {
402
+ base64: `data:image/jpeg;base64,${res?.qrcode?.buffer}`,
403
+ qrcodeUrl: `http://weixin.qq.com/x/${res?.uuid}`,
404
+ uuid: res?.uuid,
405
+ expiredTime: res?.expiredTime,
406
+ };
407
+ }
408
+ log.info(PRE, 'getQrcode error:', res?.errmsg);
409
+ return null;
410
+ }
411
+ catch (e) {
412
+ log.error(PRE, 'getQrcode(): %s', e);
413
+ return null;
414
+ }
415
+ }
416
+ async getQrcodeStatus() {
417
+ try {
418
+ const res = await this.postData({
419
+ path: '/login/check_login_qrcode',
420
+ data: {},
421
+ });
422
+ if (res?.uuid) {
423
+ return res;
424
+ }
425
+ log.info(PRE, 'getQrcodeStatus error:', res?.errmsg);
426
+ return {
427
+ status: 4,
428
+ };
429
+ }
430
+ catch (e) {
431
+ log.error(PRE, 'getQrcodeStatus(): %s', e);
432
+ return {
433
+ status: 4,
434
+ };
435
+ }
436
+ }
437
+ async verifyLoginUrl(ticket, pin) {
438
+ try {
439
+ const res = await this.postData({
440
+ path: '/login/verify_login_url',
441
+ data: {
442
+ ticket,
443
+ pin,
444
+ },
445
+ });
446
+ log.info(PRE, 'verifyLoginUrl', res);
447
+ }
448
+ catch (e) {
449
+ log.error(PRE, 'verifyLoginUrl(): %s', e);
450
+ }
451
+ }
452
+ async pushLoginNotify() {
453
+ await this.postData({
454
+ path: '/login/push_login_url',
455
+ data: {},
456
+ });
457
+ }
458
+ async getSelfInfo() {
459
+ try {
460
+ const res = await this.postData({ path: '/user/get_profile', data: {} });
461
+ if (res.errcode === -102) {
462
+ log.info(PRE, 'offline login:', res?.errmsg);
463
+ return false;
464
+ }
465
+ else if (res.userInfo) {
466
+ const contact = res?.userInfo;
467
+ const contactMore = res?.userInfoExt;
468
+ return {
469
+ wxNum: contact.alias,
470
+ wxid: contact?.userName?.string || '',
471
+ name: contact?.nickName?.string || '',
472
+ sex: contact?.sex,
473
+ alias: contact?.remark?.string || '',
474
+ province: contact?.province || '',
475
+ city: contact?.city || '',
476
+ country: contact?.country || '',
477
+ avatar: contactMore?.bigHeadImgUrl || contactMore?.smallHeadImgUrl || '',
478
+ description: contact?.description,
479
+ labelIdlist: contact?.labelIdlist,
480
+ };
481
+ }
482
+ log.info(PRE, 'get self info error:(%s)', res?.errmsg);
483
+ return false;
484
+ }
485
+ catch (e) {
486
+ log.error(PRE, 'getSelfInfo(): %s', e);
487
+ return false;
488
+ }
489
+ }
490
+ async getUserQrcode() {
491
+ try {
492
+ const res = await this.postData({
493
+ path: '/user/get_qrcode',
494
+ data: {},
495
+ });
496
+ return res.qrcodeUrl;
497
+ }
498
+ catch (e) {
499
+ log.error(PRE, 'getUserQrcode(): %s', e);
500
+ return '';
501
+ }
502
+ }
503
+ async logout() {
504
+ try {
505
+ await this.postData({
506
+ path: '/user/logout',
507
+ data: {},
508
+ });
509
+ }
510
+ catch (e) {
511
+ log.error(PRE, 'logout(): %s', e);
512
+ }
513
+ }
514
+ async searchContact(contactIds) {
515
+ if (!contactIds.length)
516
+ return;
517
+ try {
518
+ const res = await this.postData({
519
+ path: '/contact/batch_get_contact_brief_info',
520
+ data: {
521
+ username_list: contactIds,
522
+ },
523
+ });
524
+ if (res.contactList?.length === 1) {
525
+ const contactInfo = res.contactList?.length
526
+ ? res.contactList[0]
527
+ : undefined;
528
+ if (contactInfo) {
529
+ const contact = contactInfo.contact;
530
+ return {
531
+ wxNum: contact.alias,
532
+ wxid: contact?.userName?.string || '',
533
+ name: contact?.nickName?.string || '',
534
+ sex: contact?.sex,
535
+ alias: contact?.remark?.string || '',
536
+ province: contact?.province || '',
537
+ city: contact?.city || '',
538
+ country: contact?.country || '',
539
+ avatar: contact?.bigHeadImgUrl || contact?.smallHeadImgUrl || '',
540
+ description: contact?.description,
541
+ labelIdlist: contact?.labelIdlist,
542
+ };
543
+ }
544
+ return undefined;
545
+ }
546
+ else {
547
+ const contacts = res.contactList?.map((contactInfo) => {
548
+ const contact = contactInfo.contact;
549
+ return {
550
+ wxNum: contact.alias,
551
+ wxid: contact?.userName?.string || '',
552
+ name: contact?.nickName?.string || '',
553
+ sex: contact?.sex,
554
+ alias: contact?.remark?.string || '',
555
+ province: contact?.province || '',
556
+ city: contact?.city || '',
557
+ country: contact?.country || '',
558
+ avatar: contact?.bigHeadImgUrl || contact?.smallHeadImgUrl || '',
559
+ description: contact?.description,
560
+ labelIdlist: contact?.labelIdlist,
561
+ };
562
+ }) || [];
563
+ return contacts;
564
+ }
565
+ }
566
+ catch (e) {
567
+ log.error(PRE, 'searchContact(%s): %s', contactIds, e);
568
+ return undefined;
569
+ }
570
+ }
571
+ async searchContactDetail(contactIds, roomId) {
572
+ if (!contactIds.length && !roomId)
573
+ return undefined;
574
+ try {
575
+ const data = {};
576
+ if (contactIds.length) {
577
+ data['username_list'] = contactIds;
578
+ }
579
+ if (roomId) {
580
+ data['room_username'] = roomId;
581
+ }
582
+ const res = await this.postData({
583
+ path: '/contact/get_contact',
584
+ data,
585
+ });
586
+ if (res.contactList?.length === 1) {
587
+ const contactInfo = res.contactList.length
588
+ ? res.contactList[0]
589
+ : undefined;
590
+ if (contactInfo) {
591
+ const contact = contactInfo.contact || {};
592
+ return {
593
+ wxNum: contact?.alias,
594
+ wxid: contact?.userName?.string,
595
+ name: contact?.nickName?.string || '',
596
+ sex: contact?.sex || 0,
597
+ alias: contact?.remark?.string || '',
598
+ province: contact?.province || '',
599
+ city: contact?.city || '',
600
+ country: contact?.country || '',
601
+ avatar: contact?.bigHeadImgUrl || contact?.smallHeadImgUrl || '',
602
+ description: contact?.description,
603
+ labelIdlist: contact?.labelIdlist,
604
+ scene: contact?.addContactScene,
605
+ sign: contact?.signature,
606
+ snsBgImg: contact?.snsUserInfo?.snsBgimgId,
607
+ };
608
+ }
609
+ return undefined;
610
+ }
611
+ else {
612
+ return res.contactList?.map((contactInfo) => {
613
+ const contact = contactInfo.contact || {};
614
+ return {
615
+ wxNum: contact?.alias,
616
+ wxid: contact?.userName?.string,
617
+ name: contact?.nickName?.string || '',
618
+ sex: contact?.sex || 0,
619
+ alias: contact?.remark?.string || '',
620
+ province: contact?.province || '',
621
+ city: contact?.city || '',
622
+ country: contact?.country || '',
623
+ avatar: contact?.bigHeadImgUrl || contact?.smallHeadImgUrl || '',
624
+ description: contact?.description,
625
+ labelIdlist: contact?.labelIdlist,
626
+ scene: contact?.addContactScene,
627
+ sign: contact?.signature,
628
+ snsBgImg: contact?.snsUserInfo?.snsBgimgId,
629
+ };
630
+ });
631
+ }
632
+ }
633
+ catch (e) {
634
+ log.error(PRE, 'searchContactDetail(%s, %s): %s', contactIds, roomId, e);
635
+ return undefined;
636
+ }
637
+ }
638
+ async syncContact() {
639
+ try {
640
+ const res = await this.postData({
641
+ path: '/contact/init_contact',
642
+ data: {
643
+ contact_seq: 0,
644
+ room_seq: 0,
645
+ },
646
+ });
647
+ const contactUsernameList = res.contactUsernameList || [];
648
+ const contactsInfo = (await this.searchContact(contactUsernameList));
649
+ this.emit('update-contacts', contactsInfo || []);
650
+ }
651
+ catch (e) {
652
+ log.error(PRE, 'syncContact(): %s', e);
653
+ }
654
+ }
655
+ async getContactList(page = 1, pageSize = 100) {
656
+ try {
657
+ const res = await this.postData({
658
+ path: '/contact/get_friends',
659
+ data: {
660
+ page_num: page,
661
+ page_size: pageSize,
662
+ },
663
+ });
664
+ const totalPage = res.total_page || 1;
665
+ const contactList = res.contact_list
666
+ .filter((item) => item.username)
667
+ .map((contact) => {
668
+ return {
669
+ isFriend: true,
670
+ wxNum: contact?.alias,
671
+ wxid: contact?.username,
672
+ name: contact?.nickname || '',
673
+ sex: contact?.sex,
674
+ alias: contact?.remark || '',
675
+ province: contact?.province || '',
676
+ city: contact?.city || '',
677
+ country: contact?.country || '',
678
+ avatar: contact?.big_headimg_url || contact?.small_headimg_url || '',
679
+ labelIdlist: contact?.labelIdlist,
680
+ };
681
+ });
682
+ this.emit('update-contacts', contactList);
683
+ if (page < totalPage) {
684
+ await this.getContactList(page + 1, pageSize);
685
+ }
686
+ }
687
+ catch (e) {
688
+ log.error(PRE, 'getContactList(): %s', e);
689
+ }
690
+ }
691
+ async getGroupList(page = 1, pageSize = 100) {
692
+ try {
693
+ const res = await this.postData({
694
+ path: '/room/get_chatrooms',
695
+ data: {
696
+ page_num: page,
697
+ page_size: pageSize,
698
+ },
699
+ });
700
+ const totalPage = res.total_page || 1;
701
+ const groupList = res.room_list
702
+ .filter((item) => item.username)
703
+ .map((item) => {
704
+ return {
705
+ wxid: item.username,
706
+ announcement: item?.announcement,
707
+ ownerId: item?.creator,
708
+ name: item?.nickname,
709
+ avatar: item?.headimg_url,
710
+ memberNum: item?.total_member,
711
+ chatroommemberList: [],
712
+ };
713
+ });
714
+ if (groupList.length > 0) {
715
+ this.emit('update-contacts', groupList);
716
+ }
717
+ if (parseInt(page.toString()) < parseInt(totalPage.toString())) {
718
+ await this.getGroupList(parseInt(page.toString()) + 1, pageSize);
719
+ }
720
+ }
721
+ catch (e) {
722
+ log.error(PRE, 'getGroupList(): %s', e);
723
+ }
724
+ }
725
+ async getGroupMembersDetail(roomId) {
726
+ try {
727
+ const res = await this.postData({
728
+ path: '/room/get_chatroom_member_detail',
729
+ data: {
730
+ room_username: roomId,
731
+ version: 0,
732
+ },
733
+ });
734
+ const memeberIdList = res?.allMemberUserNameList.map((item) => item.string) || [];
735
+ const allMemberCount = res.allMemberCount;
736
+ const ownerId = res.chatRoomOwner;
737
+ const adminIdList = res?.adminUserNameList.map((item) => item.string) || [];
738
+ const memberList = res?.newChatroomData?.chatRoomMember
739
+ .filter((item) => item.username)
740
+ .map((item) => ({
741
+ wxid: item.username,
742
+ groupNick: item?.nickname,
743
+ avatarMinUrl: item?.smallHeadImgUrl,
744
+ avatarMaxUrl: item?.bigHeadImgUrl,
745
+ avatar: item?.bigHeadImgUrl || item?.smallHeadImgUrl,
746
+ inviterUserName: item?.inviterUserName,
747
+ }));
748
+ return {
749
+ memeberIdList,
750
+ allMemberCount,
751
+ ownerId,
752
+ adminIdList,
753
+ memberList,
754
+ };
755
+ }
756
+ catch (e) {
757
+ log.error(PRE, 'getGroupMembers(%s): %s', roomId, e);
758
+ return [];
759
+ }
760
+ }
761
+ async getGroupMembers(roomId, page = 1, pageSize = 100) {
762
+ try {
763
+ const res = await this.postData({
764
+ path: '/room/get_chatroom_members',
765
+ data: {
766
+ room_username: roomId,
767
+ page_num: page,
768
+ page_size: pageSize,
769
+ },
770
+ });
771
+ const totalPage = res.total_page || 1;
772
+ const memberList = res.room_list
773
+ .filter((item) => item.username)
774
+ .map((item) => ({
775
+ wxid: item.username,
776
+ groupNick: item?.nickname,
777
+ avatarMinUrl: item?.small_headimg_url,
778
+ avatarMaxUrl: item?.big_headimg_url,
779
+ avatar: item?.big_headimg_url || item?.small_headimg_url,
780
+ inviterUserName: item?.invite_username,
781
+ country: item?.country,
782
+ province: item?.province,
783
+ city: item?.city,
784
+ displayName: item?.display_name,
785
+ sex: item?.sex,
786
+ wxNum: item?.alias,
787
+ alias: item?.remark,
788
+ }));
789
+ if (page < totalPage) {
790
+ const nextPageContacts = await this.getGroupMembers(roomId, page + 1, pageSize);
791
+ return memberList.concat(nextPageContacts);
792
+ }
793
+ else {
794
+ return memberList;
795
+ }
796
+ }
797
+ catch (e) {
798
+ log.error(PRE, 'getGroupMembers(%s): %s', roomId, e);
799
+ return [];
800
+ }
801
+ }
802
+ async getOfficeList(page = 1, pageSize = 100) {
803
+ try {
804
+ const res = await this.postData({
805
+ path: '/contact/get_publics',
806
+ data: {
807
+ page_num: page,
808
+ page_size: pageSize,
809
+ },
810
+ });
811
+ const totalPage = res.total_page || 1;
812
+ const officeList = res.contact_list
813
+ .filter((item) => item.username)
814
+ .map((contact) => {
815
+ return {
816
+ wxNum: contact?.alias,
817
+ wxid: contact?.username,
818
+ name: contact?.nickname || '',
819
+ sex: contact?.sex,
820
+ alias: contact?.remark || '',
821
+ province: contact?.province || '',
822
+ city: contact?.city || '',
823
+ country: contact?.country || '',
824
+ avatar: contact?.big_headimg_url || contact?.small_headimg_url || '',
825
+ labelIdlist: contact?.labelIdlist,
826
+ };
827
+ });
828
+ this.emit('update-contacts', officeList);
829
+ if (page < totalPage) {
830
+ await this.getOfficeList(page + 1, pageSize);
831
+ }
832
+ }
833
+ catch (e) {
834
+ log.error(PRE, 'getOfficeList(): %s', e);
835
+ }
836
+ }
837
+ async sendText(contactId, msg, selfId) {
838
+ try {
839
+ const res = await this.postData({
840
+ path: '/msg/send_text',
841
+ data: {
842
+ to_username: contactId,
843
+ content: msg,
844
+ },
845
+ });
846
+ return {
847
+ id: res?.list?.[0].newMsgId || '',
848
+ timeStamp: res?.list?.[0].createTime || '',
849
+ msgType: res?.list?.[0].type || '',
850
+ talkerId: selfId || '',
851
+ text: msg,
852
+ msg,
853
+ fromWxid: isRoomId(contactId) ? contactId : '',
854
+ listenerId: contactId,
855
+ };
856
+ }
857
+ catch (e) {
858
+ log.error(PRE, 'sendText(%s, %s, %s): %s', contactId, msg, e);
859
+ }
860
+ }
861
+ async sendAtText(contactId, msg, atList, selfId) {
862
+ try {
863
+ const res = await this.postData({
864
+ path: '/msg/send_room_at',
865
+ data: {
866
+ to_username: contactId,
867
+ content: msg,
868
+ at_list: atList,
869
+ },
870
+ });
871
+ return {
872
+ id: res?.list?.[0].newMsgId || '',
873
+ timeStamp: res?.list?.[0].createTime || '',
874
+ msgType: res?.list?.[0].type || '',
875
+ talkerId: selfId || '',
876
+ text: msg,
877
+ msg,
878
+ fromWxid: isRoomId(contactId) ? contactId : '',
879
+ listenerId: contactId,
880
+ };
881
+ }
882
+ catch (e) {
883
+ log.error(PRE, 'sendText(%s, %s, %s): %s', contactId, msg, atList, e);
884
+ }
885
+ }
886
+ async uploadFile(url, type) {
887
+ return await this.postData({
888
+ path: '/cloud/cdn_upload',
889
+ data: {
890
+ file_type: type,
891
+ url,
892
+ },
893
+ });
894
+ }
895
+ async downloadImage(imageInfo) {
896
+ const params = {
897
+ file_type: 2,
898
+ file_id: imageInfo.file_id,
899
+ aes_key: imageInfo.aes_key,
900
+ file_size: imageInfo.file_size,
901
+ file_name: `/微信图片_${format(new Date(), 'yyyyMMddHHmmss')}.png`,
902
+ };
903
+ const res = await this.postData({
904
+ path: '/cloud/cdn_download',
905
+ data: params,
906
+ });
907
+ return encodeURI(res.url) || '';
908
+ }
909
+ async downloadFile(imageInfo) {
910
+ const params = {
911
+ file_type: 5,
912
+ file_id: imageInfo.file_id.replace('@cdn_', ''),
913
+ aes_key: imageInfo.aes_key,
914
+ file_size: imageInfo.file_size,
915
+ file_name: '/' + imageInfo.file_name,
916
+ };
917
+ const res = await this.postData({
918
+ path: '/cloud/cdn_download',
919
+ data: params,
920
+ });
921
+ return encodeURI(res.url) || '';
922
+ }
923
+ async downloadAudio(msgId, voiceInfo, roomId) {
924
+ const params = {
925
+ msg_id: msgId,
926
+ length: voiceInfo.length,
927
+ room_username: roomId,
928
+ file_name: '/voice.mp3',
929
+ to_mp3: true,
930
+ };
931
+ const res = await this.postData({
932
+ path: '/cloud/download_voice',
933
+ data: params,
934
+ });
935
+ return encodeURI(res.url) || '';
936
+ }
937
+ async downloadVideo(videoInfo) {
938
+ const params = {
939
+ file_type: 4,
940
+ file_id: videoInfo.file_id,
941
+ aes_key: videoInfo.aes_key,
942
+ file_size: videoInfo.file_size,
943
+ file_name: `/微信视频_${format(new Date(), 'yyyyMMddHHmmss')}.mp4`,
944
+ };
945
+ const res = await this.postData({
946
+ path: '/cloud/cdn_download',
947
+ data: params,
948
+ });
949
+ return encodeURI(res.url) || '';
950
+ }
951
+ async sendUrlImg(contactId, url, selfId) {
952
+ try {
953
+ const fileInfo = await this.uploadFile(url, 2);
954
+ const res = await this.postData({
955
+ path: '/msg/send_image',
956
+ data: {
957
+ to_username: contactId,
958
+ file_id: fileInfo.file_id,
959
+ aes_key: fileInfo.aes_key,
960
+ file_size: fileInfo.file_size,
961
+ big_file_size: 0,
962
+ thumb_file_size: fileInfo.thumb_file_size,
963
+ file_md5: fileInfo.md5,
964
+ thumb_width: fileInfo.thumb_width,
965
+ thumb_height: fileInfo.thumb_height,
966
+ file_crc: fileInfo.file_crc,
967
+ },
968
+ });
969
+ return {
970
+ id: res?.newMsgId || '',
971
+ timeStamp: res?.createTime || '',
972
+ msgType: WechatMessageType.Image,
973
+ talkerId: selfId || '',
974
+ text: url,
975
+ msg: url,
976
+ fromWxid: isRoomId(contactId) ? contactId : '',
977
+ listenerId: contactId,
978
+ };
979
+ }
980
+ catch (e) {
981
+ log.error(PRE, 'sendUrlImg(%s, %s): %s', contactId, url, e);
982
+ }
983
+ }
984
+ async sendVideo(contactId, url, selfId) {
985
+ try {
986
+ const fileInfo = await this.uploadFile(url, 4);
987
+ const res = await this.postData({
988
+ path: '/msg/send_video',
989
+ data: {
990
+ to_username: contactId,
991
+ file_id: fileInfo.file_id,
992
+ aes_key: fileInfo.aes_key,
993
+ file_size: fileInfo.file_size,
994
+ thumb_file_size: fileInfo.thumb_file_size,
995
+ file_md5: fileInfo.md5,
996
+ thumb_file_md5: fileInfo.thumb_file_md5,
997
+ video_duration: fileInfo.video_duration,
998
+ file_crc: fileInfo.file_crc,
999
+ mp4_identify: fileInfo.mp4_identify,
1000
+ },
1001
+ });
1002
+ return {
1003
+ id: res?.newMsgId || '',
1004
+ timeStamp: res?.createTime || getUnixTime(new Date()),
1005
+ msgType: WechatMessageType.Image,
1006
+ talkerId: selfId || '',
1007
+ text: url,
1008
+ msg: url,
1009
+ fromWxid: isRoomId(contactId) ? contactId : '',
1010
+ listenerId: contactId,
1011
+ };
1012
+ }
1013
+ catch (error) {
1014
+ log.error(PRE, 'sendVideo(%s, %s): %s', contactId, url, error);
1015
+ }
1016
+ }
1017
+ async sendCloudFile(contactId, url, selfId) {
1018
+ try {
1019
+ const fileInfo = await this.uploadFile(url, 5);
1020
+ const res = await this.postData({
1021
+ path: '/msg/send_file',
1022
+ data: {
1023
+ to_username: contactId,
1024
+ file_id: fileInfo.file_id,
1025
+ aes_key: fileInfo.aes_key,
1026
+ file_size: fileInfo.file_size,
1027
+ file_md5: fileInfo.md5,
1028
+ file_name: fileInfo.name,
1029
+ file_key: fileInfo.file_key,
1030
+ },
1031
+ });
1032
+ return {
1033
+ id: res?.newMsgId || '',
1034
+ timeStamp: res?.createTime || '',
1035
+ msgType: WechatMessageType.App,
1036
+ talkerId: selfId || '',
1037
+ text: url,
1038
+ msg: url,
1039
+ fromWxid: isRoomId(contactId) ? contactId : '',
1040
+ listenerId: contactId,
1041
+ };
1042
+ }
1043
+ catch (error) {
1044
+ log.error(PRE, 'sendCloudFile(%s, %s): %s', contactId, url, error);
1045
+ }
1046
+ }
1047
+ async sendShareCard({ contactId, title, content, jumpUrl, imageUrl, }, selfId) {
1048
+ try {
1049
+ const res = await this.postData({
1050
+ path: '/msg/send_link_card',
1051
+ data: {
1052
+ to_username: contactId,
1053
+ title,
1054
+ desc: content,
1055
+ url: jumpUrl,
1056
+ image_url: imageUrl,
1057
+ },
1058
+ });
1059
+ return {
1060
+ id: res?.newMsgId || '',
1061
+ timeStamp: res?.createTime || '',
1062
+ msgType: WechatMessageType.Text,
1063
+ talkerId: selfId || '',
1064
+ text: jumpUrl,
1065
+ msg: jumpUrl,
1066
+ fromWxid: isRoomId(contactId) ? contactId : '',
1067
+ listenerId: contactId,
1068
+ };
1069
+ }
1070
+ catch (e) {
1071
+ log.error('error info', e);
1072
+ }
1073
+ }
1074
+ async sendMiniProgram({ appid, contactId, title, content, pagePath, username, thumbUrl, iconUrl, }, selfId) {
1075
+ try {
1076
+ const fileInfo = await this.uploadFile(thumbUrl, 2);
1077
+ const res = await this.postData({
1078
+ path: '/msg/send_mini_app',
1079
+ data: {
1080
+ to_username: contactId,
1081
+ appid,
1082
+ username: username && username.endsWith('@app')
1083
+ ? username
1084
+ : username + '@app',
1085
+ title: content,
1086
+ appname: title,
1087
+ page_path: pagePath,
1088
+ appicon: iconUrl,
1089
+ file_id: fileInfo.file_id,
1090
+ aes_key: fileInfo.aes_key,
1091
+ file_size: fileInfo.file_size,
1092
+ file_md5: fileInfo.md5,
1093
+ },
1094
+ });
1095
+ return {
1096
+ id: res?.newMsgId || '',
1097
+ timeStamp: res?.createTime || '',
1098
+ msgType: WechatMessageType.MiniProgram,
1099
+ talkerId: selfId || '',
1100
+ text: appid + '_' + username,
1101
+ msg: appid + '_' + username,
1102
+ fromWxid: isRoomId(contactId) ? contactId : '',
1103
+ listenerId: contactId,
1104
+ };
1105
+ }
1106
+ catch (error) {
1107
+ log.error(PRE, 'sendMiniProgram(%s, %s): %s', contactId, username, error);
1108
+ }
1109
+ }
1110
+ async sendXml(contactId, xml, selfId) {
1111
+ try {
1112
+ const res = await this.postData({
1113
+ path: '/msg/send_app_msg',
1114
+ data: {
1115
+ to_username: contactId,
1116
+ app_type: 0,
1117
+ appid: '',
1118
+ xml,
1119
+ },
1120
+ });
1121
+ return {
1122
+ id: res?.newMsgId || '',
1123
+ timeStamp: res?.createTime || '',
1124
+ msgType: WechatMessageType.App,
1125
+ talkerId: selfId || '',
1126
+ text: xml,
1127
+ msg: xml,
1128
+ fromWxid: isRoomId(contactId) ? contactId : '',
1129
+ listenerId: contactId,
1130
+ };
1131
+ }
1132
+ catch (error) {
1133
+ log.error(PRE, 'sendXml(%s, %s): %s', contactId, xml, error);
1134
+ }
1135
+ }
1136
+ async confirmFriendship(contactId, scene, ticket) {
1137
+ const res = await this.postData({
1138
+ path: '/contact/verify_friend',
1139
+ data: {
1140
+ username: contactId,
1141
+ scene: (scene && scene.toString()) || 6,
1142
+ ticket,
1143
+ opcode: 3,
1144
+ },
1145
+ });
1146
+ return res;
1147
+ }
1148
+ async addFriendByWxid({ scene, wxid, content, ticket, }) {
1149
+ await this.postData({
1150
+ path: '/contact/add_friend',
1151
+ data: {
1152
+ scene,
1153
+ username: wxid,
1154
+ verify_content: content,
1155
+ ticket,
1156
+ },
1157
+ });
1158
+ }
1159
+ async searchStranger(content) {
1160
+ const contact = await this.postData({
1161
+ path: '/contact/search_contact',
1162
+ data: {
1163
+ username: content,
1164
+ from_scene: 0,
1165
+ search_scene: 0,
1166
+ },
1167
+ });
1168
+ return {
1169
+ wxNum: contact?.alias || '',
1170
+ wxid: contact?.userName?.string,
1171
+ isFriend: contact?.userName?.string.includes('@stranger')
1172
+ && contact?.userName?.string.includes('v3_')
1173
+ ? 0
1174
+ : 1,
1175
+ name: contact?.nickName?.string || '',
1176
+ sex: contact?.sex,
1177
+ alias: contact?.remark?.string || '',
1178
+ province: contact?.province || '',
1179
+ city: contact?.city || '',
1180
+ country: contact?.country || '',
1181
+ avatar: contact?.bigHeadImgUrl || contact?.smallHeadImgUrl || '',
1182
+ description: contact?.description,
1183
+ labelIdlist: contact?.labelIdlist,
1184
+ scene: contact?.addContactScene,
1185
+ sign: contact?.signature,
1186
+ snsBgImg: contact?.snsUserInfo?.snsBgimgId,
1187
+ ticket: contact?.antispamTicket,
1188
+ };
1189
+ }
1190
+ async inviteToGroup(groupId, contactId, type = 1) {
1191
+ if (type === 1) {
1192
+ await this.postData({
1193
+ path: '/room/add_chatroom_member',
1194
+ data: {
1195
+ room_username: groupId,
1196
+ username_list: [contactId],
1197
+ },
1198
+ });
1199
+ }
1200
+ else {
1201
+ await this.postData({
1202
+ path: '/room/invite_chatroom_member',
1203
+ data: {
1204
+ room_username: groupId,
1205
+ username_list: [contactId],
1206
+ },
1207
+ });
1208
+ }
1209
+ }
1210
+ async removeContact(contactId) {
1211
+ await this.postData({
1212
+ path: '/contact/del_friend',
1213
+ data: {
1214
+ username: contactId,
1215
+ },
1216
+ });
1217
+ }
1218
+ async setContactAlias(contactId, remark) {
1219
+ await this.postData({
1220
+ path: '/contact/modify_remark',
1221
+ data: {
1222
+ username: contactId,
1223
+ remark,
1224
+ },
1225
+ });
1226
+ }
1227
+ async setGroupName(groupId, name) {
1228
+ await this.postData({
1229
+ path: '/room/modify_chatroom_name',
1230
+ data: {
1231
+ room_username: groupId,
1232
+ name,
1233
+ },
1234
+ });
1235
+ }
1236
+ async roomQuit(roomId) {
1237
+ await this.postData({
1238
+ path: '/room/quit_chatroom',
1239
+ data: {
1240
+ room_username: roomId,
1241
+ },
1242
+ });
1243
+ }
1244
+ async sendContactCard(contactId, xml, selfId) {
1245
+ try {
1246
+ const res = await this.postData({
1247
+ path: '/msg/send_share_card_raw',
1248
+ data: {
1249
+ to_username: contactId,
1250
+ xml,
1251
+ },
1252
+ });
1253
+ return {
1254
+ id: res?.newMsgId || '',
1255
+ timeStamp: res?.createTime || '',
1256
+ msgType: WechatMessageType.App,
1257
+ talkerId: selfId || '',
1258
+ text: xml,
1259
+ msg: xml,
1260
+ fromWxid: isRoomId(contactId) ? contactId : '',
1261
+ listenerId: contactId,
1262
+ };
1263
+ }
1264
+ catch (error) {
1265
+ log.error(PRE, 'sendContactCard(%s, %s): %s', contactId, xml, error);
1266
+ }
1267
+ }
1268
+ async sendAnnouncement(roomId, content) {
1269
+ try {
1270
+ const res = await this.postData({
1271
+ path: '/room/set_chatroom_announcement',
1272
+ data: {
1273
+ room_username: roomId,
1274
+ announcement: content,
1275
+ },
1276
+ });
1277
+ if (res.baseResponse.ret) {
1278
+ log.error('sendAnnouncement error: %s', JSON.stringify(res.baseResponse));
1279
+ }
1280
+ }
1281
+ catch (error) {
1282
+ log.error(PRE, 'sendAnnouncement(%s, %s): %s', roomId, content, error);
1283
+ }
1284
+ }
1285
+ }
1286
+ export default Client;