├── .gitignore
├── README.md
├── config.json
├── img
├── testing.jpg
├── testing2.jpeg
└── testing3.jpeg
├── index.js
└── package.json
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | sessions
3 | package-lock.json
4 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Auto Read Story Whatsapp
2 |
3 | Auto Read Story/Status WhatsApp adalah bot sederhana yang memungkinkan kamu melihat, menyukai, dan mendownload status/story teman-teman WhatsAppmu secara otomatis, sehingga kamu menjadi orang pertamax yang melihat dan menyukai storynyaw.
4 |
5 |
6 |

7 |
Melihat dan menyukai story secara otomatis
8 |
9 |

10 |
Mendownload media(foto, video, dan audio) dari story secara otomatis jika fitur downloadMediaStatus diaktifkan
11 |
12 |

13 |
Terdapat beberapa perintah (command) untuk mengaktifkan atau menonaktifkan fitur yang tersedia dengan mengetik #menu.
14 |
15 |
16 | ## Fitur:
17 |
18 | 1. **Auto Read Status**: Melihat status secara otomatis jika fitur ini diaktifkan.
19 | 2. **Auto Like Status**: Menyukai status secara otomatis jika fitur ini diaktifkan.
20 | 3. **Download Media**: Mendownload media (foto, video, audio) dari status secara otomatis jika fitur ini diaktifkan.
21 | 4. **Sensor Nomor**: Menyensor nomor yang ada di dalam status jika fitur ini diaktifkan.
22 | 5. **Anti-Telpon**: Menolak panggilan telepon secara otomatis jika fitur ini diaktifkan.
23 | 6. **Auto Kick Story Grup**: Kick/mengeluarkan member yang terdeteksi mentag grup di story mereka.
24 | 7. **Blacklist**: Mengatur hanya nomor tertentu yang statusnya tidak akan dilihat.
25 | 8. **Whitelist**: Mengatur hanya nomor tertentu yang statusnya akan dilihat.
26 | 9. **Emojis**: Mengatur emoji yang digunakan untuk menyukai status.
27 | 10. **View Once**: Mengambil/mendownload foto, video, audio dari pesan yang hanya dapat dilihat sekali.
28 |
29 | ## Instalasi :
30 |
31 | ### Windows
32 |
33 | 1. Nodejs :
34 | https://nodejs.org/id
35 | 2. Git :
36 | https://git-scm.com/downloads
37 |
38 | ### Ubuntu/Debian
39 |
40 | 1. Nodejs :
41 | ```bash
42 | curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash && nvm install 22
43 | ```
44 | 2. Git :
45 | ```bash
46 | sudo apt update && sudo apt install -y git
47 | ```
48 |
49 | ### Termux (Android)
50 |
51 | 1. Nodejs + git :
52 | ```bash
53 | pkg update && pkg install git nodejs-lts
54 | ```
55 |
56 | ## Cara menjalankan bot :
57 |
58 | 1. Buka Terminal kesayangan kalian ( ╹▽╹ ) 👍
59 | 2. Clone repository dengan mengetik:
60 | ```bash
61 | git clone https://github.com/jauhariel/AutoReadStoryWhatsapp.git
62 | ```
63 | 3. Masuk ke dalam folder repository dengan mengetik:
64 | ```bash
65 | cd AutoReadStoryWhatsapp
66 | ```
67 | 4. Instal dependensi yang diperlukan dengan mengetik:
68 | ```bash
69 | npm i
70 | ```
71 | 5. Jalankan bot dengan mengetik:
72 | ```bash
73 | npm start
74 | ```
75 | 6. Enjoy
76 |
77 |
78 | ## Catatan
79 |
80 | ```js
81 | {
82 | "autoReadStatus": true, // ubah jadi false jika tidak ingin otomatis melihat status
83 | "autoLikeStatus": true, // ubah jadi false jika tidak ingin otomatis menyukai status
84 | "downloadMediaStatus": false, // ubah jadi true jika ingin mendownload media(foto, video, audio) dari status
85 | "sensorNomor": true, // ubah jadi false jika tidak ingin menyensor nomor yang ada di dalam status
86 | "antiTelpon": false, // ubah jadi true jika ingin mengaktifkan fitur anti-telepon
87 | "autoKickStory": false, // ubah jadi true jika ingin mengaktifkan fitur kick tag grup story
88 | "blackList": [ // nomor yang ada di dalam array ini tidak akan dilihat statusnya
89 | "628987654321",
90 | "628123456789"
91 | ],
92 | "whiteList": [], // jika array ini tidak kosong, hanya nomor yang ada di dalam array ini yang akan dilihat statusnya
93 | "emojis": [ // mengatur emoji yang digunakan untuk menyukai status
94 | "💚",
95 | "❤️",
96 | "👍"
97 | ]
98 | }
99 | ```
100 |
101 | 1. Kamu bisa menambahkan nomor yang tidak ingin kamu lihat story-nya secara otomatis di file config.json dengan menambahkan nomor pada array blackList.
102 | 2. Kamu bisa menambahkan hanya nomor tertentu yang ingin kamu lihat story-nya secara otomatis di file config.json dengan menambahkan nomor pada array whiteList.
103 | 3. Jika kamu ingin melihat story dari semua kontak, kosongkan array blackList dan whiteList yang ada di file config.json.
104 |
105 | 4. Ubah nilai autoReadStatus yang terdapat di file config.json menjadi false untuk menonaktifkan fitur auto-read pada status, atau ubah menjadi true untuk mengaktifkannya.
106 |
107 | 5. Ubah nilai autoLikeStatus yang terdapat di file config.json menjadi false untuk menonaktifkan fitur auto-like pada status, atau ubah menjadi true untuk mengaktifkannya.
108 |
109 | 6. Ubah nilai downloadMediaStatus yang terdapat di file config.json menjadi true untuk secara otomatis mendownload media (foto, video, audio) dari status, atau ubah menjadi false untuk menonaktifkan fitur tersebut.
110 |
111 | 7. Ubah nilai antiTelpon yang terdapat di file config.json menjadi true untuk mengaktifkan fitur anti-telepon, atau ubah menjadi false untuk menonaktifkannya.
112 |
113 | 8. Ubah nilai autoKickStory yang terdapat di file config.json menjadi true untuk mengaktifkan fitur kick member yg terdeteksi tag grup di story mereka, atau ubah menjadi false untuk menonaktifkannya.
114 |
115 | 9. Ubah nilai emojis yang terdapat di file config.json untuk mengatur emoji yang digunakan untuk menyukai status. Kamu bisa menambahkan atau mengubah emoji sesuai keinginan.
116 |
117 | 10. Klik CTRL dan C pada keyboard secara bersamaan untuk memberhentikan bot!
118 | 11. Hapus folder sessions jika ingin login dengan nomor lain atau jika terjadi masalah login, seperti stuck di 'menghubungkan ke wangsaf', lalu jalankan ulang dengan mengetik:
119 |
120 | ```bash
121 | npm start
122 | ```
123 |
--------------------------------------------------------------------------------
/config.json:
--------------------------------------------------------------------------------
1 | {
2 | "autoReadStatus": true,
3 | "autoLikeStatus": true,
4 | "downloadMediaStatus": false,
5 | "sensorNomor": true,
6 | "antiTelpon": false,
7 | "autoKickStory": false,
8 | "blackList": [
9 | "628987654321",
10 | "628123456789"
11 | ],
12 | "whiteList": [],
13 | "emojis": [
14 | "💚",
15 | "👍",
16 | "🙏"
17 | ]
18 | }
--------------------------------------------------------------------------------
/img/testing.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jauhariel/AutoReadStoryWhatsapp/2720aaf9f0fe0bf059861e99e2469ead2aff375f/img/testing.jpg
--------------------------------------------------------------------------------
/img/testing2.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jauhariel/AutoReadStoryWhatsapp/2720aaf9f0fe0bf059861e99e2469ead2aff375f/img/testing2.jpeg
--------------------------------------------------------------------------------
/img/testing3.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jauhariel/AutoReadStoryWhatsapp/2720aaf9f0fe0bf059861e99e2469ead2aff375f/img/testing3.jpeg
--------------------------------------------------------------------------------
/index.js:
--------------------------------------------------------------------------------
1 | const {
2 | makeWASocket,
3 | DisconnectReason,
4 | useMultiFileAuthState,
5 | Browsers,
6 | jidNormalizedUser,
7 | downloadMediaMessage,
8 | } = require("@whiskeysockets/baileys");
9 | const pino = require("pino");
10 | const readline = require("readline");
11 | const fs = require("fs");
12 | const path = require("path");
13 | const colors = require("colors");
14 | const moment = require("moment-timezone");
15 |
16 | let useCode = true;
17 | let loggedInNumber;
18 |
19 | function logCuy(message, type = "green") {
20 | moment.locale("id");
21 | const now = moment().tz("Asia/Jakarta");
22 | console.log(
23 | `\n${now.format(" dddd ").bgRed}${
24 | now.format(" D MMMM YYYY ").bgYellow.black
25 | }${now.format(" HH:mm:ss ").bgWhite.black}\n`
26 | );
27 | console.log(`${message.bold[type]}`);
28 | }
29 |
30 | const configPath = path.join(__dirname, "config.json");
31 | let config = JSON.parse(fs.readFileSync(configPath, "utf-8"));
32 |
33 | let {
34 | autoReadStatus,
35 | autoLikeStatus,
36 | downloadMediaStatus,
37 | sensorNomor,
38 | antiTelpon,
39 | autoKickStory,
40 | blackList,
41 | whiteList,
42 | emojis,
43 | } = config;
44 |
45 | const updateConfig = (key, value) => {
46 | config[key] = value;
47 | fs.writeFileSync(configPath, JSON.stringify(config, null, 4), "utf-8");
48 | };
49 |
50 | let welcomeMessage = false;
51 |
52 | async function connectToWhatsApp() {
53 | const sessionPath = path.join(__dirname, "sessions");
54 | const sessionExists =
55 | fs.existsSync(sessionPath) && fs.readdirSync(sessionPath).length > 0;
56 |
57 | const { state, saveCreds } = await useMultiFileAuthState("sessions");
58 |
59 | const sock = makeWASocket({
60 | logger: pino({ level: "silent" }),
61 | auth: state,
62 | printQRInTerminal: !useCode,
63 | defaultQueryTimeoutMs: undefined,
64 | keepAliveIntervalMs: 30000,
65 | browser: Browsers.macOS("Chrome"),
66 | shouldSyncHistoryMessage: () => true,
67 | syncFullHistory: true,
68 | generateHighQualityLinkPreview: true,
69 | });
70 |
71 | if (useCode && !sessionExists) {
72 | const rl = readline.createInterface({
73 | input: process.stdin,
74 | output: process.stdout,
75 | });
76 |
77 | logCuy(
78 | "Halo sepertinya kamu belum login, Mau login wangsaf pakai pairing code?\nSilahkan balas dengan (y/n)\nketik y untuk setuju atau ketik n untuk login menggunakan qrcode",
79 | "cyan"
80 | ); // pesan untuk yang menggunakan panel
81 |
82 | const askPairingCode = () => {
83 | rl.question(
84 | "\nApakah kamu ingin menggunakan pairing code untuk login ke wangsaf? (y/n): "
85 | .yellow.bold,
86 | async (answer) => {
87 | if (answer.toLowerCase() === "y" || answer.trim() === "") {
88 | logCuy(
89 | "Wokeh kalau gitu silahkan masukkan nomor wangsafmu!\ncatatan : awali dengan 62 contoh 628123456789",
90 | "cyan"
91 | ); // pesan untuk yang menggunakan panel
92 | const askWaNumber = () => {
93 | rl.question(
94 | "\nMasukkan nomor wangsaf Anda: ".yellow.bold,
95 | async (waNumber) => {
96 | if (!/^\d+$/.test(waNumber)) {
97 | logCuy(
98 | "Nomor harus berupa angka!\nSilakan masukkan nomor wangsaf kembali!.",
99 | "red"
100 | );
101 | askWaNumber();
102 | } else if (!waNumber.startsWith("62")) {
103 | logCuy(
104 | "Nomor harus diawali dengan 62!\nContoh : 628123456789\nSilakan masukkan nomor wangsaf kembali!.",
105 | "red"
106 | );
107 | askWaNumber();
108 | } else {
109 | const code = await sock.requestPairingCode(waNumber);
110 | console.log(
111 | "\nCek notifikasi wangsafmu dan masukin kode login wangsaf:"
112 | .blue.bold,
113 | code.bold.red
114 | );
115 | rl.close();
116 | }
117 | }
118 | );
119 | };
120 | askWaNumber();
121 | } else if (answer.toLowerCase() === "n") {
122 | useCode = false;
123 | logCuy(
124 | "Buka wangsafmu lalu klik titik tiga di kanan atas kemudian klik perangkat tertaut setelah itu Silahkan scan QR code dibawah untuk login ke wangsaf",
125 | "cyan"
126 | );
127 | connectToWhatsApp();
128 | rl.close();
129 | } else {
130 | logCuy('Input tidak valid. Silakan masukkan "y" atau "n".', "red");
131 | askPairingCode();
132 | }
133 | }
134 | );
135 | };
136 |
137 | askPairingCode();
138 | }
139 |
140 | sock.ev.on("connection.update", async (update) => {
141 | const { connection, lastDisconnect } = update;
142 | if (connection === "close") {
143 | const shouldReconnect =
144 | lastDisconnect.error?.output.statusCode !== DisconnectReason.loggedOut;
145 | if (shouldReconnect) {
146 | logCuy("Mencoba menghubungkan ke wangsaf...\n", "cyan");
147 | connectToWhatsApp();
148 | } else {
149 | logCuy(
150 | "Nampaknya kamu telah logout dari wangsaf, silahkan login ke wangsaf kembali!",
151 | "red"
152 | );
153 | fs.rmdirSync(sessionPath, { recursive: true, force: true });
154 | connectToWhatsApp();
155 | }
156 | } else if (connection === "open") {
157 | logCuy("Berhasil Terhubung ke wangsaf");
158 | loggedInNumber = sock.user.id.split("@")[0].split(":")[0];
159 | let displayedLoggedInNumber = loggedInNumber;
160 | if (sensorNomor) {
161 | displayedLoggedInNumber =
162 | displayedLoggedInNumber.slice(0, 3) +
163 | "****" +
164 | displayedLoggedInNumber.slice(-2);
165 | }
166 | let messageInfo = `Bot *AutoReadStoryWhatsApp* Aktif!
167 | Kamu berhasil login dengan nomor: ${displayedLoggedInNumber}
168 |
169 | info status fitur:
170 | - Auto Read Status: ${autoReadStatus ? "*Aktif*" : "*Nonaktif*"}
171 | - Auto Like Status: ${autoLikeStatus ? "*Aktif*" : "*Nonaktif*"}
172 | - Download Media Status: ${downloadMediaStatus ? "*Aktif*" : "*Nonaktif*"}
173 | - Sensor Nomor: ${sensorNomor ? "*Aktif*" : "*Nonaktif*"}
174 | - Anti Telpon: ${antiTelpon ? "*Aktif*" : "*Nonaktif*"}
175 | - Auto Kick tag Story: ${autoKickStory ? "*Aktif*" : "*Nonaktif*"}
176 |
177 | Ketik *#menu* untuk melihat menu perintah yang tersedia.
178 |
179 | SC : https://github.com/jauhariel/AutoReadStoryWhatsapp`;
180 | console.log(
181 | `kamu berhasil login dengan nomor:`.green.bold,
182 | displayedLoggedInNumber.yellow.bold
183 | );
184 | console.log(
185 | "Bot sudah aktif!\n\nSelamat menikmati fitur auto read story whatsapp by"
186 | .green.bold,
187 | "github.com/Jauhariel\n".red.bold
188 | );
189 |
190 | if (!welcomeMessage) {
191 | setTimeout(async () => {
192 | await sock.sendMessage(`${loggedInNumber}@s.whatsapp.net`, {
193 | text: messageInfo,
194 | });
195 | welcomeMessage = true;
196 | }, 5000);
197 | }
198 | }
199 | });
200 | sock.ev.on("creds.update", saveCreds);
201 |
202 | sock.ev.on("call", (call) => {
203 | const { id, status, from } = call[0];
204 | if (status === "offer" && antiTelpon) return sock.rejectCall(id, from);
205 | });
206 |
207 | sock.ev.on("messages.upsert", async ({ messages }) => {
208 | const msg = messages[0];
209 | if (!msg.message) return;
210 |
211 | msg.type = msg.message.imageMessage
212 | ? "imageMessage"
213 | : msg.message.videoMessage
214 | ? "videoMessage"
215 | : msg.message.audioMessage
216 | ? "audioMessage"
217 | : msg.message.extendedTextMessage
218 | ? "extendedTextMessage"
219 | : Object.keys(msg.message)[0];
220 |
221 | msg.text =
222 | msg.type === "conversation"
223 | ? msg.message.conversation
224 | : msg.type === "extendedTextMessage"
225 | ? msg.message.extendedTextMessage.text
226 | : msg.message[msg.type]?.caption || "";
227 |
228 | msg.isQuoted =
229 | msg.type === "extendedTextMessage"
230 | ? msg.message.extendedTextMessage.contextInfo?.quotedMessage
231 | : msg.type === "imageMessage"
232 | ? msg.message.imageMessage.contextInfo?.quotedMessage
233 | : msg.type === "videoMessage"
234 | ? msg.message.videoMessage.contextInfo?.quotedMessage
235 | : msg.type === "audioMessage"
236 | ? msg.message.audioMessage.contextInfo?.quotedMessage
237 | : null;
238 |
239 | msg.quoted = msg.isQuoted
240 | ? msg.message.extendedTextMessage?.contextInfo ||
241 | msg.message.imageMessage?.contextInfo ||
242 | msg.message.videoMessage?.contextInfo ||
243 | msg.message.audioMessage?.contextInfo
244 | : null;
245 |
246 | const prefixes = [".", "#", "!", "/"];
247 | let prefix = prefixes.find((p) => msg.text.startsWith(p));
248 |
249 | if (prefix && msg.key.fromMe) {
250 | msg.cmd = msg.text.trim().split(" ")[0].replace(prefix, "").toLowerCase();
251 |
252 | // args
253 | msg.args = msg.text
254 | .replace(/^\S*\b/g, "")
255 | .trim()
256 | .split("|");
257 |
258 | async function validateNumber(commandname, type, sc, data) {
259 | if (!data) {
260 | await sock.sendMessage(
261 | `${loggedInNumber}@s.whatsapp.net`,
262 | {
263 | text: `Nomor harus diisi.\ncontoh ketik :\n\`${commandname} blacklist 628123456789\`\n\nArgumen yang tersedia:\n\n\`${commandname} blacklist nomornya\`\nuntuk ${type} nomor ${sc} blacklist\n\n\`${commandname} whitelist nomornya\`\nuntuk ${type} nomor ${sc} whitelist`,
264 | },
265 | { quoted: msg }
266 | );
267 | return false;
268 | }
269 | if (!/^\d+$/.test(data)) {
270 | await sock.sendMessage(
271 | `${loggedInNumber}@s.whatsapp.net`,
272 | {
273 | text: `Nomor harus berupa angka.\ncontoh ketik :\n\`${commandname} blacklist 628123456789\`\n\nArgumen yang tersedia:\n\n\`${commandname} blacklist nomornya\`\nuntuk ${type} nomor ${sc} blacklist\n\n\`${commandname} whitelist nomornya\`\nuntuk ${type} nomor ${sc} whitelist`,
274 | },
275 | { quoted: msg }
276 | );
277 | return false;
278 | }
279 | if (!data.startsWith("62")) {
280 | await sock.sendMessage(
281 | `${loggedInNumber}@s.whatsapp.net`,
282 | {
283 | text: `Nomor harus diawali dengan 62.\ncontoh ketik :\n\`${commandname} blacklist 628123456789\`\n\nArgumen yang tersedia:\n\n\`${commandname} blacklist nomornya\`\nuntuk ${type} nomor ${sc} blacklist\n\n\`${commandname} whitelist nomornya\`\nuntuk ${type} nomor ${sc} whitelist`,
284 | },
285 | { quoted: msg }
286 | );
287 | return false;
288 | }
289 | return true;
290 | }
291 |
292 | // command
293 | switch (msg.cmd) {
294 | case "on":
295 | msg.args[0].trim() === ""
296 | ? await sock.sendMessage(
297 | `${loggedInNumber}@s.whatsapp.net`,
298 | {
299 | text: `mana argumennya ?\ncontoh ketik : \`#on autolike\`\n\nArgumen yang tersedia:\n\n\`#on autoread\`\nuntuk mengaktifkan fitur autoread story\n\n\`#on autolike\`\nuntuk mengaktifkan fitur autolike story\n\n\`#on dlmedia\`\nuntuk mengaktifkan fitur download media(foto,video, dan audio) dari story\n\n\`#on sensornomor\`\nuntuk mengaktifkan sensor nomor\n\n\`#on antitelpon\`\nuntuk mengaktifkan anti-telpon\n\n\`#on kickstory\`\nuntuk mengaktifkan auto kick story grup`,
300 | },
301 | { quoted: msg }
302 | )
303 | : msg.args.forEach(async (arg) => {
304 | switch (arg.trim().toLowerCase()) {
305 | case "autoread":
306 | autoReadStatus = true;
307 | updateConfig("autoReadStatus", true);
308 | logCuy("Kamu mengaktifkan fitur Auto Read Status", "blue");
309 | await sock.sendMessage(
310 | `${loggedInNumber}@s.whatsapp.net`,
311 | { text: "Auto Read Status aktif" },
312 | { quoted: msg }
313 | );
314 | break;
315 | case "autolike":
316 | autoLikeStatus = true;
317 | updateConfig("autoLikeStatus", true);
318 | logCuy("Kamu mengaktifkan fitur Auto Like Status", "blue");
319 | await sock.sendMessage(
320 | `${loggedInNumber}@s.whatsapp.net`,
321 | { text: "Auto Like Status aktif" },
322 | { quoted: msg }
323 | );
324 | break;
325 | case "dlmedia":
326 | downloadMediaStatus = true;
327 | updateConfig("downloadMediaStatus", true);
328 | logCuy(
329 | "Kamu mengaktifkan fitur Download Media Status",
330 | "blue"
331 | );
332 | await sock.sendMessage(
333 | `${loggedInNumber}@s.whatsapp.net`,
334 | { text: "Download Media Status aktif" },
335 | { quoted: msg }
336 | );
337 | break;
338 | case "sensornomor":
339 | sensorNomor = true;
340 | updateConfig("sensorNomor", true);
341 | logCuy("Kamu mengaktifkan fitur sensorNomor", "blue");
342 | await sock.sendMessage(
343 | `${loggedInNumber}@s.whatsapp.net`,
344 | { text: "Sensor Nomor aktif" },
345 | { quoted: msg }
346 | );
347 | break;
348 | case "antitelpon":
349 | antiTelpon = true;
350 | updateConfig("antiTelpon", true);
351 | logCuy("Kamu mengaktifkan fitur Anti-telpon", "blue");
352 | await sock.sendMessage(
353 | `${loggedInNumber}@s.whatsapp.net`,
354 | { text: "Anti-telpon aktif" },
355 | { quoted: msg }
356 | );
357 | break;
358 | case "kickstory":
359 | autoKickStory = true;
360 | updateConfig("autoKickStory", true);
361 | logCuy(
362 | "Kamu mengaktifkan fitur auto kick tag grup di story",
363 | "blue"
364 | );
365 | await sock.sendMessage(
366 | `${loggedInNumber}@s.whatsapp.net`,
367 | { text: "Auto Kick Tag Grup di Story aktif" },
368 | { quoted: msg }
369 | );
370 | break;
371 | default:
372 | await sock.sendMessage(
373 | `${loggedInNumber}@s.whatsapp.net`,
374 | {
375 | text: `Argumen tidak valid: ${arg}. Pilihan yang tersedia: autoread, autolike, dlmedia, sensornomor, kickstory dan antitelpon`,
376 | },
377 | { quoted: msg }
378 | );
379 | break;
380 | }
381 | });
382 | break;
383 | case "off":
384 | msg.args[0].trim() === ""
385 | ? await sock.sendMessage(
386 | `${loggedInNumber}@s.whatsapp.net`,
387 | {
388 | text: `mana argumennya ?\ncontoh ketik : \`#off autolike\`\n\nArgumen yang tersedia:\n\n\`#off autoread\`\nuntuk menonaktifkan fitur autoread story\n\n\`#off autolike\`\nuntuk menonaktifkan fitur autolike story\n\n\`#off dlmedia\`\nuntuk menonaktifkan fitur download media(foto,video, dan audio) dari story\n\n\`#off sensornomor\`\nuntuk menonaktifkan sensor nomor\n\n\`#off antitelpon\`\nuntuk menonaktifkan anti-telpon\n\n\`#off kickstory\`\nuntuk menonaktifkan auto kick story grup`,
389 | },
390 | { quoted: msg }
391 | )
392 | : msg.args.forEach(async (arg) => {
393 | switch (arg.trim().toLowerCase()) {
394 | case "autoread":
395 | autoReadStatus = false;
396 | updateConfig("autoReadStatus", false);
397 | logCuy("Kamu mematikan fitur Auto Read Status", "blue");
398 | await sock.sendMessage(
399 | `${loggedInNumber}@s.whatsapp.net`,
400 | { text: "Auto Read Status nonaktif" },
401 | { quoted: msg }
402 | );
403 | break;
404 | case "autolike":
405 | autoLikeStatus = false;
406 | updateConfig("autoLikeStatus", false);
407 | logCuy("Kamu mematikan fitur Auto Like Status", "blue");
408 | await sock.sendMessage(
409 | `${loggedInNumber}@s.whatsapp.net`,
410 | { text: "Auto Like Status nonaktif" },
411 | { quoted: msg }
412 | );
413 | break;
414 | case "dlmedia":
415 | downloadMediaStatus = false;
416 | updateConfig("downloadMediaStatus", false);
417 | logCuy(
418 | "Kamu mematikan fitur Download Media Status",
419 | "blue"
420 | );
421 | await sock.sendMessage(
422 | `${loggedInNumber}@s.whatsapp.net`,
423 | { text: "Download Media Status nonaktif" },
424 | { quoted: msg }
425 | );
426 | break;
427 | case "sensornomor":
428 | sensorNomor = false;
429 | updateConfig("sensorNomor", false);
430 | logCuy("Kamu mematikan fitur Sensor Nomor", "blue");
431 | await sock.sendMessage(
432 | `${loggedInNumber}@s.whatsapp.net`,
433 | { text: "Sensor Nomor nonaktif" },
434 | { quoted: msg }
435 | );
436 | break;
437 | case "antitelpon":
438 | antiTelpon = false;
439 | updateConfig("antiTelpon", false);
440 | logCuy("Kamu mematikan fitur Anti-telpon", "blue");
441 | await sock.sendMessage(
442 | `${loggedInNumber}@s.whatsapp.net`,
443 | { text: "Anti-telpon nonaktif" },
444 | { quoted: msg }
445 | );
446 | break;
447 | case "kickstory":
448 | autoKickStory = false;
449 | updateConfig("autoKickStory", false);
450 | logCuy(
451 | "Kamu mematikan fitur auto kick tag grup di story",
452 | "blue"
453 | );
454 | await sock.sendMessage(
455 | `${loggedInNumber}@s.whatsapp.net`,
456 | { text: "Auto Kick Tag Grup di Story nonaktif" },
457 | { quoted: msg }
458 | );
459 | break;
460 | default:
461 | await sock.sendMessage(
462 | `${loggedInNumber}@s.whatsapp.net`,
463 | {
464 | text: `Argumen tidak valid: ${arg}. Pilihan yang tersedia: autoread, autolike, dlmedia, sensornomor, kickstory dan antitelpon`,
465 | },
466 | { quoted: msg }
467 | );
468 | break;
469 | }
470 | });
471 | break;
472 | case "add":
473 | msg.args[0].trim() === ""
474 | ? await sock.sendMessage(
475 | `${loggedInNumber}@s.whatsapp.net`,
476 | {
477 | text: `mana argumennya ?\ncontoh ketik :\n\`#add blacklist 628123456789\`\n\nArgumen yang tersedia:\n\n\`#add blacklist nomornya\`\nuntuk menambahkan nomor ke blacklist\n\n\`#add whitelist nomornya\`\nuntuk menambahkan nomor ke whitelist\n\n\`#add emojis emojinya\`\nuntuk menambahkan emoji ke emojis`,
478 | },
479 | { quoted: msg }
480 | )
481 | : msg.args.forEach(async (arg) => {
482 | const [list, data] = arg.trim().split(" ");
483 | if (list === "emojis") {
484 | let emojiRegex = /^[\p{Emoji}\u200D\uFE0F]$/gu;
485 | if (!data) {
486 | await sock.sendMessage(
487 | `${loggedInNumber}@s.whatsapp.net`,
488 | {
489 | text: `emoji harus diisi.\ncontoh ketik :\n\`#add emojis 👍\``,
490 | },
491 | { quoted: msg }
492 | );
493 | return;
494 | }
495 | if (!emojiRegex.test(data)) {
496 | await sock.sendMessage(
497 | `${loggedInNumber}@s.whatsapp.net`,
498 | {
499 | text: `hanya boleh mengisi 1 emoji.\ncontoh ketik :\n\`#add emojis 👍\``,
500 | },
501 | { quoted: msg }
502 | );
503 | return;
504 | }
505 | if (!emojis.includes(data)) {
506 | emojis.push(data);
507 | updateConfig("emojis", emojis);
508 | logCuy(
509 | `Kamu menambahkan emoji ${data} ke daftar emojis`,
510 | "blue"
511 | );
512 | await sock.sendMessage(
513 | `${loggedInNumber}@s.whatsapp.net`,
514 | {
515 | text: `emoji ${data} berhasil ditambahkan ke daftar emojis`,
516 | },
517 | { quoted: msg }
518 | );
519 | } else {
520 | await sock.sendMessage(
521 | `${loggedInNumber}@s.whatsapp.net`,
522 | { text: `emoji ${data} sudah ada di daftar emojis` },
523 | { quoted: msg }
524 | );
525 | }
526 | } else if (list === "blacklist") {
527 | const isValid = await validateNumber(
528 | "#add",
529 | "menambahkan",
530 | "ke",
531 | data
532 | );
533 | if (!isValid) return;
534 | let displayNumber = data;
535 | if (sensorNomor) {
536 | displayNumber =
537 | displayNumber.slice(0, 3) +
538 | "****" +
539 | displayNumber.slice(-2);
540 | }
541 | if (!blackList.includes(data)) {
542 | blackList.push(data);
543 | updateConfig("blackList", blackList);
544 | logCuy(
545 | `Kamu menambahkan nomor ${displayNumber} ke blacklist`,
546 | "blue"
547 | );
548 | await sock.sendMessage(
549 | `${loggedInNumber}@s.whatsapp.net`,
550 | {
551 | text: `Nomor ${displayNumber} berhasil ditambahkan ke blacklist`,
552 | },
553 | { quoted: msg }
554 | );
555 | } else {
556 | await sock.sendMessage(
557 | `${loggedInNumber}@s.whatsapp.net`,
558 | { text: `Nomor ${displayNumber} sudah ada di blacklist` },
559 | { quoted: msg }
560 | );
561 | }
562 | } else if (list === "whitelist") {
563 | const isValid = await validateNumber(
564 | "#add",
565 | "menambahkan",
566 | "ke",
567 | data
568 | );
569 | if (!isValid) return;
570 | let displayNumber = data;
571 | if (sensorNomor) {
572 | displayNumber =
573 | displayNumber.slice(0, 3) +
574 | "****" +
575 | displayNumber.slice(-2);
576 | }
577 | if (!whiteList.includes(data)) {
578 | whiteList.push(data);
579 | updateConfig("whiteList", whiteList);
580 | logCuy(
581 | `Kamu menambahkan nomor ${displayNumber} ke whitelist`,
582 | "blue"
583 | );
584 | await sock.sendMessage(
585 | `${loggedInNumber}@s.whatsapp.net`,
586 | {
587 | text: `Nomor ${displayNumber} berhasil ditambahkan ke whitelist`,
588 | },
589 | { quoted: msg }
590 | );
591 | } else {
592 | await sock.sendMessage(
593 | `${loggedInNumber}@s.whatsapp.net`,
594 | { text: `Nomor ${displayNumber} sudah ada di whitelist` },
595 | { quoted: msg }
596 | );
597 | }
598 | } else {
599 | await sock.sendMessage(
600 | `${loggedInNumber}@s.whatsapp.net`,
601 | {
602 | text: `Argumen tidak valid: ${arg}. Pilihan yang tersedia: blacklist, whitelist, emojis`,
603 | },
604 | { quoted: msg }
605 | );
606 | }
607 | });
608 | break;
609 | case "remove":
610 | msg.args[0].trim() === ""
611 | ? await sock.sendMessage(
612 | `${loggedInNumber}@s.whatsapp.net`,
613 | {
614 | text: `mana argumennya ?\ncontoh ketik :\n\`#remove blacklist 628123456789\`\n\nArgumen yang tersedia:\n\n\`#remove blacklist nomornya\`\nuntuk menghapus nomor dari blacklist\n\n\`#remove whitelist nomornya\`\nuntuk menghapus nomor dari whitelist\n\n\`#remove emojis emojinya\`\nuntuk menghapus emoji dari daftar emojis`,
615 | },
616 | { quoted: msg }
617 | )
618 | : msg.args.forEach(async (arg) => {
619 | const [list, data] = arg.trim().split(" ");
620 | if (list === "emojis") {
621 | let emojiRegex = /^[\p{Emoji}\u200D\uFE0F]$/gu;
622 | if (!data) {
623 | await sock.sendMessage(
624 | `${loggedInNumber}@s.whatsapp.net`,
625 | {
626 | text: `emoji harus diisi.\ncontoh ketik :\n\`#remove emojis 👍\``,
627 | },
628 | { quoted: msg }
629 | );
630 | return;
631 | }
632 | if (!emojiRegex.test(data)) {
633 | await sock.sendMessage(
634 | `${loggedInNumber}@s.whatsapp.net`,
635 | {
636 | text: `hanya boleh mengisi 1 emoji.\ncontoh ketik :\n\`#remove emojis 👍\``,
637 | },
638 | { quoted: msg }
639 | );
640 | return;
641 | }
642 | if (emojis.length === 1) {
643 | await sock.sendMessage(
644 | `${loggedInNumber}@s.whatsapp.net`,
645 | {
646 | text: `Tidak bisa menghapus emoji terakhir. Harus ada minimal satu emoji.\n\nKetik \`#info\` untuk mengecek daftar emoji yang tersedia`,
647 | },
648 | { quoted: msg }
649 | );
650 | return;
651 | }
652 | if (emojis.includes(data)) {
653 | emojis = emojis.filter((n) => n !== data);
654 | updateConfig("emojis", emojis);
655 | logCuy(`Kamu menghapus emoji ${data} dari emojis`, "blue");
656 | await sock.sendMessage(
657 | `${loggedInNumber}@s.whatsapp.net`,
658 | {
659 | text: `emoji ${data} berhasil dihapus dari daftar emojis`,
660 | },
661 | { quoted: msg }
662 | );
663 | } else {
664 | await sock.sendMessage(
665 | `${loggedInNumber}@s.whatsapp.net`,
666 | {
667 | text: `emoji ${data} tidak ada di daftar emojis\n\nKetik \`#info\` untuk mengecek daftar emoji yang tersedia`,
668 | },
669 | { quoted: msg }
670 | );
671 | }
672 | } else if (list === "blacklist") {
673 | const isValid = await validateNumber(
674 | "#remove",
675 | "menghapus",
676 | "dari",
677 | data
678 | );
679 | if (!isValid) return;
680 | let displayNumber = data;
681 | if (sensorNomor) {
682 | displayNumber =
683 | displayNumber.slice(0, 3) +
684 | "****" +
685 | displayNumber.slice(-2);
686 | }
687 | if (blackList.includes(data)) {
688 | blackList = blackList.filter((n) => n !== data);
689 | updateConfig("blackList", blackList);
690 | logCuy(
691 | `Kamu menghapus nomor ${displayNumber} dari blacklist`,
692 | "blue"
693 | );
694 | await sock.sendMessage(
695 | `${loggedInNumber}@s.whatsapp.net`,
696 | {
697 | text: `Nomor ${displayNumber} berhasil dihapus dari blacklist`,
698 | },
699 | { quoted: msg }
700 | );
701 | } else {
702 | await sock.sendMessage(
703 | `${loggedInNumber}@s.whatsapp.net`,
704 | {
705 | text: `Nomor ${displayNumber} tidak ada di blacklist\n\nKetik \`#info\` untuk mengecek daftar nomor yang tersedia`,
706 | },
707 | { quoted: msg }
708 | );
709 | }
710 | } else if (list === "whitelist") {
711 | const isValid = await validateNumber(
712 | "#remove",
713 | "menghapus",
714 | "dari",
715 | data
716 | );
717 | if (!isValid) return;
718 | let displayNumber = data;
719 | if (sensorNomor) {
720 | displayNumber =
721 | displayNumber.slice(0, 3) +
722 | "****" +
723 | displayNumber.slice(-2);
724 | }
725 | if (whiteList.includes(data)) {
726 | whiteList = whiteList.filter((n) => n !== data);
727 | updateConfig("whiteList", whiteList);
728 | logCuy(
729 | `Kamu menghapus nomor ${displayNumber} dari whitelist`,
730 | "blue"
731 | );
732 | await sock.sendMessage(
733 | `${loggedInNumber}@s.whatsapp.net`,
734 | {
735 | text: `Nomor ${displayNumber} berhasil dihapus dari whitelist`,
736 | },
737 | { quoted: msg }
738 | );
739 | } else {
740 | await sock.sendMessage(
741 | `${loggedInNumber}@s.whatsapp.net`,
742 | {
743 | text: `Nomor ${displayNumber} tidak ada di whitelist\n\nKetik \`#info\` untuk mengecek daftar nomor yang tersedia`,
744 | },
745 | { quoted: msg }
746 | );
747 | }
748 | } else {
749 | await sock.sendMessage(
750 | `${loggedInNumber}@s.whatsapp.net`,
751 | {
752 | text: `Argumen tidak valid: ${arg}. Pilihan yang tersedia: blacklist, whitelist, emojis`,
753 | },
754 | { quoted: msg }
755 | );
756 | }
757 | });
758 | break;
759 | case "menu":
760 | const menuMessage = `Daftar Menu:
761 | contoh penggunaan: #on autolike
762 |
763 | Perintah On:
764 | \`#on autoread\`
765 | Mengaktifkan fitur autoread story
766 |
767 | \`#on autolike\`
768 | Mengaktifkan fitur autolike story
769 |
770 | \`#on dlmedia\`
771 | Mengaktifkan fitur download media (foto, video, dan audio) dari story
772 |
773 | \`#on sensornomor\`
774 | Mengaktifkan sensor nomor
775 |
776 | \`#on antitelpon\`
777 | Mengaktifkan anti telpon
778 |
779 | \`#on kickstory\`
780 | Mengaktifkan auto kick story tag grup
781 |
782 | Perintah Off:
783 | \`#off autoread\`
784 | Menonaktifkan fitur autoread story
785 |
786 | \`#off autolike\`
787 | Menonaktifkan fitur autolike story
788 |
789 | \`#off dlmedia\`
790 | Menonaktifkan fitur download media (foto, video, dan audio) dari story
791 |
792 | \`#off sensornomor\`
793 | Menonaktifkan sensor nomor
794 |
795 | \`#off antitelpon\`
796 | Menonaktifkan anti telpon
797 |
798 | \`#off kickstory\`
799 | Menonaktifkan auto kick story tag grup
800 |
801 | Perintah Add:
802 | \`#add blacklist nomornya\`
803 | Menambahkan nomor ke blacklist
804 |
805 | \`#add whitelist nomornya\`
806 | Menambahkan nomor ke whitelist
807 |
808 | \`#add emojis emojinya\`
809 | Menambahkan emoji ke daftar emojis
810 |
811 | Perintah Remove:
812 | \`#remove blacklist nomornya\`
813 | Menghapus nomor dari blacklist
814 |
815 | \`#remove whitelist nomornya\`
816 | Menghapus nomor dari whitelist
817 |
818 | \`#remove emojis emojinya\`
819 | Menghapus emoji dari daftar emojis
820 |
821 | Perintah Info:
822 | \`#info\`
823 | Menampilkan informasi status fitur, daftar nomor/emoji yang ada di blacklist, whitelist dan emojis
824 |
825 | Perintah Viewonce:
826 | \`#viewonce\`
827 | Mengambil/download foto, video, audio dari pesan sementara/sekali liat dari yang kamu reply
828 | `;
829 |
830 | await sock.sendMessage(
831 | `${loggedInNumber}@s.whatsapp.net`,
832 | { text: menuMessage },
833 | { quoted: msg }
834 | );
835 | break;
836 | case "viewonce":
837 | if (msg.isQuoted && msg.quoted && msg.quoted.quotedMessage) {
838 | if (msg.quoted.quotedMessage.imageMessage) {
839 | let buffer = await downloadMediaMessage(
840 | {
841 | message: {
842 | imageMessage: msg.quoted.quotedMessage.imageMessage,
843 | },
844 | key: msg.quoted.key,
845 | },
846 | "buffer",
847 | {},
848 | {
849 | logger: pino({ level: "fatal" }),
850 | }
851 | );
852 |
853 | await sock.sendMessage(
854 | `${loggedInNumber}@s.whatsapp.net`,
855 | {
856 | image: Buffer.from(buffer),
857 | },
858 | { quoted: msg }
859 | );
860 |
861 | logCuy(
862 | `Berhasil mengambil gambar sekali liat dari yang kamu reply`,
863 | "blue"
864 | );
865 |
866 | buffer = null;
867 | } else if (msg.quoted.quotedMessage.videoMessage) {
868 | let buffer = await downloadMediaMessage(
869 | {
870 | message: {
871 | videoMessage: msg.quoted.quotedMessage.videoMessage,
872 | },
873 | key: msg.quoted.key,
874 | },
875 | "buffer",
876 | {},
877 | {
878 | logger: pino({ level: "fatal" }),
879 | }
880 | );
881 |
882 | await sock.sendMessage(
883 | `${loggedInNumber}@s.whatsapp.net`,
884 | {
885 | video: Buffer.from(buffer),
886 | },
887 | { quoted: msg }
888 | );
889 |
890 | logCuy(
891 | `Berhasil mengambil video sekali liat dari yang kamu reply`,
892 | "blue"
893 | );
894 |
895 | buffer = null;
896 | } else if (msg.quoted.quotedMessage.audioMessage) {
897 | let buffer = await downloadMediaMessage(
898 | {
899 | message: {
900 | audioMessage: msg.quoted.quotedMessage.audioMessage,
901 | },
902 | key: msg.quoted.key,
903 | },
904 | "buffer",
905 | {},
906 | {
907 | logger: pino({ level: "fatal" }),
908 | }
909 | );
910 |
911 | await sock.sendMessage(
912 | `${loggedInNumber}@s.whatsapp.net`,
913 | {
914 | audio: Buffer.from(buffer),
915 | },
916 | { quoted: msg }
917 | );
918 |
919 | logCuy(
920 | `Berhasil mengambil audio sekali liat dari yang kamu reply`,
921 | "blue"
922 | );
923 |
924 | buffer = null;
925 | } else {
926 | await sock.sendMessage(
927 | `${loggedInNumber}@s.whatsapp.net`,
928 | {
929 | text: `Pesan yang kamu reply bukan pesan yang bertipe foto, video, audio dan sekali liat`,
930 | },
931 | { quoted: msg }
932 | );
933 | logCuy(
934 | `Pesan yang kamu reply bukan pesan yang bertipe foto, video, audio dan sekali liat`,
935 | "yellow"
936 | );
937 | }
938 | } else {
939 | await sock.sendMessage(
940 | `${loggedInNumber}@s.whatsapp.net`,
941 | {
942 | text: `Reply/balas pesan sekali liat dengan perintah #viewonce`,
943 | },
944 | { quoted: msg }
945 | );
946 | }
947 | break;
948 | case "info":
949 | const infoMessage = `Informasi Status Fitur:
950 | - Auto Read Status: ${autoReadStatus ? "*Aktif*" : "*Nonaktif*"}
951 | - Auto Like Status: ${autoLikeStatus ? "*Aktif*" : "*Nonaktif*"}
952 | - Download Media Status: ${downloadMediaStatus ? "*Aktif*" : "*Nonaktif*"}
953 | - Sensor Nomor: ${sensorNomor ? "*Aktif*" : "*Nonaktif*"}
954 | - Anti Telpon: ${antiTelpon ? "*Aktif*" : "*Nonaktif*"}
955 | - Auto Kick tag Story: ${autoKickStory ? "*Aktif*" : "*Nonaktif*"}`;
956 |
957 | const formatList = (list) =>
958 | list
959 | .map((number, index) => {
960 | let displayNumber = number;
961 | if (sensorNomor) {
962 | displayNumber =
963 | displayNumber.slice(0, 3) +
964 | "****" +
965 | displayNumber.slice(-2);
966 | }
967 | return `\u25CF ${displayNumber}`;
968 | })
969 | .join("\n");
970 | const formatEmojiList = (list) =>
971 | list.map((emoji, index) => `${emoji}`).join(", ");
972 |
973 | const blacklistMessage =
974 | blackList.length > 0
975 | ? `Blacklist:\n${formatList(blackList)}`
976 | : "Blacklist kosong.";
977 | const whitelistMessage =
978 | whiteList.length > 0
979 | ? `Whitelist:\n${formatList(whiteList)}`
980 | : "Whitelist kosong.";
981 | const emojisMessage =
982 | emojis.length > 0
983 | ? `Emojis:\n${formatEmojiList(emojis)}`
984 | : "Emojis kosong.";
985 | const listMessage = `\n\n${blacklistMessage}\n\n${whitelistMessage}\n\n${emojisMessage}\n\nKetik \`#add\` untuk menambahkan nomor atau emoji ke blacklist, whitelist, dan emojis\nKetik \`#remove\` untuk menghapus nomor atau emoji dari blacklist, whitelist, dan emojis\nKetik \`#on\` untuk mengaktifkan fitur\nKetik \`#off\` untuk menonaktifkan fitur\nKetik \`#menu\` untuk melihat menu perintah yang tersedia`;
986 |
987 | await sock.sendMessage(
988 | `${loggedInNumber}@s.whatsapp.net`,
989 | { text: infoMessage + listMessage },
990 | { quoted: msg }
991 | );
992 | break;
993 | }
994 | }
995 |
996 | if (autoKickStory) {
997 | if (msg.message.groupStatusMentionMessage && !msg.key.fromMe) {
998 | const groupId = msg.key.remoteJid;
999 | const participant = msg.key.participant;
1000 |
1001 | const groupMetadata = await sock.groupMetadata(groupId);
1002 | const groupName = groupMetadata.subject;
1003 | const botNumber = sock.user.id.split(":")[0] + "@s.whatsapp.net";
1004 | const isAdmin = groupMetadata.participants.some(
1005 | (member) => member.id === botNumber && member.admin !== null
1006 | );
1007 |
1008 | if (isAdmin) {
1009 | await sock.sendMessage(
1010 | groupId,
1011 | {
1012 | text: `@${
1013 | participant.split("@")[0]
1014 | } terdeteksi tag grup di story, kamu akan dikick.`,
1015 | mentions: [participant],
1016 | },
1017 | { quoted: msg }
1018 | );
1019 |
1020 | await sock.groupParticipantsUpdate(groupId, [participant], "remove");
1021 | logCuy(
1022 | `Kamu mengeluarkan sesorang dari group ${groupName} karena telah tag grup di story.`,
1023 | "red"
1024 | );
1025 | } else {
1026 | // await sock.sendMessage(
1027 | // `${loggedInNumber}@s.whatsapp.net`,
1028 | // {
1029 | // text: `terdeteksi ada yang tag grup di story, namun bot bukan admin jadi tidak bisa kick.`,
1030 | // },
1031 | // { quoted: msg }
1032 | // );
1033 | logCuy(
1034 | `Kamu bukan admin di grup ${groupName} jadi tidak bisa kick.`,
1035 | "yellow"
1036 | );
1037 | }
1038 | }
1039 | }
1040 |
1041 | // status
1042 | if (
1043 | msg.key.remoteJid === "status@broadcast" &&
1044 | msg.key.participant !== `${loggedInNumber}@s.whatsapp.net` &&
1045 | autoReadStatus
1046 | ) {
1047 | let senderNumber = msg.key.participant
1048 | ? msg.key.participant.split("@")[0]
1049 | : "Tidak diketahui";
1050 | let displaySendernumber = senderNumber;
1051 | const senderName = msg.pushName || "Tidak diketahui";
1052 |
1053 | if (sensorNomor && displaySendernumber !== "Tidak diketahui") {
1054 | displaySendernumber =
1055 | displaySendernumber.slice(0, 3) +
1056 | "****" +
1057 | displaySendernumber.slice(-2);
1058 | }
1059 |
1060 | if (msg.message.protocolMessage) {
1061 | logCuy(
1062 | `Status dari ${senderName} (${displaySendernumber}) telah dihapus.`,
1063 | "red"
1064 | );
1065 | } else if (!msg.message.reactionMessage) {
1066 | if (blackList.includes(senderNumber)) {
1067 | logCuy(
1068 | `${senderName} (${displaySendernumber}) membuat status tapi karena ada di blacklist. Status tidak akan dilihat.`,
1069 | "yellow"
1070 | );
1071 | return;
1072 | }
1073 |
1074 | if (whiteList.length > 0 && !whiteList.includes(senderNumber)) {
1075 | logCuy(
1076 | `${senderName} (${displaySendernumber}) membuat status tapi karena tidak ada di whitelist. Status tidak akan dilihat.`,
1077 | "yellow"
1078 | );
1079 | return;
1080 | }
1081 |
1082 | const myself = jidNormalizedUser(sock.user.id);
1083 | const emojiToReact = emojis[Math.floor(Math.random() * emojis.length)];
1084 |
1085 | if (msg.key.remoteJid && msg.key.participant) {
1086 | await sock.readMessages([msg.key]);
1087 |
1088 | if (autoLikeStatus) {
1089 | await sock.sendMessage(
1090 | msg.key.remoteJid,
1091 | { react: { key: msg.key, text: emojiToReact } },
1092 | { statusJidList: [msg.key.participant, myself] }
1093 | );
1094 | }
1095 |
1096 | logCuy(
1097 | `Berhasil melihat ${
1098 | autoLikeStatus ? "dan menyukai " : ""
1099 | }status dari: ${senderName} (${displaySendernumber})`,
1100 | "green"
1101 | );
1102 |
1103 | const targetNumber = loggedInNumber;
1104 | let messageContent = `Status dari *${senderName}* (${displaySendernumber}) telah dilihat ${
1105 | autoLikeStatus ? "dan disukai" : ""
1106 | }`;
1107 | let caption =
1108 | msg.message.imageMessage?.caption ||
1109 | msg.message.videoMessage?.caption ||
1110 | msg.message.extendedTextMessage?.text ||
1111 | "Tidak ada caption";
1112 |
1113 | if (downloadMediaStatus) {
1114 | if (msg.type === "imageMessage" || msg.type === "videoMessage") {
1115 | let mediaType = msg.type === "imageMessage" ? "image" : "video";
1116 | messageContent = `Status ${
1117 | mediaType === "image" ? "gambar" : "video"
1118 | } dari *${senderName}* (${displaySendernumber}) telah dilihat ${
1119 | autoLikeStatus ? "dan disukai" : ""
1120 | }`;
1121 |
1122 | try {
1123 | let buffer = await downloadMediaMessage(
1124 | msg,
1125 | "buffer",
1126 | {},
1127 | {
1128 | logger: pino({ level: "fatal" }),
1129 | }
1130 | );
1131 |
1132 | await sock.sendMessage(`${targetNumber}@s.whatsapp.net`, {
1133 | [mediaType]: Buffer.from(buffer),
1134 | caption: `${messageContent} dengan caption : "*${caption}*"`,
1135 | });
1136 |
1137 | buffer = null;
1138 | } catch (error) {
1139 | logCuy(`Error uploading media: ${error}`, "red");
1140 | await sock.sendMessage(`${targetNumber}@s.whatsapp.net`, {
1141 | text: `${messageContent} namun Gagal mengunggah media dari status ${
1142 | mediaType === "image" ? "gambar" : "video"
1143 | } dari *${senderName}* (${displaySendernumber}).`,
1144 | });
1145 | }
1146 | } else if (msg.type === "audioMessage") {
1147 | messageContent = `Status audio dari *${senderName}* (${displaySendernumber}) telah dilihat ${
1148 | autoLikeStatus ? "dan disukai" : ""
1149 | }. Berikut audionya.`;
1150 |
1151 | await sock.sendMessage(`${targetNumber}@s.whatsapp.net`, {
1152 | text: messageContent,
1153 | });
1154 |
1155 | try {
1156 | let buffer = await downloadMediaMessage(
1157 | msg,
1158 | "buffer",
1159 | {},
1160 | {
1161 | logger: pino({ level: "fatal" }),
1162 | }
1163 | );
1164 |
1165 | await sock.sendMessage(`${targetNumber}@s.whatsapp.net`, {
1166 | audio: Buffer.from(buffer),
1167 | caption: "",
1168 | });
1169 |
1170 | buffer = null;
1171 | } catch (error) {
1172 | logCuy(`Error uploading media: ${error}`, "red");
1173 | await sock.sendMessage(`${targetNumber}@s.whatsapp.net`, {
1174 | text: `Gagal mengunggah audio dari status audio dari *${senderName}* (${displaySendernumber}).`,
1175 | });
1176 | }
1177 | } else {
1178 | messageContent = `Status teks dari *${senderName}* (${displaySendernumber}) telah dilihat ${
1179 | autoLikeStatus ? "dan disukai" : ""
1180 | } dengan caption: "*${caption}*"`;
1181 |
1182 | await sock.sendMessage(`${targetNumber}@s.whatsapp.net`, {
1183 | text: messageContent,
1184 | });
1185 | }
1186 | } else {
1187 | await sock.sendMessage(`${targetNumber}@s.whatsapp.net`, {
1188 | text: messageContent,
1189 | });
1190 | }
1191 | }
1192 | }
1193 | }
1194 | });
1195 | }
1196 |
1197 | connectToWhatsApp();
1198 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "auto-read-story-wa-jauhariel",
3 | "version": "3.0.0",
4 | "main": "index.js",
5 | "scripts": {
6 | "start": "node index"
7 | },
8 | "keywords": [
9 | "auto-read-story",
10 | "whatsapp-bot",
11 | "whatsapp-status-viewer",
12 | "auto-view-whatsapp-story",
13 | "bot-whatsapp"
14 | ],
15 | "author": "github.com/jauhariel",
16 | "license": "ISC",
17 | "description": "Auto Read Story/Status WhatsApp adalah bot sederhana yang memungkinkan kamu untuk melihat status/story teman-teman WhatsApp secara otomatis, sehingga kamu menjadi orang pertama yang melihat story mereka.",
18 | "dependencies": {
19 | "@whiskeysockets/baileys": "github:jauhariel/Baileys",
20 | "colors": "^1.4.0",
21 | "moment-timezone": "^0.5.47",
22 | "qrcode-terminal": "^0.12.0"
23 | }
24 | }
25 |
--------------------------------------------------------------------------------