-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
212 lines (184 loc) · 5.98 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
import pkg from 'whatsapp-web.js';
const { Client, LocalAuth } = pkg;
import qrcode from 'qrcode-terminal';
import readline from 'readline';
import fs from 'fs/promises';
import chalk from 'chalk';
const CONTACT_LIST = './contact.txt';
function sleep(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
function logs(message, type = null) {
switch (type) {
case "info":
message = `[INFO] ${message}\n`;
break;
case "ok":
message = `[+] ${message}`;
break;
case "fail":
message = `[!] ${message}`;
break;
case "loading":
message = `[%] ${message}`;
break;
}
const now = new Date();
const timestamp = now.toISOString().replace(/T/, " ").replace(/\..+/, "");
if (type != null) {
if (type == "fail") {
console.log(chalk.red(`[${timestamp}] ${message}`));
} else {
if(type == 'info'){
console.log(chalk.blue(`\n[${timestamp}] ${message}`));
} else if(type == 'loading'){
console.log(chalk.yellow(`\n[${timestamp}] ${message}`));
} else {
console.log(chalk.green(`[${timestamp}] ${message}`));
}
}
} else {
console.log(chalk.white(`[${timestamp}] ${message}`));
}
}
// Function to prompt user for input
function askQuestion(query) {
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
return new Promise((resolve) =>
rl.question(query, (ans) => {
rl.close();
resolve(ans);
})
);
}
logs("Sedang memulai bot, harap tunggu...", "loading");
// Initialize the client with LocalAuth
const client = new Client({
authStrategy: new LocalAuth(), // Use LocalAuth for session management
});
client.on("qr", (qr) => {
logs(
`Tolong scan qrcode berikut di akun yang akan di gunakan untuk memasukkan kontak ke grup`,
"info"
);
qrcode.generate(qr, { small: true });
});
client.on("authenticated", () => {
logs("User terverifikasi!", "ok");
});
client.on("disconnected", (reason) => {
if (reason === "BANNED") {
console.log(chalk.red("[WARNING] Akun telah terbanned oleh WhatsApp , menghentikan proses."));
process.exit(1);
}
});
client.on("ready", async () => {
console.log(chalk.magenta(`
┓ ┓ •
┏┣┓┏┓┏┓┏┓┣┓┏┓┓
┛┛┗┗┻┛┗┗┫┛┗┗┻┗
v1.0.0 ┛
By ./SansXpl
`));
let myGroupName;
let myGroup;
// Loop to prompt for group name until a valid group is found
while (true) {
myGroupName = await askQuestion("Masukkan nama grup (lengkap): ");
myGroup = (await client.getChats()).find(
(chat) => chat.name === myGroupName
);
if (myGroup) {
logs(`Bot telah disetting ke grup ${myGroupName}`, "info");
break;
} else {
logs(`Grup ${myGroupName} tidak ditemukan, tolong coba lagi.`, "fail");
}
}
// Prompt for welcome message, delay, and message frequency
const welcomeMessage = await askQuestion("Masukkan pesan selamat datang: ");
let delay = await askQuestion(
"Masukkan delay setiap memasukkan kontak (detik): "
);
const messageAfter = await askQuestion(
"Kirim pesan selamat datang setiap berapa kontak: "
);
const delaySeconds = parseFloat(delay);
const messageAfterCount = parseInt(messageAfter, 10);
if (
isNaN(delaySeconds) ||
delaySeconds <= 0 ||
isNaN(messageAfterCount) ||
messageAfterCount <= 0
) {
logs("Delay invalid, otomatis di ubah ke 10 detik.", "fail");
delay = '10';
}
const delayMs = delaySeconds * 1000; // Convert seconds to milliseconds
// Read contacts from file
try {
const data = await fs.readFile(CONTACT_LIST, "utf8");
logs(`Memulai menambahkan kontak`, "info");
const contactNumbers = data
.split("\n")
.map((line) => {
// Clean and format phone number
return line
.trim()
.replace(/[\s+()-]/g, "") // Remove spaces, plus signs, parentheses, and dashes
.replace(/^0/, ""); // Remove leading zero if present
})
.filter((line) => line); // Filter out any empty lines
// Create a mapping from original phone numbers to WhatsApp contact IDs
const contactMapping = contactNumbers.reduce((map, number) => {
const contactID = `${number}@c.us`;
map[contactID] = number;
return map;
}, {});
// Convert to WhatsApp contact IDs
const contactIDs = Object.keys(contactMapping);
let count = 0;
for (const contactID of contactIDs) {
try {
await myGroup.addParticipants([contactID]);
logs(
`Nomor ${contactMapping[contactID]} berhasil dimasukkan kedalam grup ${myGroupName}`,
"ok"
);
count++;
// Send welcome message after the specified number of contacts
if (count % messageAfterCount === 0) {
await client.sendMessage(myGroup.id._serialized, welcomeMessage);
logs(
`Pesan selamat datang berhasil di kirim ke grup ${myGroupName}`,
"info"
);
}
// Delay between adding participants
await sleep(delayMs);
} catch (error) {
logs(
`Gagal menambahkan nomor ${contactMapping[contactID]}: ${error}`,
"fail"
);
}
}
// Send final welcome message if any contacts were added but not yet triggered a message
if (count % messageAfterCount !== 0) {
await client.sendMessage(myGroup.id._serialized, welcomeMessage);
logs(
`Pesan selamat datang terakhir berhasil dikirim ke grup ${myGroupName}`,
"info"
);
}
// Log and exit
logs("\n[DONE] Semua kontak telah berhasil di tambahkan\n");
process.exit(0);
} catch (err) {
logs(`Error ketika membuka file ${CONTACT_LIST}: ${err}`, 'fail');
}
});
client.initialize();