baileys-joss 1.0.0 → 1.0.2
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/README.md +2554 -78
- package/lib/Socket/business.d.ts +4 -0
- package/lib/Socket/business.d.ts.map +1 -1
- package/lib/Socket/chats.d.ts +4 -0
- package/lib/Socket/chats.d.ts.map +1 -1
- package/lib/Socket/chats.js +44 -1
- package/lib/Socket/chats.js.map +1 -1
- package/lib/Socket/communities.d.ts +4 -0
- package/lib/Socket/communities.d.ts.map +1 -1
- package/lib/Socket/groups.d.ts +4 -0
- package/lib/Socket/groups.d.ts.map +1 -1
- package/lib/Socket/index.d.ts +4 -0
- package/lib/Socket/index.d.ts.map +1 -1
- package/lib/Socket/messages-recv.d.ts +4 -0
- package/lib/Socket/messages-recv.d.ts.map +1 -1
- package/lib/Socket/messages-send.d.ts +4 -0
- package/lib/Socket/messages-send.d.ts.map +1 -1
- package/lib/Socket/messages-send.js +130 -1
- package/lib/Socket/messages-send.js.map +1 -1
- package/lib/Socket/newsletter.d.ts +4 -0
- package/lib/Socket/newsletter.d.ts.map +1 -1
- package/lib/Types/Message.d.ts +25 -1
- package/lib/Types/Message.d.ts.map +1 -1
- package/lib/Utils/activity-logger.d.ts +189 -0
- package/lib/Utils/activity-logger.d.ts.map +1 -0
- package/lib/Utils/activity-logger.js +418 -0
- package/lib/Utils/activity-logger.js.map +1 -0
- package/lib/Utils/anti-spam.d.ts +145 -0
- package/lib/Utils/anti-spam.d.ts.map +1 -0
- package/lib/Utils/anti-spam.js +398 -0
- package/lib/Utils/anti-spam.js.map +1 -0
- package/lib/Utils/auto-reply.d.ts +123 -0
- package/lib/Utils/auto-reply.d.ts.map +1 -0
- package/lib/Utils/auto-reply.js +234 -0
- package/lib/Utils/auto-reply.js.map +1 -0
- package/lib/Utils/broadcast.d.ts +121 -0
- package/lib/Utils/broadcast.d.ts.map +1 -0
- package/lib/Utils/broadcast.js +223 -0
- package/lib/Utils/broadcast.js.map +1 -0
- package/lib/Utils/bulk-messaging.d.ts +79 -0
- package/lib/Utils/bulk-messaging.d.ts.map +1 -0
- package/lib/Utils/bulk-messaging.js +148 -0
- package/lib/Utils/bulk-messaging.js.map +1 -0
- package/lib/Utils/chat-analytics.d.ts +92 -0
- package/lib/Utils/chat-analytics.d.ts.map +1 -0
- package/lib/Utils/chat-analytics.js +337 -0
- package/lib/Utils/chat-analytics.js.map +1 -0
- package/lib/Utils/chat-control.d.ts +156 -0
- package/lib/Utils/chat-control.d.ts.map +1 -0
- package/lib/Utils/chat-control.js +224 -0
- package/lib/Utils/chat-control.js.map +1 -0
- package/lib/Utils/chat-export.d.ts +75 -0
- package/lib/Utils/chat-export.d.ts.map +1 -0
- package/lib/Utils/chat-export.js +309 -0
- package/lib/Utils/chat-export.js.map +1 -0
- package/lib/Utils/content-detector.d.ts +199 -0
- package/lib/Utils/content-detector.d.ts.map +1 -0
- package/lib/Utils/content-detector.js +442 -0
- package/lib/Utils/content-detector.js.map +1 -0
- package/lib/Utils/index.d.ts +23 -0
- package/lib/Utils/index.d.ts.map +1 -1
- package/lib/Utils/index.js +52 -0
- package/lib/Utils/index.js.map +1 -1
- package/lib/Utils/link-scanner.d.ts +112 -0
- package/lib/Utils/link-scanner.d.ts.map +1 -0
- package/lib/Utils/link-scanner.js +433 -0
- package/lib/Utils/link-scanner.js.map +1 -0
- package/lib/Utils/media-downloader.d.ts +86 -0
- package/lib/Utils/media-downloader.d.ts.map +1 -0
- package/lib/Utils/media-downloader.js +269 -0
- package/lib/Utils/media-downloader.js.map +1 -0
- package/lib/Utils/meme-generator.d.ts +96 -0
- package/lib/Utils/meme-generator.d.ts.map +1 -0
- package/lib/Utils/meme-generator.js +368 -0
- package/lib/Utils/meme-generator.js.map +1 -0
- package/lib/Utils/message-search.d.ts +96 -0
- package/lib/Utils/message-search.d.ts.map +1 -0
- package/lib/Utils/message-search.js +261 -0
- package/lib/Utils/message-search.js.map +1 -0
- package/lib/Utils/messages-media.d.ts +20 -1
- package/lib/Utils/messages-media.d.ts.map +1 -1
- package/lib/Utils/messages-media.js +100 -5
- package/lib/Utils/messages-media.js.map +1 -1
- package/lib/Utils/messages.d.ts.map +1 -1
- package/lib/Utils/messages.js +14 -2
- package/lib/Utils/messages.js.map +1 -1
- package/lib/Utils/mini-games.d.ts +155 -0
- package/lib/Utils/mini-games.d.ts.map +1 -0
- package/lib/Utils/mini-games.js +445 -0
- package/lib/Utils/mini-games.js.map +1 -0
- package/lib/Utils/pomodoro.d.ts +139 -0
- package/lib/Utils/pomodoro.d.ts.map +1 -0
- package/lib/Utils/pomodoro.js +434 -0
- package/lib/Utils/pomodoro.js.map +1 -0
- package/lib/Utils/qr-generator.d.ts +95 -0
- package/lib/Utils/qr-generator.d.ts.map +1 -0
- package/lib/Utils/qr-generator.js +226 -0
- package/lib/Utils/qr-generator.js.map +1 -0
- package/lib/Utils/quotes.d.ts +110 -0
- package/lib/Utils/quotes.d.ts.map +1 -0
- package/lib/Utils/quotes.js +325 -0
- package/lib/Utils/quotes.js.map +1 -0
- package/lib/Utils/scheduling.d.ts +88 -0
- package/lib/Utils/scheduling.d.ts.map +1 -0
- package/lib/Utils/scheduling.js +163 -0
- package/lib/Utils/scheduling.js.map +1 -0
- package/lib/Utils/status-posting.d.ts +151 -0
- package/lib/Utils/status-posting.d.ts.map +1 -0
- package/lib/Utils/status-posting.js +162 -0
- package/lib/Utils/status-posting.js.map +1 -0
- package/lib/Utils/templates.d.ts +154 -0
- package/lib/Utils/templates.d.ts.map +1 -0
- package/lib/Utils/templates.js +368 -0
- package/lib/Utils/templates.js.map +1 -0
- package/lib/Utils/vcard.d.ts +86 -0
- package/lib/Utils/vcard.d.ts.map +1 -0
- package/lib/Utils/vcard.js +195 -0
- package/lib/Utils/vcard.js.map +1 -0
- package/lib/Utils/voice-note.d.ts +115 -0
- package/lib/Utils/voice-note.d.ts.map +1 -0
- package/lib/Utils/voice-note.js +212 -0
- package/lib/Utils/voice-note.js.map +1 -0
- package/lib/Utils/weather.d.ts +118 -0
- package/lib/Utils/weather.d.ts.map +1 -0
- package/lib/Utils/weather.js +362 -0
- package/lib/Utils/weather.js.map +1 -0
- package/package.json +6 -3
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Baileys-Joss: vCard / Contact Card Generator
|
|
3
|
+
*
|
|
4
|
+
* Fitur untuk membuat dan mengirim kartu kontak
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Escape special characters for vCard
|
|
8
|
+
*/
|
|
9
|
+
const escapeVCard = (str) => {
|
|
10
|
+
return str
|
|
11
|
+
.replace(/\\/g, '\\\\')
|
|
12
|
+
.replace(/;/g, '\\;')
|
|
13
|
+
.replace(/,/g, '\\,')
|
|
14
|
+
.replace(/\n/g, '\\n');
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Format phone number for vCard
|
|
18
|
+
*/
|
|
19
|
+
const formatPhone = (phone) => {
|
|
20
|
+
// Remove all non-digit characters except +
|
|
21
|
+
return phone.replace(/[^\d+]/g, '');
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Generate vCard string from contact data
|
|
25
|
+
*/
|
|
26
|
+
export const generateVCard = (contact) => {
|
|
27
|
+
const lines = [];
|
|
28
|
+
// vCard header
|
|
29
|
+
lines.push('BEGIN:VCARD');
|
|
30
|
+
lines.push('VERSION:3.0');
|
|
31
|
+
// Full name (required)
|
|
32
|
+
const escapedName = escapeVCard(contact.fullName);
|
|
33
|
+
lines.push(`FN:${escapedName}`);
|
|
34
|
+
// Structured name (N: last;first;middle;prefix;suffix)
|
|
35
|
+
const nameParts = contact.fullName.split(' ');
|
|
36
|
+
if (nameParts.length >= 2) {
|
|
37
|
+
const lastName = nameParts[nameParts.length - 1] || '';
|
|
38
|
+
const firstName = nameParts.slice(0, -1).join(' ');
|
|
39
|
+
lines.push(`N:${escapeVCard(lastName)};${escapeVCard(firstName)};;;`);
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
lines.push(`N:${escapedName};;;;`);
|
|
43
|
+
}
|
|
44
|
+
// Organization
|
|
45
|
+
if (contact.organization) {
|
|
46
|
+
lines.push(`ORG:${escapeVCard(contact.organization)}`);
|
|
47
|
+
}
|
|
48
|
+
// Title
|
|
49
|
+
if (contact.title) {
|
|
50
|
+
lines.push(`TITLE:${escapeVCard(contact.title)}`);
|
|
51
|
+
}
|
|
52
|
+
// Phone numbers
|
|
53
|
+
if (contact.phones && contact.phones.length > 0) {
|
|
54
|
+
for (const phone of contact.phones) {
|
|
55
|
+
const type = phone.type || 'CELL';
|
|
56
|
+
const formattedPhone = formatPhone(phone.number);
|
|
57
|
+
if (phone.label) {
|
|
58
|
+
lines.push(`TEL;type=${type};type=VOICE;X-ABLabel=${escapeVCard(phone.label)}:${formattedPhone}`);
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
lines.push(`TEL;type=${type};type=VOICE:${formattedPhone}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// Email addresses
|
|
66
|
+
if (contact.emails && contact.emails.length > 0) {
|
|
67
|
+
for (const email of contact.emails) {
|
|
68
|
+
const type = email.type || 'OTHER';
|
|
69
|
+
lines.push(`EMAIL;type=${type}:${email.email}`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// URLs
|
|
73
|
+
if (contact.urls && contact.urls.length > 0) {
|
|
74
|
+
for (const url of contact.urls) {
|
|
75
|
+
const type = url.type || 'OTHER';
|
|
76
|
+
lines.push(`URL;type=${type}:${url.url}`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// Addresses
|
|
80
|
+
if (contact.addresses && contact.addresses.length > 0) {
|
|
81
|
+
for (const addr of contact.addresses) {
|
|
82
|
+
const type = addr.type || 'OTHER';
|
|
83
|
+
const parts = [
|
|
84
|
+
'', // PO Box
|
|
85
|
+
'', // Extended address
|
|
86
|
+
addr.street || '',
|
|
87
|
+
addr.city || '',
|
|
88
|
+
addr.state || '',
|
|
89
|
+
addr.postalCode || '',
|
|
90
|
+
addr.country || ''
|
|
91
|
+
].map(p => escapeVCard(p));
|
|
92
|
+
lines.push(`ADR;type=${type}:${parts.join(';')}`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// Birthday
|
|
96
|
+
if (contact.birthday) {
|
|
97
|
+
lines.push(`BDAY:${contact.birthday}`);
|
|
98
|
+
}
|
|
99
|
+
// Notes
|
|
100
|
+
if (contact.note) {
|
|
101
|
+
lines.push(`NOTE:${escapeVCard(contact.note)}`);
|
|
102
|
+
}
|
|
103
|
+
// vCard footer
|
|
104
|
+
lines.push('END:VCARD');
|
|
105
|
+
return lines.join('\r\n');
|
|
106
|
+
};
|
|
107
|
+
/**
|
|
108
|
+
* Generate multiple vCards (for contact array)
|
|
109
|
+
*/
|
|
110
|
+
export const generateVCards = (contacts) => {
|
|
111
|
+
return contacts.map(generateVCard).join('\r\n');
|
|
112
|
+
};
|
|
113
|
+
/**
|
|
114
|
+
* Parse vCard string to contact data (basic parser)
|
|
115
|
+
*/
|
|
116
|
+
export const parseVCard = (vcard) => {
|
|
117
|
+
const contact = {};
|
|
118
|
+
const lines = vcard.split(/\r?\n/);
|
|
119
|
+
for (const line of lines) {
|
|
120
|
+
const [key, ...valueParts] = line.split(':');
|
|
121
|
+
if (!key)
|
|
122
|
+
continue;
|
|
123
|
+
const value = valueParts.join(':');
|
|
124
|
+
if (key.startsWith('FN')) {
|
|
125
|
+
contact.fullName = value.replace(/\\([;,n\\])/g, '$1').replace(/\\n/g, '\n');
|
|
126
|
+
}
|
|
127
|
+
else if (key.startsWith('ORG')) {
|
|
128
|
+
contact.organization = value.replace(/\\([;,n\\])/g, '$1');
|
|
129
|
+
}
|
|
130
|
+
else if (key.startsWith('TITLE')) {
|
|
131
|
+
contact.title = value.replace(/\\([;,n\\])/g, '$1');
|
|
132
|
+
}
|
|
133
|
+
else if (key.startsWith('TEL')) {
|
|
134
|
+
contact.phones = contact.phones || [];
|
|
135
|
+
const typeMatch = key.match(/type=(\w+)/i);
|
|
136
|
+
const phoneType = (typeMatch?.[1]?.toUpperCase() || 'CELL');
|
|
137
|
+
contact.phones.push({
|
|
138
|
+
number: value,
|
|
139
|
+
type: phoneType
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
else if (key.startsWith('EMAIL')) {
|
|
143
|
+
contact.emails = contact.emails || [];
|
|
144
|
+
const typeMatch = key.match(/type=(\w+)/i);
|
|
145
|
+
contact.emails.push({
|
|
146
|
+
email: value,
|
|
147
|
+
type: typeMatch?.[1]?.toUpperCase() || 'OTHER'
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
else if (key.startsWith('BDAY')) {
|
|
151
|
+
contact.birthday = value;
|
|
152
|
+
}
|
|
153
|
+
else if (key.startsWith('NOTE')) {
|
|
154
|
+
contact.note = value.replace(/\\n/g, '\n');
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return contact;
|
|
158
|
+
};
|
|
159
|
+
/**
|
|
160
|
+
* Create a simple contact card message content
|
|
161
|
+
*/
|
|
162
|
+
export const createContactCard = (contact) => {
|
|
163
|
+
return {
|
|
164
|
+
contacts: {
|
|
165
|
+
displayName: contact.displayName || contact.fullName,
|
|
166
|
+
contacts: [{ vcard: generateVCard(contact) }]
|
|
167
|
+
}
|
|
168
|
+
};
|
|
169
|
+
};
|
|
170
|
+
/**
|
|
171
|
+
* Create a contact array message content
|
|
172
|
+
*/
|
|
173
|
+
export const createContactCards = (contacts) => {
|
|
174
|
+
const firstContact = contacts[0];
|
|
175
|
+
return {
|
|
176
|
+
contacts: {
|
|
177
|
+
displayName: contacts.length === 1 && firstContact
|
|
178
|
+
? (firstContact.displayName || firstContact.fullName)
|
|
179
|
+
: `${contacts.length} Contacts`,
|
|
180
|
+
contacts: contacts.map(c => ({ vcard: generateVCard(c) }))
|
|
181
|
+
}
|
|
182
|
+
};
|
|
183
|
+
};
|
|
184
|
+
/**
|
|
185
|
+
* Quick helper to create contact from phone number
|
|
186
|
+
*/
|
|
187
|
+
export const quickContact = (name, phone, options) => {
|
|
188
|
+
return {
|
|
189
|
+
fullName: name,
|
|
190
|
+
phones: [{ number: phone, type: 'CELL' }],
|
|
191
|
+
organization: options?.organization,
|
|
192
|
+
emails: options?.email ? [{ email: options.email, type: 'WORK' }] : undefined
|
|
193
|
+
};
|
|
194
|
+
};
|
|
195
|
+
//# sourceMappingURL=vcard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vcard.js","sourceRoot":"","sources":["../../src/Utils/vcard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Baileys-Joss: Voice Note Utilities
|
|
3
|
+
*
|
|
4
|
+
* Fitur untuk merekam dan mengirim voice note
|
|
5
|
+
*/
|
|
6
|
+
export interface VoiceNoteOptions {
|
|
7
|
+
/** Duration in seconds */
|
|
8
|
+
seconds?: number;
|
|
9
|
+
/** Audio sample rate (default: 48000) */
|
|
10
|
+
sampleRate?: number;
|
|
11
|
+
/** Audio channels (default: 1 for mono) */
|
|
12
|
+
channels?: number;
|
|
13
|
+
}
|
|
14
|
+
export interface AudioConversionOptions {
|
|
15
|
+
/** Target format (default: 'ogg') */
|
|
16
|
+
format?: 'ogg' | 'mp3' | 'wav';
|
|
17
|
+
/** Audio bitrate (default: '64k') */
|
|
18
|
+
bitrate?: string;
|
|
19
|
+
/** Sample rate (default: 48000) */
|
|
20
|
+
sampleRate?: number;
|
|
21
|
+
/** Audio channels (default: 1) */
|
|
22
|
+
channels?: number;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Check if FFmpeg is available
|
|
26
|
+
*/
|
|
27
|
+
export declare const isFFmpegAvailable: () => Promise<boolean>;
|
|
28
|
+
/**
|
|
29
|
+
* Get audio duration from buffer
|
|
30
|
+
*/
|
|
31
|
+
export declare const getAudioDurationFromBuffer: (buffer: Buffer) => Promise<number>;
|
|
32
|
+
/**
|
|
33
|
+
* Convert audio to Opus OGG format (required for WhatsApp voice notes)
|
|
34
|
+
*/
|
|
35
|
+
export declare const convertToOpusOgg: (input: Buffer | string, options?: AudioConversionOptions) => Promise<Buffer>;
|
|
36
|
+
/**
|
|
37
|
+
* Convert audio to MP3 format
|
|
38
|
+
*/
|
|
39
|
+
export declare const convertToMp3: (input: Buffer | string, options?: AudioConversionOptions) => Promise<Buffer>;
|
|
40
|
+
/**
|
|
41
|
+
* Create voice note message content
|
|
42
|
+
*/
|
|
43
|
+
export declare const createVoiceNote: (audio: Buffer | string, options?: VoiceNoteOptions) => Promise<{
|
|
44
|
+
audio: Buffer;
|
|
45
|
+
ptt: true;
|
|
46
|
+
seconds: number;
|
|
47
|
+
mimetype: string;
|
|
48
|
+
}>;
|
|
49
|
+
/**
|
|
50
|
+
* Create regular audio message (not voice note)
|
|
51
|
+
*/
|
|
52
|
+
export declare const createAudioMessage: (audio: Buffer | string, options?: VoiceNoteOptions) => Promise<{
|
|
53
|
+
audio: Buffer;
|
|
54
|
+
ptt: false;
|
|
55
|
+
seconds: number;
|
|
56
|
+
mimetype: string;
|
|
57
|
+
}>;
|
|
58
|
+
/**
|
|
59
|
+
* Voice note helper for quick usage
|
|
60
|
+
*/
|
|
61
|
+
export declare const VoiceNoteHelper: {
|
|
62
|
+
/**
|
|
63
|
+
* Create PTT voice note from buffer
|
|
64
|
+
*/
|
|
65
|
+
fromBuffer: (buffer: Buffer, seconds?: number) => Promise<{
|
|
66
|
+
audio: Buffer;
|
|
67
|
+
ptt: true;
|
|
68
|
+
seconds: number;
|
|
69
|
+
mimetype: string;
|
|
70
|
+
}>;
|
|
71
|
+
/**
|
|
72
|
+
* Create PTT voice note from file
|
|
73
|
+
*/
|
|
74
|
+
fromFile: (filePath: string) => Promise<{
|
|
75
|
+
audio: Buffer;
|
|
76
|
+
ptt: true;
|
|
77
|
+
seconds: number;
|
|
78
|
+
mimetype: string;
|
|
79
|
+
}>;
|
|
80
|
+
/**
|
|
81
|
+
* Create regular audio from buffer
|
|
82
|
+
*/
|
|
83
|
+
audioFromBuffer: (buffer: Buffer, seconds?: number) => Promise<{
|
|
84
|
+
audio: Buffer;
|
|
85
|
+
ptt: false;
|
|
86
|
+
seconds: number;
|
|
87
|
+
mimetype: string;
|
|
88
|
+
}>;
|
|
89
|
+
/**
|
|
90
|
+
* Create regular audio from file
|
|
91
|
+
*/
|
|
92
|
+
audioFromFile: (filePath: string) => Promise<{
|
|
93
|
+
audio: Buffer;
|
|
94
|
+
ptt: false;
|
|
95
|
+
seconds: number;
|
|
96
|
+
mimetype: string;
|
|
97
|
+
}>;
|
|
98
|
+
/**
|
|
99
|
+
* Check FFmpeg availability
|
|
100
|
+
*/
|
|
101
|
+
checkFFmpeg: () => Promise<boolean>;
|
|
102
|
+
/**
|
|
103
|
+
* Get audio duration
|
|
104
|
+
*/
|
|
105
|
+
getDuration: (buffer: Buffer) => Promise<number>;
|
|
106
|
+
/**
|
|
107
|
+
* Convert to Opus OGG
|
|
108
|
+
*/
|
|
109
|
+
toOpus: (input: Buffer | string, options?: AudioConversionOptions) => Promise<Buffer>;
|
|
110
|
+
/**
|
|
111
|
+
* Convert to MP3
|
|
112
|
+
*/
|
|
113
|
+
toMp3: (input: Buffer | string, options?: AudioConversionOptions) => Promise<Buffer>;
|
|
114
|
+
};
|
|
115
|
+
//# sourceMappingURL=voice-note.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"voice-note.d.ts","sourceRoot":"","sources":["../../src/Utils/voice-note.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAUH,MAAM,WAAW,gBAAgB;IAChC,0BAA0B;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,yCAAyC;IACzC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,sBAAsB;IACtC,qCAAqC;IACrC,MAAM,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,CAAA;IAC9B,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,mCAAmC;IACnC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,kCAAkC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAA;CACjB;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB,QAAa,OAAO,CAAC,OAAO,CAOzD,CAAA;AAgBD;;GAEG;AACH,eAAO,MAAM,0BAA0B,GAAU,QAAQ,MAAM,KAAG,OAAO,CAAC,MAAM,CAW/E,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,gBAAgB,GAC5B,OAAO,MAAM,GAAG,MAAM,EACtB,UAAS,sBAA2B,KAClC,OAAO,CAAC,MAAM,CAgChB,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,YAAY,GACxB,OAAO,MAAM,GAAG,MAAM,EACtB,UAAS,sBAA2B,KAClC,OAAO,CAAC,MAAM,CA4BhB,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,eAAe,GAC3B,OAAO,MAAM,GAAG,MAAM,EACtB,UAAS,gBAAqB,KAC5B,OAAO,CAAC;IACV,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,IAAI,CAAA;IACT,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;CAChB,CA+BA,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,kBAAkB,GAC9B,OAAO,MAAM,GAAG,MAAM,EACtB,UAAS,gBAAqB,KAC5B,OAAO,CAAC;IACV,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,KAAK,CAAA;IACV,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;CAChB,CAoBA,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,eAAe;IAC3B;;OAEG;yBACwB,MAAM,YAAY,MAAM;eA7E5C,MAAM;aACR,IAAI;iBACA,MAAM;kBACL,MAAM;;IA8EhB;;OAEG;yBACwB,MAAM;eApF1B,MAAM;aACR,IAAI;iBACA,MAAM;kBACL,MAAM;;IAqFhB;;OAEG;8BAC6B,MAAM,YAAY,MAAM;eA/CjD,MAAM;aACR,KAAK;iBACD,MAAM;kBACL,MAAM;;IAgDhB;;OAEG;8BAC6B,MAAM;eAtD/B,MAAM;aACR,KAAK;iBACD,MAAM;kBACL,MAAM;;IAuDhB;;OAEG;uBAlOuC,OAAO,CAAC,OAAO,CAAC;IAqO1D;;OAEG;0BA7MqD,MAAM,KAAG,OAAO,CAAC,MAAM,CAAC;IAgNhF;;OAEG;oBAjMI,MAAM,GAAG,MAAM,YACb,sBAAsB,KAC7B,OAAO,CAAC,MAAM,CAAC;IAkMjB;;OAEG;mBA9JI,MAAM,GAAG,MAAM,YACb,sBAAsB,KAC7B,OAAO,CAAC,MAAM,CAAC;CA8JjB,CAAA"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Baileys-Joss: Voice Note Utilities
|
|
3
|
+
*
|
|
4
|
+
* Fitur untuk merekam dan mengirim voice note
|
|
5
|
+
*/
|
|
6
|
+
import { exec } from 'child_process';
|
|
7
|
+
import { promisify } from 'util';
|
|
8
|
+
import * as fs from 'fs';
|
|
9
|
+
import * as path from 'path';
|
|
10
|
+
import * as os from 'os';
|
|
11
|
+
const execAsync = promisify(exec);
|
|
12
|
+
/**
|
|
13
|
+
* Check if FFmpeg is available
|
|
14
|
+
*/
|
|
15
|
+
export const isFFmpegAvailable = async () => {
|
|
16
|
+
try {
|
|
17
|
+
await execAsync('ffmpeg -version');
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Get audio duration using FFprobe
|
|
26
|
+
*/
|
|
27
|
+
const getAudioDuration = async (audioPath) => {
|
|
28
|
+
try {
|
|
29
|
+
const { stdout } = await execAsync(`ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "${audioPath}"`);
|
|
30
|
+
return Math.ceil(parseFloat(stdout.trim()));
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return 0;
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* Get audio duration from buffer
|
|
38
|
+
*/
|
|
39
|
+
export const getAudioDurationFromBuffer = async (buffer) => {
|
|
40
|
+
const tempPath = path.join(os.tmpdir(), `audio_${Date.now()}.tmp`);
|
|
41
|
+
try {
|
|
42
|
+
await fs.promises.writeFile(tempPath, buffer);
|
|
43
|
+
const duration = await getAudioDuration(tempPath);
|
|
44
|
+
return duration;
|
|
45
|
+
}
|
|
46
|
+
finally {
|
|
47
|
+
try {
|
|
48
|
+
await fs.promises.unlink(tempPath);
|
|
49
|
+
}
|
|
50
|
+
catch { }
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* Convert audio to Opus OGG format (required for WhatsApp voice notes)
|
|
55
|
+
*/
|
|
56
|
+
export const convertToOpusOgg = async (input, options = {}) => {
|
|
57
|
+
const isBuffer = Buffer.isBuffer(input);
|
|
58
|
+
const inputPath = isBuffer
|
|
59
|
+
? path.join(os.tmpdir(), `input_${Date.now()}.tmp`)
|
|
60
|
+
: input;
|
|
61
|
+
const outputPath = path.join(os.tmpdir(), `output_${Date.now()}.ogg`);
|
|
62
|
+
try {
|
|
63
|
+
// Write buffer to temp file if needed
|
|
64
|
+
if (isBuffer) {
|
|
65
|
+
await fs.promises.writeFile(inputPath, input);
|
|
66
|
+
}
|
|
67
|
+
const sampleRate = options.sampleRate || 48000;
|
|
68
|
+
const channels = options.channels || 1;
|
|
69
|
+
const bitrate = options.bitrate || '64k';
|
|
70
|
+
// Convert using FFmpeg
|
|
71
|
+
await execAsync(`ffmpeg -y -i "${inputPath}" -ar ${sampleRate} -ac ${channels} -b:a ${bitrate} -c:a libopus "${outputPath}"`);
|
|
72
|
+
const outputBuffer = await fs.promises.readFile(outputPath);
|
|
73
|
+
return outputBuffer;
|
|
74
|
+
}
|
|
75
|
+
finally {
|
|
76
|
+
// Cleanup temp files
|
|
77
|
+
try {
|
|
78
|
+
if (isBuffer)
|
|
79
|
+
await fs.promises.unlink(inputPath);
|
|
80
|
+
await fs.promises.unlink(outputPath);
|
|
81
|
+
}
|
|
82
|
+
catch { }
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
/**
|
|
86
|
+
* Convert audio to MP3 format
|
|
87
|
+
*/
|
|
88
|
+
export const convertToMp3 = async (input, options = {}) => {
|
|
89
|
+
const isBuffer = Buffer.isBuffer(input);
|
|
90
|
+
const inputPath = isBuffer
|
|
91
|
+
? path.join(os.tmpdir(), `input_${Date.now()}.tmp`)
|
|
92
|
+
: input;
|
|
93
|
+
const outputPath = path.join(os.tmpdir(), `output_${Date.now()}.mp3`);
|
|
94
|
+
try {
|
|
95
|
+
if (isBuffer) {
|
|
96
|
+
await fs.promises.writeFile(inputPath, input);
|
|
97
|
+
}
|
|
98
|
+
const sampleRate = options.sampleRate || 44100;
|
|
99
|
+
const channels = options.channels || 2;
|
|
100
|
+
const bitrate = options.bitrate || '128k';
|
|
101
|
+
await execAsync(`ffmpeg -y -i "${inputPath}" -ar ${sampleRate} -ac ${channels} -b:a ${bitrate} "${outputPath}"`);
|
|
102
|
+
return await fs.promises.readFile(outputPath);
|
|
103
|
+
}
|
|
104
|
+
finally {
|
|
105
|
+
try {
|
|
106
|
+
if (isBuffer)
|
|
107
|
+
await fs.promises.unlink(inputPath);
|
|
108
|
+
await fs.promises.unlink(outputPath);
|
|
109
|
+
}
|
|
110
|
+
catch { }
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
/**
|
|
114
|
+
* Create voice note message content
|
|
115
|
+
*/
|
|
116
|
+
export const createVoiceNote = async (audio, options = {}) => {
|
|
117
|
+
let audioBuffer;
|
|
118
|
+
// Load audio if it's a file path
|
|
119
|
+
if (typeof audio === 'string') {
|
|
120
|
+
audioBuffer = await fs.promises.readFile(audio);
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
audioBuffer = audio;
|
|
124
|
+
}
|
|
125
|
+
// Get or calculate duration
|
|
126
|
+
let seconds = options.seconds;
|
|
127
|
+
if (!seconds) {
|
|
128
|
+
seconds = await getAudioDurationFromBuffer(audioBuffer);
|
|
129
|
+
}
|
|
130
|
+
// Convert to Opus OGG format for WhatsApp compatibility
|
|
131
|
+
const hasFFmpeg = await isFFmpegAvailable();
|
|
132
|
+
if (hasFFmpeg) {
|
|
133
|
+
audioBuffer = await convertToOpusOgg(audioBuffer, {
|
|
134
|
+
sampleRate: options.sampleRate,
|
|
135
|
+
channels: options.channels
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
return {
|
|
139
|
+
audio: audioBuffer,
|
|
140
|
+
ptt: true,
|
|
141
|
+
seconds: seconds || 1,
|
|
142
|
+
mimetype: 'audio/ogg; codecs=opus'
|
|
143
|
+
};
|
|
144
|
+
};
|
|
145
|
+
/**
|
|
146
|
+
* Create regular audio message (not voice note)
|
|
147
|
+
*/
|
|
148
|
+
export const createAudioMessage = async (audio, options = {}) => {
|
|
149
|
+
let audioBuffer;
|
|
150
|
+
if (typeof audio === 'string') {
|
|
151
|
+
audioBuffer = await fs.promises.readFile(audio);
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
audioBuffer = audio;
|
|
155
|
+
}
|
|
156
|
+
let seconds = options.seconds;
|
|
157
|
+
if (!seconds) {
|
|
158
|
+
seconds = await getAudioDurationFromBuffer(audioBuffer);
|
|
159
|
+
}
|
|
160
|
+
return {
|
|
161
|
+
audio: audioBuffer,
|
|
162
|
+
ptt: false,
|
|
163
|
+
seconds: seconds || 1,
|
|
164
|
+
mimetype: 'audio/mp4'
|
|
165
|
+
};
|
|
166
|
+
};
|
|
167
|
+
/**
|
|
168
|
+
* Voice note helper for quick usage
|
|
169
|
+
*/
|
|
170
|
+
export const VoiceNoteHelper = {
|
|
171
|
+
/**
|
|
172
|
+
* Create PTT voice note from buffer
|
|
173
|
+
*/
|
|
174
|
+
fromBuffer: async (buffer, seconds) => {
|
|
175
|
+
return createVoiceNote(buffer, { seconds });
|
|
176
|
+
},
|
|
177
|
+
/**
|
|
178
|
+
* Create PTT voice note from file
|
|
179
|
+
*/
|
|
180
|
+
fromFile: async (filePath) => {
|
|
181
|
+
return createVoiceNote(filePath);
|
|
182
|
+
},
|
|
183
|
+
/**
|
|
184
|
+
* Create regular audio from buffer
|
|
185
|
+
*/
|
|
186
|
+
audioFromBuffer: async (buffer, seconds) => {
|
|
187
|
+
return createAudioMessage(buffer, { seconds });
|
|
188
|
+
},
|
|
189
|
+
/**
|
|
190
|
+
* Create regular audio from file
|
|
191
|
+
*/
|
|
192
|
+
audioFromFile: async (filePath) => {
|
|
193
|
+
return createAudioMessage(filePath);
|
|
194
|
+
},
|
|
195
|
+
/**
|
|
196
|
+
* Check FFmpeg availability
|
|
197
|
+
*/
|
|
198
|
+
checkFFmpeg: isFFmpegAvailable,
|
|
199
|
+
/**
|
|
200
|
+
* Get audio duration
|
|
201
|
+
*/
|
|
202
|
+
getDuration: getAudioDurationFromBuffer,
|
|
203
|
+
/**
|
|
204
|
+
* Convert to Opus OGG
|
|
205
|
+
*/
|
|
206
|
+
toOpus: convertToOpusOgg,
|
|
207
|
+
/**
|
|
208
|
+
* Convert to MP3
|
|
209
|
+
*/
|
|
210
|
+
toMp3: convertToMp3
|
|
211
|
+
};
|
|
212
|
+
//# sourceMappingURL=voice-note.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"voice-note.js","sourceRoot":"","sources":["../../src/Utils/voice-note.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Baileys-Joss: Weather Bot
|
|
3
|
+
*
|
|
4
|
+
* Informasi cuaca dengan integrasi OpenWeatherMap API
|
|
5
|
+
*/
|
|
6
|
+
export interface WeatherConfig {
|
|
7
|
+
apiKey?: string;
|
|
8
|
+
units: 'metric' | 'imperial';
|
|
9
|
+
language: string;
|
|
10
|
+
defaultCity?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface WeatherData {
|
|
13
|
+
city: string;
|
|
14
|
+
country: string;
|
|
15
|
+
temperature: number;
|
|
16
|
+
feelsLike: number;
|
|
17
|
+
humidity: number;
|
|
18
|
+
pressure: number;
|
|
19
|
+
windSpeed: number;
|
|
20
|
+
windDirection: number;
|
|
21
|
+
description: string;
|
|
22
|
+
icon: string;
|
|
23
|
+
visibility: number;
|
|
24
|
+
clouds: number;
|
|
25
|
+
sunrise: number;
|
|
26
|
+
sunset: number;
|
|
27
|
+
timestamp: number;
|
|
28
|
+
}
|
|
29
|
+
export interface ForecastData {
|
|
30
|
+
city: string;
|
|
31
|
+
country: string;
|
|
32
|
+
forecasts: Array<{
|
|
33
|
+
date: string;
|
|
34
|
+
time: string;
|
|
35
|
+
temperature: number;
|
|
36
|
+
feelsLike: number;
|
|
37
|
+
humidity: number;
|
|
38
|
+
description: string;
|
|
39
|
+
icon: string;
|
|
40
|
+
windSpeed: number;
|
|
41
|
+
pop: number;
|
|
42
|
+
}>;
|
|
43
|
+
}
|
|
44
|
+
export interface WeatherAlert {
|
|
45
|
+
event: string;
|
|
46
|
+
description: string;
|
|
47
|
+
start: number;
|
|
48
|
+
end: number;
|
|
49
|
+
severity: 'minor' | 'moderate' | 'severe' | 'extreme';
|
|
50
|
+
}
|
|
51
|
+
export declare class WeatherBot {
|
|
52
|
+
private config;
|
|
53
|
+
private cache;
|
|
54
|
+
private cacheTimeout;
|
|
55
|
+
constructor(config?: Partial<WeatherConfig>);
|
|
56
|
+
/**
|
|
57
|
+
* Set API key
|
|
58
|
+
*/
|
|
59
|
+
setApiKey(apiKey: string): void;
|
|
60
|
+
/**
|
|
61
|
+
* Get weather for city
|
|
62
|
+
*/
|
|
63
|
+
getWeather(city: string): Promise<WeatherData>;
|
|
64
|
+
/**
|
|
65
|
+
* Fetch weather from OpenWeatherMap API
|
|
66
|
+
*/
|
|
67
|
+
private fetchWeatherFromAPI;
|
|
68
|
+
/**
|
|
69
|
+
* Get mock weather data
|
|
70
|
+
*/
|
|
71
|
+
private getMockWeather;
|
|
72
|
+
/**
|
|
73
|
+
* Format weather data for display
|
|
74
|
+
*/
|
|
75
|
+
formatWeather(data: WeatherData, style?: 'simple' | 'detailed' | 'compact'): string;
|
|
76
|
+
/**
|
|
77
|
+
* Get weather advice based on conditions
|
|
78
|
+
*/
|
|
79
|
+
getAdvice(data: WeatherData): string;
|
|
80
|
+
/**
|
|
81
|
+
* Parse command and return weather
|
|
82
|
+
*/
|
|
83
|
+
parseCommand(command: string): Promise<string>;
|
|
84
|
+
/**
|
|
85
|
+
* Get help message
|
|
86
|
+
*/
|
|
87
|
+
getHelpMessage(): string;
|
|
88
|
+
/**
|
|
89
|
+
* Get wind direction from degrees
|
|
90
|
+
*/
|
|
91
|
+
private getWindDirection;
|
|
92
|
+
/**
|
|
93
|
+
* Capitalize first letter
|
|
94
|
+
*/
|
|
95
|
+
private capitalizeFirst;
|
|
96
|
+
/**
|
|
97
|
+
* Capitalize each word
|
|
98
|
+
*/
|
|
99
|
+
private capitalizeWords;
|
|
100
|
+
/**
|
|
101
|
+
* Clear cache
|
|
102
|
+
*/
|
|
103
|
+
clearCache(): void;
|
|
104
|
+
}
|
|
105
|
+
export declare const createWeatherBot: (config?: Partial<WeatherConfig>) => WeatherBot;
|
|
106
|
+
/**
|
|
107
|
+
* Get weather for city
|
|
108
|
+
*/
|
|
109
|
+
export declare const getWeather: (city: string) => Promise<string>;
|
|
110
|
+
/**
|
|
111
|
+
* Get simple weather
|
|
112
|
+
*/
|
|
113
|
+
export declare const getSimpleWeather: (city: string) => Promise<string>;
|
|
114
|
+
/**
|
|
115
|
+
* Parse weather command
|
|
116
|
+
*/
|
|
117
|
+
export declare const weatherCommand: (cmd: string) => Promise<string>;
|
|
118
|
+
//# sourceMappingURL=weather.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"weather.d.ts","sourceRoot":"","sources":["../../src/Utils/weather.ts"],"names":[],"mappings":"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"}
|