wa-multi-mongodb 3.11.2 → 3.12.1

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.
@@ -1,6 +1,7 @@
1
1
  import { proto } from "baileys";
2
- import { SendMediaTypes, SendMessageTypes, SendReadTypes, SendTypingTypes, SendMessageWithMentionTypes } from "../Types/index.js";
2
+ import { SendButtonMessageTypes, SendMediaTypes, SendMessageTypes, SendReadTypes, SendTypingTypes, SendMessageWithMentionTypes } from "../Types/index.js";
3
3
  export declare const sendTextMessage: ({ sessionId, to, text, isGroup, ...props }: SendMessageTypes) => Promise<proto.WebMessageInfo | undefined>;
4
+ export declare const sendButtonMessage: ({ sessionId, to, title, text, footer, image, aimode, buttons, isGroup, }: SendButtonMessageTypes) => Promise<proto.WebMessageInfo | undefined>;
4
5
  /**
5
6
  * Kirim pesan teks dengan mention
6
7
  *
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Messaging/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAqB,MAAM,SAAS,CAAC;AAGnD,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,2BAA2B,EAC5B,MAAM,UAAU,CAAC;AAQlB,eAAO,MAAM,eAAe,GAAU,4CAMnC,gBAAgB,KAAG,OAAO,CAAC,KAAK,CAAC,cAAc,GAAG,SAAS,CA8I7D,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,0BAA0B,GAAU,sDAO9C,2BAA2B,KAAG,OAAO,CAAC,KAAK,CAAC,cAAc,GAAG,SAAS,CAoKxE,CAAC;AAaF,eAAO,MAAM,SAAS,GAAU,wEAS7B,cAAc,KAAG,OAAO,CAAC,KAAK,CAAC,cAAc,GAAG,SAAS,CAqM3D,CAAC;AAEF,eAAO,MAAM,aAAa,GAAU,6CAMjC,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,KAAG,OAAO,CAAC,KAAK,CAAC,cAAc,GAAG,SAAS,CA6HzE,CAAC;AAEF,eAAO,MAAM,WAAW,GAAU,6CAM/B,cAAc,KAAG,OAAO,CAAC,KAAK,CAAC,cAAc,GAAG,SAAS,CA2H3D,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,UAAU,GAAU,uCAK9B,eAAe,KAAG,OAAO,CAAC,IAAI,CA4EhC,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,WAAW,GAAU,qBAG/B,aAAa,KAAG,OAAO,CAAC,IAAI,CA6B9B,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa,GAAU,qBAGjC,aAAa,KAAG,OAAO,CAAC,IAAI,CAsC9B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Messaging/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAqB,MAAM,SAAS,CAAC;AAGnD,OAAO,EACL,sBAAsB,EACtB,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,2BAA2B,EAC5B,MAAM,UAAU,CAAC;AAWlB,eAAO,MAAM,eAAe,GAAU,4CAMnC,gBAAgB,KAAG,OAAO,CAAC,KAAK,CAAC,cAAc,GAAG,SAAS,CA8I7D,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAU,0EAUrC,sBAAsB,KAAG,OAAO,CAAC,KAAK,CAAC,cAAc,GAAG,SAAS,CAuInE,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,0BAA0B,GAAU,sDAO9C,2BAA2B,KAAG,OAAO,CAAC,KAAK,CAAC,cAAc,GAAG,SAAS,CAoKxE,CAAC;AAaF,eAAO,MAAM,SAAS,GAAU,wEAS7B,cAAc,KAAG,OAAO,CAAC,KAAK,CAAC,cAAc,GAAG,SAAS,CAqM3D,CAAC;AAEF,eAAO,MAAM,aAAa,GAAU,6CAMjC,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,KAAG,OAAO,CAAC,KAAK,CAAC,cAAc,GAAG,SAAS,CA6HzE,CAAC;AAEF,eAAO,MAAM,WAAW,GAAU,6CAM/B,cAAc,KAAG,OAAO,CAAC,KAAK,CAAC,cAAc,GAAG,SAAS,CA2H3D,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,UAAU,GAAU,uCAK9B,eAAe,KAAG,OAAO,CAAC,IAAI,CA4EhC,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,WAAW,GAAU,qBAG/B,aAAa,KAAG,OAAO,CAAC,IAAI,CA6B9B,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa,GAAU,qBAGjC,aAAa,KAAG,OAAO,CAAC,IAAI,CAsC9B,CAAC"}
@@ -18,6 +18,7 @@ var __rest = (this && this.__rest) || function (s, e) {
18
18
  }
19
19
  return t;
20
20
  };
21
+ var _a;
21
22
  import { Messages } from "../Defaults/index.js";
22
23
  import { getSession, reconnect } from "../Socket/index.js";
23
24
  import { phoneToJid } from "../Utils/index.js";
@@ -26,6 +27,8 @@ import { createDelay, withTimeout } from "../Utils/create-delay.js";
26
27
  import { isExist } from "../Utils/is-exist.js";
27
28
  import mime from "mime";
28
29
  import { WhatsappError } from "../Error/index.js";
30
+ import giftedButtonsPkg from "gifted-btns";
31
+ const { sendButtons } = (_a = giftedButtonsPkg.default) !== null && _a !== void 0 ? _a : giftedButtonsPkg;
29
32
  export const sendTextMessage = (_a) => __awaiter(void 0, void 0, void 0, function* () {
30
33
  var { sessionId, to, text = "", isGroup = false } = _a, props = __rest(_a, ["sessionId", "to", "text", "isGroup"]);
31
34
  const session = getSession(sessionId);
@@ -132,6 +135,109 @@ export const sendTextMessage = (_a) => __awaiter(void 0, void 0, void 0, functio
132
135
  });
133
136
  return attemptSend();
134
137
  });
138
+ export const sendButtonMessage = (_a) => __awaiter(void 0, [_a], void 0, function* ({ sessionId, to, title, text, footer, image, aimode = false, buttons, isGroup = false, }) {
139
+ const session = getSession(sessionId);
140
+ if (!session)
141
+ throw new WhatsappError(Messages.sessionNotFound(sessionId));
142
+ const toStr = to.toString();
143
+ const isGroupChat = toStr.includes('@g.us');
144
+ let jid;
145
+ if (isGroupChat) {
146
+ if (!toStr.endsWith('@g.us')) {
147
+ jid = toStr + '@g.us';
148
+ }
149
+ else {
150
+ jid = toStr;
151
+ }
152
+ }
153
+ else {
154
+ jid = phoneToJid({ to, isGroup: isGroup || isGroupChat });
155
+ }
156
+ if (!isValidJid(jid)) {
157
+ throw new WhatsappError(`Invalid JID format: ${jid}. Supported formats: @s.whatsapp.net, @lid, @g.us`);
158
+ }
159
+ if (!text || !text.trim()) {
160
+ throw new WhatsappError("Button message text is required");
161
+ }
162
+ if (!Array.isArray(buttons) || buttons.length === 0) {
163
+ throw new WhatsappError("Button message requires at least one button");
164
+ }
165
+ const hasInvalidButton = buttons.some((button) => {
166
+ return !button || !button.id || !button.id.trim() || !button.text || !button.text.trim();
167
+ });
168
+ if (hasInvalidButton) {
169
+ throw new WhatsappError("Each button requires non-empty id and text");
170
+ }
171
+ let retryCount = 0;
172
+ const maxRetries = 3;
173
+ const createPayload = () => {
174
+ const payload = {
175
+ text,
176
+ aimode,
177
+ buttons,
178
+ };
179
+ if (title)
180
+ payload.title = title;
181
+ if (footer)
182
+ payload.footer = footer;
183
+ if (image)
184
+ payload.image = image;
185
+ return payload;
186
+ };
187
+ const normalizeResult = (result) => {
188
+ if (result && typeof result === "object") {
189
+ result.toJSON = () => ({});
190
+ }
191
+ return result;
192
+ };
193
+ const attemptSend = () => __awaiter(void 0, void 0, void 0, function* () {
194
+ var _a, _b, _c;
195
+ try {
196
+ const isDestinationGroup = jid.endsWith('@g.us');
197
+ yield createDelay(500);
198
+ const timeoutMs = isDestinationGroup ? 15000 : 30000;
199
+ const result = yield sendButtons(session, jid, createPayload());
200
+ return yield withTimeout(Promise.resolve(normalizeResult(result)), timeoutMs, `Pengiriman button message ke ${jid} melebihi batas waktu ${timeoutMs / 1000} detik`);
201
+ }
202
+ catch (error) {
203
+ console.error(`Error saat mengirim button message (percobaan ${retryCount + 1}/${maxRetries}): ${(error === null || error === void 0 ? void 0 : error.message) || 'Unknown error'}`);
204
+ if (((_a = error === null || error === void 0 ? void 0 : error.message) === null || _a === void 0 ? void 0 : _a.includes('MessageCounterError')) || ((_b = error === null || error === void 0 ? void 0 : error.stack) === null || _b === void 0 ? void 0 : _b.includes('MessageCounterError'))) {
205
+ console.warn('Terdeteksi MessageCounterError, kemungkinan grup dengan channel pengumuman');
206
+ if (retryCount < maxRetries) {
207
+ retryCount++;
208
+ yield createDelay(2000 * retryCount);
209
+ return attemptSend();
210
+ }
211
+ else {
212
+ console.error('Batas maksimum percobaan ulang tercapai');
213
+ throw new WhatsappError(`Gagal mengirim button message ke grup dengan channel pengumuman setelah ${maxRetries} kali percobaan`);
214
+ }
215
+ }
216
+ if ((_c = error === null || error === void 0 ? void 0 : error.message) === null || _c === void 0 ? void 0 : _c.includes('Connection Closed')) {
217
+ try {
218
+ yield reconnect(sessionId);
219
+ yield createDelay(3000);
220
+ const reconnectResult = yield sendButtons(session, jid, createPayload());
221
+ return yield withTimeout(Promise.resolve(normalizeResult(reconnectResult)), 30000, `Pengiriman button message setelah reconnect melebihi batas waktu`);
222
+ }
223
+ catch (reconnectError) {
224
+ console.error(`Gagal reconnect: ${(reconnectError === null || reconnectError === void 0 ? void 0 : reconnectError.message) || 'Unknown error'}`);
225
+ throw new WhatsappError(`Koneksi terputus dan gagal reconnect: ${(reconnectError === null || reconnectError === void 0 ? void 0 : reconnectError.message) || 'Unknown error'}`);
226
+ }
227
+ }
228
+ try {
229
+ yield createDelay(2000);
230
+ const retryResult = yield sendButtons(session, jid, createPayload());
231
+ return yield withTimeout(Promise.resolve(normalizeResult(retryResult)), 20000, `Percobaan kedua pengiriman button message melebihi batas waktu`);
232
+ }
233
+ catch (retryError) {
234
+ console.error(`Gagal pada percobaan kedua: ${(retryError === null || retryError === void 0 ? void 0 : retryError.message) || 'Unknown error'}`);
235
+ throw new WhatsappError(`Gagal mengirim button message: ${(retryError === null || retryError === void 0 ? void 0 : retryError.message) || 'Unknown error'}`);
236
+ }
237
+ }
238
+ });
239
+ return attemptSend();
240
+ });
135
241
  /**
136
242
  * Kirim pesan teks dengan mention
137
243
  *
@@ -17,6 +17,20 @@ export interface SendMessageTypes {
17
17
  export interface SendMessageWithMentionTypes extends SendMessageTypes {
18
18
  mentions?: string[];
19
19
  }
20
+ export interface SendButtonMessageButton {
21
+ id: string;
22
+ text: string;
23
+ }
24
+ export interface SendButtonMessageTypes extends Omit<SendMessageTypes, "text"> {
25
+ title?: string;
26
+ text: string;
27
+ footer?: string;
28
+ image?: {
29
+ url: string;
30
+ } | Buffer | string;
31
+ aimode?: boolean;
32
+ buttons: SendButtonMessageButton[];
33
+ }
20
34
  export interface SendMediaTypes extends SendMessageTypes {
21
35
  media: string | Buffer;
22
36
  type: "image" | "video" | "audio" | "pdf" | "xls" | "xlsx" | "doc" | "docx" | "zip" | "mp3";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Types/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Types/index.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { proto } from "baileys";
2
- import { SendMediaTypes, SendMessageTypes, SendReadTypes, SendTypingTypes, SendMessageWithMentionTypes } from "../Types";
2
+ import { SendButtonMessageTypes, SendMediaTypes, SendMessageTypes, SendReadTypes, SendTypingTypes, SendMessageWithMentionTypes } from "../Types";
3
3
  export declare const sendTextMessage: ({ sessionId, to, text, isGroup, ...props }: SendMessageTypes) => Promise<proto.WebMessageInfo | undefined>;
4
+ export declare const sendButtonMessage: ({ sessionId, to, title, text, footer, image, aimode, buttons, isGroup, }: SendButtonMessageTypes) => Promise<proto.WebMessageInfo | undefined>;
4
5
  /**
5
6
  * Kirim pesan teks dengan mention
6
7
  *
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/Messaging/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAqB,MAAM,SAAS,CAAC;AAGnD,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,2BAA2B,EAC5B,MAAM,UAAU,CAAC;AAQlB,eAAO,MAAM,eAAe,GAAU,4CAMnC,gBAAgB,KAAG,OAAO,CAAC,KAAK,CAAC,cAAc,GAAG,SAAS,CA8I7D,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,0BAA0B,GAAU,sDAO9C,2BAA2B,KAAG,OAAO,CAAC,KAAK,CAAC,cAAc,GAAG,SAAS,CAoKxE,CAAC;AAaF,eAAO,MAAM,SAAS,GAAU,wEAS7B,cAAc,KAAG,OAAO,CAAC,KAAK,CAAC,cAAc,GAAG,SAAS,CAqM3D,CAAC;AAEF,eAAO,MAAM,aAAa,GAAU,6CAMjC,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,KAAG,OAAO,CAAC,KAAK,CAAC,cAAc,GAAG,SAAS,CA6HzE,CAAC;AAEF,eAAO,MAAM,WAAW,GAAU,6CAM/B,cAAc,KAAG,OAAO,CAAC,KAAK,CAAC,cAAc,GAAG,SAAS,CA2H3D,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,UAAU,GAAU,uCAK9B,eAAe,KAAG,OAAO,CAAC,IAAI,CA4EhC,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,WAAW,GAAU,qBAG/B,aAAa,KAAG,OAAO,CAAC,IAAI,CA6B9B,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa,GAAU,qBAGjC,aAAa,KAAG,OAAO,CAAC,IAAI,CAsC9B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/Messaging/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAqB,MAAM,SAAS,CAAC;AAGnD,OAAO,EACL,sBAAsB,EACtB,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,2BAA2B,EAC5B,MAAM,UAAU,CAAC;AAWlB,eAAO,MAAM,eAAe,GAAU,4CAMnC,gBAAgB,KAAG,OAAO,CAAC,KAAK,CAAC,cAAc,GAAG,SAAS,CA8I7D,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAU,0EAUrC,sBAAsB,KAAG,OAAO,CAAC,KAAK,CAAC,cAAc,GAAG,SAAS,CAuInE,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,0BAA0B,GAAU,sDAO9C,2BAA2B,KAAG,OAAO,CAAC,KAAK,CAAC,cAAc,GAAG,SAAS,CAoKxE,CAAC;AAaF,eAAO,MAAM,SAAS,GAAU,wEAS7B,cAAc,KAAG,OAAO,CAAC,KAAK,CAAC,cAAc,GAAG,SAAS,CAqM3D,CAAC;AAEF,eAAO,MAAM,aAAa,GAAU,6CAMjC,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,KAAG,OAAO,CAAC,KAAK,CAAC,cAAc,GAAG,SAAS,CA6HzE,CAAC;AAEF,eAAO,MAAM,WAAW,GAAU,6CAM/B,cAAc,KAAG,OAAO,CAAC,KAAK,CAAC,cAAc,GAAG,SAAS,CA2H3D,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,UAAU,GAAU,uCAK9B,eAAe,KAAG,OAAO,CAAC,IAAI,CA4EhC,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,WAAW,GAAU,qBAG/B,aAAa,KAAG,OAAO,CAAC,IAAI,CA6B9B,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa,GAAU,qBAGjC,aAAa,KAAG,OAAO,CAAC,IAAI,CAsC9B,CAAC"}
@@ -22,8 +22,9 @@ var __rest = (this && this.__rest) || function (s, e) {
22
22
  var __importDefault = (this && this.__importDefault) || function (mod) {
23
23
  return (mod && mod.__esModule) ? mod : { "default": mod };
24
24
  };
25
+ var _a;
25
26
  Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.deleteMessage = exports.readMessage = exports.sendTyping = exports.sendSticker = exports.sendVoiceNote = exports.sendMedia = exports.sendTextMessageWithMention = exports.sendTextMessage = void 0;
27
+ exports.deleteMessage = exports.readMessage = exports.sendTyping = exports.sendSticker = exports.sendVoiceNote = exports.sendMedia = exports.sendTextMessageWithMention = exports.sendButtonMessage = exports.sendTextMessage = void 0;
27
28
  const Defaults_1 = require("../Defaults");
28
29
  const Socket_1 = require("../Socket");
29
30
  const Utils_1 = require("../Utils");
@@ -32,6 +33,8 @@ const create_delay_1 = require("../Utils/create-delay");
32
33
  const is_exist_1 = require("../Utils/is-exist");
33
34
  const mime_1 = __importDefault(require("mime"));
34
35
  const Error_1 = require("../Error");
36
+ const gifted_btns_1 = __importDefault(require("gifted-btns"));
37
+ const { sendButtons } = (_a = gifted_btns_1.default.default) !== null && _a !== void 0 ? _a : gifted_btns_1.default;
35
38
  const sendTextMessage = (_a) => __awaiter(void 0, void 0, void 0, function* () {
36
39
  var { sessionId, to, text = "", isGroup = false } = _a, props = __rest(_a, ["sessionId", "to", "text", "isGroup"]);
37
40
  const session = (0, Socket_1.getSession)(sessionId);
@@ -139,6 +142,110 @@ const sendTextMessage = (_a) => __awaiter(void 0, void 0, void 0, function* () {
139
142
  return attemptSend();
140
143
  });
141
144
  exports.sendTextMessage = sendTextMessage;
145
+ const sendButtonMessage = (_a) => __awaiter(void 0, [_a], void 0, function* ({ sessionId, to, title, text, footer, image, aimode = false, buttons, isGroup = false, }) {
146
+ const session = (0, Socket_1.getSession)(sessionId);
147
+ if (!session)
148
+ throw new Error_1.WhatsappError(Defaults_1.Messages.sessionNotFound(sessionId));
149
+ const toStr = to.toString();
150
+ const isGroupChat = toStr.includes('@g.us');
151
+ let jid;
152
+ if (isGroupChat) {
153
+ if (!toStr.endsWith('@g.us')) {
154
+ jid = toStr + '@g.us';
155
+ }
156
+ else {
157
+ jid = toStr;
158
+ }
159
+ }
160
+ else {
161
+ jid = (0, Utils_1.phoneToJid)({ to, isGroup: isGroup || isGroupChat });
162
+ }
163
+ if (!(0, Utils_2.isValidJid)(jid)) {
164
+ throw new Error_1.WhatsappError(`Invalid JID format: ${jid}. Supported formats: @s.whatsapp.net, @lid, @g.us`);
165
+ }
166
+ if (!text || !text.trim()) {
167
+ throw new Error_1.WhatsappError("Button message text is required");
168
+ }
169
+ if (!Array.isArray(buttons) || buttons.length === 0) {
170
+ throw new Error_1.WhatsappError("Button message requires at least one button");
171
+ }
172
+ const hasInvalidButton = buttons.some((button) => {
173
+ return !button || !button.id || !button.id.trim() || !button.text || !button.text.trim();
174
+ });
175
+ if (hasInvalidButton) {
176
+ throw new Error_1.WhatsappError("Each button requires non-empty id and text");
177
+ }
178
+ let retryCount = 0;
179
+ const maxRetries = 3;
180
+ const createPayload = () => {
181
+ const payload = {
182
+ text,
183
+ aimode,
184
+ buttons,
185
+ };
186
+ if (title)
187
+ payload.title = title;
188
+ if (footer)
189
+ payload.footer = footer;
190
+ if (image)
191
+ payload.image = image;
192
+ return payload;
193
+ };
194
+ const normalizeResult = (result) => {
195
+ if (result && typeof result === "object") {
196
+ result.toJSON = () => ({});
197
+ }
198
+ return result;
199
+ };
200
+ const attemptSend = () => __awaiter(void 0, void 0, void 0, function* () {
201
+ var _a, _b, _c;
202
+ try {
203
+ const isDestinationGroup = jid.endsWith('@g.us');
204
+ yield (0, create_delay_1.createDelay)(500);
205
+ const timeoutMs = isDestinationGroup ? 15000 : 30000;
206
+ const result = yield sendButtons(session, jid, createPayload());
207
+ return yield (0, create_delay_1.withTimeout)(Promise.resolve(normalizeResult(result)), timeoutMs, `Pengiriman button message ke ${jid} melebihi batas waktu ${timeoutMs / 1000} detik`);
208
+ }
209
+ catch (error) {
210
+ console.error(`Error saat mengirim button message (percobaan ${retryCount + 1}/${maxRetries}): ${(error === null || error === void 0 ? void 0 : error.message) || 'Unknown error'}`);
211
+ if (((_a = error === null || error === void 0 ? void 0 : error.message) === null || _a === void 0 ? void 0 : _a.includes('MessageCounterError')) || ((_b = error === null || error === void 0 ? void 0 : error.stack) === null || _b === void 0 ? void 0 : _b.includes('MessageCounterError'))) {
212
+ console.warn('Terdeteksi MessageCounterError, kemungkinan grup dengan channel pengumuman');
213
+ if (retryCount < maxRetries) {
214
+ retryCount++;
215
+ yield (0, create_delay_1.createDelay)(2000 * retryCount);
216
+ return attemptSend();
217
+ }
218
+ else {
219
+ console.error('Batas maksimum percobaan ulang tercapai');
220
+ throw new Error_1.WhatsappError(`Gagal mengirim button message ke grup dengan channel pengumuman setelah ${maxRetries} kali percobaan`);
221
+ }
222
+ }
223
+ if ((_c = error === null || error === void 0 ? void 0 : error.message) === null || _c === void 0 ? void 0 : _c.includes('Connection Closed')) {
224
+ try {
225
+ yield (0, Socket_1.reconnect)(sessionId);
226
+ yield (0, create_delay_1.createDelay)(3000);
227
+ const reconnectResult = yield sendButtons(session, jid, createPayload());
228
+ return yield (0, create_delay_1.withTimeout)(Promise.resolve(normalizeResult(reconnectResult)), 30000, `Pengiriman button message setelah reconnect melebihi batas waktu`);
229
+ }
230
+ catch (reconnectError) {
231
+ console.error(`Gagal reconnect: ${(reconnectError === null || reconnectError === void 0 ? void 0 : reconnectError.message) || 'Unknown error'}`);
232
+ throw new Error_1.WhatsappError(`Koneksi terputus dan gagal reconnect: ${(reconnectError === null || reconnectError === void 0 ? void 0 : reconnectError.message) || 'Unknown error'}`);
233
+ }
234
+ }
235
+ try {
236
+ yield (0, create_delay_1.createDelay)(2000);
237
+ const retryResult = yield sendButtons(session, jid, createPayload());
238
+ return yield (0, create_delay_1.withTimeout)(Promise.resolve(normalizeResult(retryResult)), 20000, `Percobaan kedua pengiriman button message melebihi batas waktu`);
239
+ }
240
+ catch (retryError) {
241
+ console.error(`Gagal pada percobaan kedua: ${(retryError === null || retryError === void 0 ? void 0 : retryError.message) || 'Unknown error'}`);
242
+ throw new Error_1.WhatsappError(`Gagal mengirim button message: ${(retryError === null || retryError === void 0 ? void 0 : retryError.message) || 'Unknown error'}`);
243
+ }
244
+ }
245
+ });
246
+ return attemptSend();
247
+ });
248
+ exports.sendButtonMessage = sendButtonMessage;
142
249
  /**
143
250
  * Kirim pesan teks dengan mention
144
251
  *
@@ -17,6 +17,20 @@ export interface SendMessageTypes {
17
17
  export interface SendMessageWithMentionTypes extends SendMessageTypes {
18
18
  mentions?: string[];
19
19
  }
20
+ export interface SendButtonMessageButton {
21
+ id: string;
22
+ text: string;
23
+ }
24
+ export interface SendButtonMessageTypes extends Omit<SendMessageTypes, "text"> {
25
+ title?: string;
26
+ text: string;
27
+ footer?: string;
28
+ image?: {
29
+ url: string;
30
+ } | Buffer | string;
31
+ aimode?: boolean;
32
+ buttons: SendButtonMessageButton[];
33
+ }
20
34
  export interface SendMediaTypes extends SendMessageTypes {
21
35
  media: string | Buffer;
22
36
  type: "image" | "video" | "audio" | "pdf" | "xls" | "xlsx" | "doc" | "docx" | "zip" | "mp3";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/Types/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/Types/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wa-multi-mongodb",
3
- "version": "3.11.2",
3
+ "version": "3.12.1",
4
4
  "description": "Multi Session Whatsapp Library with MongoDB Integration",
5
5
  "main": "dist/cjs/index.js",
6
6
  "module": "dist/index.js",
@@ -35,6 +35,7 @@
35
35
  "aws4": "^1.13.2",
36
36
  "baileys": "^7.0.0-rc13",
37
37
  "dotenv": "^16.5.0",
38
+ "gifted-btns": "^1.0.2",
38
39
  "link-preview-js": "^3.0.14",
39
40
  "mime": "^4.1.0",
40
41
  "mongodb": "^5.7.0",
package/readme.md CHANGED
@@ -368,15 +368,30 @@ await whatsapp.sendTextMessage({
368
368
  });
369
369
 
370
370
  // Send to a group (compatible with older versions)
371
- await whatsapp.sendTextMessage({
372
- sessionId: "mysession",
373
- to: "120363152682073800", // group ID
374
- text: "Hello group!",
375
- isGroup: true // still works but optional in v3.9.0+
376
- });
377
-
378
- // Send media (unified function)
379
- await whatsapp.sendMedia({
371
+ await whatsapp.sendTextMessage({
372
+ sessionId: "mysession",
373
+ to: "120363152682073800", // group ID
374
+ text: "Hello group!",
375
+ isGroup: true // still works but optional in v3.9.0+
376
+ });
377
+
378
+ // Send button message
379
+ await whatsapp.sendButtonMessage({
380
+ sessionId: "mysession",
381
+ to: "6281234567890",
382
+ title: "Header Title", // optional
383
+ text: "Pick one option below",
384
+ footer: "Footer text", // optional
385
+ image: { url: "https://example.com/image.jpg" }, // optional, can be URL, buffer, or path
386
+ aimode: true, // optional, defaults to false
387
+ buttons: [
388
+ { id: "quick_1", text: "Quick Reply" }
389
+ ],
390
+ // isGroup parameter is optional (v3.9.0+)
391
+ });
392
+
393
+ // Send media (unified function)
394
+ await whatsapp.sendMedia({
380
395
  sessionId: "mysession",
381
396
  to: "6281234567890",
382
397
  type: "image", // options: image, video, pdf, doc, docx, xls, xlsx, zip, mp3
@@ -1151,8 +1166,15 @@ export default WhatsAppQRComponent;
1151
1166
 
1152
1167
  ## Changelog
1153
1168
 
1154
- ### v3.11.0 (latest)
1155
- - **New `downloadMediaMessage` Function**: Download incoming WhatsApp media messages directly as a `Buffer`
1169
+ ### v3.12.0 (latest)
1170
+ - **Button Message Support**: Added `sendButtonMessage()` for sending WhatsApp button messages
1171
+ - Supports title, body text, footer, image, AI mode, and quick reply buttons
1172
+ - Includes validation for required button text and non-empty button IDs
1173
+ - Works with private chats and groups using the existing automatic JID detection
1174
+ - Uses the same retry, reconnect, and timeout handling pattern as text messages
1175
+
1176
+ ### v3.11.0
1177
+ - **New `downloadMediaMessage` Function**: Download incoming WhatsApp media messages directly as a `Buffer`
1156
1178
  - Supports images, videos, documents, audio, stickers, and other Baileys-supported media messages
1157
1179
  - Uses the active session for media reupload requests when WhatsApp media links have expired
1158
1180
  - Useful for cloud uploads, custom storage, media processing, forwarding workflows, and API responses