@arcaelas/whatsapp 4.4.0 → 5.1.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 +6 -4
- package/build/cjs/index.js +22 -2
- package/build/cjs/index.js.map +1 -1
- package/build/cjs/lib/bot/decorator.d.ts +2 -0
- package/build/cjs/lib/bot/decorator.js +6 -0
- package/build/cjs/lib/bot/decorator.js.map +1 -1
- package/build/cjs/lib/chat/index.d.ts +340 -204
- package/build/cjs/lib/chat/index.js +225 -213
- package/build/cjs/lib/chat/index.js.map +1 -1
- package/build/cjs/lib/contact/index.d.ts +162 -179
- package/build/cjs/lib/contact/index.js +96 -190
- package/build/cjs/lib/contact/index.js.map +1 -1
- package/build/cjs/lib/internal.d.ts +40 -0
- package/build/cjs/lib/internal.js +39 -0
- package/build/cjs/lib/internal.js.map +1 -0
- package/build/cjs/lib/message/index.d.ts +463 -278
- package/build/cjs/lib/message/index.js +830 -710
- package/build/cjs/lib/message/index.js.map +1 -1
- package/build/cjs/lib/status/index.d.ts +60 -70
- package/build/cjs/lib/status/index.js +106 -111
- package/build/cjs/lib/status/index.js.map +1 -1
- package/build/cjs/lib/store/engine/index.d.ts +21 -7
- package/build/cjs/lib/store/engine/index.js +6 -3
- package/build/cjs/lib/store/engine/index.js.map +1 -1
- package/build/cjs/lib/store/engine/lib/file_system/index.d.ts +38 -8
- package/build/cjs/lib/store/engine/lib/file_system/index.js +92 -67
- package/build/cjs/lib/store/engine/lib/file_system/index.js.map +1 -1
- package/build/cjs/lib/store/engine/lib/index.d.ts +112 -0
- package/build/cjs/lib/store/engine/lib/index.js +213 -0
- package/build/cjs/lib/store/engine/lib/index.js.map +1 -0
- package/build/cjs/lib/store/engine/lib/redis/index.d.ts +28 -13
- package/build/cjs/lib/store/engine/lib/redis/index.js +56 -42
- package/build/cjs/lib/store/engine/lib/redis/index.js.map +1 -1
- package/build/cjs/lib/store/engine/lib/s3/index.d.ts +44 -1
- package/build/cjs/lib/store/engine/lib/s3/index.js +112 -64
- package/build/cjs/lib/store/engine/lib/s3/index.js.map +1 -1
- package/build/cjs/lib/store/engine/lib/sqlite/index.d.ts +98 -0
- package/build/cjs/lib/store/engine/lib/sqlite/index.js +114 -0
- package/build/cjs/lib/store/engine/lib/sqlite/index.js.map +1 -0
- package/build/cjs/lib/store/index.d.ts +7 -3
- package/build/cjs/lib/store/index.js +14 -4
- package/build/cjs/lib/store/index.js.map +1 -1
- package/build/cjs/lib/whatsapp/index.d.ts +117 -63
- package/build/cjs/lib/whatsapp/index.js +404 -184
- package/build/cjs/lib/whatsapp/index.js.map +1 -1
- package/build/cjs/test.d.ts +1 -0
- package/build/cjs/test.js +72 -0
- package/build/cjs/test.js.map +1 -0
- package/build/esm/index.d.ts +6 -4
- package/build/esm/index.js +5 -2
- package/build/esm/index.js.map +1 -1
- package/build/esm/lib/bot/decorator.d.ts +2 -0
- package/build/esm/lib/bot/decorator.js +6 -0
- package/build/esm/lib/bot/decorator.js.map +1 -1
- package/build/esm/lib/chat/index.d.ts +340 -204
- package/build/esm/lib/chat/index.js +225 -213
- package/build/esm/lib/chat/index.js.map +1 -1
- package/build/esm/lib/contact/index.d.ts +162 -179
- package/build/esm/lib/contact/index.js +96 -189
- package/build/esm/lib/contact/index.js.map +1 -1
- package/build/esm/lib/internal.d.ts +40 -0
- package/build/esm/lib/internal.js +35 -0
- package/build/esm/lib/internal.js.map +1 -0
- package/build/esm/lib/message/index.d.ts +463 -278
- package/build/esm/lib/message/index.js +825 -705
- package/build/esm/lib/message/index.js.map +1 -1
- package/build/esm/lib/status/index.d.ts +60 -70
- package/build/esm/lib/status/index.js +105 -110
- package/build/esm/lib/status/index.js.map +1 -1
- package/build/esm/lib/store/engine/index.d.ts +21 -7
- package/build/esm/lib/store/engine/index.js +4 -2
- package/build/esm/lib/store/engine/index.js.map +1 -1
- package/build/esm/lib/store/engine/lib/file_system/index.d.ts +38 -8
- package/build/esm/lib/store/engine/lib/file_system/index.js +92 -67
- package/build/esm/lib/store/engine/lib/file_system/index.js.map +1 -1
- package/build/esm/lib/store/engine/lib/index.d.ts +112 -0
- package/build/esm/lib/store/engine/lib/index.js +206 -0
- package/build/esm/lib/store/engine/lib/index.js.map +1 -0
- package/build/esm/lib/store/engine/lib/redis/index.d.ts +28 -13
- package/build/esm/lib/store/engine/lib/redis/index.js +54 -40
- package/build/esm/lib/store/engine/lib/redis/index.js.map +1 -1
- package/build/esm/lib/store/engine/lib/s3/index.d.ts +44 -1
- package/build/esm/lib/store/engine/lib/s3/index.js +111 -63
- package/build/esm/lib/store/engine/lib/s3/index.js.map +1 -1
- package/build/esm/lib/store/engine/lib/sqlite/index.d.ts +98 -0
- package/build/esm/lib/store/engine/lib/sqlite/index.js +110 -0
- package/build/esm/lib/store/engine/lib/sqlite/index.js.map +1 -0
- package/build/esm/lib/store/index.d.ts +7 -3
- package/build/esm/lib/store/index.js +13 -4
- package/build/esm/lib/store/index.js.map +1 -1
- package/build/esm/lib/whatsapp/index.d.ts +117 -63
- package/build/esm/lib/whatsapp/index.js +406 -186
- package/build/esm/lib/whatsapp/index.js.map +1 -1
- package/build/esm/test.d.ts +1 -0
- package/build/esm/test.js +67 -0
- package/build/esm/test.js.map +1 -0
- package/package.json +2 -2
|
@@ -3,62 +3,51 @@
|
|
|
3
3
|
* @description Entidad Chat — conversaciones individuales y grupales.
|
|
4
4
|
* Chat entity — individual and group conversations.
|
|
5
5
|
*/
|
|
6
|
+
import { internals } from '../../lib/internal.js';
|
|
7
|
+
import { Message } from '../../lib/message/index.js';
|
|
6
8
|
import { deserialize, serialize } from '../../lib/store/index.js';
|
|
7
9
|
/**
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*/
|
|
11
|
-
const MUTE_FOREVER_MS = 365 * 100 * 24 * 3_600 * 1_000;
|
|
12
|
-
/**
|
|
13
|
-
* Clase base del chat (forma pública, solo lectura).
|
|
14
|
-
* Base Chat class (public shape, read-only).
|
|
10
|
+
* Clase base del chat: recibe el raw y deriva todo con getters.
|
|
11
|
+
* Base Chat class: receives the raw and derives everything via getters.
|
|
15
12
|
*/
|
|
16
13
|
export class Chat {
|
|
17
|
-
|
|
18
|
-
|
|
14
|
+
/**
|
|
15
|
+
* @internal Documento crudo del chat. `id` es el identificador del engine (JID, LID o
|
|
16
|
+
* `@g.us`); `pinned` y `mute_end_time` son epoch ms.
|
|
17
|
+
* Raw chat document. `id` is the engine identifier (JID, LID or `@g.us`); `pinned` and
|
|
18
|
+
* `mute_end_time` are epoch ms.
|
|
19
|
+
*/
|
|
20
|
+
constructor(_raw) {
|
|
21
|
+
this._raw = _raw;
|
|
19
22
|
}
|
|
20
|
-
/**
|
|
23
|
+
/** Teléfono del contacto, o el identificador crudo en grupos y LIDs. / Contact phone, or the raw identifier for groups and LIDs. */
|
|
21
24
|
get id() {
|
|
22
|
-
return this._raw.id;
|
|
25
|
+
return this._raw.id.endsWith('@s.whatsapp.net') ? this._raw.id.split('@')[0].split(':')[0] : this._raw.id;
|
|
23
26
|
}
|
|
24
|
-
/**
|
|
25
|
-
get
|
|
26
|
-
return this._raw.id;
|
|
27
|
+
/** Nombre del grupo o del contacto. / Group or contact name. */
|
|
28
|
+
get name() {
|
|
29
|
+
return this._raw.name ?? this.id;
|
|
27
30
|
}
|
|
28
|
-
/** Tipo
|
|
31
|
+
/** Tipo de conversación. / Conversation type. */
|
|
29
32
|
get type() {
|
|
30
33
|
return this._raw.id.endsWith('@g.us') ? 'group' : 'contact';
|
|
31
34
|
}
|
|
32
|
-
/**
|
|
33
|
-
get
|
|
34
|
-
return this._raw.
|
|
35
|
-
}
|
|
36
|
-
/** Descripción del grupo. / Group description. */
|
|
37
|
-
get content() {
|
|
38
|
-
return this._raw.description ?? '';
|
|
35
|
+
/** true si el chat está archivado. / true when the chat is archived. */
|
|
36
|
+
get archived() {
|
|
37
|
+
return this._raw.archived ?? false;
|
|
39
38
|
}
|
|
40
|
-
/**
|
|
39
|
+
/** true si el chat está fijado. / true when the chat is pinned. */
|
|
41
40
|
get pinned() {
|
|
42
41
|
return this._raw.pinned != null;
|
|
43
42
|
}
|
|
44
|
-
/**
|
|
45
|
-
get archived() {
|
|
46
|
-
return this._raw.archived ?? false;
|
|
47
|
-
}
|
|
48
|
-
/** true si el chat está silenciado y el silencio aún no expira. / true if chat is muted and the mute has not expired. */
|
|
43
|
+
/** Fecha ISO UTC hasta la que el chat está silenciado, o null. / ISO UTC date until the chat stays muted, or null. */
|
|
49
44
|
get muted() {
|
|
50
45
|
const end = this._raw.mute_end_time;
|
|
51
|
-
return end != null && end > Date.now();
|
|
52
|
-
}
|
|
53
|
-
/** Si está leído. / Whether it's read. */
|
|
54
|
-
get read() {
|
|
55
|
-
return !this._raw.unread_count && !this._raw.marked_as_unread;
|
|
56
|
-
}
|
|
57
|
-
/** Si es solo lectura. / Whether it's read-only. */
|
|
58
|
-
get readonly() {
|
|
59
|
-
return this._raw.read_only ?? false;
|
|
46
|
+
return end != null && end > Date.now() ? new Date(end).toISOString() : null;
|
|
60
47
|
}
|
|
61
48
|
}
|
|
49
|
+
/** Máximo de chats fijados que acepta WhatsApp; el cuarto se descarta en silencio. / Max pinned chats WhatsApp accepts; the fourth is silently dropped. */
|
|
50
|
+
const MAX_PINNED = 3;
|
|
62
51
|
/**
|
|
63
52
|
* Factoría de Chat ligada al contexto WhatsApp.
|
|
64
53
|
* Context-bound Chat factory.
|
|
@@ -67,242 +56,265 @@ export class Chat {
|
|
|
67
56
|
*/
|
|
68
57
|
export function chat(wa) {
|
|
69
58
|
/**
|
|
70
|
-
*
|
|
71
|
-
*
|
|
59
|
+
* Último mensaje del chat en el formato que exige `chatModify`.
|
|
60
|
+
* The chat's last message in the shape `chatModify` requires.
|
|
72
61
|
*/
|
|
73
62
|
async function last_messages(cid) {
|
|
74
63
|
const [raw] = await wa.engine.list(`/chat/${cid}/message`, 0, 1);
|
|
75
64
|
const parsed = deserialize(raw ?? null);
|
|
76
65
|
return parsed
|
|
77
|
-
? [
|
|
78
|
-
{
|
|
79
|
-
key: { remoteJid: cid, id: parsed.id, fromMe: parsed.me },
|
|
80
|
-
messageTimestamp: Math.floor(parsed.created_at / 1000),
|
|
81
|
-
},
|
|
82
|
-
]
|
|
66
|
+
? [{ key: { remoteJid: cid, id: parsed.id, fromMe: parsed.me }, messageTimestamp: Math.floor(parsed.created_at / 1000) }]
|
|
83
67
|
: [];
|
|
84
68
|
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
static async get(cid) {
|
|
96
|
-
let result = null;
|
|
97
|
-
const jid = await wa._resolve_jid(cid);
|
|
98
|
-
if (jid) {
|
|
99
|
-
const cached = deserialize(await wa.engine.get(`/chat/${jid}`));
|
|
100
|
-
if (cached) {
|
|
101
|
-
result = new _Chat(cached);
|
|
102
|
-
}
|
|
103
|
-
else {
|
|
104
|
-
const c = await wa.Contact.get(jid);
|
|
105
|
-
if (c) {
|
|
106
|
-
const raw = { id: jid, name: c.name };
|
|
107
|
-
await wa.engine.set(`/chat/${jid}`, serialize(raw));
|
|
108
|
-
result = new _Chat(raw);
|
|
109
|
-
}
|
|
110
|
-
}
|
|
69
|
+
/**
|
|
70
|
+
* Cuenta los chats fijados distintos del indicado, cortando al llegar al máximo.
|
|
71
|
+
* Counts pinned chats other than the given one, stopping once the max is reached.
|
|
72
|
+
*/
|
|
73
|
+
async function count_pinned(exclude) {
|
|
74
|
+
let total = 0;
|
|
75
|
+
for (let offset = 0; total < MAX_PINNED; offset += 200) {
|
|
76
|
+
const page = await wa.engine.list('/chat', offset, 200);
|
|
77
|
+
if (page.length === 0) {
|
|
78
|
+
break;
|
|
111
79
|
}
|
|
112
|
-
|
|
113
|
-
}
|
|
114
|
-
/** Pagina los chats persistidos por mtime DESC. / Paginates persisted chats by mtime DESC. */
|
|
115
|
-
static async list(offset = 0, limit = 50) {
|
|
116
|
-
const chats = [];
|
|
117
|
-
for (const raw of await wa.engine.list('/chat', offset, limit)) {
|
|
80
|
+
for (const raw of page) {
|
|
118
81
|
const parsed = deserialize(raw);
|
|
119
|
-
if (parsed) {
|
|
120
|
-
|
|
82
|
+
if (parsed && parsed.id !== exclude && parsed.pinned != null) {
|
|
83
|
+
total++;
|
|
121
84
|
}
|
|
122
85
|
}
|
|
123
|
-
return chats;
|
|
124
|
-
}
|
|
125
|
-
/** Fija/desfija un chat por CID. / Pins or unpins a chat by CID. */
|
|
126
|
-
static async pin(cid, value) {
|
|
127
|
-
const c = await _Chat.get(cid);
|
|
128
|
-
return c ? c.pin(value) : false;
|
|
129
86
|
}
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
87
|
+
return total;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Participantes del grupo memoizados 15s, para no repetir `groupMetadata` en cada página.
|
|
91
|
+
* Group participants memoized for 15s, avoiding a `groupMetadata` round-trip per page.
|
|
92
|
+
*/
|
|
93
|
+
const members_cache = new Map();
|
|
94
|
+
function group_members(jid) {
|
|
95
|
+
if (!members_cache.has(jid)) {
|
|
96
|
+
const socket = internals(wa).socket;
|
|
97
|
+
members_cache.set(jid, socket ? socket.groupMetadata(jid).then((meta) => meta.participants).catch(() => []) : Promise.resolve([]));
|
|
98
|
+
setTimeout(() => members_cache.delete(jid), 15_000);
|
|
139
99
|
}
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
100
|
+
return members_cache.get(jid);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Contacto desde el engine, o ficha mínima local cuando no está persistido (sin red).
|
|
104
|
+
* Contact from the engine, or a minimal local card when not persisted (no network).
|
|
105
|
+
*/
|
|
106
|
+
async function load_contact(id) {
|
|
107
|
+
const cached = deserialize(await wa.engine.get(`/contact/${id}`));
|
|
108
|
+
return new wa.Contact(cached ?? { id });
|
|
109
|
+
}
|
|
110
|
+
return class _Chat extends Chat {
|
|
111
|
+
/**
|
|
112
|
+
* Participantes del chat: los integrantes en grupos, el contacto y yo en 1:1.
|
|
113
|
+
* Chat participants: members for groups, the contact and myself for 1:1.
|
|
114
|
+
*
|
|
115
|
+
* @param offset - Desplazamiento / Offset
|
|
116
|
+
* @param limit - Tamaño de página / Page size
|
|
117
|
+
* @returns Página de contactos / Contact page
|
|
118
|
+
*/
|
|
119
|
+
async members(offset = 0, limit = 50) {
|
|
120
|
+
const ids = this.type === 'group'
|
|
121
|
+
? (await group_members(this._raw.id)).map((participant) => participant.id)
|
|
122
|
+
: [this._raw.id, internals(wa).socket?.user?.id].filter((id) => Boolean(id));
|
|
123
|
+
return Promise.all(ids.slice(offset, offset + limit).map(load_contact));
|
|
144
124
|
}
|
|
145
|
-
/**
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
125
|
+
/**
|
|
126
|
+
* Mensajes del chat paginados desde el más reciente.
|
|
127
|
+
* Chat messages paginated from the most recent one.
|
|
128
|
+
*
|
|
129
|
+
* @param offset - Desplazamiento / Offset
|
|
130
|
+
* @param limit - Tamaño de página / Page size
|
|
131
|
+
* @returns Página de mensajes / Message page
|
|
132
|
+
*/
|
|
133
|
+
async messages(offset = 0, limit = 50) {
|
|
134
|
+
return Message.list(wa, this._raw.id, offset, limit);
|
|
149
135
|
}
|
|
150
|
-
/**
|
|
151
|
-
|
|
136
|
+
/**
|
|
137
|
+
* Activa o desactiva el indicador «escribiendo…».
|
|
138
|
+
* Toggles the "typing…" indicator.
|
|
139
|
+
*
|
|
140
|
+
* @param value - true activa, false vuelve a pausa / true enables, false returns to paused
|
|
141
|
+
* @returns true si el socket estaba disponible / true when the socket was available
|
|
142
|
+
*/
|
|
143
|
+
async typing(value) {
|
|
152
144
|
let ok = false;
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
const meta = await wa._socket.groupMetadata(this.id);
|
|
157
|
-
this._raw.name = meta.subject;
|
|
158
|
-
this._raw.description = meta.desc ?? null;
|
|
159
|
-
this._raw.participants = meta.participants.map((p) => ({
|
|
160
|
-
id: p.id,
|
|
161
|
-
admin: p.admin ?? null,
|
|
162
|
-
}));
|
|
163
|
-
this._raw.created_by = meta.owner ?? null;
|
|
164
|
-
this._raw.created_at = meta.creation ?? null;
|
|
165
|
-
}
|
|
166
|
-
catch {
|
|
167
|
-
/* group metadata may fail */
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
else {
|
|
171
|
-
const c = await wa.Contact.get(this.id);
|
|
172
|
-
if (c) {
|
|
173
|
-
await c.refresh();
|
|
174
|
-
this._raw.name = c.name;
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
await wa.engine.set(`/chat/${this.id}`, serialize(this._raw));
|
|
145
|
+
const socket = internals(wa).socket;
|
|
146
|
+
if (socket) {
|
|
147
|
+
await socket.sendPresenceUpdate(value ? 'composing' : 'paused', this._raw.id);
|
|
178
148
|
ok = true;
|
|
179
149
|
}
|
|
180
|
-
return ok
|
|
150
|
+
return ok;
|
|
181
151
|
}
|
|
182
|
-
/**
|
|
183
|
-
|
|
152
|
+
/**
|
|
153
|
+
* Activa o desactiva el indicador «grabando audio…».
|
|
154
|
+
* Toggles the "recording audio…" indicator.
|
|
155
|
+
*
|
|
156
|
+
* @param value - true activa, false vuelve a pausa / true enables, false returns to paused
|
|
157
|
+
* @returns true si el socket estaba disponible / true when the socket was available
|
|
158
|
+
*/
|
|
159
|
+
async recording(value) {
|
|
184
160
|
let ok = false;
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
await wa.engine.set(`/chat/${this.id}`, serialize(this._raw));
|
|
161
|
+
const socket = internals(wa).socket;
|
|
162
|
+
if (socket) {
|
|
163
|
+
await socket.sendPresenceUpdate(value ? 'recording' : 'paused', this._raw.id);
|
|
189
164
|
ok = true;
|
|
190
165
|
}
|
|
191
166
|
return ok;
|
|
192
167
|
}
|
|
193
|
-
/**
|
|
168
|
+
/**
|
|
169
|
+
* Archiva o desarchiva el chat en la cuenta de WhatsApp.
|
|
170
|
+
* Archives or unarchives the chat on the WhatsApp account.
|
|
171
|
+
*
|
|
172
|
+
* @param value - true archiva, false desarchiva / true archives, false unarchives
|
|
173
|
+
* @returns true si la acción se envió / true when the action was sent
|
|
174
|
+
*/
|
|
194
175
|
async archive(value) {
|
|
195
176
|
let ok = false;
|
|
196
|
-
|
|
197
|
-
|
|
177
|
+
const socket = internals(wa).socket;
|
|
178
|
+
if (socket) {
|
|
179
|
+
await socket.chatModify({ archive: value, lastMessages: await last_messages(this._raw.id) }, this._raw.id);
|
|
198
180
|
this._raw.archived = value;
|
|
199
|
-
await wa.engine.set(`/chat/${this.id}`, serialize(this._raw));
|
|
181
|
+
await wa.engine.set(`/chat/${this._raw.id}`, serialize(this._raw));
|
|
200
182
|
ok = true;
|
|
201
183
|
}
|
|
202
184
|
return ok;
|
|
203
185
|
}
|
|
204
|
-
/**
|
|
205
|
-
|
|
186
|
+
/**
|
|
187
|
+
* Fija o desfija el chat en la cuenta de WhatsApp. WhatsApp acepta hasta 3 chats
|
|
188
|
+
* fijados y descarta el cuarto sin avisar, así que el límite se verifica antes.
|
|
189
|
+
* Pins or unpins the chat on the WhatsApp account. WhatsApp accepts up to 3 pinned
|
|
190
|
+
* chats and silently drops the fourth, so the limit is checked beforehand.
|
|
191
|
+
*
|
|
192
|
+
* @param value - true fija, false desfija / true pins, false unpins
|
|
193
|
+
* @returns false si el socket está caído o ya hay 3 chats fijados / false when the socket is down or 3 chats are already pinned
|
|
194
|
+
*/
|
|
195
|
+
async pin(value) {
|
|
206
196
|
let ok = false;
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
197
|
+
const socket = internals(wa).socket;
|
|
198
|
+
if (socket) {
|
|
199
|
+
const allowed = value ? (await count_pinned(this._raw.id)) < MAX_PINNED : true;
|
|
200
|
+
if (allowed) {
|
|
201
|
+
await socket.chatModify({ pin: value }, this._raw.id);
|
|
202
|
+
this._raw.pinned = value ? Date.now() : null;
|
|
203
|
+
await wa.engine.set(`/chat/${this._raw.id}`, serialize(this._raw));
|
|
204
|
+
ok = true;
|
|
205
|
+
}
|
|
213
206
|
}
|
|
214
207
|
return ok;
|
|
215
208
|
}
|
|
216
|
-
/**
|
|
217
|
-
|
|
209
|
+
/**
|
|
210
|
+
* Silencia el chat hasta la fecha indicada. `false` o una fecha pasada lo des-silencian.
|
|
211
|
+
* Mutes the chat until the given date. `false` or a past date unmutes it.
|
|
212
|
+
*
|
|
213
|
+
* @param until - Fecha límite (ISO, epoch ms o Date) o false / Deadline (ISO, epoch ms or Date) or false
|
|
214
|
+
* @returns true si la acción se envió / true when the action was sent
|
|
215
|
+
*/
|
|
216
|
+
async mute(until) {
|
|
218
217
|
let ok = false;
|
|
219
|
-
|
|
220
|
-
|
|
218
|
+
const socket = internals(wa).socket;
|
|
219
|
+
if (socket) {
|
|
220
|
+
const end = until === false ? 0 : new Date(until).getTime();
|
|
221
|
+
const muted = end > Date.now();
|
|
222
|
+
await socket.chatModify({ mute: muted ? end : null }, this._raw.id);
|
|
223
|
+
this._raw.mute_end_time = muted ? end : null;
|
|
224
|
+
await wa.engine.set(`/chat/${this._raw.id}`, serialize(this._raw));
|
|
221
225
|
ok = true;
|
|
222
226
|
}
|
|
223
227
|
return ok;
|
|
224
228
|
}
|
|
225
|
-
/**
|
|
226
|
-
|
|
229
|
+
/**
|
|
230
|
+
* Marca el chat completo como leído en la cuenta de WhatsApp.
|
|
231
|
+
* Marks the whole chat as read on the WhatsApp account.
|
|
232
|
+
*
|
|
233
|
+
* @returns true si la acción se envió / true when the action was sent
|
|
234
|
+
*/
|
|
235
|
+
async seen() {
|
|
227
236
|
let ok = false;
|
|
228
|
-
|
|
229
|
-
|
|
237
|
+
const socket = internals(wa).socket;
|
|
238
|
+
if (socket) {
|
|
239
|
+
await socket.chatModify({ markRead: true, lastMessages: await last_messages(this._raw.id) }, this._raw.id);
|
|
230
240
|
ok = true;
|
|
231
241
|
}
|
|
232
242
|
return ok;
|
|
233
243
|
}
|
|
234
|
-
/**
|
|
244
|
+
/**
|
|
245
|
+
* Vacía los mensajes del chat en la cuenta de WhatsApp y en el engine, conservando el chat.
|
|
246
|
+
* Clears the chat messages on the WhatsApp account and in the engine, keeping the chat.
|
|
247
|
+
*
|
|
248
|
+
* @returns true siempre; la limpieza local es idempotente / always true; local cleanup is idempotent
|
|
249
|
+
*/
|
|
235
250
|
async clear() {
|
|
236
|
-
|
|
251
|
+
const socket = internals(wa).socket;
|
|
252
|
+
if (socket) {
|
|
253
|
+
await socket
|
|
254
|
+
.chatModify({ clear: true, lastMessages: await last_messages(this._raw.id) }, this._raw.id)
|
|
255
|
+
.catch(() => null);
|
|
256
|
+
}
|
|
257
|
+
await wa.engine.unset(`/chat/${this._raw.id}/message`);
|
|
237
258
|
return true;
|
|
238
259
|
}
|
|
239
|
-
/**
|
|
260
|
+
/**
|
|
261
|
+
* Elimina el chat y sus mensajes en la cuenta de WhatsApp y en el engine; en grupos
|
|
262
|
+
* abandona el grupo.
|
|
263
|
+
* Deletes the chat and its messages on the WhatsApp account and in the engine; for
|
|
264
|
+
* groups it leaves the group.
|
|
265
|
+
*
|
|
266
|
+
* @returns true siempre; la limpieza local es idempotente / always true; local cleanup is idempotent
|
|
267
|
+
*/
|
|
240
268
|
async delete() {
|
|
241
|
-
|
|
269
|
+
const socket = internals(wa).socket;
|
|
270
|
+
if (socket) {
|
|
242
271
|
if (this.type === 'group') {
|
|
243
|
-
|
|
244
|
-
await wa._socket.groupLeave(this.id);
|
|
245
|
-
}
|
|
246
|
-
catch {
|
|
247
|
-
/* may fail */
|
|
248
|
-
}
|
|
272
|
+
await socket.groupLeave(this._raw.id).catch(() => null);
|
|
249
273
|
}
|
|
250
274
|
else {
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
catch {
|
|
255
|
-
/* may fail */
|
|
256
|
-
}
|
|
275
|
+
await socket
|
|
276
|
+
.chatModify({ delete: true, lastMessages: await last_messages(this._raw.id) }, this._raw.id)
|
|
277
|
+
.catch(() => null);
|
|
257
278
|
}
|
|
258
279
|
}
|
|
259
|
-
await this.
|
|
260
|
-
await wa.engine.unset(`/chat/${this.id}`);
|
|
280
|
+
await wa.engine.unset(`/chat/${this._raw.id}`);
|
|
261
281
|
return true;
|
|
262
282
|
}
|
|
263
283
|
/**
|
|
264
|
-
*
|
|
265
|
-
*
|
|
266
|
-
*
|
|
267
|
-
*
|
|
268
|
-
*
|
|
269
|
-
*
|
|
284
|
+
* Carga un chat por teléfono, JID, LID o id de grupo: el persistido en el engine o,
|
|
285
|
+
* si todavía no existe, una instancia mínima lista para usar (no se persiste).
|
|
286
|
+
* Loads a chat by phone, JID, LID or group id: the engine-persisted one or, when it
|
|
287
|
+
* does not exist yet, a minimal ready-to-use instance (not persisted).
|
|
288
|
+
*
|
|
289
|
+
* @param cid - Teléfono, JID, LID o id de grupo / Phone, JID, LID or group id
|
|
290
|
+
* @returns Chat o null si el identificador es irresoluble / Chat or null when the identifier cannot be resolved
|
|
270
291
|
*/
|
|
271
|
-
async
|
|
272
|
-
const
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
else if (wa._socket) {
|
|
282
|
-
try {
|
|
283
|
-
const socket = wa._socket;
|
|
284
|
-
const participants = await (this._members_cache ??= (async () => {
|
|
285
|
-
const meta = await socket.groupMetadata(this.id);
|
|
286
|
-
setTimeout(() => { this._members_cache = null; }, 15_000);
|
|
287
|
-
return meta.participants;
|
|
288
|
-
})());
|
|
289
|
-
const slice = participants.slice(offset, offset + limit);
|
|
290
|
-
for (const p of slice) {
|
|
291
|
-
const existing = await wa.Contact.get(p.id);
|
|
292
|
-
if (existing) {
|
|
293
|
-
result.push(existing);
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
catch {
|
|
298
|
-
/* may fail */
|
|
299
|
-
}
|
|
292
|
+
static async get(cid) {
|
|
293
|
+
const digits = String(cid).replace(/\D+/g, '');
|
|
294
|
+
const jid = String(cid).includes('@')
|
|
295
|
+
? await internals(wa).resolve_jid(String(cid))
|
|
296
|
+
: digits
|
|
297
|
+
? `${digits}@s.whatsapp.net`
|
|
298
|
+
: null;
|
|
299
|
+
if (jid) {
|
|
300
|
+
const cached = deserialize(await wa.engine.get(`/chat/${jid}`));
|
|
301
|
+
return new _Chat(cached ?? { id: jid });
|
|
300
302
|
}
|
|
301
|
-
return
|
|
303
|
+
return null;
|
|
302
304
|
}
|
|
303
|
-
/**
|
|
304
|
-
|
|
305
|
-
|
|
305
|
+
/**
|
|
306
|
+
* Pagina los chats persistidos, del más reciente al más antiguo.
|
|
307
|
+
* Paginates persisted chats, from the most recent to the oldest.
|
|
308
|
+
*
|
|
309
|
+
* @param offset - Desplazamiento / Offset
|
|
310
|
+
* @param limit - Tamaño de página / Page size
|
|
311
|
+
* @returns Página de chats / Chat page
|
|
312
|
+
*/
|
|
313
|
+
static async list(offset = 0, limit = 50) {
|
|
314
|
+
return (await wa.engine.list('/chat', offset, limit))
|
|
315
|
+
.map((raw) => deserialize(raw))
|
|
316
|
+
.filter((parsed) => parsed !== null)
|
|
317
|
+
.map((parsed) => new _Chat(parsed));
|
|
306
318
|
}
|
|
307
319
|
};
|
|
308
320
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/chat/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/chat/index.ts"],"names":[],"mappings":"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"}
|