forked from DIEGO-OFC/ShadowBot-MD
-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.js
238 lines (215 loc) ยท 11.1 KB
/
main.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
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';
import './configuracion.js';
import { createRequire } from "module";
import path, { join } from 'path'
import { fileURLToPath, pathToFileURL } from 'url'
import { platform } from 'process'
import * as ws from 'ws';
import { readdirSync, statSync, unlinkSync, existsSync, readFileSync, rmSync, watch } from 'fs';
//import watch from 'glob-fs'
import yargs from 'yargs';
import { spawn } from 'child_process';
import lodash from 'lodash';
import chalk from 'chalk';
import syntaxerror from 'syntax-error';
import { tmpdir } from 'os';
import { format } from 'util';
import P from 'pino';
import { makeWASocket, protoType, serialize } from './lib/simple.js';
import { Low, JSONFile } from 'lowdb';
import { mongoDB, mongoDBV2 } from './lib/mongoDB.js';
import store from './lib/store.js'
const { DisconnectReason, useMultiFileAuthState } = await import('@adiwajshing/baileys')
const { CONNECTING } = ws
const { chain } = lodash
const PORT = process.env.PORT || process.env.SERVER_PORT || 3000
protoType()
serialize()
global.__filename = function filename(pathURL = import.meta.url, rmPrefix = platform !== 'win32') { return rmPrefix ? /file:\/\/\//.test(pathURL) ? fileURLToPath(pathURL) : pathURL : pathToFileURL(pathURL).toString() }; global.__dirname = function dirname(pathURL) { return path.dirname(global.__filename(pathURL, true)) }; global.__require = function require(dir = import.meta.url) { return createRequire(dir) }
global.API = (name, path = '/', query = {}, apikeyqueryname) => (name in global.APIs ? global.APIs[name] : name) + path + (query || apikeyqueryname ? '?' + new URLSearchParams(Object.entries({ ...query, ...(apikeyqueryname ? { [apikeyqueryname]: global.APIKeys[name in global.APIs ? global.APIs[name] : name] } : {}) })) : '')
global.timestamp = { start: new Date }
const __dirname = global.__dirname(import.meta.url)
global.opts = new Object(yargs(process.argv.slice(2)).exitProcess(false).parse())
global.prefix = new RegExp('^[' + (opts['prefix'] || 'xzXZ/i!#$%+ยฃยขโฌยฅ^ยฐ=ยถโรรทฯโโยฉยฎ:;?&.\\-HhhHBb.aA').replace(/[|\\{}()[\]^$+*?.\-\^]/g, '\\$&') + ']')
global.db = new Low(/https?:\/\//.test(opts['db'] || '') ? new cloudDBAdapter(opts['db']) : new JSONFile(`${opts._[0] ? opts._[0] + '_' : ''}database.json`))
global.DATABASE = global.db // Backwards Compatibility
global.loadDatabase = async function loadDatabase() {
if (global.db.READ) return new Promise((resolve) => setInterval(async function () {
if (!global.db.READ) {
clearInterval(this)
resolve(global.db.data == null ? global.loadDatabase() : global.db.data)
}
}, 1 * 1000))
if (global.db.data !== null) return
global.db.READ = true
await global.db.read().catch(console.error)
global.db.READ = null
global.db.data = {
users: {},
chats: {},
stats: {},
msgs: {},
sticker: {},
settings: {},
...(global.db.data || {})
}
global.db.chain = chain(global.db.data)
}
loadDatabase()
global.authFile = `DORRATSESSION`
const { state, saveState, saveCreds } = await useMultiFileAuthState(global.authFile)
const connectionOptions = {
printQRInTerminal: true,
auth: state,
logger: P({ level: 'silent'}),
browser: ['DORRAT-BOT','Firefox','1.0.0']
}
global.conn = makeWASocket(connectionOptions)
conn.isInit = false
if (!opts['test']) {
if (global.db) setInterval(async () => {
if (global.db.data) await global.db.write()
if (opts['autocleartmp'] && (global.support || {}).find) (tmp = [os.tmpdir(), 'tmp'], tmp.forEach(filename => cp.spawn('find', [filename, '-amin', '3', '-type', 'f', '-delete'])))
}, 30 * 1000)}
if (opts['server']) (await import('./server.js')).default(global.conn, PORT)
function clearTmp() {
const tmp = [tmpdir(), join(__dirname, './tmp')]
const filename = []
tmp.forEach(dirname => readdirSync(dirname).forEach(file => filename.push(join(dirname, file))))
return filename.map(file => {
const stats = statSync(file)
if (stats.isFile() && (Date.now() - stats.mtimeMs >= 1000 * 60 * 3)) return unlinkSync(file) // 3 minutes
return false
})}
async function connectionUpdate(update) {
const { connection, lastDisconnect, isNewLogin } = update
if (isNewLogin) conn.isInit = true
const code = lastDisconnect?.error?.output?.statusCode || lastDisconnect?.error?.output?.payload?.statusCode
if (code && code !== DisconnectReason.loggedOut && conn?.ws.readyState !== CONNECTING) {
console.log(await global.reloadHandler(true).catch(console.error))
global.timestamp.connect = new Date
}
if (global.db.data == null) loadDatabase()
if (connection == 'open') {
console.log(chalk.yellow('โญโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโงโขยฐโขยฐยทยทยท\nโโข ๐๐๐ ๐๐๐๐๐๐๐๐๐ ๐๐๐๐๐๐๐๐๐๐๐๐๐ โ๏ธ\nโโ ๐๐๐ ๐๐๐๐๐๐๐๐๐:๐๐๐๐๐๐-๐๐๐-๐๐ โ๏ธ\nโฐโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโงโขยฐโขยฐยทยทยท'))}
}
process.on('uncaughtException', console.error)
let isInit = true;
let handler = await import('./handler.js')
global.reloadHandler = async function (restatConn) {
try {
const Handler = await import(`./handler.js?update=${Date.now()}`).catch(console.error)
if (Object.keys(Handler || {}).length) handler = Handler
} catch (e) {
console.error(e)
}
if (restatConn) {
const oldChats = global.conn.chats
try { global.conn.ws.close() } catch { }
conn.ev.removeAllListeners()
global.conn = makeWASocket(connectionOptions, { chats: oldChats })
isInit = true
}
if (!isInit) {
conn.ev.off('messages.upsert', conn.handler)
conn.ev.off('group-participants.update', conn.participantsUpdate)
conn.ev.off('groups.update', conn.groupsUpdate)
conn.ev.off('message.delete', conn.onDelete)
conn.ev.off('call', conn.onCall)
conn.ev.off('connection.update', conn.connectionUpdate)
conn.ev.off('creds.update', conn.credsUpdate)
}
conn.welcome = 'โโโโโโโโโโโโโ\nโโโใ *WELCOME* ใโโ\nโโโโโโโโโโโโโ\nโ *_โจ @user bienvenid@ a_* \nโ *_@subject โจ_*\nโ\nโ=> *_En este grupo podrรกs_*\nโ *_encontrar:_*\nโ โท *Amistades ๐ซ* \nโ โท *Desmadre ๐๐บ* \nโ โท *Relajo ๐
* \nโ โท *Enemig@s ๐ฅต* :\nโ โท *Un Bot Sexy*\nโ\nโ=> *_Puedes solicitar mi lista de_*\nโ *_comandos con:_*\nโ โท *#menu*\nโ\nโ=> *_Aquรญ tienes la descripciรณn_* \nโ *_del grupo, lรฉela!!_*\nโ\n\n@desc\n\nโ \nโ *_๐ฐ Disfruta de tu_* \nโ *_estadรญa en el grupo ๐ฐ_* \nโ\nโโโโโโโโโโโโ'
conn.bye = '*โโโโโโโโโโโโโโโ*\n*โโง @user*\n*โโง ๐ท๐ฐ๐๐๐ฐ ๐ฟ๐๐พ๐ฝ๐๐พ ๐๐ป* \n*โโโโโโโโโโโโโโโ*'
conn.spromote = 'ใโใ *@user ๐๐ด ๐๐๐ผ๐ฐ ๐ฐ๐ป ๐ถ๐๐๐ฟ๐พ ๐ณ๐ด ๐ฐ๐ณ๐ผ๐ธ๐ฝ๐!!*'
conn.sdemote = 'ใโใ *@user ๐ฐ๐ฑ๐ฐ๐ฝ๐ณ๐พ๐ฝ๐ฐ ๐ด๐ป ๐ถ๐๐๐ฟ๐พ ๐ณ๐ด ๐ฐ๐ณ๐ผ๐ธ๐ฝ๐ !!*'
conn.sDesc = 'ใโใ *๐๐ด ๐ท๐ฐ ๐ผ๐พ๐ณ๐ธ๐ต๐ธ๐ฒ๐ฐ๐ณ๐พ ๐ป๐ฐ ๐ณ๐ด๐๐ฒ๐๐ธ๐ฟ๐ฒ๐ธ๐พ๐ฝ ๐ณ๐ด๐ป ๐ถ๐๐๐ฟ๐พ*\n\n*๐ฝ๐๐ด๐
๐ฐ ๐ณ๐ด๐๐ฒ๐๐ธ๐ฟ๐ฒ๐ธ๐พ๐ฝ:* @desc'
conn.sSubject = 'ใโใ*๐๐ด ๐ท๐ฐ ๐ผ๐พ๐ณ๐ธ๐ต๐ธ๐ฒ๐ฐ๐ณ๐พ ๐ด๐ป ๐ฝ๐พ๐ผ๐ฑ๐๐ด ๐ณ๐ด๐ป ๐ถ๐๐๐ฟ๐พ*\n*๐ฝ๐๐ด๐
๐พ ๐ฝ๐พ๐ผ๐ฑ๐๐ด:* @subject'
conn.sIcon = 'ใโใ*๐๐ด ๐ท๐ฐ ๐ฒ๐ฐ๐ผ๐ฑ๐ธ๐ฐ๐ณ๐พ ๐ป๐ฐ ๐ต๐พ๐๐พ ๐ณ๐ด๐ป ๐ถ๐๐๐ฟ๐พ!!*'
conn.sRevoke = 'ใโใ *๐๐ด ๐ท๐ฐ ๐ฐ๐ฒ๐๐๐ฐ๐ป๐ธ๐๐ฐ๐ณ๐พ ๐ด๐ป ๐ป๐ธ๐ฝ๐บ ๐ณ๐ด๐ป ๐ถ๐๐๐ฟ๐พ!!*\n*๐ป๐ธ๐ฝ๐บ ๐ฝ๐๐ด๐
๐พ:* @revoke'
conn.handler = handler.handler.bind(global.conn)
conn.participantsUpdate = handler.participantsUpdate.bind(global.conn)
conn.groupsUpdate = handler.groupsUpdate.bind(global.conn)
conn.onDelete = handler.deleteUpdate.bind(global.conn)
conn.onCall = handler.callUpdate.bind(global.conn)
conn.connectionUpdate = connectionUpdate.bind(global.conn)
conn.credsUpdate = saveCreds.bind(global.conn, true)
conn.ev.on('messages.upsert', conn.handler)
conn.ev.on('group-participants.update', conn.participantsUpdate)
conn.ev.on('groups.update', conn.groupsUpdate)
conn.ev.on('message.delete', conn.onDelete)
conn.ev.on('call', conn.onCall)
conn.ev.on('connection.update', conn.connectionUpdate)
conn.ev.on('creds.update', conn.credsUpdate)
isInit = false
return true
}
const pluginFolder = global.__dirname(join(__dirname, './plugins/index'))
const pluginFilter = filename => /\.js$/.test(filename)
global.plugins = {}
async function filesInit() {
for (let filename of readdirSync(pluginFolder).filter(pluginFilter)) {
try {
let file = global.__filename(join(pluginFolder, filename))
const module = await import(file)
global.plugins[filename] = module.default || module
} catch (e) {
conn.logger.error(e)
delete global.plugins[filename]
}}}
filesInit().then(_ => Object.keys(global.plugins)).catch(console.error)
global.reload = async (_ev, filename) => {
if (pluginFilter(filename)) {
let dir = global.__filename(join(pluginFolder, filename), true)
if (filename in global.plugins) {
if (existsSync(dir)) conn.logger.info(` updated plugin - '${filename}'`)
else {
conn.logger.warn(`deleted plugin - '${filename}'`)
return delete global.plugins[filename]
}
} else conn.logger.info(`new plugin - '${filename}'`)
let err = syntaxerror(readFileSync(dir), filename, {
sourceType: 'module',
allowAwaitOutsideFunction: true
})
if (err) conn.logger.error(`syntax error while loading '${filename}'\n${format(err)}`)
else try {
const module = (await import(`${global.__filename(dir)}?update=${Date.now()}`))
global.plugins[filename] = module.default || module
} catch (e) {
conn.logger.error(`error require plugin '${filename}\n${format(e)}'`)
} finally {
global.plugins = Object.fromEntries(Object.entries(global.plugins).sort(([a], [b]) => a.localeCompare(b)))
}}}
Object.freeze(global.reload)
watch(pluginFolder, global.reload)
await global.reloadHandler()
async function _quickTest() {
let test = await Promise.all([
spawn('ffmpeg'),
spawn('ffprobe'),
spawn('ffmpeg', ['-hide_banner', '-loglevel', 'error', '-filter_complex', 'color', '-frames:v', '1', '-f', 'webp', '-']),
spawn('convert'),
spawn('magick'),
spawn('gm'),
spawn('find', ['--version'])
].map(p => {
return Promise.race([
new Promise(resolve => {
p.on('close', code => {
resolve(code !== 127)
})}),
new Promise(resolve => {
p.on('error', _ => resolve(false))
})])}))
let [ffmpeg, ffprobe, ffmpegWebp, convert, magick, gm, find] = test
let s = global.support = { ffmpeg, ffprobe, ffmpegWebp, convert, magick, gm, find }
Object.freeze(global.support)
}
setInterval(async () => {
var a = await clearTmp()
console.log(chalk.cyanBright(`\nโฃโโโโโโโโ[ ๐๐๐๐๐๐๐๐๐-๐๐๐ ]โโโโโโโโโโโโ...\nโ\nโฃโโข ๐๐๐ฌ๐ฎ๐ซ๐ ๐๐ฅ๐ข๐ฆ๐ข๐ง๐๐๐ โ
\nโ\nโฃโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ...\n`))
}, 180000)
_quickTest()
.then(() => conn.logger.info(`ฦแดสษขแดษดแด
แด๏ผ๏ผ๏ผ\n`))
.catch(console.error)