baileys-joss 1.0.1 → 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 +1983 -79
- 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/newsletter.d.ts +4 -0
- package/lib/Socket/newsletter.d.ts.map +1 -1
- package/lib/Types/Message.d.ts +4 -0
- 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 +9 -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,269 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Baileys-Joss: Media Downloader
|
|
3
|
+
*
|
|
4
|
+
* Download semua media dari chat
|
|
5
|
+
*/
|
|
6
|
+
import * as fs from 'fs';
|
|
7
|
+
import * as path from 'path';
|
|
8
|
+
import { downloadMediaMessage } from './messages.js';
|
|
9
|
+
/**
|
|
10
|
+
* Get media type from message
|
|
11
|
+
*/
|
|
12
|
+
const getMediaType = (message) => {
|
|
13
|
+
const content = message.message;
|
|
14
|
+
if (!content)
|
|
15
|
+
return null;
|
|
16
|
+
if (content.imageMessage)
|
|
17
|
+
return 'image';
|
|
18
|
+
if (content.videoMessage)
|
|
19
|
+
return 'video';
|
|
20
|
+
if (content.audioMessage)
|
|
21
|
+
return 'audio';
|
|
22
|
+
if (content.documentMessage)
|
|
23
|
+
return 'document';
|
|
24
|
+
if (content.stickerMessage)
|
|
25
|
+
return 'sticker';
|
|
26
|
+
return null;
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Get file extension for media type
|
|
30
|
+
*/
|
|
31
|
+
const getExtension = (message) => {
|
|
32
|
+
const content = message.message;
|
|
33
|
+
if (!content)
|
|
34
|
+
return '';
|
|
35
|
+
if (content.imageMessage) {
|
|
36
|
+
const mime = content.imageMessage.mimetype || 'image/jpeg';
|
|
37
|
+
if (mime.includes('png'))
|
|
38
|
+
return '.png';
|
|
39
|
+
if (mime.includes('gif'))
|
|
40
|
+
return '.gif';
|
|
41
|
+
if (mime.includes('webp'))
|
|
42
|
+
return '.webp';
|
|
43
|
+
return '.jpg';
|
|
44
|
+
}
|
|
45
|
+
if (content.videoMessage) {
|
|
46
|
+
const mime = content.videoMessage.mimetype || 'video/mp4';
|
|
47
|
+
if (mime.includes('3gp'))
|
|
48
|
+
return '.3gp';
|
|
49
|
+
if (mime.includes('webm'))
|
|
50
|
+
return '.webm';
|
|
51
|
+
return '.mp4';
|
|
52
|
+
}
|
|
53
|
+
if (content.audioMessage) {
|
|
54
|
+
const mime = content.audioMessage.mimetype || 'audio/ogg';
|
|
55
|
+
if (mime.includes('mp3') || mime.includes('mpeg'))
|
|
56
|
+
return '.mp3';
|
|
57
|
+
if (mime.includes('mp4'))
|
|
58
|
+
return '.m4a';
|
|
59
|
+
if (mime.includes('wav'))
|
|
60
|
+
return '.wav';
|
|
61
|
+
return '.ogg';
|
|
62
|
+
}
|
|
63
|
+
if (content.documentMessage) {
|
|
64
|
+
const filename = content.documentMessage.fileName;
|
|
65
|
+
if (filename) {
|
|
66
|
+
const ext = path.extname(filename);
|
|
67
|
+
if (ext)
|
|
68
|
+
return ext;
|
|
69
|
+
}
|
|
70
|
+
return '.bin';
|
|
71
|
+
}
|
|
72
|
+
if (content.stickerMessage) {
|
|
73
|
+
if (content.stickerMessage.isAnimated)
|
|
74
|
+
return '.webp';
|
|
75
|
+
return '.webp';
|
|
76
|
+
}
|
|
77
|
+
return '';
|
|
78
|
+
};
|
|
79
|
+
/**
|
|
80
|
+
* Generate filename from template
|
|
81
|
+
*/
|
|
82
|
+
const generateFilename = (message, type, template) => {
|
|
83
|
+
const ts = message.messageTimestamp;
|
|
84
|
+
const timestamp = ts ? (typeof ts === 'number' ? ts : Number(ts)) : Date.now() / 1000;
|
|
85
|
+
const date = new Date(timestamp * 1000);
|
|
86
|
+
const id = message.key.id || 'unknown';
|
|
87
|
+
const ext = getExtension(message);
|
|
88
|
+
// Get original filename for documents
|
|
89
|
+
let originalName = '';
|
|
90
|
+
if (message.message?.documentMessage?.fileName) {
|
|
91
|
+
originalName = path.basename(message.message.documentMessage.fileName, path.extname(message.message.documentMessage.fileName));
|
|
92
|
+
}
|
|
93
|
+
if (template) {
|
|
94
|
+
const dateStr = date.toISOString().split('T')[0] || '';
|
|
95
|
+
const timeStr = (date.toTimeString().split(' ')[0] || '').replace(/:/g, '-');
|
|
96
|
+
return template
|
|
97
|
+
.replace('{id}', id)
|
|
98
|
+
.replace('{type}', type)
|
|
99
|
+
.replace('{timestamp}', timestamp.toString())
|
|
100
|
+
.replace('{date}', dateStr)
|
|
101
|
+
.replace('{time}', timeStr)
|
|
102
|
+
.replace('{originalName}', originalName || id)
|
|
103
|
+
.replace('{ext}', ext);
|
|
104
|
+
}
|
|
105
|
+
// Default format: type_date_time_id.ext
|
|
106
|
+
const dateStr = date.toISOString().split('T')[0] || '';
|
|
107
|
+
const timeStr = (date.toTimeString().split(' ')[0] || '').replace(/:/g, '-');
|
|
108
|
+
return `${type}_${dateStr}_${timeStr}_${id.substring(0, 8)}${ext}`;
|
|
109
|
+
};
|
|
110
|
+
/**
|
|
111
|
+
* Sleep helper
|
|
112
|
+
*/
|
|
113
|
+
const sleep = (ms) => new Promise(r => setTimeout(r, ms));
|
|
114
|
+
/**
|
|
115
|
+
* Media Downloader
|
|
116
|
+
*/
|
|
117
|
+
export class MediaDownloader {
|
|
118
|
+
constructor(getMessage) {
|
|
119
|
+
this.getMessage = getMessage;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Filter messages that have downloadable media
|
|
123
|
+
*/
|
|
124
|
+
filterMediaMessages(messages, types = ['all']) {
|
|
125
|
+
return messages.filter(msg => {
|
|
126
|
+
const type = getMediaType(msg);
|
|
127
|
+
if (!type)
|
|
128
|
+
return false;
|
|
129
|
+
if (types.includes('all'))
|
|
130
|
+
return true;
|
|
131
|
+
return types.includes(type);
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Download media from a single message
|
|
136
|
+
*/
|
|
137
|
+
async downloadSingle(message, outputDir, options = {}) {
|
|
138
|
+
const type = getMediaType(message);
|
|
139
|
+
const result = {
|
|
140
|
+
messageId: message.key.id || 'unknown',
|
|
141
|
+
type: type || 'all',
|
|
142
|
+
filename: '',
|
|
143
|
+
filepath: '',
|
|
144
|
+
size: 0,
|
|
145
|
+
success: false
|
|
146
|
+
};
|
|
147
|
+
if (!type) {
|
|
148
|
+
result.error = 'No media in message';
|
|
149
|
+
return result;
|
|
150
|
+
}
|
|
151
|
+
try {
|
|
152
|
+
// Generate filename
|
|
153
|
+
const filename = generateFilename(message, type, options.filenameTemplate);
|
|
154
|
+
result.filename = filename;
|
|
155
|
+
// Determine output path
|
|
156
|
+
let outputPath = outputDir;
|
|
157
|
+
if (options.createSubfolders) {
|
|
158
|
+
outputPath = path.join(outputDir, type + 's'); // images, videos, etc.
|
|
159
|
+
}
|
|
160
|
+
// Ensure directory exists
|
|
161
|
+
await fs.promises.mkdir(outputPath, { recursive: true });
|
|
162
|
+
const filepath = path.join(outputPath, filename);
|
|
163
|
+
result.filepath = filepath;
|
|
164
|
+
// Skip if exists
|
|
165
|
+
if (options.skipExisting) {
|
|
166
|
+
try {
|
|
167
|
+
await fs.promises.access(filepath);
|
|
168
|
+
result.success = true;
|
|
169
|
+
result.error = 'Skipped (already exists)';
|
|
170
|
+
return result;
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
// File doesn't exist, continue
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
// Download media
|
|
177
|
+
const buffer = await downloadMediaMessage(message, 'buffer', {}, {
|
|
178
|
+
logger: console,
|
|
179
|
+
reuploadRequest: async () => message
|
|
180
|
+
});
|
|
181
|
+
if (!buffer || !(buffer instanceof Buffer)) {
|
|
182
|
+
throw new Error('Failed to download media');
|
|
183
|
+
}
|
|
184
|
+
// Check file size
|
|
185
|
+
if (options.maxFileSize && options.maxFileSize > 0 && buffer.length > options.maxFileSize) {
|
|
186
|
+
result.error = `File too large (${buffer.length} bytes)`;
|
|
187
|
+
return result;
|
|
188
|
+
}
|
|
189
|
+
// Save file
|
|
190
|
+
await fs.promises.writeFile(filepath, buffer);
|
|
191
|
+
result.size = buffer.length;
|
|
192
|
+
result.success = true;
|
|
193
|
+
}
|
|
194
|
+
catch (error) {
|
|
195
|
+
result.error = error.message;
|
|
196
|
+
options.onError?.(message, error);
|
|
197
|
+
}
|
|
198
|
+
return result;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Download media from multiple messages
|
|
202
|
+
*/
|
|
203
|
+
async downloadMultiple(messages, options) {
|
|
204
|
+
const types = options.types || ['all'];
|
|
205
|
+
const mediaMessages = this.filterMediaMessages(messages, types);
|
|
206
|
+
const summary = {
|
|
207
|
+
total: mediaMessages.length,
|
|
208
|
+
successful: 0,
|
|
209
|
+
failed: 0,
|
|
210
|
+
skipped: 0,
|
|
211
|
+
totalSize: 0,
|
|
212
|
+
results: [],
|
|
213
|
+
startedAt: new Date(),
|
|
214
|
+
completedAt: new Date()
|
|
215
|
+
};
|
|
216
|
+
for (let i = 0; i < mediaMessages.length; i++) {
|
|
217
|
+
const msg = mediaMessages[i];
|
|
218
|
+
if (!msg)
|
|
219
|
+
continue;
|
|
220
|
+
const result = await this.downloadSingle(msg, options.outputDir, options);
|
|
221
|
+
summary.results.push(result);
|
|
222
|
+
if (result.success) {
|
|
223
|
+
if (result.error?.includes('Skipped')) {
|
|
224
|
+
summary.skipped++;
|
|
225
|
+
}
|
|
226
|
+
else {
|
|
227
|
+
summary.successful++;
|
|
228
|
+
summary.totalSize += result.size;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
summary.failed++;
|
|
233
|
+
}
|
|
234
|
+
options.onProgress?.(i + 1, mediaMessages.length, result.filename);
|
|
235
|
+
// Delay between downloads
|
|
236
|
+
if (options.delay && i < mediaMessages.length - 1) {
|
|
237
|
+
await sleep(options.delay);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
summary.completedAt = new Date();
|
|
241
|
+
return summary;
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Download all media from a chat
|
|
245
|
+
*/
|
|
246
|
+
async downloadFromChat(jid, messages, options) {
|
|
247
|
+
// Create output directory based on JID
|
|
248
|
+
const sanitizedJid = jid.replace(/[^a-zA-Z0-9]/g, '_');
|
|
249
|
+
const outputDir = options.outputDir || path.join(process.cwd(), 'downloads', sanitizedJid);
|
|
250
|
+
return this.downloadMultiple(messages, {
|
|
251
|
+
...options,
|
|
252
|
+
outputDir
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Create media downloader
|
|
258
|
+
*/
|
|
259
|
+
export const createMediaDownloader = (getMessage) => {
|
|
260
|
+
return new MediaDownloader(getMessage);
|
|
261
|
+
};
|
|
262
|
+
/**
|
|
263
|
+
* Quick download helper
|
|
264
|
+
*/
|
|
265
|
+
export const downloadAllMedia = async (messages, outputDir, options) => {
|
|
266
|
+
const downloader = new MediaDownloader(async () => undefined);
|
|
267
|
+
return downloader.downloadMultiple(messages, { ...options, outputDir });
|
|
268
|
+
};
|
|
269
|
+
//# sourceMappingURL=media-downloader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-downloader.js","sourceRoot":"","sources":["../../src/Utils/media-downloader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Baileys-Joss: Meme Generator
|
|
3
|
+
*
|
|
4
|
+
* Generate meme sederhana dengan text overlay
|
|
5
|
+
*/
|
|
6
|
+
export interface MemeTemplate {
|
|
7
|
+
id: string;
|
|
8
|
+
name: string;
|
|
9
|
+
description: string;
|
|
10
|
+
textPositions: Array<{
|
|
11
|
+
id: string;
|
|
12
|
+
label: string;
|
|
13
|
+
defaultText: string;
|
|
14
|
+
position: 'top' | 'bottom' | 'center' | 'custom';
|
|
15
|
+
customPosition?: {
|
|
16
|
+
x: number;
|
|
17
|
+
y: number;
|
|
18
|
+
};
|
|
19
|
+
}>;
|
|
20
|
+
imageUrl?: string;
|
|
21
|
+
width?: number;
|
|
22
|
+
height?: number;
|
|
23
|
+
}
|
|
24
|
+
export interface MemeConfig {
|
|
25
|
+
template: string | MemeTemplate;
|
|
26
|
+
texts: Record<string, string>;
|
|
27
|
+
fontSize?: number;
|
|
28
|
+
fontColor?: string;
|
|
29
|
+
strokeColor?: string;
|
|
30
|
+
strokeWidth?: number;
|
|
31
|
+
}
|
|
32
|
+
export interface GeneratedMeme {
|
|
33
|
+
templateId: string;
|
|
34
|
+
texts: Record<string, string>;
|
|
35
|
+
svgContent: string;
|
|
36
|
+
htmlContent: string;
|
|
37
|
+
}
|
|
38
|
+
export declare const MEME_TEMPLATES: MemeTemplate[];
|
|
39
|
+
export declare class MemeGenerator {
|
|
40
|
+
private templates;
|
|
41
|
+
constructor();
|
|
42
|
+
/**
|
|
43
|
+
* Get all available templates
|
|
44
|
+
*/
|
|
45
|
+
getTemplates(): MemeTemplate[];
|
|
46
|
+
/**
|
|
47
|
+
* Get template by ID
|
|
48
|
+
*/
|
|
49
|
+
getTemplate(id: string): MemeTemplate | undefined;
|
|
50
|
+
/**
|
|
51
|
+
* Add custom template
|
|
52
|
+
*/
|
|
53
|
+
addTemplate(template: MemeTemplate): void;
|
|
54
|
+
/**
|
|
55
|
+
* Generate meme as text (ASCII art style)
|
|
56
|
+
*/
|
|
57
|
+
generateTextMeme(templateId: string, texts: Record<string, string>): string;
|
|
58
|
+
/**
|
|
59
|
+
* Generate meme as SVG
|
|
60
|
+
*/
|
|
61
|
+
generateSvgMeme(config: MemeConfig): GeneratedMeme;
|
|
62
|
+
/**
|
|
63
|
+
* Generate meme description (for text-only display)
|
|
64
|
+
*/
|
|
65
|
+
describeMeme(templateId: string, texts: Record<string, string>): string;
|
|
66
|
+
/**
|
|
67
|
+
* List templates as formatted message
|
|
68
|
+
*/
|
|
69
|
+
listTemplates(): string;
|
|
70
|
+
/**
|
|
71
|
+
* Quick meme from popular formats
|
|
72
|
+
*/
|
|
73
|
+
quickMeme(format: 'drake' | 'expanding' | 'buttons' | 'fine' | 'change', ...texts: string[]): string;
|
|
74
|
+
/**
|
|
75
|
+
* Wrap text to fit width
|
|
76
|
+
*/
|
|
77
|
+
private wrapText;
|
|
78
|
+
/**
|
|
79
|
+
* Escape XML special characters
|
|
80
|
+
*/
|
|
81
|
+
private escapeXml;
|
|
82
|
+
}
|
|
83
|
+
export declare const createMemeGenerator: () => MemeGenerator;
|
|
84
|
+
/**
|
|
85
|
+
* Quick Drake meme
|
|
86
|
+
*/
|
|
87
|
+
export declare const drakeMeme: (bad: string, good: string) => string;
|
|
88
|
+
/**
|
|
89
|
+
* Quick expanding brain meme
|
|
90
|
+
*/
|
|
91
|
+
export declare const expandingBrainMeme: (...levels: string[]) => string;
|
|
92
|
+
/**
|
|
93
|
+
* Quick "this is fine" meme
|
|
94
|
+
*/
|
|
95
|
+
export declare const thisIsFineMeme: (text?: string) => string;
|
|
96
|
+
//# sourceMappingURL=meme-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meme-generator.d.ts","sourceRoot":"","sources":["../../src/Utils/meme-generator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,MAAM,WAAW,YAAY;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,aAAa,EAAE,KAAK,CAAC;QACpB,EAAE,EAAE,MAAM,CAAA;QACV,KAAK,EAAE,MAAM,CAAA;QACb,WAAW,EAAE,MAAM,CAAA;QACnB,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAA;QAChD,cAAc,CAAC,EAAE;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KACzC,CAAC,CAAA;IACF,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,UAAU;IAC1B,QAAQ,EAAE,MAAM,GAAG,YAAY,CAAA;IAC/B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,aAAa;IAC7B,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC7B,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;CACnB;AAMD,eAAO,MAAM,cAAc,EAAE,YAAY,EA0FxC,CAAA;AAMD,qBAAa,aAAa;IACzB,OAAO,CAAC,SAAS,CAAuC;;IASxD;;OAEG;IACH,YAAY,IAAI,YAAY,EAAE;IAI9B;;OAEG;IACH,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAIjD;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI;IAIzC;;OAEG;IACH,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM;IAgC3E;;OAEG;IACH,eAAe,CAAC,MAAM,EAAE,UAAU,GAAG,aAAa;IAyFlD;;OAEG;IACH,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM;IAoBvE;;OAEG;IACH,aAAa,IAAI,MAAM;IAcvB;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,OAAO,GAAG,WAAW,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM;IAgCpG;;OAEG;IACH,OAAO,CAAC,QAAQ;IAkBhB;;OAEG;IACH,OAAO,CAAC,SAAS;CAQjB;AAMD,eAAO,MAAM,mBAAmB,QAAO,aAEtC,CAAA;AAMD;;GAEG;AACH,eAAO,MAAM,SAAS,GAAI,KAAK,MAAM,EAAE,MAAM,MAAM,KAAG,MAGrD,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,kBAAkB,GAAI,GAAG,QAAQ,MAAM,EAAE,KAAG,MAGxD,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,GAAI,OAAO,MAAM,KAAG,MAG9C,CAAA"}
|