@kangwifi-pro/waliwa 1.0.2 → 1.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/dist/community/audio-transcription.d.ts +46 -0
- package/dist/community/audio-transcription.d.ts.map +1 -0
- package/dist/community/audio-transcription.js +108 -0
- package/dist/community/audio-transcription.js.map +1 -0
- package/dist/community/bulk-operations.d.ts +87 -0
- package/dist/community/bulk-operations.d.ts.map +1 -0
- package/dist/community/bulk-operations.js +223 -0
- package/dist/community/bulk-operations.js.map +1 -0
- package/dist/community/community-fixes.d.ts +306 -0
- package/dist/community/community-fixes.d.ts.map +1 -0
- package/dist/community/community-fixes.js +630 -0
- package/dist/community/community-fixes.js.map +1 -0
- package/dist/community/contacts-manager.d.ts +89 -0
- package/dist/community/contacts-manager.d.ts.map +1 -0
- package/dist/community/contacts-manager.js +241 -0
- package/dist/community/contacts-manager.js.map +1 -0
- package/dist/community/disappearing.d.ts +63 -0
- package/dist/community/disappearing.d.ts.map +1 -0
- package/dist/community/disappearing.js +195 -0
- package/dist/community/disappearing.js.map +1 -0
- package/dist/community/index.d.ts +101 -0
- package/dist/community/index.d.ts.map +1 -0
- package/dist/community/index.js +113 -0
- package/dist/community/index.js.map +1 -0
- package/dist/community/live-location.d.ts +85 -0
- package/dist/community/live-location.d.ts.map +1 -0
- package/dist/community/live-location.js +238 -0
- package/dist/community/live-location.js.map +1 -0
- package/dist/community/message-extras.d.ts +110 -0
- package/dist/community/message-extras.d.ts.map +1 -0
- package/dist/community/message-extras.js +472 -0
- package/dist/community/message-extras.js.map +1 -0
- package/dist/community/newsletter-extended.d.ts +142 -0
- package/dist/community/newsletter-extended.d.ts.map +1 -0
- package/dist/community/newsletter-extended.js +543 -0
- package/dist/community/newsletter-extended.js.map +1 -0
- package/dist/community/privacy-manager.d.ts +98 -0
- package/dist/community/privacy-manager.d.ts.map +1 -0
- package/dist/community/privacy-manager.js +273 -0
- package/dist/community/privacy-manager.js.map +1 -0
- package/dist/community/profile-manager.d.ts +94 -0
- package/dist/community/profile-manager.d.ts.map +1 -0
- package/dist/community/profile-manager.js +363 -0
- package/dist/community/profile-manager.js.map +1 -0
- package/dist/community/status-extended.d.ts +119 -0
- package/dist/community/status-extended.d.ts.map +1 -0
- package/dist/community/status-extended.js +444 -0
- package/dist/community/status-extended.js.map +1 -0
- package/dist/community/sticker-manager.d.ts +73 -0
- package/dist/community/sticker-manager.d.ts.map +1 -0
- package/dist/community/sticker-manager.js +251 -0
- package/dist/community/sticker-manager.js.map +1 -0
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +33 -2
- package/dist/index.js.map +1 -1
- package/dist/socket/wa-socket.d.ts +77 -0
- package/dist/socket/wa-socket.d.ts.map +1 -1
- package/dist/socket/wa-socket.js +149 -3
- package/dist/socket/wa-socket.js.map +1 -1
- package/package.json +2 -2
- package/src/community/audio-transcription.ts +121 -0
- package/src/community/bulk-operations.ts +329 -0
- package/src/community/community-fixes.ts +771 -0
- package/src/community/contacts-manager.ts +282 -0
- package/src/community/disappearing.ts +218 -0
- package/src/community/index.ts +169 -0
- package/src/community/live-location.ts +287 -0
- package/src/community/message-extras.ts +523 -0
- package/src/community/newsletter-extended.ts +614 -0
- package/src/community/privacy-manager.ts +310 -0
- package/src/community/profile-manager.ts +402 -0
- package/src/community/status-extended.ts +518 -0
- package/src/community/sticker-manager.ts +305 -0
- package/src/index.ts +67 -2
- package/src/socket/wa-socket.ts +183 -4
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Waliwa - Audio Transcription (Community Request)
|
|
3
|
+
*
|
|
4
|
+
* Audio transcription menggunakan external service (e.g., Whisper API).
|
|
5
|
+
* Hook-based design agar user bisa pakai provider apapun.
|
|
6
|
+
*/
|
|
7
|
+
import type { WALogger } from '../types/index.js';
|
|
8
|
+
export interface TranscriptionResult {
|
|
9
|
+
text: string;
|
|
10
|
+
language?: string;
|
|
11
|
+
confidence?: number;
|
|
12
|
+
duration?: number;
|
|
13
|
+
provider: string;
|
|
14
|
+
}
|
|
15
|
+
export type TranscriptionProvider = (audioBuffer: Buffer, mimetype: string) => Promise<TranscriptionResult>;
|
|
16
|
+
/**
|
|
17
|
+
* Audio transcription manager dengan pluggable provider
|
|
18
|
+
*/
|
|
19
|
+
export declare class AudioTranscriptionManager {
|
|
20
|
+
private provider;
|
|
21
|
+
private logger;
|
|
22
|
+
private cache;
|
|
23
|
+
constructor(logger?: WALogger);
|
|
24
|
+
/**
|
|
25
|
+
* Set transcription provider (e.g., Whisper, Google Speech-to-Text)
|
|
26
|
+
*/
|
|
27
|
+
setProvider(provider: TranscriptionProvider): void;
|
|
28
|
+
/**
|
|
29
|
+
* Transcribe audio dengan caching
|
|
30
|
+
*/
|
|
31
|
+
transcribe(audioBuffer: Buffer, mimetype: string, cacheKey?: string): Promise<TranscriptionResult>;
|
|
32
|
+
/**
|
|
33
|
+
* Whisper API provider (OpenAI)
|
|
34
|
+
*/
|
|
35
|
+
static whisperProvider(apiKey: string, logger?: WALogger): TranscriptionProvider;
|
|
36
|
+
/**
|
|
37
|
+
* Clear cache
|
|
38
|
+
*/
|
|
39
|
+
clearCache(): void;
|
|
40
|
+
hasProvider(): boolean;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Helper: Detect language dari audio
|
|
44
|
+
*/
|
|
45
|
+
export declare function detectLanguageFromText(text: string): string;
|
|
46
|
+
//# sourceMappingURL=audio-transcription.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audio-transcription.d.ts","sourceRoot":"","sources":["../../src/community/audio-transcription.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAGlD,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,qBAAqB,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,mBAAmB,CAAC,CAAC;AAE5G;;GAEG;AACH,qBAAa,yBAAyB;IACpC,OAAO,CAAC,QAAQ,CAAsC;IACtD,OAAO,CAAC,MAAM,CAAW;IACzB,OAAO,CAAC,KAAK,CAA+C;gBAEhD,MAAM,CAAC,EAAE,QAAQ;IAI7B;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,qBAAqB,GAAG,IAAI;IAKlD;;OAEG;IACG,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAmBxG;;OAEG;IACH,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,QAAQ,GAAG,qBAAqB;IA8BhF;;OAEG;IACH,UAAU,IAAI,IAAI;IAIlB,WAAW,IAAI,OAAO;CAGvB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAU3D"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Waliwa - Audio Transcription (Community Request)
|
|
4
|
+
*
|
|
5
|
+
* Audio transcription menggunakan external service (e.g., Whisper API).
|
|
6
|
+
* Hook-based design agar user bisa pakai provider apapun.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.AudioTranscriptionManager = void 0;
|
|
10
|
+
exports.detectLanguageFromText = detectLanguageFromText;
|
|
11
|
+
const logger_js_1 = require("../utils/logger.js");
|
|
12
|
+
/**
|
|
13
|
+
* Audio transcription manager dengan pluggable provider
|
|
14
|
+
*/
|
|
15
|
+
class AudioTranscriptionManager {
|
|
16
|
+
provider = null;
|
|
17
|
+
logger;
|
|
18
|
+
cache = new Map();
|
|
19
|
+
constructor(logger) {
|
|
20
|
+
this.logger = logger ?? new logger_js_1.SilentLogger();
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Set transcription provider (e.g., Whisper, Google Speech-to-Text)
|
|
24
|
+
*/
|
|
25
|
+
setProvider(provider) {
|
|
26
|
+
this.provider = provider;
|
|
27
|
+
this.logger.info('Audio transcription provider set');
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Transcribe audio dengan caching
|
|
31
|
+
*/
|
|
32
|
+
async transcribe(audioBuffer, mimetype, cacheKey) {
|
|
33
|
+
if (cacheKey) {
|
|
34
|
+
const cached = this.cache.get(cacheKey);
|
|
35
|
+
if (cached)
|
|
36
|
+
return cached;
|
|
37
|
+
}
|
|
38
|
+
if (!this.provider) {
|
|
39
|
+
throw new Error('No transcription provider set. Call setProvider() first.');
|
|
40
|
+
}
|
|
41
|
+
const result = await this.provider(audioBuffer, mimetype);
|
|
42
|
+
if (cacheKey) {
|
|
43
|
+
this.cache.set(cacheKey, result);
|
|
44
|
+
}
|
|
45
|
+
return result;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Whisper API provider (OpenAI)
|
|
49
|
+
*/
|
|
50
|
+
static whisperProvider(apiKey, logger) {
|
|
51
|
+
return async (audioBuffer, mimetype) => {
|
|
52
|
+
const formData = new FormData();
|
|
53
|
+
const blob = new Blob([audioBuffer], { type: mimetype });
|
|
54
|
+
formData.append('file', blob, 'audio.ogg');
|
|
55
|
+
formData.append('model', 'whisper-1');
|
|
56
|
+
formData.append('response_format', 'json');
|
|
57
|
+
const response = await fetch('https://api.openai.com/v1/audio/transcriptions', {
|
|
58
|
+
method: 'POST',
|
|
59
|
+
headers: {
|
|
60
|
+
'Authorization': `Bearer ${apiKey}`
|
|
61
|
+
},
|
|
62
|
+
body: formData
|
|
63
|
+
});
|
|
64
|
+
if (!response.ok) {
|
|
65
|
+
throw new Error(`Whisper API error: ${response.status} ${response.statusText}`);
|
|
66
|
+
}
|
|
67
|
+
const data = await response.json();
|
|
68
|
+
return {
|
|
69
|
+
text: data.text,
|
|
70
|
+
language: data.language,
|
|
71
|
+
duration: data.duration,
|
|
72
|
+
provider: 'whisper'
|
|
73
|
+
};
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Clear cache
|
|
78
|
+
*/
|
|
79
|
+
clearCache() {
|
|
80
|
+
this.cache.clear();
|
|
81
|
+
}
|
|
82
|
+
hasProvider() {
|
|
83
|
+
return this.provider !== null;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
exports.AudioTranscriptionManager = AudioTranscriptionManager;
|
|
87
|
+
/**
|
|
88
|
+
* Helper: Detect language dari audio
|
|
89
|
+
*/
|
|
90
|
+
function detectLanguageFromText(text) {
|
|
91
|
+
// Simple heuristic untuk detect common languages
|
|
92
|
+
if (/[\u4e00-\u9fff]/.test(text))
|
|
93
|
+
return 'zh';
|
|
94
|
+
if (/[\u3040-\u309f\u30a0-\u30ff]/.test(text))
|
|
95
|
+
return 'ja';
|
|
96
|
+
if (/[\uac00-\ud7af]/.test(text))
|
|
97
|
+
return 'ko';
|
|
98
|
+
if (/[\u0600-\u06ff]/.test(text))
|
|
99
|
+
return 'ar';
|
|
100
|
+
if (/[\u0400-\u04ff]/.test(text))
|
|
101
|
+
return 'ru';
|
|
102
|
+
if (/[\u0900-\u097f]/.test(text))
|
|
103
|
+
return 'hi';
|
|
104
|
+
if (/[\u0e00-\u0e7f]/.test(text))
|
|
105
|
+
return 'th';
|
|
106
|
+
return 'en';
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=audio-transcription.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audio-transcription.js","sourceRoot":"","sources":["../../src/community/audio-transcription.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Waliwa - Bulk Operations (Community Request)
|
|
3
|
+
*
|
|
4
|
+
* Fitur yang sering diminta komunitas Baileys:
|
|
5
|
+
* - Send multiple messages in one call (bulk send)
|
|
6
|
+
* - Send multiple media files (album send)
|
|
7
|
+
* - Broadcast dengan delay untuk avoid spam
|
|
8
|
+
* - Multi-recipient send (same message ke multiple users)
|
|
9
|
+
* - Forward multiple messages
|
|
10
|
+
*
|
|
11
|
+
* Fix Baileys issues:
|
|
12
|
+
* - Bulk send tidak ada
|
|
13
|
+
* - Broadcast tidak ada delay control
|
|
14
|
+
* - Multi-file send tidak support
|
|
15
|
+
*/
|
|
16
|
+
import type { JIDLike, MessageContent, WAMessage, WALogger, SendMessageResult } from '../types/index.js';
|
|
17
|
+
export interface BulkSendItem {
|
|
18
|
+
jid: JIDLike;
|
|
19
|
+
content: MessageContent;
|
|
20
|
+
delayMs?: number;
|
|
21
|
+
}
|
|
22
|
+
export interface BulkSendResult {
|
|
23
|
+
jid: string;
|
|
24
|
+
success: boolean;
|
|
25
|
+
result?: SendMessageResult;
|
|
26
|
+
error?: string;
|
|
27
|
+
durationMs: number;
|
|
28
|
+
}
|
|
29
|
+
export interface BulkSendOptions {
|
|
30
|
+
/** Delay between sends (ms) - default 1000ms */
|
|
31
|
+
delayMs?: number;
|
|
32
|
+
/** Max concurrent sends - default 5 */
|
|
33
|
+
concurrency?: number;
|
|
34
|
+
/** Stop on first error - default false */
|
|
35
|
+
stopOnError?: boolean;
|
|
36
|
+
/** Progress callback */
|
|
37
|
+
onProgress?: (current: number, total: number) => void;
|
|
38
|
+
/** Rate limit per second - default 10 */
|
|
39
|
+
rateLimitPerSecond?: number;
|
|
40
|
+
}
|
|
41
|
+
export interface AlbumItem {
|
|
42
|
+
type: 'image' | 'video' | 'audio' | 'document';
|
|
43
|
+
stream: Buffer | Uint8Array;
|
|
44
|
+
mimetype: string;
|
|
45
|
+
caption?: string;
|
|
46
|
+
fileName?: string;
|
|
47
|
+
}
|
|
48
|
+
export interface BulkOperationsOptions {
|
|
49
|
+
sendMessage: (jid: JIDLike, content: MessageContent) => Promise<SendMessageResult>;
|
|
50
|
+
uploadMedia: (data: Buffer | Uint8Array, type: string, mimetype: string, fileName?: string) => Promise<any>;
|
|
51
|
+
logger?: WALogger;
|
|
52
|
+
}
|
|
53
|
+
export declare class BulkOperations {
|
|
54
|
+
private sendMessage;
|
|
55
|
+
private uploadMedia;
|
|
56
|
+
private logger;
|
|
57
|
+
private defaultRateLimiter;
|
|
58
|
+
constructor(opts: BulkOperationsOptions);
|
|
59
|
+
/**
|
|
60
|
+
* Send multiple messages dengan delay
|
|
61
|
+
* Fix Baileys issue: bulk send tidak ada
|
|
62
|
+
*/
|
|
63
|
+
bulkSend(items: BulkSendItem[], options?: BulkSendOptions): Promise<BulkSendResult[]>;
|
|
64
|
+
private processQueue;
|
|
65
|
+
/**
|
|
66
|
+
* Broadcast same message ke multiple recipients
|
|
67
|
+
* dengan delay untuk avoid spam detection
|
|
68
|
+
*/
|
|
69
|
+
broadcast(content: MessageContent, recipients: JIDLike[], options?: BulkSendOptions): Promise<BulkSendResult[]>;
|
|
70
|
+
/**
|
|
71
|
+
* Send album (multiple media files in sequence)
|
|
72
|
+
* Fix Baileys issue: multi-file send tidak support
|
|
73
|
+
*/
|
|
74
|
+
sendAlbum(jid: JIDLike, items: AlbumItem[], options?: {
|
|
75
|
+
delayMs?: number;
|
|
76
|
+
onProgress?: (current: number, total: number) => void;
|
|
77
|
+
}): Promise<BulkSendResult[]>;
|
|
78
|
+
/**
|
|
79
|
+
* Forward multiple messages ke multiple recipients
|
|
80
|
+
*/
|
|
81
|
+
bulkForward(messages: WAMessage[], recipients: JIDLike[], forwardFn: (to: JIDLike, message: WAMessage) => Promise<SendMessageResult>, options?: BulkSendOptions): Promise<BulkSendResult[]>;
|
|
82
|
+
/**
|
|
83
|
+
* Send message dengan retry on failure
|
|
84
|
+
*/
|
|
85
|
+
sendWithRetry(jid: JIDLike, content: MessageContent, maxRetries?: number, delayMs?: number): Promise<SendMessageResult>;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=bulk-operations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bulk-operations.d.ts","sourceRoot":"","sources":["../../src/community/bulk-operations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Waliwa - Bulk Operations (Community Request)
|
|
4
|
+
*
|
|
5
|
+
* Fitur yang sering diminta komunitas Baileys:
|
|
6
|
+
* - Send multiple messages in one call (bulk send)
|
|
7
|
+
* - Send multiple media files (album send)
|
|
8
|
+
* - Broadcast dengan delay untuk avoid spam
|
|
9
|
+
* - Multi-recipient send (same message ke multiple users)
|
|
10
|
+
* - Forward multiple messages
|
|
11
|
+
*
|
|
12
|
+
* Fix Baileys issues:
|
|
13
|
+
* - Bulk send tidak ada
|
|
14
|
+
* - Broadcast tidak ada delay control
|
|
15
|
+
* - Multi-file send tidak support
|
|
16
|
+
*/
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.BulkOperations = void 0;
|
|
19
|
+
const jid_js_1 = require("../utils/jid.js");
|
|
20
|
+
const retry_js_1 = require("../utils/retry.js");
|
|
21
|
+
const logger_js_1 = require("../utils/logger.js");
|
|
22
|
+
const retry_js_2 = require("../utils/retry.js");
|
|
23
|
+
class BulkOperations {
|
|
24
|
+
sendMessage;
|
|
25
|
+
uploadMedia;
|
|
26
|
+
logger;
|
|
27
|
+
defaultRateLimiter;
|
|
28
|
+
constructor(opts) {
|
|
29
|
+
this.sendMessage = opts.sendMessage;
|
|
30
|
+
this.uploadMedia = opts.uploadMedia;
|
|
31
|
+
this.logger = opts.logger ?? new logger_js_1.SilentLogger();
|
|
32
|
+
this.defaultRateLimiter = new retry_js_2.RateLimiter(10); // 10 per second default
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Send multiple messages dengan delay
|
|
36
|
+
* Fix Baileys issue: bulk send tidak ada
|
|
37
|
+
*/
|
|
38
|
+
async bulkSend(items, options = {}) {
|
|
39
|
+
const { delayMs = 1000, concurrency = 5, stopOnError = false, onProgress, rateLimitPerSecond = 10 } = options;
|
|
40
|
+
const rateLimiter = new retry_js_2.RateLimiter(rateLimitPerSecond);
|
|
41
|
+
const results = [];
|
|
42
|
+
const queue = [...items];
|
|
43
|
+
let processed = 0;
|
|
44
|
+
let hasError = false;
|
|
45
|
+
// Process dengan limited concurrency
|
|
46
|
+
const workers = [];
|
|
47
|
+
for (let i = 0; i < Math.min(concurrency, items.length); i++) {
|
|
48
|
+
workers.push(this.processQueue(queue, results, rateLimiter, delayMs, stopOnError, () => {
|
|
49
|
+
processed++;
|
|
50
|
+
onProgress?.(processed, items.length);
|
|
51
|
+
if (stopOnError && results.some(r => !r.success)) {
|
|
52
|
+
hasError = true;
|
|
53
|
+
}
|
|
54
|
+
}, () => hasError));
|
|
55
|
+
}
|
|
56
|
+
await Promise.all(workers);
|
|
57
|
+
const successCount = results.filter(r => r.success).length;
|
|
58
|
+
const failureCount = results.length - successCount;
|
|
59
|
+
this.logger.info(`Bulk send complete: ${successCount} success, ${failureCount} failed`);
|
|
60
|
+
return results;
|
|
61
|
+
}
|
|
62
|
+
async processQueue(queue, results, rateLimiter, delayMs, stopOnError, onItemDone, shouldStop) {
|
|
63
|
+
while (queue.length > 0 && !shouldStop()) {
|
|
64
|
+
const item = queue.shift();
|
|
65
|
+
if (!item)
|
|
66
|
+
break;
|
|
67
|
+
const startTime = Date.now();
|
|
68
|
+
try {
|
|
69
|
+
await rateLimiter.acquire();
|
|
70
|
+
const result = await this.sendMessage(item.jid, item.content);
|
|
71
|
+
results.push({
|
|
72
|
+
jid: (0, jid_js_1.jidToString)(item.jid),
|
|
73
|
+
success: true,
|
|
74
|
+
result,
|
|
75
|
+
durationMs: Date.now() - startTime
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
catch (err) {
|
|
79
|
+
results.push({
|
|
80
|
+
jid: (0, jid_js_1.jidToString)(item.jid),
|
|
81
|
+
success: false,
|
|
82
|
+
error: err.message,
|
|
83
|
+
durationMs: Date.now() - startTime
|
|
84
|
+
});
|
|
85
|
+
if (stopOnError) {
|
|
86
|
+
this.logger.error(`Stopping bulk send due to error: ${err.message}`);
|
|
87
|
+
break;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
onItemDone();
|
|
91
|
+
// Delay between sends
|
|
92
|
+
const delay = item.delayMs ?? delayMs;
|
|
93
|
+
if (delay > 0 && queue.length > 0) {
|
|
94
|
+
await (0, retry_js_1.sleep)(delay);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Broadcast same message ke multiple recipients
|
|
100
|
+
* dengan delay untuk avoid spam detection
|
|
101
|
+
*/
|
|
102
|
+
async broadcast(content, recipients, options = {}) {
|
|
103
|
+
const items = recipients.map(jid => ({ jid, content }));
|
|
104
|
+
return this.bulkSend(items, options);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Send album (multiple media files in sequence)
|
|
108
|
+
* Fix Baileys issue: multi-file send tidak support
|
|
109
|
+
*/
|
|
110
|
+
async sendAlbum(jid, items, options = {}) {
|
|
111
|
+
const { delayMs = 500, onProgress } = options;
|
|
112
|
+
const results = [];
|
|
113
|
+
for (let i = 0; i < items.length; i++) {
|
|
114
|
+
const item = items[i];
|
|
115
|
+
const startTime = Date.now();
|
|
116
|
+
try {
|
|
117
|
+
// Upload media first
|
|
118
|
+
const uploadResult = await this.uploadMedia(item.stream, item.type, item.mimetype, item.fileName);
|
|
119
|
+
// Send message with media reference
|
|
120
|
+
const content = {
|
|
121
|
+
[item.type]: {
|
|
122
|
+
stream: item.stream,
|
|
123
|
+
mimetype: item.mimetype,
|
|
124
|
+
url: uploadResult.url
|
|
125
|
+
},
|
|
126
|
+
caption: item.caption
|
|
127
|
+
};
|
|
128
|
+
const result = await this.sendMessage(jid, content);
|
|
129
|
+
results.push({
|
|
130
|
+
jid: (0, jid_js_1.jidToString)(jid),
|
|
131
|
+
success: true,
|
|
132
|
+
result,
|
|
133
|
+
durationMs: Date.now() - startTime
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
catch (err) {
|
|
137
|
+
results.push({
|
|
138
|
+
jid: (0, jid_js_1.jidToString)(jid),
|
|
139
|
+
success: false,
|
|
140
|
+
error: err.message,
|
|
141
|
+
durationMs: Date.now() - startTime
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
onProgress?.(i + 1, items.length);
|
|
145
|
+
if (i < items.length - 1 && delayMs > 0) {
|
|
146
|
+
await (0, retry_js_1.sleep)(delayMs);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return results;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Forward multiple messages ke multiple recipients
|
|
153
|
+
*/
|
|
154
|
+
async bulkForward(messages, recipients, forwardFn, options = {}) {
|
|
155
|
+
const items = [];
|
|
156
|
+
for (const recipient of recipients) {
|
|
157
|
+
for (const message of messages) {
|
|
158
|
+
// Use forwardFn via content placeholder
|
|
159
|
+
items.push({
|
|
160
|
+
jid: recipient,
|
|
161
|
+
content: { text: '__forward__' }, // marker, akan di-handle oleh forwardFn
|
|
162
|
+
delayMs: options.delayMs
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
const results = [];
|
|
167
|
+
const { delayMs = 1000, stopOnError = false, onProgress } = options;
|
|
168
|
+
let processed = 0;
|
|
169
|
+
for (let i = 0; i < items.length; i++) {
|
|
170
|
+
const item = items[i];
|
|
171
|
+
const message = messages[Math.floor(i / recipients.length)];
|
|
172
|
+
const recipient = recipients[i % recipients.length];
|
|
173
|
+
const startTime = Date.now();
|
|
174
|
+
try {
|
|
175
|
+
const result = await forwardFn(recipient, message);
|
|
176
|
+
results.push({
|
|
177
|
+
jid: (0, jid_js_1.jidToString)(recipient),
|
|
178
|
+
success: true,
|
|
179
|
+
result,
|
|
180
|
+
durationMs: Date.now() - startTime
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
catch (err) {
|
|
184
|
+
results.push({
|
|
185
|
+
jid: (0, jid_js_1.jidToString)(recipient),
|
|
186
|
+
success: false,
|
|
187
|
+
error: err.message,
|
|
188
|
+
durationMs: Date.now() - startTime
|
|
189
|
+
});
|
|
190
|
+
if (stopOnError)
|
|
191
|
+
break;
|
|
192
|
+
}
|
|
193
|
+
processed++;
|
|
194
|
+
onProgress?.(processed, items.length);
|
|
195
|
+
if (i < items.length - 1 && delayMs > 0) {
|
|
196
|
+
await (0, retry_js_1.sleep)(delayMs);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
return results;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Send message dengan retry on failure
|
|
203
|
+
*/
|
|
204
|
+
async sendWithRetry(jid, content, maxRetries = 3, delayMs = 2000) {
|
|
205
|
+
let lastError;
|
|
206
|
+
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
|
207
|
+
try {
|
|
208
|
+
this.logger.debug(`Send attempt ${attempt}/${maxRetries} to ${(0, jid_js_1.jidToString)(jid)}`);
|
|
209
|
+
return await this.sendMessage(jid, content);
|
|
210
|
+
}
|
|
211
|
+
catch (err) {
|
|
212
|
+
lastError = err;
|
|
213
|
+
this.logger.warn(`Attempt ${attempt} failed: ${err.message}`);
|
|
214
|
+
if (attempt < maxRetries) {
|
|
215
|
+
await (0, retry_js_1.sleep)(delayMs * attempt); // exponential-ish
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
throw lastError ?? new Error('Send failed after retries');
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
exports.BulkOperations = BulkOperations;
|
|
223
|
+
//# sourceMappingURL=bulk-operations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bulk-operations.js","sourceRoot":"","sources":["../../src/community/bulk-operations.ts"],"names":[],"mappings":"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"}
|