-
Notifications
You must be signed in to change notification settings - Fork 25
/
Copy pathpair.js
116 lines (106 loc) · 3.71 KB
/
pair.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
const express = require('express');
const fs = require('fs');
const pino = require('pino');
const NodeCache = require('node-cache');
const {
default: makeWASocket,
useMultiFileAuthState,
delay,
Browsers,
makeCacheableSignalKeyStore,
DisconnectReason
} = require('@whiskeysockets/baileys');
const { upload } = require('./mega');
const { Mutex } = require('async-mutex');
const config = require('./config');
const app = express();
const port = 3000;
let session;
const msgRetryCounterCache = new NodeCache();
const mutex = new Mutex();
async function connector(Num, res) {
const sessionDir = './session';
if (!fs.existsSync(sessionDir)) {
fs.mkdirSync(sessionDir);
}
const { state, saveCreds } = await useMultiFileAuthState(sessionDir);
session = makeWASocket({
auth: {
creds: state.creds,
keys: makeCacheableSignalKeyStore(state.keys, pino({ level: 'fatal' }).child({ level: 'fatal' }))
},
printQRInTerminal: false,
logger: pino({ level: 'fatal' }).child({ level: 'fatal' }),
browser: Browsers.macOS("Safari"),
markOnlineOnConnect: true,
msgRetryCounterCache
});
if (!session.authState.creds.registered) {
await delay(1500);
Num = Num.replace(/[^0-9]/g, '');
const code = await session.requestPairingCode(Num);
if (!res.headersSent) {
res.send({ code: code?.match(/.{1,4}/g)?.join('-') });
}
}
session.ev.on('creds.update', async () => {
await saveCreds();
});
session.ev.on('connection.update', async (update) => {
const { connection, lastDisconnect } = update;
if (connection === 'open') {
console.log('Connected successfully');
await delay(5000);
const myr = await session.sendMessage(session.user.id, { text: "Thank you for using our bot. Don't share your session ID." });
const pth = './session/creds.json';
try {
const url = await upload(pth);
let sID;
if (url.includes("https://mega.nz/file/")) {
sID = config.PREFIX + url.split("https://mega.nz/file/")[1];
} else {
sID = 'Fekd up';
}
// Optional image can be added or not
await session.sendMessage(session.user.id, { image: { url: "https://cdn.ironman.my.id/i/2iceb4.jpeg" }, caption: `*Session ID*\n\n${sID}` }, { quoted: myr });
} catch (error) {
console.error('Error:', error);
} finally {
await delay(1000);
fs.rmdirSync(sessionDir, { recursive: true });
}
} else if (connection === 'close') {
const reason = lastDisconnect?.error?.output?.statusCode;
reconn(reason);
}
});
}
function reconn(reason) {
if ([DisconnectReason.connectionLost, DisconnectReason.connectionClosed, DisconnectReason.restartRequired].includes(reason)) {
console.log('Connection lost, reconnecting...');
connector();
} else {
console.log(`Disconnected! Reason: ${reason}`);
session.end();
}
}
app.get('/pair', async (req, res) => {
const Num = req.query.code;
if (!Num) {
return res.status(418).json({ message: 'Phone number is required' });
}
// Mutex for handling request concurrency
const release = await mutex.acquire();
try {
await connector(Num, res);
} catch (error) {
console.log(error);
res.status(500).json({ error: "fekd up" });
} finally {
release();
}
});
// Start the server
app.listen(port, () => {
console.log(`Running on PORT: ${port}`);
});