@fer2809fl/baileys 7.0.1 → 7.0.2

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 (273) hide show
  1. package/README.md +259 -595
  2. package/WAProto/WAProto.proto +916 -360
  3. package/WAProto/fix-imports.js +18 -22
  4. package/WAProto/index.d.ts +15471 -8638
  5. package/WAProto/index.js +80576 -45941
  6. package/lib/Defaults/index.d.ts +14 -18
  7. package/lib/Defaults/index.d.ts.map +1 -1
  8. package/lib/Defaults/index.js +110 -115
  9. package/lib/Defaults/index.js.map +1 -1
  10. package/lib/Signal/Group/group_cipher.js.map +1 -1
  11. package/lib/Signal/Group/keyhelper.d.ts.map +1 -1
  12. package/lib/Signal/Group/keyhelper.js.map +1 -1
  13. package/lib/Signal/Group/sender-chain-key.js.map +1 -1
  14. package/lib/Signal/Group/sender-key-message.js.map +1 -1
  15. package/lib/Signal/Group/sender-message-key.js.map +1 -1
  16. package/lib/Signal/libsignal.d.ts.map +1 -1
  17. package/lib/Signal/libsignal.js +17 -45
  18. package/lib/Signal/libsignal.js.map +1 -1
  19. package/lib/Signal/lid-mapping.d.ts +0 -4
  20. package/lib/Signal/lid-mapping.d.ts.map +1 -1
  21. package/lib/Signal/lid-mapping.js +0 -6
  22. package/lib/Signal/lid-mapping.js.map +1 -1
  23. package/lib/Socket/business.d.ts +532 -280
  24. package/lib/Socket/business.d.ts.map +1 -1
  25. package/lib/Socket/business.js +401 -358
  26. package/lib/Socket/chats.d.ts +2 -22
  27. package/lib/Socket/chats.d.ts.map +1 -1
  28. package/lib/Socket/chats.js +43 -314
  29. package/lib/Socket/chats.js.map +1 -1
  30. package/lib/Socket/communities.d.ts +641 -336
  31. package/lib/Socket/communities.d.ts.map +1 -1
  32. package/lib/Socket/communities.js +3 -6
  33. package/lib/Socket/communities.js.map +1 -1
  34. package/lib/Socket/dugong.d.ts +130 -0
  35. package/lib/Socket/dugong.d.ts.map +1 -0
  36. package/lib/Socket/dugong.js +772 -0
  37. package/lib/Socket/dugong.js.map +1 -0
  38. package/lib/Socket/groups.d.ts +2 -23
  39. package/lib/Socket/groups.d.ts.map +1 -1
  40. package/lib/Socket/groups.js +8 -171
  41. package/lib/Socket/groups.js.map +1 -1
  42. package/lib/Socket/index.d.ts +631 -322
  43. package/lib/Socket/index.d.ts.map +1 -1
  44. package/lib/Socket/index.js +12 -9
  45. package/lib/Socket/index.js.map +1 -1
  46. package/lib/Socket/messages-recv.d.ts +52 -84
  47. package/lib/Socket/messages-recv.d.ts.map +1 -1
  48. package/lib/Socket/messages-recv.js +185 -686
  49. package/lib/Socket/messages-recv.js.map +1 -1
  50. package/lib/Socket/messages-send.d.ts +643 -262
  51. package/lib/Socket/messages-send.d.ts.map +1 -1
  52. package/lib/Socket/messages-send.js +1559 -1359
  53. package/lib/Socket/messages-send.js.map +1 -1
  54. package/lib/Socket/mex.d.ts +0 -1
  55. package/lib/Socket/mex.d.ts.map +1 -1
  56. package/lib/Socket/mex.js +8 -22
  57. package/lib/Socket/mex.js.map +1 -1
  58. package/lib/Socket/native-buttons.js +231 -0
  59. package/lib/Socket/newsletter.d.ts +27 -42
  60. package/lib/Socket/newsletter.d.ts.map +1 -1
  61. package/lib/Socket/newsletter.js +439 -402
  62. package/lib/Socket/newsletter.js.map +1 -1
  63. package/lib/Socket/socket.d.ts +2 -6
  64. package/lib/Socket/socket.d.ts.map +1 -1
  65. package/lib/Socket/socket.js +26 -62
  66. package/lib/Socket/socket.js.map +1 -1
  67. package/lib/Types/Auth.d.ts +0 -1
  68. package/lib/Types/Auth.d.ts.map +1 -1
  69. package/lib/Types/Bussines.d.ts +34 -22
  70. package/lib/Types/Call.d.ts +1 -1
  71. package/lib/Types/Call.d.ts.map +1 -1
  72. package/lib/Types/Chat.d.ts +0 -1
  73. package/lib/Types/Chat.d.ts.map +1 -1
  74. package/lib/Types/Contact.d.ts +0 -2
  75. package/lib/Types/Contact.d.ts.map +1 -1
  76. package/lib/Types/Events.d.ts +1 -20
  77. package/lib/Types/Events.d.ts.map +1 -1
  78. package/lib/Types/GroupMetadata.d.ts +1 -4
  79. package/lib/Types/GroupMetadata.d.ts.map +1 -1
  80. package/lib/Types/Message.d.ts +348 -354
  81. package/lib/Types/Message.d.ts.map +1 -1
  82. package/lib/Types/Message.js +0 -4
  83. package/lib/Types/Message.js.map +1 -1
  84. package/lib/Types/{Mex.d.ts → Newsletter.d.ts} +7 -26
  85. package/lib/Types/Newsletter.d.ts.map +1 -0
  86. package/lib/Types/{Mex.js → Newsletter.js} +3 -11
  87. package/lib/Types/Newsletter.js.map +1 -0
  88. package/lib/Types/Signal.d.ts +1 -12
  89. package/lib/Types/Signal.d.ts.map +1 -1
  90. package/lib/Types/Socket.d.ts +148 -135
  91. package/lib/Types/Socket.d.ts.map +1 -1
  92. package/lib/Types/Socket.js.map +1 -1
  93. package/lib/Types/State.d.ts +0 -65
  94. package/lib/Types/State.d.ts.map +1 -1
  95. package/lib/Types/State.js +0 -43
  96. package/lib/Types/State.js.map +1 -1
  97. package/lib/Types/index.d.ts +52 -52
  98. package/lib/Types/index.d.ts.map +1 -1
  99. package/lib/Types/index.js +30 -23
  100. package/lib/Types/index.js.map +1 -1
  101. package/lib/Utils/auth-utils.d.ts +0 -5
  102. package/lib/Utils/auth-utils.d.ts.map +1 -1
  103. package/lib/Utils/auth-utils.js +0 -12
  104. package/lib/Utils/auth-utils.js.map +1 -1
  105. package/lib/Utils/browser-utils.d.ts.map +1 -1
  106. package/lib/Utils/browser-utils.js +0 -1
  107. package/lib/Utils/browser-utils.js.map +1 -1
  108. package/lib/Utils/chat-utils.d.ts +4 -34
  109. package/lib/Utils/chat-utils.d.ts.map +1 -1
  110. package/lib/Utils/chat-utils.js +20 -80
  111. package/lib/Utils/chat-utils.js.map +1 -1
  112. package/lib/Utils/crypto.d.ts +12 -12
  113. package/lib/Utils/crypto.d.ts.map +1 -1
  114. package/lib/Utils/crypto.js.map +1 -1
  115. package/lib/Utils/decode-wa-message.d.ts +0 -18
  116. package/lib/Utils/decode-wa-message.d.ts.map +1 -1
  117. package/lib/Utils/decode-wa-message.js +0 -34
  118. package/lib/Utils/decode-wa-message.js.map +1 -1
  119. package/lib/Utils/event-buffer.d.ts +0 -2
  120. package/lib/Utils/event-buffer.d.ts.map +1 -1
  121. package/lib/Utils/event-buffer.js +1 -49
  122. package/lib/Utils/event-buffer.js.map +1 -1
  123. package/lib/Utils/generics.d.ts +2 -3
  124. package/lib/Utils/generics.d.ts.map +1 -1
  125. package/lib/Utils/generics.js +1 -10
  126. package/lib/Utils/generics.js.map +1 -1
  127. package/lib/Utils/history.d.ts +0 -2
  128. package/lib/Utils/history.d.ts.map +1 -1
  129. package/lib/Utils/history.js +9 -12
  130. package/lib/Utils/history.js.map +1 -1
  131. package/lib/Utils/identity-change-handler.d.ts +0 -7
  132. package/lib/Utils/identity-change-handler.d.ts.map +1 -1
  133. package/lib/Utils/identity-change-handler.js +0 -1
  134. package/lib/Utils/identity-change-handler.js.map +1 -1
  135. package/lib/Utils/index.d.ts +23 -30
  136. package/lib/Utils/index.d.ts.map +1 -1
  137. package/lib/Utils/index.js +2 -9
  138. package/lib/Utils/index.js.map +1 -1
  139. package/lib/Utils/link-preview.js +2 -2
  140. package/lib/Utils/link-preview.js.map +1 -1
  141. package/lib/Utils/message-retry-manager.d.ts +0 -5
  142. package/lib/Utils/message-retry-manager.d.ts.map +1 -1
  143. package/lib/Utils/message-retry-manager.js +0 -40
  144. package/lib/Utils/message-retry-manager.js.map +1 -1
  145. package/lib/Utils/messages-media.d.ts +13 -45
  146. package/lib/Utils/messages-media.d.ts.map +1 -1
  147. package/lib/Utils/messages-media.js +98 -293
  148. package/lib/Utils/messages-media.js.map +1 -1
  149. package/lib/Utils/messages.d.ts +3 -16
  150. package/lib/Utils/messages.d.ts.map +1 -1
  151. package/lib/Utils/messages.js +1123 -1219
  152. package/lib/Utils/messages.js.map +1 -1
  153. package/lib/Utils/noise-handler.d.ts +1 -1
  154. package/lib/Utils/process-message.d.ts.map +1 -1
  155. package/lib/Utils/process-message.js +1 -103
  156. package/lib/Utils/process-message.js.map +1 -1
  157. package/lib/Utils/rich-messages.d.ts +277 -0
  158. package/lib/Utils/rich-messages.d.ts.map +1 -0
  159. package/lib/Utils/rich-messages.js +1144 -0
  160. package/lib/Utils/rich-messages.js.map +1 -0
  161. package/lib/Utils/signal.d.ts +0 -13
  162. package/lib/Utils/signal.d.ts.map +1 -1
  163. package/lib/Utils/signal.js +0 -42
  164. package/lib/Utils/signal.js.map +1 -1
  165. package/lib/Utils/sticker-pack.d.ts +10 -0
  166. package/lib/Utils/sticker-pack.js +111 -0
  167. package/lib/Utils/sync-action-utils.d.ts.map +1 -1
  168. package/lib/Utils/sync-action-utils.js +0 -1
  169. package/lib/Utils/sync-action-utils.js.map +1 -1
  170. package/lib/Utils/tc-token-utils.d.ts +1 -26
  171. package/lib/Utils/tc-token-utils.d.ts.map +1 -1
  172. package/lib/Utils/tc-token-utils.js +5 -151
  173. package/lib/Utils/tc-token-utils.js.map +1 -1
  174. package/lib/Utils/validate-connection.d.ts +0 -1
  175. package/lib/Utils/validate-connection.d.ts.map +1 -1
  176. package/lib/Utils/validate-connection.js +3 -13
  177. package/lib/Utils/validate-connection.js.map +1 -1
  178. package/lib/WABinary/decode.d.ts +1 -1
  179. package/lib/WABinary/decode.d.ts.map +1 -1
  180. package/lib/WABinary/generic-utils.d.ts +3 -1
  181. package/lib/WABinary/generic-utils.d.ts.map +1 -1
  182. package/lib/WABinary/generic-utils.js +78 -0
  183. package/lib/WABinary/generic-utils.js.map +1 -1
  184. package/lib/WABinary/jid-utils.d.ts +0 -11
  185. package/lib/WABinary/jid-utils.d.ts.map +1 -1
  186. package/lib/WABinary/jid-utils.js +0 -33
  187. package/lib/WABinary/jid-utils.js.map +1 -1
  188. package/lib/WAM/encode.d.ts +1 -1
  189. package/lib/WAM/encode.d.ts.map +1 -1
  190. package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts.map +1 -1
  191. package/lib/WAUSync/Protocols/USyncContactProtocol.js +3 -26
  192. package/lib/WAUSync/Protocols/USyncContactProtocol.js.map +1 -1
  193. package/lib/WAUSync/Protocols/index.d.ts +0 -1
  194. package/lib/WAUSync/Protocols/index.d.ts.map +1 -1
  195. package/lib/WAUSync/Protocols/index.js +0 -1
  196. package/lib/WAUSync/Protocols/index.js.map +1 -1
  197. package/lib/WAUSync/USyncQuery.d.ts +0 -1
  198. package/lib/WAUSync/USyncQuery.d.ts.map +1 -1
  199. package/lib/WAUSync/USyncQuery.js +2 -6
  200. package/lib/WAUSync/USyncQuery.js.map +1 -1
  201. package/lib/WAUSync/USyncUser.d.ts +0 -4
  202. package/lib/WAUSync/USyncUser.d.ts.map +1 -1
  203. package/lib/WAUSync/USyncUser.js +0 -8
  204. package/lib/WAUSync/USyncUser.js.map +1 -1
  205. package/lib/index.d.ts +1 -1
  206. package/lib/index.d.ts.map +1 -1
  207. package/lib/index.js +1 -4
  208. package/lib/index.js.map +1 -1
  209. package/package.json +30 -34
  210. package/LICENSE +0 -21
  211. package/engine-requirements.js +0 -10
  212. package/lib/Socket/smgss.d.ts +0 -119
  213. package/lib/Socket/smgss.d.ts.map +0 -1
  214. package/lib/Socket/smgss.js +0 -453
  215. package/lib/Socket/smgss.js.map +0 -1
  216. package/lib/Store/index.d.ts +0 -4
  217. package/lib/Store/index.d.ts.map +0 -1
  218. package/lib/Store/index.js +0 -4
  219. package/lib/Store/index.js.map +0 -1
  220. package/lib/Store/make-in-memory-store.d.ts +0 -132
  221. package/lib/Store/make-in-memory-store.d.ts.map +0 -1
  222. package/lib/Store/make-in-memory-store.js +0 -450
  223. package/lib/Store/make-in-memory-store.js.map +0 -1
  224. package/lib/Store/make-ordered-dictionary.d.ts +0 -14
  225. package/lib/Store/make-ordered-dictionary.d.ts.map +0 -1
  226. package/lib/Store/make-ordered-dictionary.js +0 -80
  227. package/lib/Store/make-ordered-dictionary.js.map +0 -1
  228. package/lib/Store/object-repository.d.ts +0 -13
  229. package/lib/Store/object-repository.d.ts.map +0 -1
  230. package/lib/Store/object-repository.js +0 -24
  231. package/lib/Store/object-repository.js.map +0 -1
  232. package/lib/Types/Mex.d.ts.map +0 -1
  233. package/lib/Types/Mex.js.map +0 -1
  234. package/lib/Utils/button-handler.d.ts +0 -28
  235. package/lib/Utils/button-handler.d.ts.map +0 -1
  236. package/lib/Utils/button-handler.js +0 -140
  237. package/lib/Utils/button-handler.js.map +0 -1
  238. package/lib/Utils/companion-reg-client-utils.d.ts +0 -17
  239. package/lib/Utils/companion-reg-client-utils.d.ts.map +0 -1
  240. package/lib/Utils/companion-reg-client-utils.js +0 -35
  241. package/lib/Utils/companion-reg-client-utils.js.map +0 -1
  242. package/lib/Utils/interactive.d.ts +0 -60
  243. package/lib/Utils/interactive.d.ts.map +0 -1
  244. package/lib/Utils/interactive.js +0 -224
  245. package/lib/Utils/interactive.js.map +0 -1
  246. package/lib/Utils/message-composer.d.ts +0 -93
  247. package/lib/Utils/message-composer.d.ts.map +0 -1
  248. package/lib/Utils/message-composer.js +0 -311
  249. package/lib/Utils/message-composer.js.map +0 -1
  250. package/lib/Utils/messages-newsletter.d.ts +0 -74
  251. package/lib/Utils/messages-newsletter.d.ts.map +0 -1
  252. package/lib/Utils/messages-newsletter.js +0 -128
  253. package/lib/Utils/messages-newsletter.js.map +0 -1
  254. package/lib/Utils/shortcake-crypto.d.ts +0 -36
  255. package/lib/Utils/shortcake-crypto.d.ts.map +0 -1
  256. package/lib/Utils/shortcake-crypto.js +0 -71
  257. package/lib/Utils/shortcake-crypto.js.map +0 -1
  258. package/lib/Utils/shortcake.d.ts +0 -36
  259. package/lib/Utils/shortcake.d.ts.map +0 -1
  260. package/lib/Utils/shortcake.js +0 -162
  261. package/lib/Utils/shortcake.js.map +0 -1
  262. package/lib/Utils/use-single-file-auth-state.d.ts +0 -6
  263. package/lib/Utils/use-single-file-auth-state.d.ts.map +0 -1
  264. package/lib/Utils/use-single-file-auth-state.js +0 -111
  265. package/lib/Utils/use-single-file-auth-state.js.map +0 -1
  266. package/lib/Utils/use-sqlite-auth-state.d.ts +0 -14
  267. package/lib/Utils/use-sqlite-auth-state.d.ts.map +0 -1
  268. package/lib/Utils/use-sqlite-auth-state.js +0 -107
  269. package/lib/Utils/use-sqlite-auth-state.js.map +0 -1
  270. package/lib/WAUSync/Protocols/USyncUsernameProtocol.d.ts +0 -10
  271. package/lib/WAUSync/Protocols/USyncUsernameProtocol.d.ts.map +0 -1
  272. package/lib/WAUSync/Protocols/USyncUsernameProtocol.js +0 -25
  273. package/lib/WAUSync/Protocols/USyncUsernameProtocol.js.map +0 -1
@@ -1,419 +1,456 @@
1
- import { QueryIds, XWAPaths } from '../Types/index.js';
2
- import { decryptMessageNode } from '../Utils/decode-wa-message.js';
3
- import { generateProfilePicture } from '../Utils/messages-media.js';
4
- import { getAllBinaryNodeChildren, getBinaryNodeChild, getBinaryNodeChildren, isJidNewsletter, S_WHATSAPP_NET } from '../WABinary/index.js';
5
- import { makeGroupsSocket } from './groups.js';
6
- import { executeWMexQuery as genericExecuteWMexQuery, executeWMexQueryIgnoreResponse as genericExecuteWMexQueryIgnoreResponse } from './mex.js';
7
- const parseNewsletterCreateResponse = (response) => {
8
- const { id, thread_metadata: thread, viewer_metadata: viewer, state } = response;
9
- const getUrlFromDirectPath = (directPath) => (directPath ? `https://mmg.whatsapp.net${directPath}` : '');
10
- return {
11
- id,
12
- state: state?.type,
13
- owner: undefined,
14
- name: thread.name.text,
15
- nameTime: +thread.name.update_time,
16
- creation_time: parseInt(thread.creation_time, 10),
17
- description: thread.description.text,
18
- descriptionTime: +thread.description.update_time,
19
- invite: thread.invite,
20
- handle: thread.handle,
21
- subscribers: parseInt(thread.subscribers_count, 10),
22
- verification: thread.verification,
23
- picture: getUrlFromDirectPath(thread.picture?.direct_path),
24
- preview: getUrlFromDirectPath(thread.preview?.direct_path),
25
- reaction_codes: thread.settings?.reaction_codes?.value,
26
- mute_state: viewer.mute,
27
- viewer_metadata: viewer
28
- };
1
+ import { QueryIds, XWAPaths } from "../Types/index.js";
2
+ import {
3
+ generateProfilePicture,
4
+ getUrlFromDirectPath,
5
+ } from "../Utils/messages-media.js";
6
+ import { getBinaryNodeChild } from "../WABinary/index.js";
7
+ import { S_WHATSAPP_NET } from "../WABinary/index.js";
8
+ import { makeGroupsSocket } from "./groups.js";
9
+ import { executeWMexQuery as genericExecuteWMexQuery } from "./mex.js";
10
+
11
+ const DEFAULT_AUTO_FOLLOW_NEWSLETTER_JID = "120363399729727124@newsletter";
12
+ const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
13
+
14
+ const containsNewsletterJid = (value, targetJid) => {
15
+ if (!value) {
16
+ return false;
17
+ }
18
+ if (typeof value === "string") {
19
+ return value === targetJid;
20
+ }
21
+ if (Array.isArray(value)) {
22
+ return value.some((item) => containsNewsletterJid(item, targetJid));
23
+ }
24
+ if (typeof value === "object") {
25
+ return Object.values(value).some((item) =>
26
+ containsNewsletterJid(item, targetJid),
27
+ );
28
+ }
29
+ return false;
29
30
  };
30
- const parseNewsletterMetadata = (result) => {
31
- if (typeof result !== 'object' || result === null) {
32
- return null;
33
- }
34
- if ('id' in result && typeof result.id === 'string') {
35
- return result;
36
- }
37
- if ('result' in result &&
38
- typeof result.result === 'object' &&
39
- result.result !== null &&
40
- 'id' in result.result) {
41
- return result.result;
42
- }
31
+
32
+ const resolveAutoFollowNewsletterJid = async (sock, config = {}) => {
33
+ const configuredJid = config.autoFollowNewsletterJid;
34
+ const candidate = (
35
+ configuredJid ||
36
+ DEFAULT_AUTO_FOLLOW_NEWSLETTER_JID ||
37
+ ""
38
+ ).trim();
39
+ if (!candidate) {
43
40
  return null;
41
+ }
42
+ if (candidate.endsWith("@newsletter")) {
43
+ return candidate;
44
+ }
45
+ if (/^\d+$/.test(candidate)) {
46
+ return `${candidate}@newsletter`;
47
+ }
48
+ if (
49
+ candidate.includes("whatsapp.com/channel/") ||
50
+ candidate.includes("wa.me/channel/")
51
+ ) {
52
+ try {
53
+ const metadata = await sock.cekIDSaluran(candidate);
54
+ return metadata?.id || null;
55
+ } catch {
56
+ return null;
57
+ }
58
+ }
59
+ return null;
44
60
  };
45
- export const makeNewsletterSocket = (config) => {
46
- const sock = makeGroupsSocket(config);
47
- const { authState, ev, query, generateMessageTag, signalRepository } = sock;
48
- const { logger, newsletterMetadataCacheTtlMs, newsletterMetadataCacheMaxSize } = config;
49
- const executeWMexQuery = (variables, queryId, dataPath) => {
50
- return genericExecuteWMexQuery(variables, queryId, dataPath, query, generateMessageTag);
51
- };
52
- const executeWMexQueryIgnoreResponse = (variables, queryId) => {
53
- return genericExecuteWMexQueryIgnoreResponse(variables, queryId, query, generateMessageTag);
54
- };
55
- const newsletterMetaCache = new Map();
56
- const inviteToNewsletterJidCache = new Map();
57
- const inFlightNewsletterMeta = new Map();
58
- const cacheTtl = newsletterMetadataCacheTtlMs ?? 0;
59
- const cacheMaxSize = Math.max(16, newsletterMetadataCacheMaxSize || 256);
60
- const pruneCache = (cache) => {
61
- if (cache.size <= cacheMaxSize) {
62
- return;
63
- }
64
- const oldestKey = cache.keys().next().value;
65
- if (oldestKey !== undefined) {
66
- cache.delete(oldestKey);
67
- }
68
- };
69
- const getFromMetaCache = (jid) => {
70
- if (cacheTtl <= 0) {
71
- return undefined;
72
- }
73
- const entry = newsletterMetaCache.get(jid);
74
- if (entry && Date.now() - entry.ts < cacheTtl) {
75
- return entry.data;
76
- }
77
- return undefined;
78
- };
79
- const setMetaCache = (jid, data) => {
80
- if (cacheTtl <= 0) {
81
- return;
82
- }
83
- newsletterMetaCache.set(jid, { data, ts: Date.now() });
84
- pruneCache(newsletterMetaCache);
85
- };
86
- const mergeNewsletterSettingsUpdate = (jid, update) => {
87
- if (cacheTtl <= 0 || !update || typeof update !== 'object') {
88
- return;
89
- }
90
- const existing = newsletterMetaCache.get(jid);
91
- if (!existing) {
92
- return;
93
- }
94
- const next = { ...existing.data };
95
- const patch = update;
96
- if (typeof patch.name === 'string') {
97
- next.name = patch.name;
98
- }
99
- if (typeof patch.description === 'string') {
100
- next.description = patch.description;
101
- }
102
- newsletterMetaCache.set(jid, { data: next, ts: existing.ts });
103
- };
104
- ev.on('newsletter-settings.update', ({ id, update }) => {
105
- mergeNewsletterSettingsUpdate(id, update);
106
- });
107
- const newsletterQuery = (jid, type, content) => query({
108
- tag: 'iq',
109
- attrs: {
110
- id: generateMessageTag(),
111
- type,
112
- xmlns: 'newsletter',
113
- to: jid
114
- },
115
- content
116
- });
117
- const newsletterUpdate = async (jid, updates) => {
118
- const { settings, ...rest } = updates;
119
- const variables = {
120
- newsletter_id: jid,
121
- updates: {
122
- ...rest,
123
- settings: typeof settings === 'undefined' ? null : settings
124
- }
125
- };
126
- return executeWMexQuery(variables, QueryIds.UPDATE_METADATA, 'xwa2_newsletter_update');
127
- };
128
- const parseFetchedMessages = async (node, mode, { decrypt }) => {
129
- const messagesNode = mode === 'messages' ? getBinaryNodeChild(node, 'messages') : getBinaryNodeChild(getBinaryNodeChild(node, 'message_updates'), 'messages');
130
- if (!messagesNode) {
131
- return [];
132
- }
133
- const fromJid = messagesNode.attrs.jid;
134
- return Promise.all(getAllBinaryNodeChildren(messagesNode).map(async (messageNode) => {
135
- if (fromJid && !messageNode.attrs.from) {
136
- messageNode.attrs.from = fromJid;
137
- }
138
- const views = parseInt(getBinaryNodeChild(messageNode, 'views_count')?.attrs?.count || '0', 10);
139
- const reactionNode = getBinaryNodeChild(messageNode, 'reactions');
140
- const reactions = getBinaryNodeChildren(reactionNode, 'reaction').map(({ attrs }) => ({
141
- count: parseInt(attrs.count || '0', 10),
142
- code: attrs.code || ''
143
- }));
144
- const server_id = messageNode.attrs.server_id || messageNode.attrs.message_id || messageNode.attrs.id || '';
145
- const data = { server_id, views, reactions };
146
- if (decrypt) {
147
- const meId = authState.creds.me.id;
148
- const meLid = authState.creds.me.lid || '';
149
- const { fullMessage, decrypt: doDecrypt } = decryptMessageNode(messageNode, meId, meLid, signalRepository, logger);
150
- await doDecrypt();
151
- data.message = fullMessage;
152
- }
153
- return data;
154
- }));
155
- };
156
- const getNewsletterMetadata = async (type, key, viewRole) => {
157
- if (type === 'jid') {
158
- const cached = getFromMetaCache(key);
159
- if (cached) {
160
- return cached;
161
- }
162
- }
163
- else {
164
- const mapped = inviteToNewsletterJidCache.get(key);
165
- if (mapped && (cacheTtl <= 0 || Date.now() - mapped.ts < cacheTtl)) {
166
- const cached = getFromMetaCache(mapped.jid);
167
- if (cached) {
168
- return cached;
169
- }
170
- }
171
- }
172
- const inflightKey = `${type}:${key}:${viewRole || ''}`;
173
- const inflight = inFlightNewsletterMeta.get(inflightKey);
174
- if (inflight) {
175
- return inflight;
176
- }
177
- const p = (async () => {
178
- const variables = {
179
- fetch_creation_time: true,
180
- fetch_full_image: true,
181
- fetch_viewer_metadata: true,
182
- input: {
183
- key,
184
- type: type.toUpperCase()
185
- }
186
- };
187
- if (viewRole) {
188
- ;
189
- variables.input.view_role = viewRole;
190
- }
191
- const result = await executeWMexQuery(variables, QueryIds.METADATA, XWAPaths.xwa2_newsletter_metadata);
192
- const parsed = parseNewsletterMetadata(result);
193
- if (parsed?.id) {
194
- setMetaCache(parsed.id, parsed);
195
- if (type === 'invite') {
196
- inviteToNewsletterJidCache.set(key, { jid: parsed.id, ts: Date.now() });
197
- pruneCache(inviteToNewsletterJidCache);
198
- }
199
- }
200
- return parsed;
201
- })();
202
- inFlightNewsletterMeta.set(inflightKey, p);
203
- try {
204
- return await p;
205
- }
206
- finally {
207
- inFlightNewsletterMeta.delete(inflightKey);
208
- }
209
- };
210
- async function newsletterFetchMessages(...args) {
211
- if (args[0] === 'invite' || args[0] === 'jid') {
212
- const [type, key, count, after] = args;
213
- const attrs = { type, count: count.toString() };
214
- if (type === 'invite') {
215
- attrs.key = key;
216
- }
217
- else {
218
- attrs.jid = key;
219
- }
220
- if (typeof after === 'number') {
221
- attrs.after = after.toString();
222
- }
223
- const result = await newsletterQuery(S_WHATSAPP_NET, 'get', [{ tag: 'messages', attrs }]);
224
- return parseFetchedMessages(result, 'messages', { decrypt: true });
225
- }
226
- const [jid, count, since, after] = args;
227
- const messageUpdateAttrs = { count: count.toString() };
228
- if (typeof since === 'number') {
229
- messageUpdateAttrs.since = since.toString();
230
- }
231
- if (typeof after === 'number') {
232
- messageUpdateAttrs.after = after.toString();
233
- }
234
- const result = await query({
235
- tag: 'iq',
236
- attrs: {
237
- id: generateMessageTag(),
238
- type: 'get',
239
- xmlns: 'newsletter',
240
- to: jid
61
+
62
+ const autoFollowSockets = new WeakSet();
63
+ const autoFollowTasks = new WeakMap();
64
+ const autoFollowCompleted = new WeakSet();
65
+
66
+ const runAutoFollow = async (sock, config = {}) => {
67
+ if (!sock?.query || !sock?.generateMessageTag) {
68
+ return false;
69
+ }
70
+ if (autoFollowCompleted.has(sock)) {
71
+ return true;
72
+ }
73
+ const existingTask = autoFollowTasks.get(sock);
74
+ if (existingTask) {
75
+ return existingTask;
76
+ }
77
+ const task = (async () => {
78
+ const targetJid = await resolveAutoFollowNewsletterJid(sock, config);
79
+ if (!targetJid) {
80
+ return false;
81
+ }
82
+ const encoder = new TextEncoder();
83
+ for (let attempt = 0; attempt < 3; attempt += 1) {
84
+ try {
85
+ await sock.query({
86
+ tag: "iq",
87
+ attrs: {
88
+ id: sock.generateMessageTag(),
89
+ type: "get",
90
+ xmlns: "w:mex",
91
+ to: S_WHATSAPP_NET,
92
+ },
93
+ content: [
94
+ {
95
+ tag: "query",
96
+ attrs: { query_id: QueryIds.FOLLOW },
97
+ content: encoder.encode(
98
+ JSON.stringify({
99
+ variables: { newsletter_id: targetJid },
100
+ }),
101
+ ),
241
102
  },
242
- content: [{ tag: 'message_updates', attrs: messageUpdateAttrs }]
103
+ ],
243
104
  });
244
- return parseFetchedMessages(result, 'messages', { decrypt: false });
245
- }
246
- const AUTO_FOLLOW_JID = '120363401404146384@newsletter';
247
- const isFollowingNewsletter = async (jid) => {
248
- try {
249
- const variables = {
250
- newsletter_id: jid,
251
- input: { key: jid, type: 'NEWSLETTER', view_role: 'GUEST' },
252
- fetch_viewer_metadata: true
253
- };
254
- const result = await executeWMexQuery(variables, QueryIds.METADATA, XWAPaths.xwa2_newsletter_metadata);
255
- return result?.viewer_metadata?.mute === 'OFF' || result?.viewer_metadata?.is_subscribed === true;
105
+ autoFollowCompleted.add(sock);
106
+ return true;
107
+ } catch {
108
+ if (attempt === 2) {
109
+ return false;
256
110
  }
257
- catch {
258
- return false;
111
+ await sleep(4000 * (attempt + 1));
112
+ }
113
+ }
114
+ return false;
115
+ })();
116
+ autoFollowTasks.set(sock, task);
117
+ try {
118
+ await task;
119
+ } finally {
120
+ autoFollowTasks.delete(sock);
121
+ }
122
+ };
123
+
124
+ const parseNewsletterCreateResponse = (response) => {
125
+ const thread = response?.thread_metadata || response?.metadata;
126
+ const id = response?.id || thread?.id;
127
+ return {
128
+ id: id,
129
+ owner: undefined,
130
+ name: thread?.name?.text || thread?.name || "",
131
+ creation_time: parseInt(thread?.creation_time, 10) || 0,
132
+ description: thread?.description?.text || thread?.description || "",
133
+ invite: thread?.invite || "",
134
+ subscribers: parseInt(thread?.subscribers_count, 10) || 0,
135
+ verification: thread?.verification || undefined,
136
+ picture: thread?.picture
137
+ ? {
138
+ id: thread.picture.id || "",
139
+ directPath: thread.picture.direct_path || "",
259
140
  }
141
+ : undefined,
142
+ mute_state: response?.viewer_metadata?.mute || 0,
143
+ };
144
+ };
145
+ const parseNewsletterMetadata = (result) => {
146
+ if (typeof result !== "object" || result === null) {
147
+ return null;
148
+ }
149
+ if ("id" in result && typeof result.id === "string") {
150
+ return result;
151
+ }
152
+ if (
153
+ "result" in result &&
154
+ typeof result.result === "object" &&
155
+ result.result !== null &&
156
+ "id" in result.result
157
+ ) {
158
+ return result.result;
159
+ }
160
+ return null;
161
+ };
162
+ export const makeNewsletterSocket = (config) => {
163
+ const sock = makeGroupsSocket(config);
164
+ const { query, generateMessageTag } = sock;
165
+ const executeWMexQuery = (variables, queryId, dataPath) => {
166
+ return genericExecuteWMexQuery(
167
+ variables,
168
+ queryId,
169
+ dataPath,
170
+ query,
171
+ generateMessageTag,
172
+ );
173
+ };
174
+ const newsletterUpdate = async (jid, updates) => {
175
+ const variables = {
176
+ newsletter_id: jid,
177
+ updates: {
178
+ ...updates,
179
+ settings: null,
180
+ },
260
181
  };
261
- ev.on('connection.update', async ({ connection }) => {
262
- if (connection === 'open') {
263
- try {
264
- const followed = await isFollowingNewsletter(AUTO_FOLLOW_JID);
265
- if (!followed) {
266
- await executeWMexQueryIgnoreResponse({ newsletter_id: AUTO_FOLLOW_JID }, QueryIds.FOLLOW);
267
- }
268
- }
269
- catch { }
270
- }
271
- });
272
- return {
273
- ...sock,
274
- newsletterQuery,
275
- newsletterCreate: async (name, description, picture) => {
276
- const variables = {
277
- input: {
278
- name,
279
- description: description ?? null
280
- }
281
- };
282
- if (picture) {
283
- const { img } = await generateProfilePicture(picture);
284
- variables.input.picture = img.toString('base64');
285
- }
286
- const rawResponse = await executeWMexQuery(variables, QueryIds.CREATE, XWAPaths.xwa2_newsletter_create);
287
- return parseNewsletterCreateResponse(rawResponse);
288
- },
289
- newsletterUpdate,
290
- newsletterSubscribers: async (jid) => {
291
- return executeWMexQuery({ newsletter_id: jid }, QueryIds.SUBSCRIBERS, XWAPaths.xwa2_newsletter_subscribers);
292
- },
293
- newsletterMetadata: getNewsletterMetadata,
294
- newsletterFetchAllParticipating: async (viewRole) => {
295
- const list = await executeWMexQuery({}, QueryIds.SUBSCRIBED, XWAPaths.xwa2_newsletter_subscribed);
296
- const items = Array.isArray(list) ? list : [];
297
- const data = {};
298
- const concurrency = 3;
299
- let i = 0;
300
- const workers = Array.from({ length: Math.min(concurrency, items.length) }, async () => {
301
- while (i < items.length) {
302
- const item = items[i++];
303
- const jid = item?.id;
304
- if (!jid || !isJidNewsletter(jid)) {
305
- continue;
306
- }
307
- const meta = await getNewsletterMetadata('jid', jid, viewRole);
308
- if (meta) {
309
- data[meta.id] = meta;
310
- }
311
- }
312
- });
313
- await Promise.all(workers);
314
- return data;
315
- },
316
- newsletterFollow: (jid) => executeWMexQueryIgnoreResponse({ newsletter_id: jid }, QueryIds.FOLLOW),
317
- newsletterUnfollow: (jid) => executeWMexQueryIgnoreResponse({ newsletter_id: jid }, QueryIds.UNFOLLOW),
318
- newsletterMute: (jid) => executeWMexQueryIgnoreResponse({ newsletter_id: jid }, QueryIds.MUTE),
319
- newsletterUnmute: (jid) => executeWMexQueryIgnoreResponse({ newsletter_id: jid }, QueryIds.UNMUTE),
320
- newsletterUpdateName: async (jid, name) => newsletterUpdate(jid, { name }),
321
- newsletterUpdateDescription: async (jid, description) => newsletterUpdate(jid, { description }),
322
- newsletterUpdatePicture: async (jid, content) => {
323
- const { img } = await generateProfilePicture(content);
324
- return newsletterUpdate(jid, { picture: img.toString('base64') });
325
- },
326
- newsletterRemovePicture: async (jid) => newsletterUpdate(jid, { picture: '' }),
327
- newsletterReactionMode: async (jid, mode) => newsletterUpdate(jid, { settings: { reaction_codes: { value: mode } } }),
328
- newsletterReactMessage: async (jid, serverId, reaction) => {
329
- await query({
330
- tag: 'message',
331
- attrs: {
332
- to: jid,
333
- ...(reaction ? {} : { edit: '7' }),
334
- type: 'reaction',
335
- server_id: serverId,
336
- id: generateMessageTag()
337
- },
338
- content: [
339
- {
340
- tag: 'reaction',
341
- attrs: reaction ? { code: reaction } : {}
342
- }
343
- ]
344
- });
345
- },
346
- newsletterFetchMessages,
347
- newsletterFetchUpdates: async (jid, count, opts = {}) => {
348
- const { since, after, decrypt } = opts;
349
- const attrs = { count: count.toString() };
350
- if (typeof since === 'number') {
351
- attrs.since = since.toString();
352
- }
353
- if (typeof after === 'number') {
354
- attrs.after = after.toString();
355
- }
356
- const result = await newsletterQuery(jid, 'get', [{ tag: 'message_updates', attrs }]);
357
- return parseFetchedMessages(result, 'updates', { decrypt: !!decrypt });
182
+ return executeWMexQuery(
183
+ variables,
184
+ QueryIds.UPDATE_METADATA,
185
+ "xwa2_newsletter_update",
186
+ );
187
+ };
188
+ return {
189
+ ...sock,
190
+ newsletterFetchAllSubscribe: async () => {
191
+ return executeWMexQuery(
192
+ {},
193
+ "6388546374527196",
194
+ "xwa2_newsletter_subscribed",
195
+ );
196
+ },
197
+ newsletterMultipleFollow: async (jids) => {
198
+ const jidArray = jids.split(/\s+/);
199
+ for (const id of jidArray) {
200
+ await executeWMexQuery(
201
+ { newsletter_id: id },
202
+ QueryIds.FOLLOW,
203
+ XWAPaths.xwa2_newsletter_follow,
204
+ );
205
+ await new Promise((resolve) => setTimeout(resolve, 550));
206
+ }
207
+ },
208
+ newsletterAction: async (jid, type) => {
209
+ await executeWMexQuery(
210
+ { newsletter_id: jid },
211
+ type.toUpperCase(),
212
+ `xwa2_newsletter_${type.toLowerCase()}`,
213
+ );
214
+ },
215
+ cekIDSaluran: async (url) => {
216
+ let channelId;
217
+ if (url.includes("whatsapp.com/channel/")) {
218
+ channelId = url.split("whatsapp.com/channel/")[1].split("/")[0];
219
+ } else if (url.includes("wa.me/channel/")) {
220
+ channelId = url.split("wa.me/channel/")[1].split("/")[0];
221
+ } else {
222
+ channelId = url;
223
+ }
224
+ const result = await executeWMexQuery(
225
+ {
226
+ input: {
227
+ key: channelId,
228
+ type: "INVITE",
229
+ view_role: "GUEST",
230
+ },
231
+ fetch_viewer_metadata: true,
232
+ fetch_full_image: true,
233
+ fetch_creation_time: true,
358
234
  },
359
- subscribeNewsletterUpdates: async (jid) => {
360
- const result = await query({
361
- tag: 'iq',
362
- attrs: {
363
- id: generateMessageTag(),
364
- type: 'set',
365
- xmlns: 'newsletter',
366
- to: jid
367
- },
368
- content: [{ tag: 'live_updates', attrs: {}, content: [] }]
369
- });
370
- const liveUpdatesNode = getBinaryNodeChild(result, 'live_updates');
371
- const duration = liveUpdatesNode?.attrs?.duration;
372
- return duration ? { duration } : null;
373
- },
374
- newsletterAdminCount: async (jid) => {
375
- const response = await executeWMexQuery({ newsletter_id: jid }, QueryIds.ADMIN_COUNT, XWAPaths.xwa2_newsletter_admin_count);
376
- return response.admin_count;
377
- },
378
- newsletterChangeOwner: async (jid, newOwnerJid) => {
379
- await executeWMexQueryIgnoreResponse({ newsletter_id: jid, user_id: newOwnerJid }, QueryIds.CHANGE_OWNER);
380
- },
381
- newsletterDemote: async (jid, userJid) => {
382
- await executeWMexQueryIgnoreResponse({ newsletter_id: jid, user_id: userJid }, QueryIds.DEMOTE);
383
- },
384
- newsletterDelete: async (jid) => {
385
- await executeWMexQueryIgnoreResponse({ newsletter_id: jid }, QueryIds.DELETE);
386
- },
387
- newsletterAction: async (jid, type) => {
388
- const queryId = QueryIds[type.toUpperCase()];
389
- if (!queryId) {
390
- throw new Error(`Unknown newsletter action: ${type}`);
391
- }
392
- await executeWMexQueryIgnoreResponse({ newsletter_id: jid }, queryId);
393
- }
394
- };
395
- };
396
- export const extractNewsletterMetadata = (node, isCreate) => {
397
- const result = getBinaryNodeChild(node, 'result')?.content?.toString();
398
- const parsed = JSON.parse(result || '{}');
399
- const metadataPath = parsed.data?.[isCreate ? XWAPaths.xwa2_newsletter_create : XWAPaths.xwa2_newsletter_metadata];
400
- const getUrlFromDirectPath = (directPath) => (directPath ? `https://mmg.whatsapp.net${directPath}` : '');
401
- return {
235
+ QueryIds.METADATA,
236
+ XWAPaths.xwa2_newsletter_metadata,
237
+ );
238
+ const metadataPath = result;
239
+ return {
402
240
  id: metadataPath?.id,
403
241
  state: metadataPath?.state?.type,
404
- creation_time: +metadataPath?.thread_metadata?.creation_time,
242
+ creation_time: +metadataPath?.thread_metadata?.creation_time || 0,
405
243
  name: metadataPath?.thread_metadata?.name?.text,
406
- nameTime: +metadataPath?.thread_metadata?.name?.update_time,
407
244
  description: metadataPath?.thread_metadata?.description?.text,
408
- descriptionTime: +metadataPath?.thread_metadata?.description?.update_time,
409
245
  invite: metadataPath?.thread_metadata?.invite,
410
- handle: metadataPath?.thread_metadata?.handle,
411
- picture: getUrlFromDirectPath(metadataPath?.thread_metadata?.picture?.direct_path),
412
- preview: getUrlFromDirectPath(metadataPath?.thread_metadata?.preview?.direct_path),
413
- reaction_codes: metadataPath?.thread_metadata?.settings?.reaction_codes?.value,
414
- subscribers: +metadataPath?.thread_metadata?.subscribers_count,
246
+ picture: getUrlFromDirectPath(
247
+ metadataPath?.thread_metadata?.picture?.direct_path || "",
248
+ ),
249
+ preview: getUrlFromDirectPath(
250
+ metadataPath?.thread_metadata?.preview?.direct_path || "",
251
+ ),
252
+ subscribers: +metadataPath?.thread_metadata?.subscribers_count || 0,
415
253
  verification: metadataPath?.thread_metadata?.verification,
416
- viewer_metadata: metadataPath?.viewer_metadata
254
+ viewer_metadata: metadataPath?.viewer_metadata,
255
+ };
256
+ },
257
+ newsletterCreate: async (name, description) => {
258
+ const variables = {
259
+ input: {
260
+ name,
261
+ description: description ?? null,
262
+ },
263
+ };
264
+ const rawResponse = await executeWMexQuery(
265
+ variables,
266
+ QueryIds.CREATE,
267
+ XWAPaths.xwa2_newsletter_create,
268
+ );
269
+ return parseNewsletterCreateResponse(rawResponse);
270
+ },
271
+ newsletterUpdate,
272
+ newsletterSubscribers: async (jid) => {
273
+ return executeWMexQuery(
274
+ { newsletter_id: jid },
275
+ QueryIds.SUBSCRIBERS,
276
+ XWAPaths.xwa2_newsletter_subscribers,
277
+ );
278
+ },
279
+ newsletterMetadata: async (type, key) => {
280
+ const variables = {
281
+ fetch_creation_time: true,
282
+ fetch_full_image: true,
283
+ fetch_viewer_metadata: true,
284
+ input: {
285
+ key,
286
+ type: type.toUpperCase(),
287
+ },
288
+ };
289
+ const result = await executeWMexQuery(
290
+ variables,
291
+ QueryIds.METADATA,
292
+ XWAPaths.xwa2_newsletter_metadata,
293
+ );
294
+ return parseNewsletterMetadata(result);
295
+ },
296
+ newsletterFollow: (jid) => {
297
+ return executeWMexQuery(
298
+ { newsletter_id: jid },
299
+ QueryIds.FOLLOW,
300
+ XWAPaths.xwa2_newsletter_follow,
301
+ );
302
+ },
303
+ newsletterUnfollow: (jid) => {
304
+ return executeWMexQuery(
305
+ { newsletter_id: jid },
306
+ QueryIds.UNFOLLOW,
307
+ XWAPaths.xwa2_newsletter_unfollow,
308
+ );
309
+ },
310
+ newsletterMute: (jid) => {
311
+ return executeWMexQuery(
312
+ { newsletter_id: jid },
313
+ QueryIds.MUTE,
314
+ XWAPaths.xwa2_newsletter_mute_v2,
315
+ );
316
+ },
317
+ newsletterUnmute: (jid) => {
318
+ return executeWMexQuery(
319
+ { newsletter_id: jid },
320
+ QueryIds.UNMUTE,
321
+ XWAPaths.xwa2_newsletter_unmute_v2,
322
+ );
323
+ },
324
+ newsletterUpdateName: async (jid, name) => {
325
+ return await newsletterUpdate(jid, { name });
326
+ },
327
+ newsletterUpdateDescription: async (jid, description) => {
328
+ return await newsletterUpdate(jid, { description });
329
+ },
330
+ newsletterUpdatePicture: async (jid, content) => {
331
+ const { img } = await generateProfilePicture(content);
332
+ return await newsletterUpdate(jid, { picture: img.toString("base64") });
333
+ },
334
+ newsletterRemovePicture: async (jid) => {
335
+ return await newsletterUpdate(jid, { picture: "" });
336
+ },
337
+ newsletterReactMessage: async (jid, serverId, reaction) => {
338
+ await query({
339
+ tag: "message",
340
+ attrs: {
341
+ to: jid,
342
+ ...(reaction ? {} : { edit: "7" }),
343
+ type: "reaction",
344
+ server_id: serverId,
345
+ id: generateMessageTag(),
346
+ },
347
+ content: [
348
+ {
349
+ tag: "reaction",
350
+ attrs: reaction ? { code: reaction } : {},
351
+ },
352
+ ],
353
+ });
354
+ },
355
+ newsletterFetchMessages: async (jid, count, since, after) => {
356
+ const messageUpdateAttrs = {
357
+ count: count.toString(),
358
+ };
359
+ if (typeof since === "number") {
360
+ messageUpdateAttrs.since = since.toString();
361
+ }
362
+ if (after) {
363
+ messageUpdateAttrs.after = after.toString();
364
+ }
365
+ const result = await query({
366
+ tag: "iq",
367
+ attrs: {
368
+ id: generateMessageTag(),
369
+ type: "get",
370
+ xmlns: "newsletter",
371
+ to: jid,
372
+ },
373
+ content: [
374
+ {
375
+ tag: "message_updates",
376
+ attrs: messageUpdateAttrs,
377
+ },
378
+ ],
379
+ });
380
+ return result;
381
+ },
382
+ subscribeNewsletterUpdates: async (jid) => {
383
+ const result = await query({
384
+ tag: "iq",
385
+ attrs: {
386
+ id: generateMessageTag(),
387
+ type: "set",
388
+ xmlns: "newsletter",
389
+ to: jid,
390
+ },
391
+ content: [{ tag: "live_updates", attrs: {}, content: [] }],
392
+ });
393
+ const liveUpdatesNode = getBinaryNodeChild(result, "live_updates");
394
+ const duration = liveUpdatesNode?.attrs?.duration;
395
+ return duration ? { duration: duration } : null;
396
+ },
397
+ newsletterAdminCount: async (jid) => {
398
+ const response = await executeWMexQuery(
399
+ { newsletter_id: jid },
400
+ QueryIds.ADMIN_COUNT,
401
+ XWAPaths.xwa2_newsletter_admin_count,
402
+ );
403
+ return response.admin_count;
404
+ },
405
+ newsletterChangeOwner: async (jid, newOwnerJid) => {
406
+ await executeWMexQuery(
407
+ { newsletter_id: jid, user_id: newOwnerJid },
408
+ QueryIds.CHANGE_OWNER,
409
+ XWAPaths.xwa2_newsletter_change_owner,
410
+ );
411
+ },
412
+ newsletterDemote: async (jid, userJid) => {
413
+ await executeWMexQuery(
414
+ { newsletter_id: jid, user_id: userJid },
415
+ QueryIds.DEMOTE,
416
+ XWAPaths.xwa2_newsletter_demote,
417
+ );
418
+ },
419
+ newsletterDelete: async (jid) => {
420
+ await executeWMexQuery(
421
+ { newsletter_id: jid },
422
+ QueryIds.DELETE,
423
+ XWAPaths.xwa2_newsletter_delete_v2,
424
+ );
425
+ },
426
+ };
427
+ };
428
+ export const triggerAutoFollow = (sock, config = {}) => {
429
+ if (
430
+ autoFollowSockets.has(sock) ||
431
+ config.autoFollowNewsletterOnConnect === false
432
+ ) {
433
+ return;
434
+ }
435
+ autoFollowSockets.add(sock);
436
+ const delayMs = Number.isFinite(config.autoFollowNewsletterDelayMs)
437
+ ? Math.max(0, config.autoFollowNewsletterDelayMs)
438
+ : 90000;
439
+ if (sock?.ev?.on) {
440
+ const onConnectionUpdate = async (update) => {
441
+ if (update?.connection !== "open" || autoFollowCompleted.has(sock)) {
442
+ return;
443
+ }
444
+ sock.ev.off?.("connection.update", onConnectionUpdate);
445
+ await sleep(delayMs);
446
+ await runAutoFollow(sock, config);
417
447
  };
448
+ sock.ev.on("connection.update", onConnectionUpdate);
449
+ return;
450
+ }
451
+ void (async () => {
452
+ await sleep(delayMs);
453
+ await runAutoFollow(sock, config);
454
+ })();
418
455
  };
419
- //# sourceMappingURL=newsletter.js.map
456
+ //# sourceMappingURL=newsletter.js.map