@arcaelas/whatsapp 3.1.1 → 3.2.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/build/cjs/_index.d.ts +14 -0
- package/build/cjs/_index.js +346 -0
- package/build/cjs/_index.js.map +1 -0
- package/build/cjs/decorators.d.ts +9 -0
- package/build/cjs/decorators.js +26 -0
- package/build/cjs/decorators.js.map +1 -0
- package/build/cjs/index.d.ts +11 -0
- package/build/cjs/index.js +21 -0
- package/build/cjs/index.js.map +1 -0
- package/build/cjs/lib/bot/decorator.d.ts +77 -0
- package/build/cjs/lib/bot/decorator.js +219 -0
- package/build/cjs/lib/bot/decorator.js.map +1 -0
- package/build/cjs/lib/bot/decorators.d.ts +113 -0
- package/build/cjs/lib/bot/decorators.js +253 -0
- package/build/cjs/lib/bot/decorators.js.map +1 -0
- package/build/cjs/lib/bot/index.d.ts +3 -0
- package/build/cjs/lib/bot/index.js +20 -0
- package/build/cjs/lib/bot/index.js.map +1 -0
- package/build/cjs/lib/chat/index.d.ts +260 -0
- package/build/cjs/lib/chat/index.js +341 -0
- package/build/cjs/lib/chat/index.js.map +1 -0
- package/build/cjs/lib/contact/index.d.ts +203 -0
- package/build/cjs/lib/contact/index.js +226 -0
- package/build/cjs/lib/contact/index.js.map +1 -0
- package/build/cjs/lib/message/index.d.ts +277 -0
- package/build/cjs/lib/message/index.js +767 -0
- package/build/cjs/lib/message/index.js.map +1 -0
- package/build/cjs/lib/status/index.d.ts +85 -0
- package/build/cjs/lib/status/index.js +137 -0
- package/build/cjs/lib/status/index.js.map +1 -0
- package/build/cjs/lib/store/engine/index.d.ts +34 -0
- package/build/cjs/lib/store/engine/index.js +13 -0
- package/build/cjs/lib/store/engine/index.js.map +1 -0
- package/build/cjs/lib/store/engine/lib/file_system/index.d.ts +56 -0
- package/build/cjs/lib/store/engine/lib/file_system/index.js +160 -0
- package/build/cjs/lib/store/engine/lib/file_system/index.js.map +1 -0
- package/build/cjs/lib/store/engine/lib/redis/index.d.ts +82 -0
- package/build/cjs/lib/store/engine/lib/redis/index.js +132 -0
- package/build/cjs/lib/store/engine/lib/redis/index.js.map +1 -0
- package/build/cjs/lib/store/index.d.ts +22 -0
- package/build/cjs/lib/store/index.js +38 -0
- package/build/cjs/lib/store/index.js.map +1 -0
- package/build/cjs/lib/whatsapp/index.d.ts +185 -0
- package/build/cjs/lib/whatsapp/index.js +870 -0
- package/build/cjs/lib/whatsapp/index.js.map +1 -0
- package/build/cjs/package.json +1 -0
- package/build/esm/_index.d.ts +14 -0
- package/build/esm/_index.js +344 -0
- package/build/esm/_index.js.map +1 -0
- package/build/esm/decorators.d.ts +9 -0
- package/build/esm/decorators.js +9 -0
- package/build/esm/decorators.js.map +1 -0
- package/build/esm/index.d.ts +11 -0
- package/build/esm/index.js +9 -0
- package/build/esm/index.js.map +1 -0
- package/build/esm/lib/bot/decorator.d.ts +77 -0
- package/build/esm/lib/bot/decorator.js +210 -0
- package/build/esm/lib/bot/decorator.js.map +1 -0
- package/build/esm/lib/bot/decorators.d.ts +113 -0
- package/build/esm/lib/bot/decorators.js +242 -0
- package/build/esm/lib/bot/decorators.js.map +1 -0
- package/build/esm/lib/bot/index.d.ts +3 -0
- package/build/esm/lib/bot/index.js +3 -0
- package/build/esm/lib/bot/index.js.map +1 -0
- package/build/esm/lib/chat/index.d.ts +260 -0
- package/build/esm/lib/chat/index.js +336 -0
- package/build/esm/lib/chat/index.js.map +1 -0
- package/build/esm/lib/contact/index.d.ts +203 -0
- package/build/esm/lib/contact/index.js +221 -0
- package/build/esm/lib/contact/index.js.map +1 -0
- package/build/esm/lib/message/index.d.ts +277 -0
- package/build/esm/lib/message/index.js +755 -0
- package/build/esm/lib/message/index.js.map +1 -0
- package/build/esm/lib/status/index.d.ts +85 -0
- package/build/esm/lib/status/index.js +133 -0
- package/build/esm/lib/status/index.js.map +1 -0
- package/build/esm/lib/store/engine/index.d.ts +34 -0
- package/build/esm/lib/store/engine/index.js +8 -0
- package/build/esm/lib/store/engine/index.js.map +1 -0
- package/build/esm/lib/store/engine/lib/file_system/index.d.ts +56 -0
- package/build/esm/lib/store/engine/lib/file_system/index.js +156 -0
- package/build/esm/lib/store/engine/lib/file_system/index.js.map +1 -0
- package/build/esm/lib/store/engine/lib/redis/index.d.ts +82 -0
- package/build/esm/lib/store/engine/lib/redis/index.js +128 -0
- package/build/esm/lib/store/engine/lib/redis/index.js.map +1 -0
- package/build/esm/lib/store/index.d.ts +22 -0
- package/build/esm/lib/store/index.js +31 -0
- package/build/esm/lib/store/index.js.map +1 -0
- package/build/esm/lib/whatsapp/index.d.ts +185 -0
- package/build/esm/lib/whatsapp/index.js +830 -0
- package/build/esm/lib/whatsapp/index.js.map +1 -0
- package/build/esm/package.json +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file chat/index.ts
|
|
3
|
+
* @description Entidad Chat — conversaciones individuales y grupales.
|
|
4
|
+
* Chat entity — individual and group conversations.
|
|
5
|
+
*/
|
|
6
|
+
import type { Message } from '../../lib/message';
|
|
7
|
+
import type { WhatsApp } from '../../lib/whatsapp';
|
|
8
|
+
/**
|
|
9
|
+
* Participante de grupo.
|
|
10
|
+
* Group participant.
|
|
11
|
+
*/
|
|
12
|
+
export interface GroupParticipant {
|
|
13
|
+
id: string;
|
|
14
|
+
admin: string | null;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Shape persistido del chat (snake_case).
|
|
18
|
+
* Persisted chat shape (snake_case).
|
|
19
|
+
*/
|
|
20
|
+
export interface IChatRaw {
|
|
21
|
+
id: string;
|
|
22
|
+
name?: string | null;
|
|
23
|
+
display_name?: string | null;
|
|
24
|
+
description?: string | null;
|
|
25
|
+
unread_count?: number | null;
|
|
26
|
+
read_only?: boolean | null;
|
|
27
|
+
archived?: boolean | null;
|
|
28
|
+
pinned?: number | null;
|
|
29
|
+
mute_end_time?: number | null;
|
|
30
|
+
marked_as_unread?: boolean | null;
|
|
31
|
+
participants?: GroupParticipant[] | null;
|
|
32
|
+
created_by?: string | null;
|
|
33
|
+
created_at?: number | null;
|
|
34
|
+
ephemeral_expiration?: number | null;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Clase base del chat (forma pública, solo lectura).
|
|
38
|
+
* Base Chat class (public shape, read-only).
|
|
39
|
+
*/
|
|
40
|
+
export declare class Chat {
|
|
41
|
+
/** @internal Shape persistido. Uso interno. / Internal persisted shape. */
|
|
42
|
+
readonly _raw: IChatRaw;
|
|
43
|
+
constructor(raw: IChatRaw);
|
|
44
|
+
/** JID del chat. / Chat JID. */
|
|
45
|
+
get id(): string;
|
|
46
|
+
/** CID (alias). / CID (alias). */
|
|
47
|
+
get cid(): string;
|
|
48
|
+
/** Tipo: contact o group. / Type: contact or group. */
|
|
49
|
+
get type(): 'contact' | 'group';
|
|
50
|
+
/** Nombre del chat. / Chat name. */
|
|
51
|
+
get name(): string;
|
|
52
|
+
/** Descripción del grupo. / Group description. */
|
|
53
|
+
get content(): string;
|
|
54
|
+
/** Si está fijado. / Whether it's pinned. */
|
|
55
|
+
get pinned(): boolean;
|
|
56
|
+
/** Si está archivado. / Whether it's archived. */
|
|
57
|
+
get archived(): boolean;
|
|
58
|
+
/** true si el chat está silenciado y el silencio aún no expira. / true if chat is muted and the mute has not expired. */
|
|
59
|
+
get muted(): boolean;
|
|
60
|
+
/** Si está leído. / Whether it's read. */
|
|
61
|
+
get read(): boolean;
|
|
62
|
+
/** Si es solo lectura. / Whether it's read-only. */
|
|
63
|
+
get readonly(): boolean;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Factoría de Chat ligada al contexto WhatsApp.
|
|
67
|
+
* Context-bound Chat factory.
|
|
68
|
+
*
|
|
69
|
+
* @param wa - Instancia principal / Main WhatsApp instance
|
|
70
|
+
*/
|
|
71
|
+
export declare function chat(wa: WhatsApp): {
|
|
72
|
+
new (raw: IChatRaw): {
|
|
73
|
+
/** @internal Cache TTL (15s) de la promesa de participants del grupo. Evita round-trips a `groupMetadata` y deduplica llamadas concurrentes. */
|
|
74
|
+
_members_cache: Promise<{
|
|
75
|
+
id: string;
|
|
76
|
+
}[]> | null;
|
|
77
|
+
/** Re-hidrata metadata del chat desde el socket. / Re-hydrates chat metadata from the socket. */
|
|
78
|
+
refresh(): Promise</*elided*/ any | null>;
|
|
79
|
+
/** Fija/desfija el chat. / Pins or unpins the chat. */
|
|
80
|
+
pin(value: boolean): Promise<boolean>;
|
|
81
|
+
/** Archiva/desarchiva el chat. / Archives or unarchives the chat. */
|
|
82
|
+
archive(value: boolean): Promise<boolean>;
|
|
83
|
+
/** Silencia/des-silencia el chat. / Mutes or unmutes the chat. */
|
|
84
|
+
mute(value: boolean): Promise<boolean>;
|
|
85
|
+
/** Marca todos los mensajes del chat como leídos. / Marks all chat messages as read. */
|
|
86
|
+
seen(): Promise<boolean>;
|
|
87
|
+
/** Toggle "Escribiendo...". / Toggles the "typing..." indicator. */
|
|
88
|
+
typing(on: boolean): Promise<boolean>;
|
|
89
|
+
/** Toggle "Grabando audio...". / Toggles the "recording audio..." indicator. */
|
|
90
|
+
recording(on: boolean): Promise<boolean>;
|
|
91
|
+
/** Vacía mensajes del chat (engine local). / Clears chat messages (local engine). */
|
|
92
|
+
clear(): Promise<boolean>;
|
|
93
|
+
/** Elimina el chat y sus mensajes (remoto + local). / Deletes the chat and its messages (remote + local). */
|
|
94
|
+
delete(): Promise<boolean>;
|
|
95
|
+
/**
|
|
96
|
+
* Participantes del chat paginados (incluyéndome en grupos). Para grupos,
|
|
97
|
+
* el `groupMetadata` se memoiza en la instancia con TTL de 15s para evitar
|
|
98
|
+
* round-trips repetidos al socket.
|
|
99
|
+
* Chat participants paginated (self included in groups). For groups,
|
|
100
|
+
* `groupMetadata` is memoized on the instance with a 15s TTL to avoid
|
|
101
|
+
* repeated socket round-trips.
|
|
102
|
+
*/
|
|
103
|
+
members(offset?: number, limit?: number): Promise<InstanceType<typeof wa.Contact>[]>;
|
|
104
|
+
/** Mensajes del chat paginados por mtime DESC. / Chat messages paginated by mtime DESC. */
|
|
105
|
+
messages(offset?: number, limit?: number): Promise<Message[]>;
|
|
106
|
+
/** @internal Shape persistido. Uso interno. / Internal persisted shape. */
|
|
107
|
+
readonly _raw: IChatRaw;
|
|
108
|
+
/** JID del chat. / Chat JID. */
|
|
109
|
+
get id(): string;
|
|
110
|
+
/** CID (alias). / CID (alias). */
|
|
111
|
+
get cid(): string;
|
|
112
|
+
/** Tipo: contact o group. / Type: contact or group. */
|
|
113
|
+
get type(): "contact" | "group";
|
|
114
|
+
/** Nombre del chat. / Chat name. */
|
|
115
|
+
get name(): string;
|
|
116
|
+
/** Descripción del grupo. / Group description. */
|
|
117
|
+
get content(): string;
|
|
118
|
+
/** Si está fijado. / Whether it's pinned. */
|
|
119
|
+
get pinned(): boolean;
|
|
120
|
+
/** Si está archivado. / Whether it's archived. */
|
|
121
|
+
get archived(): boolean;
|
|
122
|
+
/** true si el chat está silenciado y el silencio aún no expira. / true if chat is muted and the mute has not expired. */
|
|
123
|
+
get muted(): boolean;
|
|
124
|
+
/** Si está leído. / Whether it's read. */
|
|
125
|
+
get read(): boolean;
|
|
126
|
+
/** Si es solo lectura. / Whether it's read-only. */
|
|
127
|
+
get readonly(): boolean;
|
|
128
|
+
};
|
|
129
|
+
/**
|
|
130
|
+
* Obtiene un chat por CID. Si no está persistido, lo crea a partir del contacto.
|
|
131
|
+
* Retrieves a chat by CID. If not persisted, creates it from the contact.
|
|
132
|
+
*/
|
|
133
|
+
get(cid: string): Promise<{
|
|
134
|
+
/** @internal Cache TTL (15s) de la promesa de participants del grupo. Evita round-trips a `groupMetadata` y deduplica llamadas concurrentes. */
|
|
135
|
+
_members_cache: Promise<{
|
|
136
|
+
id: string;
|
|
137
|
+
}[]> | null;
|
|
138
|
+
/** Re-hidrata metadata del chat desde el socket. / Re-hydrates chat metadata from the socket. */
|
|
139
|
+
refresh(): Promise</*elided*/ any | null>;
|
|
140
|
+
/** Fija/desfija el chat. / Pins or unpins the chat. */
|
|
141
|
+
pin(value: boolean): Promise<boolean>;
|
|
142
|
+
/** Archiva/desarchiva el chat. / Archives or unarchives the chat. */
|
|
143
|
+
archive(value: boolean): Promise<boolean>;
|
|
144
|
+
/** Silencia/des-silencia el chat. / Mutes or unmutes the chat. */
|
|
145
|
+
mute(value: boolean): Promise<boolean>;
|
|
146
|
+
/** Marca todos los mensajes del chat como leídos. / Marks all chat messages as read. */
|
|
147
|
+
seen(): Promise<boolean>;
|
|
148
|
+
/** Toggle "Escribiendo...". / Toggles the "typing..." indicator. */
|
|
149
|
+
typing(on: boolean): Promise<boolean>;
|
|
150
|
+
/** Toggle "Grabando audio...". / Toggles the "recording audio..." indicator. */
|
|
151
|
+
recording(on: boolean): Promise<boolean>;
|
|
152
|
+
/** Vacía mensajes del chat (engine local). / Clears chat messages (local engine). */
|
|
153
|
+
clear(): Promise<boolean>;
|
|
154
|
+
/** Elimina el chat y sus mensajes (remoto + local). / Deletes the chat and its messages (remote + local). */
|
|
155
|
+
delete(): Promise<boolean>;
|
|
156
|
+
/**
|
|
157
|
+
* Participantes del chat paginados (incluyéndome en grupos). Para grupos,
|
|
158
|
+
* el `groupMetadata` se memoiza en la instancia con TTL de 15s para evitar
|
|
159
|
+
* round-trips repetidos al socket.
|
|
160
|
+
* Chat participants paginated (self included in groups). For groups,
|
|
161
|
+
* `groupMetadata` is memoized on the instance with a 15s TTL to avoid
|
|
162
|
+
* repeated socket round-trips.
|
|
163
|
+
*/
|
|
164
|
+
members(offset?: number, limit?: number): Promise<InstanceType<typeof wa.Contact>[]>;
|
|
165
|
+
/** Mensajes del chat paginados por mtime DESC. / Chat messages paginated by mtime DESC. */
|
|
166
|
+
messages(offset?: number, limit?: number): Promise<Message[]>;
|
|
167
|
+
/** @internal Shape persistido. Uso interno. / Internal persisted shape. */
|
|
168
|
+
readonly _raw: IChatRaw;
|
|
169
|
+
/** JID del chat. / Chat JID. */
|
|
170
|
+
get id(): string;
|
|
171
|
+
/** CID (alias). / CID (alias). */
|
|
172
|
+
get cid(): string;
|
|
173
|
+
/** Tipo: contact o group. / Type: contact or group. */
|
|
174
|
+
get type(): "contact" | "group";
|
|
175
|
+
/** Nombre del chat. / Chat name. */
|
|
176
|
+
get name(): string;
|
|
177
|
+
/** Descripción del grupo. / Group description. */
|
|
178
|
+
get content(): string;
|
|
179
|
+
/** Si está fijado. / Whether it's pinned. */
|
|
180
|
+
get pinned(): boolean;
|
|
181
|
+
/** Si está archivado. / Whether it's archived. */
|
|
182
|
+
get archived(): boolean;
|
|
183
|
+
/** true si el chat está silenciado y el silencio aún no expira. / true if chat is muted and the mute has not expired. */
|
|
184
|
+
get muted(): boolean;
|
|
185
|
+
/** Si está leído. / Whether it's read. */
|
|
186
|
+
get read(): boolean;
|
|
187
|
+
/** Si es solo lectura. / Whether it's read-only. */
|
|
188
|
+
get readonly(): boolean;
|
|
189
|
+
} | null>;
|
|
190
|
+
/** Pagina los chats persistidos por mtime DESC. / Paginates persisted chats by mtime DESC. */
|
|
191
|
+
list(offset?: number, limit?: number): Promise<{
|
|
192
|
+
/** @internal Cache TTL (15s) de la promesa de participants del grupo. Evita round-trips a `groupMetadata` y deduplica llamadas concurrentes. */
|
|
193
|
+
_members_cache: Promise<{
|
|
194
|
+
id: string;
|
|
195
|
+
}[]> | null;
|
|
196
|
+
/** Re-hidrata metadata del chat desde el socket. / Re-hydrates chat metadata from the socket. */
|
|
197
|
+
refresh(): Promise</*elided*/ any | null>;
|
|
198
|
+
/** Fija/desfija el chat. / Pins or unpins the chat. */
|
|
199
|
+
pin(value: boolean): Promise<boolean>;
|
|
200
|
+
/** Archiva/desarchiva el chat. / Archives or unarchives the chat. */
|
|
201
|
+
archive(value: boolean): Promise<boolean>;
|
|
202
|
+
/** Silencia/des-silencia el chat. / Mutes or unmutes the chat. */
|
|
203
|
+
mute(value: boolean): Promise<boolean>;
|
|
204
|
+
/** Marca todos los mensajes del chat como leídos. / Marks all chat messages as read. */
|
|
205
|
+
seen(): Promise<boolean>;
|
|
206
|
+
/** Toggle "Escribiendo...". / Toggles the "typing..." indicator. */
|
|
207
|
+
typing(on: boolean): Promise<boolean>;
|
|
208
|
+
/** Toggle "Grabando audio...". / Toggles the "recording audio..." indicator. */
|
|
209
|
+
recording(on: boolean): Promise<boolean>;
|
|
210
|
+
/** Vacía mensajes del chat (engine local). / Clears chat messages (local engine). */
|
|
211
|
+
clear(): Promise<boolean>;
|
|
212
|
+
/** Elimina el chat y sus mensajes (remoto + local). / Deletes the chat and its messages (remote + local). */
|
|
213
|
+
delete(): Promise<boolean>;
|
|
214
|
+
/**
|
|
215
|
+
* Participantes del chat paginados (incluyéndome en grupos). Para grupos,
|
|
216
|
+
* el `groupMetadata` se memoiza en la instancia con TTL de 15s para evitar
|
|
217
|
+
* round-trips repetidos al socket.
|
|
218
|
+
* Chat participants paginated (self included in groups). For groups,
|
|
219
|
+
* `groupMetadata` is memoized on the instance with a 15s TTL to avoid
|
|
220
|
+
* repeated socket round-trips.
|
|
221
|
+
*/
|
|
222
|
+
members(offset?: number, limit?: number): Promise<InstanceType<typeof wa.Contact>[]>;
|
|
223
|
+
/** Mensajes del chat paginados por mtime DESC. / Chat messages paginated by mtime DESC. */
|
|
224
|
+
messages(offset?: number, limit?: number): Promise<Message[]>;
|
|
225
|
+
/** @internal Shape persistido. Uso interno. / Internal persisted shape. */
|
|
226
|
+
readonly _raw: IChatRaw;
|
|
227
|
+
/** JID del chat. / Chat JID. */
|
|
228
|
+
get id(): string;
|
|
229
|
+
/** CID (alias). / CID (alias). */
|
|
230
|
+
get cid(): string;
|
|
231
|
+
/** Tipo: contact o group. / Type: contact or group. */
|
|
232
|
+
get type(): "contact" | "group";
|
|
233
|
+
/** Nombre del chat. / Chat name. */
|
|
234
|
+
get name(): string;
|
|
235
|
+
/** Descripción del grupo. / Group description. */
|
|
236
|
+
get content(): string;
|
|
237
|
+
/** Si está fijado. / Whether it's pinned. */
|
|
238
|
+
get pinned(): boolean;
|
|
239
|
+
/** Si está archivado. / Whether it's archived. */
|
|
240
|
+
get archived(): boolean;
|
|
241
|
+
/** true si el chat está silenciado y el silencio aún no expira. / true if chat is muted and the mute has not expired. */
|
|
242
|
+
get muted(): boolean;
|
|
243
|
+
/** Si está leído. / Whether it's read. */
|
|
244
|
+
get read(): boolean;
|
|
245
|
+
/** Si es solo lectura. / Whether it's read-only. */
|
|
246
|
+
get readonly(): boolean;
|
|
247
|
+
}[]>;
|
|
248
|
+
/** Fija/desfija un chat por CID. / Pins or unpins a chat by CID. */
|
|
249
|
+
pin(cid: string, value: boolean): Promise<boolean>;
|
|
250
|
+
/** Archiva/desarchiva un chat por CID. / Archives or unarchives a chat by CID. */
|
|
251
|
+
archive(cid: string, value: boolean): Promise<boolean>;
|
|
252
|
+
/** Silencia/des-silencia un chat por CID. / Mutes or unmutes a chat by CID. */
|
|
253
|
+
mute(cid: string, value: boolean): Promise<boolean>;
|
|
254
|
+
/** Marca todos los mensajes del chat como leídos. / Marks all chat messages as read. */
|
|
255
|
+
seen(cid: string): Promise<boolean>;
|
|
256
|
+
/** Vacía mensajes del chat (local). / Clears the chat's messages (local only). */
|
|
257
|
+
clear(cid: string): Promise<boolean>;
|
|
258
|
+
/** Elimina el chat y sus mensajes. / Deletes the chat and its messages. */
|
|
259
|
+
delete(cid: string): Promise<boolean>;
|
|
260
|
+
};
|
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @file chat/index.ts
|
|
4
|
+
* @description Entidad Chat — conversaciones individuales y grupales.
|
|
5
|
+
* Chat entity — individual and group conversations.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.Chat = void 0;
|
|
9
|
+
exports.chat = chat;
|
|
10
|
+
const store_1 = require("../../lib/store");
|
|
11
|
+
/**
|
|
12
|
+
* Duración usada cuando `chat.mute(true)` silencia "siempre".
|
|
13
|
+
* Duration used when `chat.mute(true)` means "mute forever".
|
|
14
|
+
*/
|
|
15
|
+
const MUTE_FOREVER_MS = 365 * 100 * 24 * 3_600 * 1_000;
|
|
16
|
+
/**
|
|
17
|
+
* Clase base del chat (forma pública, solo lectura).
|
|
18
|
+
* Base Chat class (public shape, read-only).
|
|
19
|
+
*/
|
|
20
|
+
class Chat {
|
|
21
|
+
constructor(raw) {
|
|
22
|
+
this._raw = raw;
|
|
23
|
+
}
|
|
24
|
+
/** JID del chat. / Chat JID. */
|
|
25
|
+
get id() {
|
|
26
|
+
return this._raw.id;
|
|
27
|
+
}
|
|
28
|
+
/** CID (alias). / CID (alias). */
|
|
29
|
+
get cid() {
|
|
30
|
+
return this._raw.id;
|
|
31
|
+
}
|
|
32
|
+
/** Tipo: contact o group. / Type: contact or group. */
|
|
33
|
+
get type() {
|
|
34
|
+
return this._raw.id.endsWith('@g.us') ? 'group' : 'contact';
|
|
35
|
+
}
|
|
36
|
+
/** Nombre del chat. / Chat name. */
|
|
37
|
+
get name() {
|
|
38
|
+
return this._raw.name ?? this._raw.display_name ?? this._raw.id.split('@')[0];
|
|
39
|
+
}
|
|
40
|
+
/** Descripción del grupo. / Group description. */
|
|
41
|
+
get content() {
|
|
42
|
+
return this._raw.description ?? '';
|
|
43
|
+
}
|
|
44
|
+
/** Si está fijado. / Whether it's pinned. */
|
|
45
|
+
get pinned() {
|
|
46
|
+
return this._raw.pinned != null;
|
|
47
|
+
}
|
|
48
|
+
/** Si está archivado. / Whether it's archived. */
|
|
49
|
+
get archived() {
|
|
50
|
+
return this._raw.archived ?? false;
|
|
51
|
+
}
|
|
52
|
+
/** true si el chat está silenciado y el silencio aún no expira. / true if chat is muted and the mute has not expired. */
|
|
53
|
+
get muted() {
|
|
54
|
+
const end = this._raw.mute_end_time;
|
|
55
|
+
return end != null && end > Date.now();
|
|
56
|
+
}
|
|
57
|
+
/** Si está leído. / Whether it's read. */
|
|
58
|
+
get read() {
|
|
59
|
+
return !this._raw.unread_count && !this._raw.marked_as_unread;
|
|
60
|
+
}
|
|
61
|
+
/** Si es solo lectura. / Whether it's read-only. */
|
|
62
|
+
get readonly() {
|
|
63
|
+
return this._raw.read_only ?? false;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
exports.Chat = Chat;
|
|
67
|
+
/**
|
|
68
|
+
* Factoría de Chat ligada al contexto WhatsApp.
|
|
69
|
+
* Context-bound Chat factory.
|
|
70
|
+
*
|
|
71
|
+
* @param wa - Instancia principal / Main WhatsApp instance
|
|
72
|
+
*/
|
|
73
|
+
function chat(wa) {
|
|
74
|
+
/**
|
|
75
|
+
* Obtiene la key del último mensaje para operaciones de chatModify que la requieren.
|
|
76
|
+
* Fetches the last message key required by chatModify operations.
|
|
77
|
+
*/
|
|
78
|
+
async function last_messages(cid) {
|
|
79
|
+
const [raw] = await wa.engine.list(`/chat/${cid}/message`, 0, 1);
|
|
80
|
+
const parsed = (0, store_1.deserialize)(raw ?? null);
|
|
81
|
+
return parsed
|
|
82
|
+
? [
|
|
83
|
+
{
|
|
84
|
+
key: { remoteJid: cid, id: parsed.id, fromMe: parsed.me },
|
|
85
|
+
messageTimestamp: Math.floor(parsed.created_at / 1000),
|
|
86
|
+
},
|
|
87
|
+
]
|
|
88
|
+
: [];
|
|
89
|
+
}
|
|
90
|
+
return class _Chat extends Chat {
|
|
91
|
+
constructor() {
|
|
92
|
+
super(...arguments);
|
|
93
|
+
/** @internal Cache TTL (15s) de la promesa de participants del grupo. Evita round-trips a `groupMetadata` y deduplica llamadas concurrentes. */
|
|
94
|
+
this._members_cache = null;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Obtiene un chat por CID. Si no está persistido, lo crea a partir del contacto.
|
|
98
|
+
* Retrieves a chat by CID. If not persisted, creates it from the contact.
|
|
99
|
+
*/
|
|
100
|
+
static async get(cid) {
|
|
101
|
+
let result = null;
|
|
102
|
+
const jid = await wa._resolve_jid(cid);
|
|
103
|
+
if (jid) {
|
|
104
|
+
const cached = (0, store_1.deserialize)(await wa.engine.get(`/chat/${jid}`));
|
|
105
|
+
if (cached) {
|
|
106
|
+
result = new _Chat(cached);
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
const c = await wa.Contact.get(jid);
|
|
110
|
+
if (c) {
|
|
111
|
+
const raw = { id: jid, name: c.name };
|
|
112
|
+
await wa.engine.set(`/chat/${jid}`, (0, store_1.serialize)(raw));
|
|
113
|
+
result = new _Chat(raw);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return result;
|
|
118
|
+
}
|
|
119
|
+
/** Pagina los chats persistidos por mtime DESC. / Paginates persisted chats by mtime DESC. */
|
|
120
|
+
static async list(offset = 0, limit = 50) {
|
|
121
|
+
const chats = [];
|
|
122
|
+
for (const raw of await wa.engine.list('/chat', offset, limit)) {
|
|
123
|
+
const parsed = (0, store_1.deserialize)(raw);
|
|
124
|
+
if (parsed) {
|
|
125
|
+
chats.push(new _Chat(parsed));
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return chats;
|
|
129
|
+
}
|
|
130
|
+
/** Fija/desfija un chat por CID. / Pins or unpins a chat by CID. */
|
|
131
|
+
static async pin(cid, value) {
|
|
132
|
+
const c = await _Chat.get(cid);
|
|
133
|
+
return c ? c.pin(value) : false;
|
|
134
|
+
}
|
|
135
|
+
/** Archiva/desarchiva un chat por CID. / Archives or unarchives a chat by CID. */
|
|
136
|
+
static async archive(cid, value) {
|
|
137
|
+
const c = await _Chat.get(cid);
|
|
138
|
+
return c ? c.archive(value) : false;
|
|
139
|
+
}
|
|
140
|
+
/** Silencia/des-silencia un chat por CID. / Mutes or unmutes a chat by CID. */
|
|
141
|
+
static async mute(cid, value) {
|
|
142
|
+
const c = await _Chat.get(cid);
|
|
143
|
+
return c ? c.mute(value) : false;
|
|
144
|
+
}
|
|
145
|
+
/** Marca todos los mensajes del chat como leídos. / Marks all chat messages as read. */
|
|
146
|
+
static async seen(cid) {
|
|
147
|
+
const c = await _Chat.get(cid);
|
|
148
|
+
return c ? c.seen() : false;
|
|
149
|
+
}
|
|
150
|
+
/** Vacía mensajes del chat (local). / Clears the chat's messages (local only). */
|
|
151
|
+
static async clear(cid) {
|
|
152
|
+
const c = await _Chat.get(cid);
|
|
153
|
+
return c ? c.clear() : false;
|
|
154
|
+
}
|
|
155
|
+
/** Elimina el chat y sus mensajes. / Deletes the chat and its messages. */
|
|
156
|
+
static async delete(cid) {
|
|
157
|
+
const c = await _Chat.get(cid);
|
|
158
|
+
return c ? c.delete() : false;
|
|
159
|
+
}
|
|
160
|
+
/** Re-hidrata metadata del chat desde el socket. / Re-hydrates chat metadata from the socket. */
|
|
161
|
+
async refresh() {
|
|
162
|
+
let ok = false;
|
|
163
|
+
if (wa._socket) {
|
|
164
|
+
if (this.type === 'group') {
|
|
165
|
+
try {
|
|
166
|
+
const meta = await wa._socket.groupMetadata(this.id);
|
|
167
|
+
this._raw.name = meta.subject;
|
|
168
|
+
this._raw.description = meta.desc ?? null;
|
|
169
|
+
this._raw.participants = meta.participants.map((p) => ({
|
|
170
|
+
id: p.id,
|
|
171
|
+
admin: p.admin ?? null,
|
|
172
|
+
}));
|
|
173
|
+
this._raw.created_by = meta.owner ?? null;
|
|
174
|
+
this._raw.created_at = meta.creation ?? null;
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
/* group metadata may fail */
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
const c = await wa.Contact.get(this.id);
|
|
182
|
+
if (c) {
|
|
183
|
+
await c.refresh();
|
|
184
|
+
this._raw.name = c.name;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
await wa.engine.set(`/chat/${this.id}`, (0, store_1.serialize)(this._raw));
|
|
188
|
+
ok = true;
|
|
189
|
+
}
|
|
190
|
+
return ok ? this : null;
|
|
191
|
+
}
|
|
192
|
+
/** Fija/desfija el chat. / Pins or unpins the chat. */
|
|
193
|
+
async pin(value) {
|
|
194
|
+
let ok = false;
|
|
195
|
+
if (wa._socket) {
|
|
196
|
+
await wa._socket.chatModify({ pin: value, lastMessages: await last_messages(this.id) }, this.id);
|
|
197
|
+
this._raw.pinned = value ? Date.now() : null;
|
|
198
|
+
await wa.engine.set(`/chat/${this.id}`, (0, store_1.serialize)(this._raw));
|
|
199
|
+
ok = true;
|
|
200
|
+
}
|
|
201
|
+
return ok;
|
|
202
|
+
}
|
|
203
|
+
/** Archiva/desarchiva el chat. / Archives or unarchives the chat. */
|
|
204
|
+
async archive(value) {
|
|
205
|
+
let ok = false;
|
|
206
|
+
if (wa._socket) {
|
|
207
|
+
await wa._socket.chatModify({ archive: value, lastMessages: await last_messages(this.id) }, this.id);
|
|
208
|
+
this._raw.archived = value;
|
|
209
|
+
await wa.engine.set(`/chat/${this.id}`, (0, store_1.serialize)(this._raw));
|
|
210
|
+
ok = true;
|
|
211
|
+
}
|
|
212
|
+
return ok;
|
|
213
|
+
}
|
|
214
|
+
/** Silencia/des-silencia el chat. / Mutes or unmutes the chat. */
|
|
215
|
+
async mute(value) {
|
|
216
|
+
let ok = false;
|
|
217
|
+
if (wa._socket) {
|
|
218
|
+
const mute_end = value === true ? Date.now() + MUTE_FOREVER_MS : null;
|
|
219
|
+
await wa._socket.chatModify({ mute: mute_end, lastMessages: await last_messages(this.id) }, this.id);
|
|
220
|
+
this._raw.mute_end_time = mute_end;
|
|
221
|
+
await wa.engine.set(`/chat/${this.id}`, (0, store_1.serialize)(this._raw));
|
|
222
|
+
ok = true;
|
|
223
|
+
}
|
|
224
|
+
return ok;
|
|
225
|
+
}
|
|
226
|
+
/** Marca todos los mensajes del chat como leídos. / Marks all chat messages as read. */
|
|
227
|
+
async seen() {
|
|
228
|
+
let ok = false;
|
|
229
|
+
if (wa._socket) {
|
|
230
|
+
const last = await last_messages(this.id);
|
|
231
|
+
if (last.length > 0) {
|
|
232
|
+
const msg = last[0];
|
|
233
|
+
await wa._socket.readMessages([
|
|
234
|
+
{
|
|
235
|
+
remoteJid: this.id,
|
|
236
|
+
id: msg.key.id,
|
|
237
|
+
participant: msg.key.fromMe ? undefined : msg.key.remoteJid,
|
|
238
|
+
},
|
|
239
|
+
]);
|
|
240
|
+
this._raw.unread_count = 0;
|
|
241
|
+
this._raw.marked_as_unread = false;
|
|
242
|
+
await wa.engine.set(`/chat/${this.id}`, (0, store_1.serialize)(this._raw));
|
|
243
|
+
ok = true;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
return ok;
|
|
247
|
+
}
|
|
248
|
+
/** Toggle "Escribiendo...". / Toggles the "typing..." indicator. */
|
|
249
|
+
async typing(on) {
|
|
250
|
+
let ok = false;
|
|
251
|
+
if (wa._socket) {
|
|
252
|
+
await wa._socket.sendPresenceUpdate(on ? 'composing' : 'paused', this.id);
|
|
253
|
+
ok = true;
|
|
254
|
+
}
|
|
255
|
+
return ok;
|
|
256
|
+
}
|
|
257
|
+
/** Toggle "Grabando audio...". / Toggles the "recording audio..." indicator. */
|
|
258
|
+
async recording(on) {
|
|
259
|
+
let ok = false;
|
|
260
|
+
if (wa._socket) {
|
|
261
|
+
await wa._socket.sendPresenceUpdate(on ? 'recording' : 'paused', this.id);
|
|
262
|
+
ok = true;
|
|
263
|
+
}
|
|
264
|
+
return ok;
|
|
265
|
+
}
|
|
266
|
+
/** Vacía mensajes del chat (engine local). / Clears chat messages (local engine). */
|
|
267
|
+
async clear() {
|
|
268
|
+
await wa.engine.unset(`/chat/${this.id}/message`);
|
|
269
|
+
return true;
|
|
270
|
+
}
|
|
271
|
+
/** Elimina el chat y sus mensajes (remoto + local). / Deletes the chat and its messages (remote + local). */
|
|
272
|
+
async delete() {
|
|
273
|
+
if (wa._socket) {
|
|
274
|
+
if (this.type === 'group') {
|
|
275
|
+
try {
|
|
276
|
+
await wa._socket.groupLeave(this.id);
|
|
277
|
+
}
|
|
278
|
+
catch {
|
|
279
|
+
/* may fail */
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
else {
|
|
283
|
+
try {
|
|
284
|
+
await wa._socket.chatModify({ delete: true, lastMessages: [] }, this.id);
|
|
285
|
+
}
|
|
286
|
+
catch {
|
|
287
|
+
/* may fail */
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
await this.clear();
|
|
292
|
+
await wa.engine.unset(`/chat/${this.id}`);
|
|
293
|
+
return true;
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Participantes del chat paginados (incluyéndome en grupos). Para grupos,
|
|
297
|
+
* el `groupMetadata` se memoiza en la instancia con TTL de 15s para evitar
|
|
298
|
+
* round-trips repetidos al socket.
|
|
299
|
+
* Chat participants paginated (self included in groups). For groups,
|
|
300
|
+
* `groupMetadata` is memoized on the instance with a 15s TTL to avoid
|
|
301
|
+
* repeated socket round-trips.
|
|
302
|
+
*/
|
|
303
|
+
async members(offset = 0, limit = 50) {
|
|
304
|
+
const result = [];
|
|
305
|
+
if (this.type !== 'group') {
|
|
306
|
+
if (offset === 0 && limit > 0) {
|
|
307
|
+
const c = await wa.Contact.get(this.id);
|
|
308
|
+
if (c) {
|
|
309
|
+
result.push(c);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
else if (wa._socket) {
|
|
314
|
+
try {
|
|
315
|
+
const socket = wa._socket;
|
|
316
|
+
const participants = await (this._members_cache ??= (async () => {
|
|
317
|
+
const meta = await socket.groupMetadata(this.id);
|
|
318
|
+
setTimeout(() => { this._members_cache = null; }, 15_000);
|
|
319
|
+
return meta.participants;
|
|
320
|
+
})());
|
|
321
|
+
const slice = participants.slice(offset, offset + limit);
|
|
322
|
+
for (const p of slice) {
|
|
323
|
+
const existing = await wa.Contact.get(p.id);
|
|
324
|
+
if (existing) {
|
|
325
|
+
result.push(existing);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
catch {
|
|
330
|
+
/* may fail */
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
return result;
|
|
334
|
+
}
|
|
335
|
+
/** Mensajes del chat paginados por mtime DESC. / Chat messages paginated by mtime DESC. */
|
|
336
|
+
async messages(offset = 0, limit = 50) {
|
|
337
|
+
return wa.Message.list(this.id, offset, limit);
|
|
338
|
+
}
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/chat/index.ts"],"names":[],"mappings":"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"}
|