@areumtecnologia/baileys 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -0
- package/handlers/baileys.js +27 -0
- package/handlers/calls.js +58 -0
- package/handlers/messages.js +86 -7
- package/index.js +44 -21
- package/package.json +7 -3
- package/utils/message-normalizer.js +7 -6
- package/baileys.code-workspace +0 -8
- package/desktop.ini +0 -0
- package/handlers/desktop.ini +0 -0
- package/tests/app.js +0 -68
- package/tests/desktop.ini +0 -0
- package/types/desktop.ini +0 -0
- package/utils/desktop.ini +0 -0
package/README.md
ADDED
|
File without changes
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
const wb = require('@whiskeysockets/baileys');
|
|
2
|
+
const {
|
|
3
|
+
Browsers,
|
|
4
|
+
makeWASocket,
|
|
5
|
+
decryptPollVote,
|
|
6
|
+
DisconnectReason,
|
|
7
|
+
jidNormalizedUser,
|
|
8
|
+
downloadContentFromMessage,
|
|
9
|
+
downloadMediaMessage,
|
|
10
|
+
getContentType,
|
|
11
|
+
useMultiFileAuthState,
|
|
12
|
+
fetchLatestBaileysVersion,
|
|
13
|
+
} = require('@itsukichan/baileys');
|
|
14
|
+
|
|
15
|
+
module.exports = {
|
|
16
|
+
whiskeysocketsMakeWASocket: wb.makeWASocket,
|
|
17
|
+
itsukichanMakeWASocket: makeWASocket,
|
|
18
|
+
Browsers,
|
|
19
|
+
decryptPollVote,
|
|
20
|
+
DisconnectReason,
|
|
21
|
+
jidNormalizedUser,
|
|
22
|
+
downloadContentFromMessage,
|
|
23
|
+
downloadMediaMessage,
|
|
24
|
+
getContentType,
|
|
25
|
+
useMultiFileAuthState,
|
|
26
|
+
fetchLatestBaileysVersion,
|
|
27
|
+
};
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
|
|
2
|
+
/**
|
|
3
|
+
* @copyright Áreum Tecnologia
|
|
4
|
+
* @author Áreum Tecnologia
|
|
5
|
+
* @license Proprietary
|
|
6
|
+
*
|
|
7
|
+
* Manipula o envio e recebimento de chamadas via WhatsApp utilizando Baileys.
|
|
8
|
+
* Fornece métodos para envio de texto, mídia, localização, contatos, enquetes, ações de mensagem e interatividade.
|
|
9
|
+
*
|
|
10
|
+
* @class CallHandler
|
|
11
|
+
* @classdesc Classe central para manipulação de chamadas no WhatsApp.
|
|
12
|
+
*
|
|
13
|
+
* @property {import('../client').default} client - Instância principal do cliente Baileys.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* const CallHandler = require('./handlers/calls');
|
|
17
|
+
* const handler = new CallHandler(client);
|
|
18
|
+
* await handler.callReject('5511999999999@s.whatsapp.net');
|
|
19
|
+
*/
|
|
20
|
+
// const { sendButtons, sendInteractiveMessage } = require('baileys_helper');
|
|
21
|
+
const { Utils, MessageNormalizer } = require('../utils');
|
|
22
|
+
|
|
23
|
+
class CallHandler {
|
|
24
|
+
/**
|
|
25
|
+
* @param {import('../../../client').default} client - A instância principal do cliente.
|
|
26
|
+
*/
|
|
27
|
+
constructor(client) {
|
|
28
|
+
this.client = client;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Rejeita uma chamada.
|
|
33
|
+
* @param {string} jid - O JID do destinatário.
|
|
34
|
+
*/
|
|
35
|
+
async reject(call) {
|
|
36
|
+
this.client._validateConnection();
|
|
37
|
+
return this.client.sock.rejectCall(call.id, call.from);
|
|
38
|
+
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
normalizeCall(call) {
|
|
42
|
+
return {
|
|
43
|
+
id: call.id,
|
|
44
|
+
from: call.from,
|
|
45
|
+
status: call.status,
|
|
46
|
+
isVideo: call.isVideo,
|
|
47
|
+
isGroup: call.isGroup,
|
|
48
|
+
groupJid: call.groupJid,
|
|
49
|
+
date: call.date,
|
|
50
|
+
offline: call.offline,
|
|
51
|
+
chatId: call.chatId,
|
|
52
|
+
reject: this.reject.bind(this, call)
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
module.exports = CallHandler;
|
package/handlers/messages.js
CHANGED
|
@@ -174,7 +174,6 @@ class MessageHandler {
|
|
|
174
174
|
* @param {object} [options={}] - Opções adicionais.
|
|
175
175
|
*/
|
|
176
176
|
async sendLink(jid, url, options = {}) {
|
|
177
|
-
|
|
178
177
|
return this.sendMessage(jid, { text: url }, options);
|
|
179
178
|
}
|
|
180
179
|
|
|
@@ -245,6 +244,7 @@ class MessageHandler {
|
|
|
245
244
|
return this.client.sock.readMessages([messageKey]);
|
|
246
245
|
}
|
|
247
246
|
|
|
247
|
+
/** Deprecated - Funcional apenas usando baileys e baileys_helper - Envia uma mensagem com botões interativos. */
|
|
248
248
|
async sendInteractiveMessage(jid, interactiveMessage, more) {
|
|
249
249
|
const verifiedJid = await this.client.users.isOnWhatsApp(jid);
|
|
250
250
|
if (verifiedJid && verifiedJid.exists) {
|
|
@@ -255,7 +255,7 @@ class MessageHandler {
|
|
|
255
255
|
}
|
|
256
256
|
}
|
|
257
257
|
|
|
258
|
-
/** Envia uma mensagem com botões interativos. */
|
|
258
|
+
/** Deprecated - Funcional apenas usando baileys e baileys_helper - Envia uma mensagem com botões interativos. */
|
|
259
259
|
async sendButtons(jid, messageButton) {
|
|
260
260
|
const verifiedJid = await this.client.users.isOnWhatsApp(jid);
|
|
261
261
|
if (verifiedJid && verifiedJid.exists) {
|
|
@@ -267,19 +267,98 @@ class MessageHandler {
|
|
|
267
267
|
}
|
|
268
268
|
|
|
269
269
|
/** Faz o download de mídia de uma mensagem. */
|
|
270
|
-
async
|
|
270
|
+
async getAttachments(message) {
|
|
271
271
|
this.client._validateConnection();
|
|
272
|
-
|
|
272
|
+
|
|
273
|
+
const type = Object.keys(message.message)[0]; // ex: imageMessage
|
|
273
274
|
const messageContent = message.message[type];
|
|
274
|
-
if (!messageContent.url) throw new Error('Mensagem não contém mídia para download.');
|
|
275
275
|
|
|
276
|
-
|
|
276
|
+
if (!messageContent?.url) return null;
|
|
277
|
+
|
|
278
|
+
// baixa o stream
|
|
279
|
+
const stream = await this.client.downloadContentFromMessage(
|
|
280
|
+
messageContent,
|
|
281
|
+
type.replace('Message', '') // imageMessage → image
|
|
282
|
+
);
|
|
283
|
+
|
|
284
|
+
// monta o buffer
|
|
277
285
|
let buffer = Buffer.from([]);
|
|
278
286
|
for await (const chunk of stream) {
|
|
279
287
|
buffer = Buffer.concat([buffer, chunk]);
|
|
280
288
|
}
|
|
281
|
-
|
|
289
|
+
|
|
290
|
+
const mimetype = messageContent.mimetype;
|
|
291
|
+
const extension = mimetype.split('/')[1] || 'bin';
|
|
292
|
+
|
|
293
|
+
// conversões
|
|
294
|
+
const toBase64 = () => buffer.toString('base64');
|
|
295
|
+
|
|
296
|
+
const toDataUri = () =>
|
|
297
|
+
`data:${mimetype};base64,${buffer.toString('base64')}`;
|
|
298
|
+
|
|
299
|
+
const toArrayBuffer = () =>
|
|
300
|
+
buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength);
|
|
301
|
+
|
|
302
|
+
const toBlob = () => {
|
|
303
|
+
const arrayBuffer = toArrayBuffer();
|
|
304
|
+
return new Blob([arrayBuffer], { type: mimetype });
|
|
305
|
+
};
|
|
306
|
+
|
|
307
|
+
const toImageUrl = () => {
|
|
308
|
+
const blob = toBlob();
|
|
309
|
+
return URL.createObjectURL(blob);
|
|
310
|
+
};
|
|
311
|
+
|
|
312
|
+
const toImageBitmap = async () => {
|
|
313
|
+
const blob = toBlob();
|
|
314
|
+
return await createImageBitmap(blob);
|
|
315
|
+
};
|
|
316
|
+
|
|
317
|
+
const toStream = () => {
|
|
318
|
+
const { Readable } = require('stream');
|
|
319
|
+
return Readable.from(buffer);
|
|
320
|
+
};
|
|
321
|
+
|
|
322
|
+
const toSharp = () => {
|
|
323
|
+
const sharp = require('sharp');
|
|
324
|
+
return sharp(buffer); // o usuário pode continuar com .resize().png()...
|
|
325
|
+
};
|
|
326
|
+
|
|
327
|
+
const detectType = async () => {
|
|
328
|
+
const { fileTypeFromBuffer } = await import('file-type');
|
|
329
|
+
return await fileTypeFromBuffer(buffer);
|
|
330
|
+
};
|
|
331
|
+
|
|
332
|
+
const save = async (path) => {
|
|
333
|
+
const filename = `${message.from}-${Date.now()}.${extension}`;
|
|
334
|
+
const filepath = path
|
|
335
|
+
? path
|
|
336
|
+
: `${this.client.sessionPath}/media/${filename}`;
|
|
337
|
+
|
|
338
|
+
await fs.writeFile(filepath, buffer);
|
|
339
|
+
|
|
340
|
+
return { filename, filepath };
|
|
341
|
+
};
|
|
342
|
+
|
|
343
|
+
return {
|
|
344
|
+
type: mimetype,
|
|
345
|
+
extension,
|
|
346
|
+
buffer,
|
|
347
|
+
|
|
348
|
+
// 🔥 todas as funções utilitárias
|
|
349
|
+
toBase64,
|
|
350
|
+
toDataUri,
|
|
351
|
+
toArrayBuffer,
|
|
352
|
+
toBlob,
|
|
353
|
+
toImageUrl,
|
|
354
|
+
toImageBitmap,
|
|
355
|
+
toStream,
|
|
356
|
+
toSharp,
|
|
357
|
+
detectType,
|
|
358
|
+
save,
|
|
359
|
+
};
|
|
282
360
|
}
|
|
361
|
+
|
|
283
362
|
}
|
|
284
363
|
|
|
285
364
|
module.exports = MessageHandler;
|
package/index.js
CHANGED
|
@@ -1,24 +1,30 @@
|
|
|
1
|
-
// Biblioteca chamada
|
|
2
|
-
|
|
1
|
+
// Biblioteca chamada @areumtecnologia/baileys
|
|
2
|
+
|
|
3
3
|
const {
|
|
4
4
|
Browsers,
|
|
5
|
-
|
|
5
|
+
itsukichanMakeWASocket,
|
|
6
|
+
whiskeysocketsMakeWASocket,
|
|
6
7
|
decryptPollVote,
|
|
7
8
|
DisconnectReason,
|
|
8
9
|
jidNormalizedUser,
|
|
9
10
|
downloadContentFromMessage,
|
|
11
|
+
downloadMediaMessage,
|
|
12
|
+
getContentType,
|
|
10
13
|
useMultiFileAuthState,
|
|
11
14
|
fetchLatestBaileysVersion,
|
|
12
|
-
} = require('
|
|
15
|
+
} = require('./handlers/baileys');
|
|
13
16
|
const { Boom } = require('@hapi/boom');
|
|
14
17
|
const EventEmitter = require('events');
|
|
15
18
|
const fs = require('fs/promises');
|
|
16
19
|
const { constants } = require('fs');
|
|
17
20
|
const path = require('path');
|
|
18
21
|
const pino = require('pino');
|
|
22
|
+
const QRCode = require('qrcode');
|
|
23
|
+
const qrcodeTerminal = require('qrcode-terminal');
|
|
19
24
|
// Importa os handlers de responsabilidades específicas
|
|
20
25
|
const MessageHandler = require('./handlers/messages');
|
|
21
26
|
const GroupHandler = require('./handlers/groups');
|
|
27
|
+
const CallHandler = require('./handlers/calls');
|
|
22
28
|
const { UserHandler, PresenceStatus } = require('./handlers/users');
|
|
23
29
|
const { MessageNormalizer, MessageStore } = require('./utils');
|
|
24
30
|
const { InteractiveMessage, CallButton, CopyCodeButton, ListButton, ListRow, ListSection, QuickReplyButton, UrlButton, LocationButton } = require('./types/interactive-messages');
|
|
@@ -56,10 +62,10 @@ class Client extends EventEmitter {
|
|
|
56
62
|
constructor(options = {}) {
|
|
57
63
|
super();
|
|
58
64
|
this.sock = null;
|
|
59
|
-
this.dataPath = options.dataPath || ".
|
|
65
|
+
this.dataPath = options.dataPath || ".baileys/sessions";
|
|
60
66
|
this.sessionName = options.sessionName;
|
|
61
|
-
this.
|
|
62
|
-
this.store = options.store ? options.store : new MessageStore(this.
|
|
67
|
+
this.sessionPath = [this.dataPath, this.sessionName].join('/');
|
|
68
|
+
this.store = options.store ? options.store : new MessageStore(this.sessionPath);
|
|
63
69
|
this.isOnline = false;
|
|
64
70
|
this.connected = false;
|
|
65
71
|
this.manualDisconnect = false;
|
|
@@ -69,6 +75,7 @@ class Client extends EventEmitter {
|
|
|
69
75
|
this.status = ClientEvent.DISCONNECTED;
|
|
70
76
|
this.markOnlineOnConnect = options.markOnlineOnConnect || false;
|
|
71
77
|
this.enviroment = options.enviroment ? options.enviroment : null;
|
|
78
|
+
this.printQRInTerminal = options.printQRInTerminal || false;
|
|
72
79
|
this.qrCode = null;
|
|
73
80
|
// =================================================================================================
|
|
74
81
|
// INTEGRAÇÃO DOS HANDLERS
|
|
@@ -78,6 +85,7 @@ class Client extends EventEmitter {
|
|
|
78
85
|
this.messages = new MessageHandler(this);
|
|
79
86
|
this.groups = new GroupHandler(this);
|
|
80
87
|
this.users = new UserHandler(this);
|
|
88
|
+
this.calls = new CallHandler(this);
|
|
81
89
|
}
|
|
82
90
|
|
|
83
91
|
/**
|
|
@@ -87,17 +95,16 @@ class Client extends EventEmitter {
|
|
|
87
95
|
*/
|
|
88
96
|
async connect() {
|
|
89
97
|
this.status = ClientEvent.INIT;
|
|
90
|
-
const { state, saveCreds } = await useMultiFileAuthState(this.
|
|
98
|
+
const { state, saveCreds } = await useMultiFileAuthState(this.sessionPath);
|
|
91
99
|
const { version } = await fetchLatestBaileysVersion();
|
|
92
|
-
const credsPath = path.resolve(process.cwd(), this.
|
|
100
|
+
const credsPath = path.resolve(process.cwd(), this.sessionPath, "creds.json");
|
|
93
101
|
const creds = await this.fileExists(credsPath);
|
|
94
102
|
if (creds) {
|
|
95
103
|
// Conecta usando @itsukichan/baileys
|
|
96
|
-
this.sock =
|
|
104
|
+
this.sock = itsukichanMakeWASocket({
|
|
97
105
|
auth: state,
|
|
98
106
|
version,
|
|
99
107
|
browser: this.enviroment ? this.enviroment : Browsers.macOS("Desktop"),
|
|
100
|
-
printQRInTerminal: false, // Desabilitamos para controlar via evento
|
|
101
108
|
logger: pino({ level: this.loggerLevel }),
|
|
102
109
|
markOnlineOnConnect: this.markOnlineOnConnect || false,
|
|
103
110
|
keepAliveIntervalMs: 15000,
|
|
@@ -111,11 +118,10 @@ class Client extends EventEmitter {
|
|
|
111
118
|
});
|
|
112
119
|
} else {
|
|
113
120
|
// Conecta usando Baileys
|
|
114
|
-
this.sock =
|
|
121
|
+
this.sock = whiskeysocketsMakeWASocket({
|
|
115
122
|
auth: state,
|
|
116
123
|
version,
|
|
117
124
|
browser: this.enviroment ? this.enviroment : Browsers.macOS("Desktop"),
|
|
118
|
-
printQRInTerminal: false, // Desabilitamos para controlar via evento
|
|
119
125
|
logger: pino({ level: this.loggerLevel }),
|
|
120
126
|
markOnlineOnConnect: this.markOnlineOnConnect || false,
|
|
121
127
|
cachedGroupMetadata: async (jid) => groupCache.get(jid),
|
|
@@ -153,9 +159,13 @@ class Client extends EventEmitter {
|
|
|
153
159
|
|
|
154
160
|
if (qr) {
|
|
155
161
|
this.qrCode = qr;
|
|
162
|
+
const base64 = await QRCode.toDataURL(qr);
|
|
163
|
+
this.qrCodeAttempts = (this.qrCodeAttempts || 0) + 1;
|
|
164
|
+
this.qrCode = { base64, qr, attempts: this.qrCodeAttempts };
|
|
156
165
|
this.status = ClientEvent.PAIRING_CODE;
|
|
157
|
-
this.emit(ClientEvent.PAIRING_CODE,
|
|
166
|
+
this.emit(ClientEvent.PAIRING_CODE, this.qrCode);
|
|
158
167
|
this.emit(ClientEvent.STATUS_CHANGE, this.status);
|
|
168
|
+
this.printQRInTerminal ? qrcodeTerminal.generate(qr, { small: true }) : null;
|
|
159
169
|
return;
|
|
160
170
|
}
|
|
161
171
|
|
|
@@ -177,10 +187,12 @@ class Client extends EventEmitter {
|
|
|
177
187
|
break;
|
|
178
188
|
|
|
179
189
|
case 'open':
|
|
190
|
+
this.user = this.sock.user;
|
|
191
|
+
this.qrCode = null; // Limpa o QR code após a conexão
|
|
180
192
|
this.connected = true;
|
|
181
193
|
this.manualDisconnect = false;
|
|
182
194
|
this.status = ClientEvent.CONNECTED;
|
|
183
|
-
this.emit(ClientEvent.CONNECTED,
|
|
195
|
+
this.emit(ClientEvent.CONNECTED, this.user);
|
|
184
196
|
this.emit(ClientEvent.STATUS_CHANGE, this.status);
|
|
185
197
|
this.presenceSetInterval = setInterval(() => {
|
|
186
198
|
if (this.sock?.sendPresenceUpdate) {
|
|
@@ -217,7 +229,7 @@ class Client extends EventEmitter {
|
|
|
217
229
|
statusType = DisconnectReasons.LOGGED_OUT;
|
|
218
230
|
disconnectReason = { statusCode, statusType, reason: reasonType, details: boomError.data };
|
|
219
231
|
try {
|
|
220
|
-
await fs.rm(this.
|
|
232
|
+
await fs.rm(this.sessionPath, { recursive: true, force: true });
|
|
221
233
|
// if (this.restartOnClose) this.connect();
|
|
222
234
|
} catch (err) {
|
|
223
235
|
this.emit(ClientEvent.ERROR, err);
|
|
@@ -256,7 +268,9 @@ class Client extends EventEmitter {
|
|
|
256
268
|
// OUTROS EVENTOS DE INTERAÇÃO
|
|
257
269
|
// =================================================================================================
|
|
258
270
|
|
|
259
|
-
this.sock.ev.on('call', (
|
|
271
|
+
this.sock.ev.on('call', ([call]) => {
|
|
272
|
+
this.emit(ClientEvent.CALL, this.calls.normalizeCall(call));
|
|
273
|
+
});
|
|
260
274
|
this.sock.ev.on('groups.update', async ([event]) => {
|
|
261
275
|
this.emit(ClientEvent.GROUP_UPDATE, event);
|
|
262
276
|
const metadata = await this.sock.groupMetadata(event.id);
|
|
@@ -268,8 +282,7 @@ class Client extends EventEmitter {
|
|
|
268
282
|
const metadata = await this.sock.groupMetadata(event.id)
|
|
269
283
|
groupCache.set(event.id, metadata)
|
|
270
284
|
});
|
|
271
|
-
|
|
272
|
-
// this.sock.ev.on('group-participants.update', (update) => this.emit(ClientEvent.GROUP_PARTICIPANTS_UPDATE, update));
|
|
285
|
+
|
|
273
286
|
this.sock.ev.on('presence.update', (update) => this.emit(ClientEvent.PRESENCE_UPDATE, update));
|
|
274
287
|
this.sock.ev.on('contacts.update', (updates) => this.emit(ClientEvent.CONTACT_UPDATE, updates));
|
|
275
288
|
this.sock.ev.on('blocklist.update', (update) => this.emit(ClientEvent.BLOCKLIST_UPDATE, update));
|
|
@@ -284,7 +297,7 @@ class Client extends EventEmitter {
|
|
|
284
297
|
const messages = history.messages.filter(m => m.key.remoteJid === chatId);
|
|
285
298
|
for (const msg of messages) {
|
|
286
299
|
const nmsg = MessageNormalizer.normalize(msg, this);
|
|
287
|
-
if (nmsg && this.store && this.store
|
|
300
|
+
if (nmsg && this.store && this.store?.setMessage) this.store?.setMessage(chatId, nmsg);
|
|
288
301
|
}
|
|
289
302
|
}
|
|
290
303
|
this.emit(ClientEvent.MESSAGES_HISTORY_SYNC_DONE, history);
|
|
@@ -308,7 +321,9 @@ class Client extends EventEmitter {
|
|
|
308
321
|
this.emit(ClientEvent.BROADCAST_MESSAGE, msg);
|
|
309
322
|
} else {
|
|
310
323
|
const nmsg = await MessageNormalizer.normalize(msg, this);
|
|
311
|
-
this.store.setMessage
|
|
324
|
+
if (nmsg && this.store && this.store?.setMessage) {
|
|
325
|
+
this.store?.setMessage(nmsg.chatId, nmsg);
|
|
326
|
+
}
|
|
312
327
|
// Mensagens de conversacao
|
|
313
328
|
switch (type) {
|
|
314
329
|
case 'append':
|
|
@@ -373,18 +388,26 @@ class Client extends EventEmitter {
|
|
|
373
388
|
}
|
|
374
389
|
}
|
|
375
390
|
|
|
391
|
+
// Metodos usados pelos handlers
|
|
376
392
|
async decryptPollVote(vote, voteParams) {
|
|
377
393
|
return await decryptPollVote(vote, voteParams);
|
|
378
394
|
}
|
|
379
395
|
|
|
396
|
+
// Metodos usados pelos handlers
|
|
380
397
|
jidNormalizedUser(id) {
|
|
381
398
|
return jidNormalizedUser(id);
|
|
382
399
|
}
|
|
383
400
|
|
|
401
|
+
// Metodos usados pelos handlers
|
|
384
402
|
async downloadContentFromMessage(content, type) {
|
|
385
403
|
return await downloadContentFromMessage(content, type);
|
|
386
404
|
}
|
|
387
405
|
|
|
406
|
+
// Metodos usados pelos handlers
|
|
407
|
+
getContentType(message) {
|
|
408
|
+
return getContentType(message);
|
|
409
|
+
}
|
|
410
|
+
|
|
388
411
|
async fileExists(path) {
|
|
389
412
|
try {
|
|
390
413
|
await fs.access(path, constants.F_OK);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@areumtecnologia/baileys",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "More baileys fork",
|
|
5
5
|
"license": "ISC",
|
|
6
6
|
"author": "Áreum Tecnologia",
|
|
@@ -11,6 +11,10 @@
|
|
|
11
11
|
},
|
|
12
12
|
"dependencies": {
|
|
13
13
|
"@itsukichan/baileys": "^7.3.2",
|
|
14
|
-
"baileys": "^7.0.0-rc.9"
|
|
14
|
+
"@whiskeysockets/baileys": "^7.0.0-rc.9",
|
|
15
|
+
"crypto-digest-sync": "^1.0.0",
|
|
16
|
+
"node-cache": "^5.1.2",
|
|
17
|
+
"qrcode": "^1.5.4",
|
|
18
|
+
"qrcode-terminal": "^0.12.0"
|
|
15
19
|
}
|
|
16
|
-
}
|
|
20
|
+
}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
const digestSync = require('crypto-digest-sync');
|
|
2
|
-
|
|
3
2
|
/**
|
|
4
3
|
* Classe utilitária estática para normalizar o objeto de mensagem do Baileys
|
|
5
4
|
* em uma estrutura rica, consistente e completa. (Versão 3 - Final)
|
|
@@ -35,17 +34,19 @@ class MessageNormalizer {
|
|
|
35
34
|
const chatId = rawMessage.key.remoteJid.includes('@lid') ? rawMessage.key.remoteJidAlt : rawMessage.key.remoteJid;
|
|
36
35
|
const isGroup = chatId.endsWith('@g.us');
|
|
37
36
|
const clientJid = client.jidNormalizedUser(client.sock.user.id);
|
|
38
|
-
|
|
37
|
+
const from = isGroup ? rawMessage.key.participant : rawMessage.key.fromMe ? clientJid : chatId;
|
|
38
|
+
const to = isGroup ? rawMessage.key.participant : rawMessage.key.fromMe ? chatId : clientJid;
|
|
39
39
|
const normalized = {
|
|
40
40
|
id: rawMessage.key.id,
|
|
41
|
-
from:
|
|
42
|
-
to:
|
|
41
|
+
from: from,
|
|
42
|
+
to: to,
|
|
43
43
|
chatId: chatId,
|
|
44
44
|
timestamp: new Date(Number(rawMessage.messageTimestamp) * 1000),
|
|
45
45
|
fromMe: rawMessage.key.fromMe,
|
|
46
46
|
isGroup: isGroup,
|
|
47
47
|
sender: {
|
|
48
|
-
id:
|
|
48
|
+
id: from,
|
|
49
|
+
lid: rawMessage.key.remoteJid.includes('@lid') ? rawMessage.key.remoteJid : rawMessage.key.remoteJidAlt && rawMessage.key.remoteJidAlt.includes('@lid') ? rawMessage.key.remoteJidAlt : null,
|
|
49
50
|
pushName: rawMessage.pushName || ''
|
|
50
51
|
},
|
|
51
52
|
type,
|
|
@@ -135,7 +136,7 @@ class MessageNormalizer {
|
|
|
135
136
|
isPtt: messageContent.ptt || false,
|
|
136
137
|
isGif: messageContent.gifPlayback || false,
|
|
137
138
|
isViewOnce: messageContent.viewOnce || false,
|
|
138
|
-
|
|
139
|
+
getAttachments: () => client.messages.getAttachments(rawMessage)
|
|
139
140
|
};
|
|
140
141
|
}
|
|
141
142
|
|
package/baileys.code-workspace
DELETED
package/desktop.ini
DELETED
|
Binary file
|
package/handlers/desktop.ini
DELETED
|
Binary file
|
package/tests/app.js
DELETED
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
const { Client, ClientEvent } = require('../index'); // Caminho para sua classe Client
|
|
2
|
-
// 1. Instanciação do Cliente atualizada para usar a nova classe
|
|
3
|
-
const client = new Client({
|
|
4
|
-
sessionName: sessionId,
|
|
5
|
-
restartOnClose: true,
|
|
6
|
-
markOnlineOnConnect: false,
|
|
7
|
-
enviroment: [account.name || 'MacOS', 'Chrome', '118.0.0.0'],
|
|
8
|
-
store: {
|
|
9
|
-
// getMessage: async (chatId, mid) => {
|
|
10
|
-
// const msg = (await messages.select([{ chat_id: chatId }, AND, { mid }]))[0];
|
|
11
|
-
// return msg;
|
|
12
|
-
// },
|
|
13
|
-
// setMessage: async (chatId, msg) => {
|
|
14
|
-
// // Nao implementa pois ja registra as mensagens nos eventos message_received e message_sent
|
|
15
|
-
// }
|
|
16
|
-
}
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
client.on(ClientEvent.STATUS_CHANGE, async (status) => {
|
|
20
|
-
console.log(new Date().toLocaleDateString('pt-br'), `[${sessionId}] Status alterado para: ${status}`);
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
client.on(ClientEvent.PAIRING_CODE, async ({ qr }) => {
|
|
24
|
-
console.log(new Date().toLocaleDateString('pt-br'), `[${sessionId}] QR Code recebido. Enviando via webhook...`);
|
|
25
|
-
const base64 = await QRCode.toDataURL(qr);
|
|
26
|
-
client.qrCodeAttempts = (client.qrCodeAttempts || 0) + 1;
|
|
27
|
-
client.qrCode = { base64, url: qr, attempts: client.qrCodeAttempts, status: 'waiting' };
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
client.on(ClientEvent.PAIRING_SUCCESS, async (event) => {
|
|
31
|
-
console.log(new Date().toLocaleDateString('pt-br'), `[${sessionId}] QR Code lido com sucesso. Enviando via webhook...`);
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
client.on(ClientEvent.CONNECTED, async () => {
|
|
35
|
-
console.log(new Date().toLocaleDateString('pt-br'), `[${sessionId}] Conectado com sucesso.`);
|
|
36
|
-
client.qrCode = null; // Limpa o QR code após a conexão
|
|
37
|
-
|
|
38
|
-
// Envia mensagem de boas-vindas usando o novo handler
|
|
39
|
-
const user = client.sock.user;
|
|
40
|
-
const welcomeMessage = `🤖 Olá, ${user.name || 'usuário'}!\nSua sessão (${sessionId}) foi conectada com sucesso.`;
|
|
41
|
-
await client.messages.sendTextMessage(user.id, welcomeMessage);
|
|
42
|
-
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
client.on(ClientEvent.DISCONNECTED, async (reason) => {
|
|
46
|
-
console.log(new Date().toLocaleDateString('pt-br'), `[${sessionId}] Desconectado. Motivo: ${reason.statusType}`, reason.details || '');
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
client.on(ClientEvent.MESSAGE_RECEIVED, async (msg) => {
|
|
50
|
-
console.log(new Date().toLocaleDateString('pt-br'), `[${sessionId}] Mensagem recebida de ${msg.from}`);
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
client.on(ClientEvent.MESSAGE_SENT, async (msg) => {
|
|
54
|
-
console.log(new Date().toLocaleDateString('pt-br'), `[${sessionId}] Mensagem enviada para ${msg.to}`);
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
client.on(ClientEvent.CALL, async (call) => {
|
|
58
|
-
console.log(new Date().toLocaleDateString('pt-br'), `[${sessionId}] Chamada recebida de ${call.from}`);
|
|
59
|
-
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
client.on(ClientEvent.ERROR, (error) => {
|
|
63
|
-
console.error(new Date().toLocaleDateString('pt-br'), `[${sessionId}] Ocorreu um erro na instância do cliente:`, error, error?.lastDisconnect?.output);
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
// Inicia a conexão
|
|
68
|
-
await client.connect();
|
package/tests/desktop.ini
DELETED
|
Binary file
|
package/types/desktop.ini
DELETED
|
Binary file
|
package/utils/desktop.ini
DELETED
|
Binary file
|