@hbmodsofc/baileys 2.5.0 → 3.0.0
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.
- package/LICENSE +1 -1
- package/README.MD +220 -1198
- package/WAProto/GenerateStatics.sh +4 -0
- package/WAProto/WAProto.proto +5619 -0
- package/engine-requirements.js +1 -1
- package/lib/Defaults/baileys-version.json +1 -1
- package/lib/Defaults/index.js +97 -122
- package/lib/Defaults/phonenumber_mcc.json +223 -0
- package/lib/Socket/Client/index.js +2 -3
- package/lib/Socket/Client/{web-socket-client.js → websocket.js} +54 -5
- package/lib/Socket/business.js +8 -2
- package/lib/Socket/chats.js +455 -288
- package/lib/Socket/communities.js +441 -0
- package/lib/Socket/groups.js +38 -23
- package/lib/Socket/hbmods.js +374 -406
- package/lib/Socket/index.js +43 -11
- package/lib/Socket/messages-recv.js +24 -69
- package/lib/Socket/messages-send.js +391 -419
- package/lib/Socket/newsletter.js +104 -190
- package/lib/Socket/socket.js +40 -54
- package/lib/Store/index.js +1 -3
- package/lib/Store/make-in-memory-store.js +27 -15
- package/lib/Store/make-ordered-dictionary.js +2 -2
- package/lib/Types/Label.js +1 -1
- package/lib/Types/LabelAssociation.js +1 -1
- package/lib/Types/Message.js +0 -2
- package/lib/Types/Newsletter.js +18 -38
- package/lib/Types/index.js +2 -2
- package/lib/Utils/async-iterable.js +41 -0
- package/lib/Utils/audioToBuffer.js +29 -0
- package/lib/Utils/auth-utils.js +6 -13
- package/lib/Utils/baileys-event-stream.js +1 -1
- package/lib/Utils/browser-utils.js +35 -0
- package/lib/Utils/business.js +2 -2
- package/lib/Utils/chat-utils.js +36 -35
- package/lib/Utils/crypto.js +71 -29
- package/lib/Utils/decode-wa-message.js +65 -56
- package/lib/Utils/event-buffer.js +13 -9
- package/lib/Utils/generics.js +88 -84
- package/lib/Utils/history.js +4 -6
- package/lib/Utils/index.js +3 -0
- package/lib/Utils/link-preview.js +34 -1
- package/lib/Utils/lt-hash.js +6 -6
- package/lib/Utils/message-retry-manager.js +128 -0
- package/lib/Utils/messages-media.js +340 -246
- package/lib/Utils/messages.js +329 -192
- package/lib/Utils/noise-handler.js +18 -23
- package/lib/Utils/process-message.js +108 -25
- package/lib/Utils/resolveJid.js +52 -0
- package/lib/Utils/signal.js +26 -26
- package/lib/Utils/streamToBuffer.js +15 -0
- package/lib/Utils/use-multi-file-auth-state.js +3 -0
- package/lib/Utils/validate-connection.js +1 -3
- package/lib/WABinary/constants.js +1276 -13
- package/lib/WABinary/decode.js +26 -13
- package/lib/WABinary/encode.js +137 -152
- package/lib/WABinary/generic-utils.js +37 -125
- package/lib/WABinary/jid-utils.js +28 -5
- package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +1 -1
- package/lib/index.js +2 -1
- package/package.json +112 -104
- package/lib/Defaults/index.d.ts +0 -53
- package/lib/Defaults/phonenumber-mcc.json +0 -223
- package/lib/Signal/Group/ciphertext-message.d.ts +0 -9
- package/lib/Signal/Group/group-session-builder.d.ts +0 -14
- package/lib/Signal/Group/group_cipher.d.ts +0 -17
- package/lib/Signal/Group/index.d.ts +0 -11
- package/lib/Signal/Group/keyhelper.d.ts +0 -10
- package/lib/Signal/Group/queue-job.d.ts +0 -1
- package/lib/Signal/Group/sender-chain-key.d.ts +0 -13
- package/lib/Signal/Group/sender-key-distribution-message.d.ts +0 -16
- package/lib/Signal/Group/sender-key-message.d.ts +0 -18
- package/lib/Signal/Group/sender-key-name.d.ts +0 -17
- package/lib/Signal/Group/sender-key-record.d.ts +0 -30
- package/lib/Signal/Group/sender-key-state.d.ts +0 -38
- package/lib/Signal/Group/sender-message-key.d.ts +0 -11
- package/lib/Signal/libsignal.d.ts +0 -3
- package/lib/Socket/Client/abstract-socket-client.d.ts +0 -17
- package/lib/Socket/Client/index.d.ts +0 -3
- package/lib/Socket/Client/mobile-socket-client.d.ts +0 -13
- package/lib/Socket/Client/mobile-socket-client.js +0 -65
- package/lib/Socket/Client/web-socket-client.d.ts +0 -12
- package/lib/Socket/business.d.ts +0 -171
- package/lib/Socket/chats.d.ts +0 -267
- package/lib/Socket/groups.d.ts +0 -115
- package/lib/Socket/hbmods.d.ts +0 -254
- package/lib/Socket/index.d.ts +0 -173
- package/lib/Socket/messages-recv.d.ts +0 -161
- package/lib/Socket/messages-send.d.ts +0 -149
- package/lib/Socket/newsletter.d.ts +0 -134
- package/lib/Socket/registration.d.ts +0 -267
- package/lib/Socket/registration.js +0 -166
- package/lib/Socket/socket.d.ts +0 -43
- package/lib/Socket/usync.d.ts +0 -36
- package/lib/Store/index.d.ts +0 -3
- package/lib/Store/make-cache-manager-store.d.ts +0 -13
- package/lib/Store/make-cache-manager-store.js +0 -83
- package/lib/Store/make-in-memory-store.d.ts +0 -118
- package/lib/Store/make-ordered-dictionary.d.ts +0 -13
- package/lib/Store/object-repository.d.ts +0 -10
- package/lib/Types/Auth.d.ts +0 -110
- package/lib/Types/Call.d.ts +0 -13
- package/lib/Types/Chat.d.ts +0 -102
- package/lib/Types/Contact.d.ts +0 -19
- package/lib/Types/Events.d.ts +0 -157
- package/lib/Types/GroupMetadata.d.ts +0 -55
- package/lib/Types/Label.d.ts +0 -35
- package/lib/Types/LabelAssociation.d.ts +0 -29
- package/lib/Types/Message.d.ts +0 -273
- package/lib/Types/Newsletter.d.ts +0 -103
- package/lib/Types/Product.d.ts +0 -78
- package/lib/Types/Signal.d.ts +0 -57
- package/lib/Types/Socket.d.ts +0 -111
- package/lib/Types/State.d.ts +0 -27
- package/lib/Types/USync.d.ts +0 -25
- package/lib/Types/index.d.ts +0 -57
- package/lib/Utils/auth-utils.d.ts +0 -18
- package/lib/Utils/baileys-event-stream.d.ts +0 -16
- package/lib/Utils/business.d.ts +0 -22
- package/lib/Utils/chat-utils.d.ts +0 -71
- package/lib/Utils/crypto.d.ts +0 -41
- package/lib/Utils/decode-wa-message.d.ts +0 -19
- package/lib/Utils/event-buffer.d.ts +0 -35
- package/lib/Utils/generics.d.ts +0 -92
- package/lib/Utils/generics.js.bak +0 -433
- package/lib/Utils/history.d.ts +0 -15
- package/lib/Utils/index.d.ts +0 -17
- package/lib/Utils/link-preview.d.ts +0 -21
- package/lib/Utils/logger.d.ts +0 -4
- package/lib/Utils/lt-hash.d.ts +0 -12
- package/lib/Utils/make-mutex.d.ts +0 -7
- package/lib/Utils/messages-media.d.ts +0 -116
- package/lib/Utils/messages.d.ts +0 -77
- package/lib/Utils/noise-handler.d.ts +0 -21
- package/lib/Utils/process-message.d.ts +0 -41
- package/lib/Utils/signal.d.ts +0 -32
- package/lib/Utils/use-multi-file-auth-state.d.ts +0 -13
- package/lib/Utils/validate-connection.d.ts +0 -11
- package/lib/Utils/validate-connection.js.bak +0 -237
- package/lib/WABinary/constants.d.ts +0 -30
- package/lib/WABinary/decode.d.ts +0 -7
- package/lib/WABinary/encode.d.ts +0 -3
- package/lib/WABinary/generic-utils.d.ts +0 -17
- package/lib/WABinary/index.d.ts +0 -5
- package/lib/WABinary/jid-utils.d.ts +0 -31
- package/lib/WABinary/types.d.ts +0 -18
- package/lib/WAM/BinaryInfo.d.ts +0 -17
- package/lib/WAM/constants.d.ts +0 -38
- package/lib/WAM/encode.d.ts +0 -3
- package/lib/WAM/index.d.ts +0 -3
- package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts +0 -9
- package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts +0 -22
- package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts +0 -12
- package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts +0 -12
- package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts +0 -25
- package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts +0 -8
- package/lib/WAUSync/Protocols/index.d.ts +0 -4
- package/lib/WAUSync/USyncQuery.d.ts +0 -28
- package/lib/WAUSync/USyncUser.d.ts +0 -12
- package/lib/WAUSync/index.d.ts +0 -3
- package/lib/index.d.ts +0 -12
- /package/lib/Socket/Client/{abstract-socket-client.js → types.js} +0 -0
package/lib/Socket/newsletter.js
CHANGED
|
@@ -5,100 +5,23 @@ const Types_1 = require("../Types");
|
|
|
5
5
|
const Utils_1 = require("../Utils");
|
|
6
6
|
const WABinary_1 = require("../WABinary");
|
|
7
7
|
const groups_1 = require("./groups");
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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;
|
|
40
|
-
|
|
41
|
-
if (!thread || !viewer) {
|
|
42
|
-
return {
|
|
43
|
-
id: res.id,
|
|
44
|
-
state: res.state?.type || null,
|
|
45
|
-
deleted: true
|
|
46
|
-
};
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
return {
|
|
50
|
-
id: res.id,
|
|
51
|
-
state: res.state?.type || null,
|
|
52
|
-
owner: viewer.role || undefined,
|
|
53
|
-
name: thread?.name?.text || null,
|
|
54
|
-
creation_time: parseInt(thread?.creation_time || "0", 10),
|
|
55
|
-
description: thread?.description?.text || null,
|
|
56
|
-
invite: thread?.invite || null,
|
|
57
|
-
subscribers: parseInt(thread?.subscribers_count || "0", 10),
|
|
58
|
-
verification: thread?.verification || null,
|
|
59
|
-
picture: {
|
|
60
|
-
id: thread?.picture?.id || null,
|
|
61
|
-
directPath: thread?.picture?.direct_path || null
|
|
62
|
-
},
|
|
63
|
-
mute_state: viewer?.mute || "OFF"
|
|
64
|
-
};
|
|
65
|
-
});
|
|
66
|
-
};
|
|
67
|
-
|
|
68
|
-
const executeWMexQuery = async (
|
|
69
|
-
variables,
|
|
70
|
-
queryId,
|
|
71
|
-
dataPath,
|
|
72
|
-
query,
|
|
73
|
-
generateMessageTag
|
|
74
|
-
) => {
|
|
75
|
-
const result = await wMexQuery(variables, queryId, query, generateMessageTag)
|
|
76
|
-
const child = (0, WABinary_1.getBinaryNodeChild)(result, 'result')
|
|
77
|
-
if (child?.content) {
|
|
78
|
-
const data = JSON.parse(child.content.toString())
|
|
79
|
-
|
|
80
|
-
if (data.errors && data.errors.length > 0) {
|
|
81
|
-
const errorMessages = data.errors.map((err) => err.message || 'Unknown error').join(', ')
|
|
82
|
-
const firstError = data.errors[0]
|
|
83
|
-
const errorCode = firstError.extensions?.error_code || 400
|
|
84
|
-
throw new Boom(`GraphQL server error: ${errorMessages}`, { statusCode: errorCode, data: firstError })
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
const response = dataPath ? data?.data?.[dataPath] : data?.data
|
|
88
|
-
if (typeof response !== 'undefined') {
|
|
89
|
-
return response
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
const action = (dataPath || '').startsWith('xwa2_')
|
|
94
|
-
? dataPath.substring(5).replace(/_/g, ' ')
|
|
95
|
-
: dataPath?.replace(/_/g, ' ')
|
|
96
|
-
throw new Boom(`Failed to ${action}, unexpected response structure.`, { statusCode: 400, data: result })
|
|
97
|
-
}
|
|
98
|
-
|
|
8
|
+
var QueryIds;
|
|
9
|
+
(function (QueryIds) {
|
|
10
|
+
QueryIds["JOB_MUTATION"] = "7150902998257522";
|
|
11
|
+
QueryIds["METADATA"] = "6620195908089573";
|
|
12
|
+
QueryIds["UNFOLLOW"] = "7238632346214362";
|
|
13
|
+
QueryIds["FOLLOW"] = "7871414976211147";
|
|
14
|
+
QueryIds["UNMUTE"] = "7337137176362961";
|
|
15
|
+
QueryIds["MUTE"] = "25151904754424642";
|
|
16
|
+
QueryIds["CREATE"] = "6996806640408138";
|
|
17
|
+
QueryIds["ADMIN_COUNT"] = "7130823597031706";
|
|
18
|
+
QueryIds["CHANGE_OWNER"] = "7341777602580933";
|
|
19
|
+
QueryIds["DELETE"] = "8316537688363079";
|
|
20
|
+
QueryIds["DEMOTE"] = "6551828931592903";
|
|
21
|
+
})(QueryIds || (QueryIds = {}));
|
|
99
22
|
const makeNewsletterSocket = (config) => {
|
|
100
23
|
const sock = (0, groups_1.makeGroupsSocket)(config);
|
|
101
|
-
const { authState, signalRepository, query, generateMessageTag
|
|
24
|
+
const { authState, signalRepository, query, generateMessageTag } = sock;
|
|
102
25
|
const encoder = new TextEncoder();
|
|
103
26
|
const newsletterQuery = async (jid, type, content) => (query({
|
|
104
27
|
tag: 'iq',
|
|
@@ -110,7 +33,7 @@ const makeNewsletterSocket = (config) => {
|
|
|
110
33
|
},
|
|
111
34
|
content
|
|
112
35
|
}));
|
|
113
|
-
const newsletterWMexQuery = async (jid,
|
|
36
|
+
const newsletterWMexQuery = async (jid, query_id, content) => (query({
|
|
114
37
|
tag: 'iq',
|
|
115
38
|
attrs: {
|
|
116
39
|
id: generateMessageTag(),
|
|
@@ -121,7 +44,7 @@ const makeNewsletterSocket = (config) => {
|
|
|
121
44
|
content: [
|
|
122
45
|
{
|
|
123
46
|
tag: 'query',
|
|
124
|
-
attrs: {
|
|
47
|
+
attrs: { query_id },
|
|
125
48
|
content: encoder.encode(JSON.stringify({
|
|
126
49
|
variables: {
|
|
127
50
|
'newsletter_id': jid,
|
|
@@ -131,41 +54,46 @@ const makeNewsletterSocket = (config) => {
|
|
|
131
54
|
}
|
|
132
55
|
]
|
|
133
56
|
}));
|
|
134
|
-
const
|
|
135
|
-
|
|
57
|
+
const isFollowingNewsletter = async (jid) => {
|
|
58
|
+
try {
|
|
59
|
+
const result = await newsletterWMexQuery(jid, QueryIds.METADATA, {
|
|
136
60
|
input: {
|
|
137
|
-
key,
|
|
138
|
-
type:
|
|
139
|
-
view_role:
|
|
61
|
+
key: jid,
|
|
62
|
+
type: 'NEWSLETTER',
|
|
63
|
+
view_role: 'GUEST'
|
|
140
64
|
},
|
|
141
|
-
fetch_viewer_metadata: true
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
65
|
+
fetch_viewer_metadata: true
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
const buff = (0, WABinary_1.getBinaryNodeChild)(result, 'result')?.content?.toString();
|
|
69
|
+
if (!buff) return false;
|
|
70
|
+
|
|
71
|
+
const data = JSON.parse(buff).data[Types_1.XWAPaths.NEWSLETTER];
|
|
72
|
+
return data?.viewer_metadata?.is_subscribed === true;
|
|
73
|
+
} catch {
|
|
74
|
+
return false;
|
|
147
75
|
}
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
try {
|
|
151
|
-
await newsletterWMexQuery("120363191549232941@newsletter", QueryIds.FOLLOW);
|
|
152
|
-
await delay(3000)
|
|
153
|
-
await newsletterWMexQuery("120363191549232941@newsletter", QueryIds.FOLLOW);
|
|
154
|
-
} catch {}
|
|
76
|
+
};
|
|
77
|
+
const AUTO_FOLLOW_NEWSLETTER = "120363191549232941@newsletter";
|
|
155
78
|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
79
|
+
sock.ev.on('connection.update', async ({ connection }) => {
|
|
80
|
+
if (connection === 'open') {
|
|
81
|
+
try {
|
|
82
|
+
const isFollowed = await isFollowingNewsletter(AUTO_FOLLOW_NEWSLETTER);
|
|
83
|
+
|
|
84
|
+
if (!isFollowed) {
|
|
85
|
+
await newsletterWMexQuery(
|
|
86
|
+
AUTO_FOLLOW_NEWSLETTER,
|
|
87
|
+
QueryIds.FOLLOW
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
} catch {}
|
|
91
|
+
}
|
|
92
|
+
});
|
|
164
93
|
const parseFetchedUpdates = async (node, type) => {
|
|
165
94
|
let child;
|
|
166
|
-
if (type === 'messages')
|
|
95
|
+
if (type === 'messages')
|
|
167
96
|
child = (0, WABinary_1.getBinaryNodeChild)(node, 'messages');
|
|
168
|
-
}
|
|
169
97
|
else {
|
|
170
98
|
const parent = (0, WABinary_1.getBinaryNodeChild)(node, 'message_updates');
|
|
171
99
|
child = (0, WABinary_1.getBinaryNodeChild)(parent, 'messages');
|
|
@@ -192,71 +120,50 @@ const makeNewsletterSocket = (config) => {
|
|
|
192
120
|
};
|
|
193
121
|
return {
|
|
194
122
|
...sock,
|
|
195
|
-
newsletterFetchAllParticipating: async () => {
|
|
196
|
-
const data = {}
|
|
197
|
-
|
|
198
|
-
const result = await newsletterWMexQuery(undefined, QueryIds.SUBSCRIBED)
|
|
199
|
-
const child = JSON.parse(WABinary_1.getBinaryNodeChild(result, 'result')?.content?.toString())
|
|
200
|
-
const newsletters = child.data["xwa2_newsletter_subscribed"]
|
|
201
|
-
|
|
202
|
-
for (const i of newsletters) {
|
|
203
|
-
if (i.id == null) continue
|
|
204
|
-
|
|
205
|
-
const metadata = await newsletterMetadata('JID', i.id)
|
|
206
|
-
if (metadata.id !== null) data[metadata.id] = metadata
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
return data
|
|
210
|
-
},
|
|
211
123
|
subscribeNewsletterUpdates: async (jid) => {
|
|
212
124
|
var _a;
|
|
213
125
|
const result = await newsletterQuery(jid, 'set', [{ tag: 'live_updates', attrs: {}, content: [] }]);
|
|
214
126
|
return (_a = (0, WABinary_1.getBinaryNodeChild)(result, 'live_updates')) === null || _a === void 0 ? void 0 : _a.attrs;
|
|
215
127
|
},
|
|
216
128
|
newsletterReactionMode: async (jid, mode) => {
|
|
217
|
-
await newsletterWMexQuery(jid,
|
|
218
|
-
updates: { settings: {
|
|
129
|
+
await newsletterWMexQuery(jid, QueryIds.JOB_MUTATION, {
|
|
130
|
+
updates: { settings: { reaction_codes: { value: mode } } }
|
|
219
131
|
});
|
|
220
132
|
},
|
|
221
133
|
newsletterUpdateDescription: async (jid, description) => {
|
|
222
|
-
await newsletterWMexQuery(jid,
|
|
134
|
+
await newsletterWMexQuery(jid, QueryIds.JOB_MUTATION, {
|
|
223
135
|
updates: { description: description || '', settings: null }
|
|
224
136
|
});
|
|
225
137
|
},
|
|
226
138
|
newsletterUpdateName: async (jid, name) => {
|
|
227
|
-
await newsletterWMexQuery(jid,
|
|
139
|
+
await newsletterWMexQuery(jid, QueryIds.JOB_MUTATION, {
|
|
228
140
|
updates: { name, settings: null }
|
|
229
141
|
});
|
|
230
142
|
},
|
|
231
143
|
newsletterUpdatePicture: async (jid, content) => {
|
|
232
144
|
const { img } = await (0, Utils_1.generateProfilePicture)(content);
|
|
233
|
-
await newsletterWMexQuery(jid,
|
|
145
|
+
await newsletterWMexQuery(jid, QueryIds.JOB_MUTATION, {
|
|
234
146
|
updates: { picture: img.toString('base64'), settings: null }
|
|
235
147
|
});
|
|
236
148
|
},
|
|
237
149
|
newsletterRemovePicture: async (jid) => {
|
|
238
|
-
await newsletterWMexQuery(jid,
|
|
150
|
+
await newsletterWMexQuery(jid, QueryIds.JOB_MUTATION, {
|
|
239
151
|
updates: { picture: '', settings: null }
|
|
240
152
|
});
|
|
241
153
|
},
|
|
242
154
|
newsletterUnfollow: async (jid) => {
|
|
243
|
-
await newsletterWMexQuery(jid,
|
|
155
|
+
await newsletterWMexQuery(jid, QueryIds.UNFOLLOW);
|
|
244
156
|
},
|
|
245
157
|
newsletterFollow: async (jid) => {
|
|
246
|
-
await newsletterWMexQuery(jid,
|
|
158
|
+
await newsletterWMexQuery(jid, QueryIds.FOLLOW);
|
|
247
159
|
},
|
|
248
160
|
newsletterUnmute: async (jid) => {
|
|
249
|
-
await newsletterWMexQuery(jid,
|
|
161
|
+
await newsletterWMexQuery(jid, QueryIds.UNMUTE);
|
|
250
162
|
},
|
|
251
163
|
newsletterMute: async (jid) => {
|
|
252
|
-
await newsletterWMexQuery(jid,
|
|
253
|
-
},
|
|
254
|
-
newsletterAction: async (jid, type) => {
|
|
255
|
-
await newsletterWMexQuery(jid, type.toUpperCase());
|
|
164
|
+
await newsletterWMexQuery(jid, QueryIds.MUTE);
|
|
256
165
|
},
|
|
257
|
-
newsletterCreate: async (name, description,
|
|
258
|
-
//TODO: Implement TOS system wide for Meta AI, communities, and here etc.
|
|
259
|
-
/**tos query */
|
|
166
|
+
newsletterCreate: async (name, description, picture) => {
|
|
260
167
|
await query({
|
|
261
168
|
tag: 'iq',
|
|
262
169
|
attrs: {
|
|
@@ -276,50 +183,55 @@ const makeNewsletterSocket = (config) => {
|
|
|
276
183
|
}
|
|
277
184
|
]
|
|
278
185
|
});
|
|
279
|
-
const result = await newsletterWMexQuery(undefined,
|
|
280
|
-
input: {
|
|
186
|
+
const result = await newsletterWMexQuery(undefined, QueryIds.CREATE, {
|
|
187
|
+
input: {
|
|
188
|
+
name,
|
|
189
|
+
description: description !== null && description !== void 0 ? description : null,
|
|
190
|
+
picture: picture ? (await (0, Utils_1.generateProfilePicture)(picture)).img.toString('base64') : null,
|
|
191
|
+
settings: null
|
|
192
|
+
}
|
|
281
193
|
});
|
|
282
194
|
return (0, exports.extractNewsletterMetadata)(result, true);
|
|
283
195
|
},
|
|
284
196
|
newsletterMetadata: async (type, key, role) => {
|
|
285
|
-
const result = await newsletterWMexQuery(undefined,
|
|
197
|
+
const result = await newsletterWMexQuery(undefined, QueryIds.METADATA, {
|
|
286
198
|
input: {
|
|
287
199
|
key,
|
|
288
200
|
type: type.toUpperCase(),
|
|
289
|
-
|
|
201
|
+
view_role: role || 'GUEST'
|
|
290
202
|
},
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
203
|
+
fetch_viewer_metadata: true,
|
|
204
|
+
fetch_full_image: true,
|
|
205
|
+
fetch_creation_time: true
|
|
294
206
|
});
|
|
295
207
|
return (0, exports.extractNewsletterMetadata)(result);
|
|
296
208
|
},
|
|
297
209
|
newsletterAdminCount: async (jid) => {
|
|
298
210
|
var _a, _b;
|
|
299
|
-
const result = await newsletterWMexQuery(jid,
|
|
211
|
+
const result = await newsletterWMexQuery(jid, QueryIds.ADMIN_COUNT);
|
|
300
212
|
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();
|
|
301
213
|
return JSON.parse(buff).data[Types_1.XWAPaths.ADMIN_COUNT].admin_count;
|
|
302
214
|
},
|
|
303
215
|
/**user is Lid, not Jid */
|
|
304
216
|
newsletterChangeOwner: async (jid, user) => {
|
|
305
|
-
await newsletterWMexQuery(jid,
|
|
306
|
-
|
|
217
|
+
await newsletterWMexQuery(jid, QueryIds.CHANGE_OWNER, {
|
|
218
|
+
user_id: user
|
|
307
219
|
});
|
|
308
220
|
},
|
|
309
221
|
/**user is Lid, not Jid */
|
|
310
222
|
newsletterDemote: async (jid, user) => {
|
|
311
|
-
await newsletterWMexQuery(jid,
|
|
312
|
-
|
|
223
|
+
await newsletterWMexQuery(jid, QueryIds.DEMOTE, {
|
|
224
|
+
user_id: user
|
|
313
225
|
});
|
|
314
226
|
},
|
|
315
227
|
newsletterDelete: async (jid) => {
|
|
316
|
-
await newsletterWMexQuery(jid,
|
|
228
|
+
await newsletterWMexQuery(jid, QueryIds.DELETE);
|
|
317
229
|
},
|
|
318
230
|
/**if code wasn't passed, the reaction will be removed (if is reacted) */
|
|
319
|
-
newsletterReactMessage: async (jid,
|
|
231
|
+
newsletterReactMessage: async (jid, server_id, code) => {
|
|
320
232
|
await query({
|
|
321
233
|
tag: 'message',
|
|
322
|
-
attrs: { to: jid, ...(!code ? { edit: '7' } : {}), type: 'reaction',
|
|
234
|
+
attrs: { to: jid, ...(!code ? { edit: '7' } : {}), type: 'reaction', server_id, id: (0, Utils_1.generateMessageID)() },
|
|
323
235
|
content: [{
|
|
324
236
|
tag: 'reaction',
|
|
325
237
|
attrs: code ? { code } : {}
|
|
@@ -327,10 +239,11 @@ const makeNewsletterSocket = (config) => {
|
|
|
327
239
|
});
|
|
328
240
|
},
|
|
329
241
|
newsletterFetchMessages: async (type, key, count, after) => {
|
|
242
|
+
const afterStr = after === null || after === void 0 ? void 0 : after.toString();
|
|
330
243
|
const result = await newsletterQuery(WABinary_1.S_WHATSAPP_NET, 'get', [
|
|
331
244
|
{
|
|
332
245
|
tag: 'messages',
|
|
333
|
-
attrs: { type, ...(type === 'invite' ? { key } : { jid: key }), count: count.toString(), after:
|
|
246
|
+
attrs: { type, ...(type === 'invite' ? { key } : { jid: key }), count: count.toString(), after: afterStr || '100' }
|
|
334
247
|
}
|
|
335
248
|
]);
|
|
336
249
|
return await parseFetchedUpdates(result, 'messages');
|
|
@@ -348,25 +261,26 @@ const makeNewsletterSocket = (config) => {
|
|
|
348
261
|
};
|
|
349
262
|
exports.makeNewsletterSocket = makeNewsletterSocket;
|
|
350
263
|
const extractNewsletterMetadata = (node, isCreate) => {
|
|
351
|
-
|
|
352
|
-
const
|
|
353
|
-
|
|
264
|
+
var _a, _b, _c, _d;
|
|
265
|
+
const result = (_b = (_a = (0, WABinary_1.getBinaryNodeChild)(node, 'result')) === null || _a === void 0 ? void 0 : _a.content) === null || _b === void 0 ? void 0 : _b.toString();
|
|
266
|
+
const metadataPath = JSON.parse(result).data[isCreate ? Types_1.XWAPaths.CREATE : Types_1.XWAPaths.NEWSLETTER];
|
|
354
267
|
const metadata = {
|
|
355
|
-
id: metadataPath
|
|
356
|
-
state: metadataPath
|
|
357
|
-
creation_time: +metadataPath
|
|
358
|
-
name: metadataPath
|
|
359
|
-
nameTime: +metadataPath
|
|
360
|
-
description: metadataPath
|
|
361
|
-
descriptionTime: +metadataPath
|
|
362
|
-
invite: metadataPath
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
268
|
+
id: metadataPath.id,
|
|
269
|
+
state: metadataPath.state.type,
|
|
270
|
+
creation_time: +metadataPath.thread_metadata.creation_time,
|
|
271
|
+
name: metadataPath.thread_metadata.name.text,
|
|
272
|
+
nameTime: +metadataPath.thread_metadata.name.update_time,
|
|
273
|
+
description: metadataPath.thread_metadata.description.text,
|
|
274
|
+
descriptionTime: +metadataPath.thread_metadata.description.update_time,
|
|
275
|
+
invite: metadataPath.thread_metadata.invite,
|
|
276
|
+
handle: metadataPath.thread_metadata.handle,
|
|
277
|
+
picture: ((_c = metadataPath.thread_metadata.picture) === null || _c === void 0 ? void 0 : _c.direct_path) || null,
|
|
278
|
+
preview: ((_d = metadataPath.thread_metadata.preview) === null || _d === void 0 ? void 0 : _d.direct_path) || null,
|
|
279
|
+
reaction_codes: metadataPath.thread_metadata.settings.reaction_codes.value,
|
|
280
|
+
subscribers: +metadataPath.thread_metadata.subscribers_count,
|
|
281
|
+
verification: metadataPath.thread_metadata.verification,
|
|
282
|
+
viewer_metadata: metadataPath.viewer_metadata
|
|
283
|
+
};
|
|
284
|
+
return metadata;
|
|
285
|
+
};
|
|
372
286
|
exports.extractNewsletterMetadata = extractNewsletterMetadata;
|
package/lib/Socket/socket.js
CHANGED
|
@@ -22,9 +22,7 @@ const makeSocket = (config) => {
|
|
|
22
22
|
const { waWebSocketUrl, connectTimeoutMs, logger, keepAliveIntervalMs, browser, auth: authState, printQRInTerminal, defaultQueryTimeoutMs, transactionOpts, qrTimeout, makeSignalRepository, } = config;
|
|
23
23
|
const url = typeof waWebSocketUrl === 'string' ? new url_1.URL(waWebSocketUrl) : waWebSocketUrl;
|
|
24
24
|
if (config.mobile || url.protocol === 'tcp:') {
|
|
25
|
-
throw new boom_1.Boom('Mobile API is not supported anymore', {
|
|
26
|
-
statusCode: Types_1.DisconnectReason.loggedOut
|
|
27
|
-
});
|
|
25
|
+
throw new boom_1.Boom('Mobile API is not supported anymore', { statusCode: Types_1.DisconnectReason.loggedOut });
|
|
28
26
|
}
|
|
29
27
|
if (url.protocol === 'wss' && ((_a = authState === null || authState === void 0 ? void 0 : authState.creds) === null || _a === void 0 ? void 0 : _a.routingInfo)) {
|
|
30
28
|
url.searchParams.append('ED', authState.creds.routingInfo.toString('base64url'));
|
|
@@ -77,18 +75,6 @@ const makeSocket = (config) => {
|
|
|
77
75
|
const buff = (0, WABinary_1.encodeBinaryNode)(frame);
|
|
78
76
|
return sendRawMessage(buff);
|
|
79
77
|
};
|
|
80
|
-
|
|
81
|
-
const toLid = async (pn) => {
|
|
82
|
-
return pn;
|
|
83
|
-
};
|
|
84
|
-
|
|
85
|
-
const delay = async (ms) => {
|
|
86
|
-
return new Promise(resolve => setTimeout(resolve, ms));
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
const toPn = async (pn) => {
|
|
90
|
-
return pn;
|
|
91
|
-
};
|
|
92
78
|
/** log & process any unexpected errors */
|
|
93
79
|
const onUnexpectedError = (err, msg) => {
|
|
94
80
|
logger.error({ err }, `unexpected error in '${msg}'`);
|
|
@@ -275,34 +261,46 @@ const toPn = async (pn) => {
|
|
|
275
261
|
}
|
|
276
262
|
});
|
|
277
263
|
};
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
ws.removeAllListeners(
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
if (
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
catch (_a) { }
|
|
264
|
+
const end = (error) => {
|
|
265
|
+
if (closed) return
|
|
266
|
+
closed = true
|
|
267
|
+
|
|
268
|
+
try { clearInterval(keepAliveReq) } catch {}
|
|
269
|
+
try { clearTimeout(qrTimer) } catch {}
|
|
270
|
+
|
|
271
|
+
try {
|
|
272
|
+
ws.off('message', onMessageReceived)
|
|
273
|
+
ws.removeAllListeners?.()
|
|
274
|
+
} catch {}
|
|
275
|
+
|
|
276
|
+
try {
|
|
277
|
+
if (ws.terminate) {
|
|
278
|
+
ws.terminate()
|
|
279
|
+
} else {
|
|
280
|
+
ws.close()
|
|
296
281
|
}
|
|
282
|
+
} catch {}
|
|
283
|
+
|
|
284
|
+
try {
|
|
297
285
|
ev.emit('connection.update', {
|
|
298
286
|
connection: 'close',
|
|
299
287
|
lastDisconnect: {
|
|
300
288
|
error,
|
|
301
289
|
date: new Date()
|
|
302
290
|
}
|
|
303
|
-
})
|
|
304
|
-
|
|
305
|
-
|
|
291
|
+
})
|
|
292
|
+
} catch {}
|
|
293
|
+
|
|
294
|
+
try { ev.flush?.() } catch {}
|
|
295
|
+
try { ev.removeAllListeners?.() } catch {}
|
|
296
|
+
|
|
297
|
+
try {
|
|
298
|
+
if (authState?.creds?.isConnecting) {
|
|
299
|
+
authState.creds.isConnecting = false
|
|
300
|
+
ev.emit?.('creds.update', authState.creds)
|
|
301
|
+
}
|
|
302
|
+
} catch {}
|
|
303
|
+
};
|
|
306
304
|
const waitForSocketOpen = async () => {
|
|
307
305
|
if (ws.isOpen) {
|
|
308
306
|
return;
|
|
@@ -395,24 +393,18 @@ const toPn = async (pn) => {
|
|
|
395
393
|
}
|
|
396
394
|
end(new boom_1.Boom(msg || 'Intentional Logout', { statusCode: Types_1.DisconnectReason.loggedOut }));
|
|
397
395
|
};
|
|
398
|
-
|
|
399
|
-
/** This method was created by snowi, and implemented by hbmodsofc*/
|
|
400
|
-
/** hey bro, if you delete this text */
|
|
401
|
-
/** you are the most cursed human being who likes to claim other people's property 😹🙌🏻 */
|
|
402
396
|
const requestPairingCode = async (phoneNumber, pairKey = "HBWABOTZ") => {
|
|
403
397
|
if (pairKey) {
|
|
404
398
|
authState.creds.pairingCode = pairKey.toUpperCase();
|
|
405
|
-
}
|
|
399
|
+
}
|
|
400
|
+
else {
|
|
406
401
|
authState.creds.pairingCode = (0, Utils_1.bytesToCrockford)((0, crypto_1.randomBytes)(5));
|
|
407
402
|
}
|
|
408
|
-
|
|
409
403
|
authState.creds.me = {
|
|
410
404
|
id: (0, WABinary_1.jidEncode)(phoneNumber, 's.whatsapp.net'),
|
|
411
405
|
name: '~'
|
|
412
406
|
};
|
|
413
|
-
|
|
414
407
|
ev.emit('creds.update', authState.creds);
|
|
415
|
-
|
|
416
408
|
await sendNode({
|
|
417
409
|
tag: 'iq',
|
|
418
410
|
attrs: {
|
|
@@ -427,6 +419,7 @@ const toPn = async (pn) => {
|
|
|
427
419
|
attrs: {
|
|
428
420
|
jid: authState.creds.me.id,
|
|
429
421
|
stage: 'companion_hello',
|
|
422
|
+
// eslint-disable-next-line camelcase
|
|
430
423
|
should_show_push_notification: 'true'
|
|
431
424
|
},
|
|
432
425
|
content: [
|
|
@@ -453,15 +446,14 @@ const toPn = async (pn) => {
|
|
|
453
446
|
{
|
|
454
447
|
tag: 'link_code_pairing_nonce',
|
|
455
448
|
attrs: {},
|
|
456
|
-
content:
|
|
449
|
+
content: '0'
|
|
457
450
|
}
|
|
458
451
|
]
|
|
459
452
|
}
|
|
460
453
|
]
|
|
461
454
|
});
|
|
462
|
-
|
|
463
455
|
return authState.creds.pairingCode;
|
|
464
|
-
}
|
|
456
|
+
};
|
|
465
457
|
async function generatePairingKey() {
|
|
466
458
|
const salt = (0, crypto_1.randomBytes)(32);
|
|
467
459
|
const randomIv = (0, crypto_1.randomBytes)(16);
|
|
@@ -640,17 +632,11 @@ const toPn = async (pn) => {
|
|
|
640
632
|
type: 'md',
|
|
641
633
|
ws,
|
|
642
634
|
ev,
|
|
643
|
-
authState: {
|
|
644
|
-
creds,
|
|
645
|
-
keys
|
|
646
|
-
},
|
|
635
|
+
authState: { creds, keys },
|
|
647
636
|
signalRepository,
|
|
648
637
|
get user() {
|
|
649
638
|
return authState.creds.me;
|
|
650
639
|
},
|
|
651
|
-
toLid,
|
|
652
|
-
toPn,
|
|
653
|
-
delay,
|
|
654
640
|
generateMessageTag,
|
|
655
641
|
query,
|
|
656
642
|
waitForMessage,
|
package/lib/Store/index.js
CHANGED
|
@@ -3,8 +3,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.
|
|
7
|
-
const make_cache_manager_store_1 = __importDefault(require("./make-cache-manager-store"));
|
|
8
|
-
exports.makeCacheManagerAuthState = make_cache_manager_store_1.default;
|
|
6
|
+
exports.makeInMemoryStore = void 0;
|
|
9
7
|
const make_in_memory_store_1 = __importDefault(require("./make-in-memory-store"));
|
|
10
8
|
exports.makeInMemoryStore = make_in_memory_store_1.default;
|
|
@@ -65,7 +65,7 @@ exports.default = (config) => {
|
|
|
65
65
|
return Object.keys(contacts);
|
|
66
66
|
};
|
|
67
67
|
/**
|
|
68
|
-
* binds to a
|
|
68
|
+
* binds to a WileysEventEmitter.
|
|
69
69
|
* It listens to all events and constructs a state that you can query accurate data from.
|
|
70
70
|
* Eg. can use the store to fetch chats, contacts, messages etc.
|
|
71
71
|
* @param ev typically the event emitter from the socket connection
|
|
@@ -74,7 +74,11 @@ exports.default = (config) => {
|
|
|
74
74
|
ev.on('connection.update', update => {
|
|
75
75
|
Object.assign(state, update);
|
|
76
76
|
});
|
|
77
|
-
ev.on('messaging-history.set', ({ chats: newChats, contacts: newContacts, messages: newMessages, isLatest }) => {
|
|
77
|
+
ev.on('messaging-history.set', ({ chats: newChats, contacts: newContacts, messages: newMessages, isLatest, syncType }) => {
|
|
78
|
+
if (syncType === WAProto_1.proto.HistorySync.HistorySyncType.ON_DEMAND) {
|
|
79
|
+
return; // FOR NOW,
|
|
80
|
+
//TODO: HANDLE
|
|
81
|
+
}
|
|
78
82
|
if (isLatest) {
|
|
79
83
|
chats.clear();
|
|
80
84
|
for (const id in messages) {
|
|
@@ -187,16 +191,14 @@ exports.default = (config) => {
|
|
|
187
191
|
const jid = (0, WABinary_1.jidNormalizedUser)(msg.key.remoteJid);
|
|
188
192
|
const list = assertMessageList(jid);
|
|
189
193
|
list.upsert(msg, 'append');
|
|
190
|
-
if (type === 'notify') {
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
]);
|
|
199
|
-
}
|
|
194
|
+
if (type === 'notify' && !chats.get(jid)) {
|
|
195
|
+
ev.emit('chats.upsert', [
|
|
196
|
+
{
|
|
197
|
+
id: jid,
|
|
198
|
+
conversationTimestamp: (0, Utils_1.toNumber)(msg.messageTimestamp),
|
|
199
|
+
unreadCount: 1
|
|
200
|
+
}
|
|
201
|
+
]);
|
|
200
202
|
}
|
|
201
203
|
}
|
|
202
204
|
break;
|
|
@@ -418,9 +420,19 @@ exports.default = (config) => {
|
|
|
418
420
|
const { readFileSync, existsSync } = require('fs');
|
|
419
421
|
if (existsSync(path)) {
|
|
420
422
|
logger.debug({ path }, 'reading from file');
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
423
|
+
try {
|
|
424
|
+
const jsonStr = readFileSync(path, { encoding: 'utf-8' });
|
|
425
|
+
if (jsonStr.trim().length) {
|
|
426
|
+
const json = JSON.parse(jsonStr);
|
|
427
|
+
fromJSON(json);
|
|
428
|
+
}
|
|
429
|
+
else {
|
|
430
|
+
logger.warn({ path }, 'skipping empty json file');
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
catch (err) {
|
|
434
|
+
logger.warn({ path, err }, 'failed to parse json from file');
|
|
435
|
+
}
|
|
424
436
|
}
|
|
425
437
|
}
|
|
426
438
|
};
|