trompot 1.6.5 → 1.6.7

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.
@@ -0,0 +1,216 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ContactIdHelper = void 0;
4
+ /**
5
+ * 🎯 CONTACT ID HELPER
6
+ *
7
+ * Utilitário para identificar e manipular diferentes tipos de IDs do WhatsApp
8
+ *
9
+ * Tipos suportados:
10
+ * - LID: Local ID (identificador criptografado) - Ex: "7812579066017@lid"
11
+ * - PN: Phone Number JID (formato antigo) - Ex: "5511999999999@s.whatsapp.net"
12
+ * - Group: ID de grupo - Ex: "120363XXXXX@g.us"
13
+ * - Broadcast: Lista de transmissão - Ex: "XXXXX@broadcast"
14
+ * - Newsletter: Canal - Ex: "XXXXX@newsletter"
15
+ *
16
+ * @since Baileys v7 - LID é o formato PREFERIDO e mais confiável
17
+ */
18
+ class ContactIdHelper {
19
+ /**
20
+ * Verifica se é um LID (Local ID)
21
+ *
22
+ * @example
23
+ * ContactIdHelper.isLID("7812579066017@lid") // true
24
+ * ContactIdHelper.isLID("5511999999999@s.whatsapp.net") // false
25
+ */
26
+ static isLID(id) {
27
+ return (id === null || id === void 0 ? void 0 : id.endsWith('@lid')) || (id === null || id === void 0 ? void 0 : id.endsWith('@hosted.lid')) || false;
28
+ }
29
+ /**
30
+ * Verifica se é um PN (Phone Number JID)
31
+ *
32
+ * @example
33
+ * ContactIdHelper.isPN("5511999999999@s.whatsapp.net") // true
34
+ * ContactIdHelper.isPN("7812579066017@lid") // false
35
+ */
36
+ static isPN(id) {
37
+ return (id === null || id === void 0 ? void 0 : id.endsWith('@s.whatsapp.net')) || (id === null || id === void 0 ? void 0 : id.endsWith('@hosted')) || false;
38
+ }
39
+ /**
40
+ * Verifica se é um ID de grupo
41
+ */
42
+ static isGroup(id) {
43
+ return (id === null || id === void 0 ? void 0 : id.endsWith('@g.us')) || false;
44
+ }
45
+ /**
46
+ * Verifica se é uma lista de transmissão
47
+ */
48
+ static isBroadcast(id) {
49
+ return (id === null || id === void 0 ? void 0 : id.endsWith('@broadcast')) || false;
50
+ }
51
+ /**
52
+ * Verifica se é um canal (newsletter)
53
+ */
54
+ static isNewsletter(id) {
55
+ return (id === null || id === void 0 ? void 0 : id.endsWith('@newsletter')) || false;
56
+ }
57
+ /**
58
+ * Verifica se é um contato individual (LID ou PN)
59
+ */
60
+ static isUser(id) {
61
+ return this.isLID(id) || this.isPN(id);
62
+ }
63
+ /**
64
+ * Retorna o tipo do ID
65
+ */
66
+ static getIdType(id) {
67
+ if (this.isLID(id))
68
+ return 'lid';
69
+ if (this.isPN(id))
70
+ return 'pn';
71
+ if (this.isGroup(id))
72
+ return 'group';
73
+ if (this.isBroadcast(id))
74
+ return 'broadcast';
75
+ if (this.isNewsletter(id))
76
+ return 'newsletter';
77
+ return 'unknown';
78
+ }
79
+ /**
80
+ * Extrai o número de telefone de um PN format
81
+ *
82
+ * @example
83
+ * ContactIdHelper.extractPhoneFromPN("5511999999999@s.whatsapp.net")
84
+ * // "5511999999999"
85
+ */
86
+ static extractPhoneFromPN(pn) {
87
+ if (!this.isPN(pn))
88
+ return null;
89
+ return pn.replace('@s.whatsapp.net', '').replace('@hosted', '');
90
+ }
91
+ /**
92
+ * Extrai o LID number (parte antes do @)
93
+ *
94
+ * @example
95
+ * ContactIdHelper.extractLIDNumber("7812579066017@lid")
96
+ * // "7812579066017"
97
+ */
98
+ static extractLIDNumber(lid) {
99
+ if (!this.isLID(lid))
100
+ return null;
101
+ return lid.replace('@lid', '').replace('@hosted.lid', '');
102
+ }
103
+ /**
104
+ * Normaliza um ID removendo device ID e mantendo só user ID
105
+ *
106
+ * @example
107
+ * ContactIdHelper.normalizeId("5511999999999:10@s.whatsapp.net")
108
+ * // "5511999999999@s.whatsapp.net"
109
+ */
110
+ static normalizeId(id) {
111
+ if (!id)
112
+ return id;
113
+ // Remove device ID (formato: user:device@domain)
114
+ const parts = id.split('@');
115
+ if (parts.length !== 2)
116
+ return id;
117
+ const [userPart, domain] = parts;
118
+ const user = userPart.split(':')[0]; // Remove device ID
119
+ return `${user}@${domain}`;
120
+ }
121
+ /**
122
+ * Formata um phoneNumber para PN JID
123
+ *
124
+ * @example
125
+ * ContactIdHelper.formatToPN("5511999999999")
126
+ * // "5511999999999@s.whatsapp.net"
127
+ */
128
+ static formatToPN(phoneNumber) {
129
+ if (phoneNumber.includes('@')) {
130
+ return phoneNumber; // Já está formatado
131
+ }
132
+ return `${phoneNumber}@s.whatsapp.net`;
133
+ }
134
+ /**
135
+ * Retorna o ID preferido para uso
136
+ * Baileys v7: LID é PREFERIDO sobre PN
137
+ *
138
+ * @param lidId - LID se disponível
139
+ * @param pnId - PN se disponível
140
+ * @returns ID preferido (LID > PN)
141
+ */
142
+ static getPreferredId(lidId, pnId) {
143
+ // Baileys v7: LID é mais confiável
144
+ if (lidId && this.isLID(lidId))
145
+ return lidId;
146
+ if (pnId && this.isPN(pnId))
147
+ return pnId;
148
+ // Fallback para qualquer ID válido
149
+ return lidId || pnId || null;
150
+ }
151
+ /**
152
+ * Verifica se dois IDs representam o mesmo usuário
153
+ * Útil para comparar LID ↔ PN do mesmo contato
154
+ */
155
+ static isSameUser(id1, id2) {
156
+ if (!id1 || !id2)
157
+ return false;
158
+ // Mesmos IDs = mesmo usuário
159
+ if (this.normalizeId(id1) === this.normalizeId(id2)) {
160
+ return true;
161
+ }
162
+ // Para LID ↔ PN: não podemos determinar sem mapeamento
163
+ // Retorna false por segurança
164
+ return false;
165
+ }
166
+ /**
167
+ * Valida se um ID está no formato correto
168
+ */
169
+ static isValidId(id) {
170
+ if (!id || typeof id !== 'string')
171
+ return false;
172
+ return this.isLID(id) ||
173
+ this.isPN(id) ||
174
+ this.isGroup(id) ||
175
+ this.isBroadcast(id) ||
176
+ this.isNewsletter(id);
177
+ }
178
+ /**
179
+ * Extrai informações detalhadas de um ID
180
+ */
181
+ static parseId(id) {
182
+ const type = this.getIdType(id);
183
+ if (!this.isValidId(id)) {
184
+ return {
185
+ type: 'unknown',
186
+ user: null,
187
+ device: null,
188
+ domain: null,
189
+ isValid: false
190
+ };
191
+ }
192
+ const parts = id.split('@');
193
+ if (parts.length !== 2) {
194
+ return {
195
+ type: 'unknown',
196
+ user: null,
197
+ device: null,
198
+ domain: null,
199
+ isValid: false
200
+ };
201
+ }
202
+ const [userPart, domain] = parts;
203
+ const userDeviceParts = userPart.split(':');
204
+ const user = userDeviceParts[0];
205
+ const device = userDeviceParts.length > 1 ? parseInt(userDeviceParts[1], 10) : null;
206
+ return {
207
+ type,
208
+ user,
209
+ device,
210
+ domain,
211
+ isValid: true
212
+ };
213
+ }
214
+ }
215
+ exports.ContactIdHelper = ContactIdHelper;
216
+ //# sourceMappingURL=ContactIdHelper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContactIdHelper.js","sourceRoot":"","sources":["../../../src/wa/utils/ContactIdHelper.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "trompot",
3
- "version": "1.6.5",
3
+ "version": "1.6.7",
4
4
  "description": "Chatbot API multi-plataforma em TypeScript. Fork do Trompot.",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",
@@ -9,6 +9,14 @@
9
9
  "cluster": "ts-node-dev example/cluster.ts",
10
10
  "telegram": "ts-node-dev example/telegram.ts",
11
11
  "test": "ts-node example/test-refactoring.ts",
12
+ "test:proactive": "ts-node example/test-send-proactive-whatsapp.ts",
13
+ "test:bulk": "ts-node example/test-bulk-notifications-whatsapp.ts",
14
+ "test:convert-lid": "ts-node example/test-convert-lid-to-jid.ts",
15
+ "test:stable-id": "ts-node example/test-stable-user-id.ts",
16
+ "test:perfect": "ts-node example/test-perfect-contact-system.ts",
17
+ "test:force-contact": "ts-node example/test-force-contact-verification.ts",
18
+ "test:complete": "ts-node example/test-complete-whatsapp-methods.ts",
19
+ "test:connection": "ts-node example/test-connection-debug.ts",
12
20
  "build": "npm i && npm run clean && tsc",
13
21
  "clean": "rimraf lib",
14
22
  "lint": "eslint ."