UNPKG

handz

Version:

Facebook-chat-api protect and deploy by Kanzu and HZI Team

843 lines (777 loc) 66.8 kB
'use strict'; /!-[ Require config and use ]-!/ if (global.Fca.Require.FastConfig.Config != 'default') { //do ssth } const Language = global.Fca.Require.languageFile.find((/** @type {{ Language: string; }} */i) => i.Language == global.Fca.Require.FastConfig.Language).Folder.Index; /!-[ Require All Package Need Use ]-!/ var utils = global.Fca.Require.utils, logger = global.Fca.Require.logger, fs = global.Fca.Require.fs, getText = global.Fca.getText, log = global.Fca.Require.log, express = require("express")(), { join } = require('path'), cheerio = require("cheerio"), { readFileSync } = require('fs-extra'), Database = require("../../Fca-Horizon-Remake/Extra/Database"), readline = require("readline"), chalk = require("chalk"), figlet = require("figlet"), os = require("os"), deasync = require('deasync'), Security = require("../../Fca-Horizon-Remake/Extra/Security/Index"), { getAll, deleteAll } = require('../../Fca-Horizon-Remake/Extra/ExtraGetThread'), ws = require('ws'), Websocket = require('../../Fca-Horizon-Remake/Extra/Src/Websocket'), Convert = require('ansi-to-html'); /!-[ Set Variable For Process ]-!/ log.maxRecordSize = 100; var checkVerified = null; const Boolean_Option = ['online','selfListen','listenEvents','updatePresence','forceLogin','autoMarkDelivery','autoMarkRead','listenTyping','autoReconnect','emitReady']; /!-[ Set And Check Template HTML ]-!/ const css = readFileSync(join(__dirname, 'Extra', 'Html', 'Classic', 'style.css')); const js = readFileSync(join(__dirname, 'Extra', 'Html', 'Classic', 'script.js')); /!-[ Function Generate HTML Template ]-!/ /** * It returns a string of HTML code. * @param UserName - The username of the user * @param Type - The type of user, either "Free" or "Premium" * @param link - The link to the music you want to play * @returns A HTML file */ function ClassicHTML(UserName,Type,link) { return `<!DOCTYPE html> <html lang="en" > <head> <meta charset="UTF-8"> <title>Horizon</title> <link rel="stylesheet" href="./style.css"> </head> <body> <center> <marquee><b>waiting for u :d</b></marquee> <h2>Horizon User Infomation</h2> <h3>UserName: ${UserName} | Type: ${Type}</h3> <canvas id="myCanvas"></canvas> <script src="./script.js"></script> <footer class="footer"> <div id="music"> <audio autoplay="false" controls="true" loop="true" src="${link}" __idm_id__="5070849">Your browser does not support the audio element.</audio> <br><b>Session ID:</b> ${global.Fca.Require.Security.create().uuid}<br> <br>Thanks For Using <b>Fca-Horizon-Remastered</b> - From <b>Kanzu</b> <3<br> </div> </footer> </div> </center> </html> </body>` //lazy to change } /!-[ Stating Http Infomation ]-!/ express.set('DFP', (process.env.PORT || process.env.port || 80)); express.use(function(req, res, next) { switch (req.url.split('?')[0]) { case '/script.js': { res.writeHead(200, { 'Content-Type': 'text/javascript' }); res.write(js); break; } case '/style.css': { res.writeHead(200, { 'Content-Type': 'text/css' }); res.write(css); break; } // case '/History': { // if (req.query.PassWord == process.env.REPL_OWNER) { // res.writeHead(200, { 'Content-Type': 'application/json charset=utf-8' }); // res.write(JSON.stringify(console.history,null,2),'utf8'); // res.end(); // } // else res.json({ // Status: false, // Error: "Thiếu Params ?PassWord=PassWordCuaBan =))" // }); // break; // } default: { res.writeHead(200, "OK", { "Content-Type": "text/html" }); res.write(ClassicHTML(global.Fca.Require.FastConfig.HTML.UserName, "Premium Access", global.Fca.Require.FastConfig.HTML.MusicLink)); } } res.end(); }) var Server; if (global.Fca.Require.FastConfig.HTML.HTML) Server = express.listen(express.get('DFP')) if (global.Fca.Require.FastConfig.Websocket_Extension.Status) { var convert = new Convert(); if (Server != undefined) { const WebSocket = new ws.Server({ noServer: true }); const { Client, WSS } = Websocket.connect(WebSocket); Server.on('upgrade', (req, socket, head) => { WSS.handleUpgrade(req, socket, head, (wss) => { WSS.emit('connection', wss, req); }); }); console._log = console.__log console.log = function(data) { const All = Object.keys(Client) console._log.apply(data,arguments) try { const log = (convert.toHtml(data) || data) console.history.push(log) for (let i of All) { if (Client[i].Status) { Client[i].Websocket.send(JSON.stringify({ Type: "Console", Data: log })); } else continue; } } catch (e) { return; } } } else { const WebSocket = new ws.Server({ port: 80 }); const { Client } = Websocket.connect(WebSocket); console._log = console.__log console.log = function(data) { const All = Object.keys(Client) console._log.apply(data,arguments) try { const log = convert.toHtml(data) console.history.push(log) for (let i of All) { if (Client[i].Status) { Client[i].Websocket.send(JSON.stringify({ Type: "Console", Data: log })); } else continue; } } catch (e) { return } } } } /!-[ Function setOptions ]-!/ /** * @param {{ [x: string]: boolean; selfListen?: boolean; listenEvents?: boolean; listenTyping?: boolean; updatePresence?: boolean; forceLogin?: boolean; autoMarkDelivery?: boolean; autoMarkRead?: boolean; autoReconnect?: boolean; logRecordSize: any; online?: boolean; emitReady?: boolean; userAgent: any; logLevel?: any; pageID?: any; proxy?: any; }} globalOptions * @param {{ [x: string]: any; logLevel?: any; forceLogin?: boolean; userAgent?: any; pauseLog?: any; logRecordSize?: any; pageID?: any; proxy?: any; }} options */ function setOptions(globalOptions, options) { Object.keys(options).map(function(key) { switch (Boolean_Option.includes(key)) { case true: { globalOptions[key] = Boolean(options[key]); break; } case false: { switch (key) { case 'pauseLog': { if (options.pauseLog) log.pause(); else log.resume(); break; } case 'logLevel': { log.level = options.logLevel; globalOptions.logLevel = options.logLevel; break; } case 'logRecordSize': { log.maxRecordSize = options.logRecordSize; globalOptions.logRecordSize = options.logRecordSize; break; } case 'pageID': { globalOptions.pageID = options.pageID.toString(); break; } case 'userAgent': { globalOptions.userAgent = (options.userAgent || 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36'); break; } case 'proxy': { if (typeof options.proxy != "string") { delete globalOptions.proxy; utils.setProxy(); } else { globalOptions.proxy = options.proxy; utils.setProxy(globalOptions.proxy); } break; } default: { log.warn("setOptions", "Unrecognized option given to setOptions: " + key); break; } } break; } } }); } /!-[ Function BuildAPI ]-!/ /** * @param {any} globalOptions * @param {string} html * @param {{ getCookies: (arg0: string) => any[]; }} jar */ function buildAPI(globalOptions, html, jar) { var maybeCookie = jar.getCookies("https://www.facebook.com").filter(function(/** @type {{ cookieString: () => string; }} */val) { return val.cookieString().split("=")[0] === "c_user"; }); const objCookie = jar.getCookies("https://www.facebook.com").reduce(function (obj, val) { obj[val.cookieString().split("=")[0]] = val.cookieString().split("=")[1]; return obj; }, {}); if (maybeCookie.length === 0) { if (global.Fca.Require.FastConfig.AutoLogin) { return global.Fca.Require.logger.Warning(global.Fca.Require.Language.Index.AutoLogin, function() { global.Fca.Action('AutoLogin') }); } else if (!global.Fca.Require.FastConfig.AutoLogin) { return global.Fca.Require.logger.Error(global.Fca.Require.Language.Index.ErrAppState); } } else { if (html.indexOf("/checkpoint/block/?next") > -1) log.warn("login", Language.CheckPointLevelI); const userID = objCookie.i_user || maybeCookie[0].cookieString().split("=")[1].toString(); process.env['UID'] = logger.Normal(getText(Language.UID,userID), userID); try { clearInterval(checkVerified); } catch (e) { console.log(e); } var clientID = (Math.random() * 2147483648 | 0).toString(16); var CHECK_MQTT = { oldFBMQTTMatch: html.match(/irisSeqID:"(.+?)",appID:219994525426954,endpoint:"(.+?)"/), newFBMQTTMatch: html.match(/{"app_id":"219994525426954","endpoint":"(.+?)","iris_seq_id":"(.+?)"}/), legacyFBMQTTMatch: html.match(/(\["MqttWebConfig",\[\],{fbid:")(.+?)(",appID:219994525426954,endpoint:")(.+?)(",pollingEndpoint:")(.+?)(3790])/) } let Slot = Object.keys(CHECK_MQTT); var mqttEndpoint,region,irisSeqID; Object.keys(CHECK_MQTT).map(function(MQTT) { if (CHECK_MQTT[MQTT] && !region) { switch (Slot.indexOf(MQTT)) { case 0: { irisSeqID = CHECK_MQTT[MQTT][1]; mqttEndpoint = CHECK_MQTT[MQTT][2]; region = new URL(mqttEndpoint).searchParams.get("region").toUpperCase(); return; } case 1: { irisSeqID = CHECK_MQTT[MQTT][2]; mqttEndpoint = CHECK_MQTT[MQTT][1].replace(/\\\//g, "/"); region = new URL(mqttEndpoint).searchParams.get("region").toUpperCase(); return; } case 2: { mqttEndpoint = CHECK_MQTT[MQTT][4]; region = new URL(mqttEndpoint).searchParams.get("region").toUpperCase(); return; } } return; } }); var ctx = { userID: userID, jar: jar, clientID: clientID, globalOptions: globalOptions, loggedIn: true, access_token: 'NONE', clientMutationId: 0, mqttClient: undefined, lastSeqId: irisSeqID, syncToken: undefined, mqttEndpoint: mqttEndpoint, region: region, firstListen: true }; var api = { setOptions: setOptions.bind(null, globalOptions), getAppState: function getAppState() { return utils.getAppState(jar); } }; if (region && mqttEndpoint) { //do sth } else { log.warn("login", getText(Language.NoAreaData)); api["htmlData"] = html; } var defaultFuncs = utils.makeDefaults(html, userID, ctx); fs.readdirSync(__dirname + "/src").filter((/** @type {string} */File) => File.endsWith(".js") && !File.includes('Dev_')).map((/** @type {string} */File) => { if (File == 'getThreadInfo.js' && global.Fca.Require.FastConfig.AntiGetInfo.AntiGetThreadInfo != true || File == 'getUserInfo.js' && global.Fca.Require.FastConfig.AntiGetInfo.AntiGetUserInfo != true) api[File.split('.').slice(0, -1).join('.')] = require('./src/' + (File.includes('getThreadInfo') ? 'getThreadMain.js' : 'getUserInfoMain.js'))(defaultFuncs, api, ctx) else api[File.split('.').slice(0, -1).join('.')] = require('./src/' + File)(defaultFuncs, api, ctx) }); return { ctx, defaultFuncs, api }; } } /!-[ Function makeLogin ]-!/ /** * @param {{ setCookie: (arg0: any, arg1: string) => void; }} jar * @param {any} email * @param {any} password * @param {{ forceLogin: any; }} loginOptions * @param {(err: any, api: any) => any} callback * @param {any} prCallback */ function makeLogin(jar, email, password, loginOptions, callback, prCallback) { return function(res) { var html = res.body,$ = cheerio.load(html),arr = []; $("#login_form input").map((i, v) => arr.push({ val: $(v).val(), name: $(v).attr("name") })); arr = arr.filter(function(v) { return v.val && v.val.length; }); var form = utils.arrToForm(arr); form.lsd = utils.getFrom(html, "[\"LSD\",[],{\"token\":\"", "\"}"); form.lgndim = Buffer.from("{\"w\":1440,\"h\":900,\"aw\":1440,\"ah\":834,\"c\":24}").toString('base64'); form.email = email; form.pass = password; form.default_persistent = '0'; form.locale = 'en_US'; form.timezone = '240'; form.lgnjs = ~~(Date.now() / 1000); html.split("\"_js_").slice(1).map((val) => { jar.setCookie(utils.formatCookie(JSON.parse("[\"" + utils.getFrom(val, "", "]") + "]"), "facebook"),"https://www.facebook.com") }); logger.Normal(Language.OnLogin); return utils .post("https://www.facebook.com/login/device-based/regular/login/?login_attempt=1&lwv=110", jar, form, loginOptions) .then(utils.saveCookies(jar)) .then(function(/** @type {{ headers: any; }} */res) { var headers = res.headers; if (!headers.location) throw { error: Language.InvaildAccount }; // This means the account has login approvals turned on. if (headers.location.indexOf('https://www.facebook.com/checkpoint/') > -1) { logger.Warning(Language.TwoAuth); var nextURL = 'https://www.facebook.com/checkpoint/?next=https%3A%2F%2Fwww.facebook.com%2Fhome.php'; return utils .get(headers.location, jar, null, loginOptions) .then(utils.saveCookies(jar)) .then(function(res) { if (!Database().get('ThroughAcc')) { Database().set('ThroughAcc', email); } else { if (String((Database().get('ThroughAcc'))).replace(RegExp('"','g'), '') != String(email).replace(RegExp('"','g'), '')) { Database().set('ThroughAcc', email); if (Database().get('Through2Fa')) { Database().delete('Through2Fa'); } } } var html = res.body,$ = cheerio.load(html), arr = []; $("form input").map((i, v) => arr.push({ val: $(v).val(), name: $(v).attr("name") })); arr = arr.filter(v => { return v.val && v.val.length }); var form = utils.arrToForm(arr); if (html.indexOf("checkpoint/?next") > -1) { setTimeout(() => { checkVerified = setInterval((_form) => {}, 5000, { fb_dtsg: form.fb_dtsg, jazoest: form.jazoest, dpr: 1 }); }, 2500); switch (global.Fca.Require.FastConfig.Login2Fa) { case true: { const question = question => { const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); var done,answ; rl.question(question, answer => { rl.close(); answ = answer; done = true }) deasync.loopWhile(function(){ return !done; }); return answ; }; try { const Old_Cookie = Database().get('Through2Fa'); if (Old_Cookie) { Old_Cookie.map(function(/** @type {{ key: string; value: string; expires: string; domain: string; path: string; }} */c) { let str = c.key + "=" + c.value + "; expires=" + c.expires + "; domain=" + c.domain + "; path=" + c.path + ";"; jar.setCookie(str, "http://" + c.domain); }); let Form = utils.arrToForm(arr); Form.lsd = utils.getFrom(html, "[\"LSD\",[],{\"token\":\"", "\"}"); Form.lgndim = Buffer.from("{\"w\":1440,\"h\":900,\"aw\":1440,\"ah\":834,\"c\":24}").toString('base64'); Form.email = email; Form.pass = password; Form.default_persistent = '0'; Form.locale = 'en_US'; Form.timezone = '240'; Form.lgnjs = ~~(Date.now() / 1000); return utils .post("https://www.facebook.com/login/device-based/regular/login/?login_attempt=1&lwv=110", jar, Form, loginOptions) .then(utils.saveCookies(jar)) .then(function(res) { let headers = res.headers if (!headers['set-cookie'][0].includes('deleted')) { logger.Warning(Language.ErrThroughCookies, function() { Database().delete('Through2Fa'); }); process.exit(1); } if (headers.location && headers.location.indexOf('https://www.facebook.com/checkpoint/') > -1) { return utils .get(headers.location, jar, null, loginOptions) .then(utils.saveCookies(jar)) .then(function(res) { var html = res.body,$ = cheerio.load(html), arr = []; $("form input").map((i, v) => arr.push({ val: $(v).val(), name: $(v).attr("name") })); arr = arr.filter(v => { return v.val && v.val.length }); var Form = utils.arrToForm(arr); if (html.indexOf("checkpoint/?next") > -1) { setTimeout(() => { checkVerified = setInterval((_form) => {}, 5000, { fb_dtsg: Form.fb_dtsg, jazoest: Form.jazoest, dpr: 1 }); }, 2500); if (!res.headers.location && res.headers['set-cookie'][0].includes('checkpoint')) { try { delete Form.name_action_selected; Form['submit[Continue]'] = $("#checkpointSubmitButton").html(); return utils .post(nextURL, jar, Form, loginOptions) .then(utils.saveCookies(jar)) .then(function() { Form['submit[This was me]'] = "This was me"; return utils.post(nextURL, jar, Form, loginOptions).then(utils.saveCookies(jar)); }) .then(function() { delete Form['submit[This was me]']; Form.name_action_selected = 'save_device'; Form['submit[Continue]'] = $("#checkpointSubmitButton").html(); return utils.post(nextURL, jar, Form, loginOptions).then(utils.saveCookies(jar)); }) .then(function(res) { var headers = res.headers; if (!headers.location && res.headers['set-cookie'][0].includes('checkpoint')) { Database().delete('Through2Fa'); process.exit(1); } var appState = utils.getAppState(jar,false); Database().set('Through2Fa', appState); return loginHelper(appState, email, password, loginOptions, callback); }) .catch((e) => callback(e)); } catch (e) { console.log(e) } } } }) } return utils.get('https://www.facebook.com/', jar, null, loginOptions).then(utils.saveCookies(jar)); }) .catch((e) => console.log(e)); } } catch (e) { Database().delete('Through2Fa'); } const Otp_code = require('totp-generator'); const Code = global.Fca.Require.FastConfig.AuthString.includes('|') == false ? Otp_code(global.Fca.Require.FastConfig.AuthString.includes(" ") ? global.Fca.Require.FastConfig.AuthString.replace(RegExp(" ", 'g'), "") : global.Fca.Require.FastConfig.AuthString) : question(Language.EnterSecurityCode); try { const approvals = function(N_Code) { form.approvals_code = N_Code; form['submit[Continue]'] = $("#checkpointSubmitButton").html(); var prResolve,prReject; var rtPromise = new Promise((resolve, reject) => { prResolve = resolve; prReject = reject; }); if (typeof N_Code == "string") { utils .post(nextURL, jar, form, loginOptions) .then(utils.saveCookies(jar)) .then(function(res) { var $ = cheerio.load(res.body); var error = $("#approvals_code").parent().attr("data-xui-error"); if (error) { logger.Warning(Language.InvaildTwoAuthCode,function() { approvals(question(Language.EnterSecurityCode)) }); //bruh loop }; }) .then(function() { delete form.no_fido;delete form.approvals_code; form.name_action_selected = 'save_device'; //'save_device' || 'dont_save; return utils.post(nextURL, jar, form, loginOptions).then(utils.saveCookies(jar)); }) .then(function(res) { var headers = res.headers; if (!headers.location && res.headers['set-cookie'][0].includes('checkpoint')) { try { delete form.name_action_selected; form['submit[Continue]'] = $("#checkpointSubmitButton").html(); return utils .post(nextURL, jar, form, loginOptions) .then(utils.saveCookies(jar)) .then(function() { form['submit[This was me]'] = "This was me"; return utils.post(nextURL, jar, form, loginOptions).then(utils.saveCookies(jar)); }) .then(function() { delete form['submit[This was me]']; form.name_action_selected = 'save_device'; form['submit[Continue]'] = $("#checkpointSubmitButton").html(); return utils.post(nextURL, jar, form, loginOptions).then(utils.saveCookies(jar)); }) .then(function(res) { var headers = res.headers; if (!headers.location && res.headers['set-cookie'][0].includes('checkpoint')) throw { error: "wtf ??:D" }; var appState = utils.getAppState(jar,false); Database().set('Through2Fa', appState); return loginHelper(appState, email, password, loginOptions, callback); }) .catch((e) => callback(e)); } catch (e) { console.log(e) } } var appState = utils.getAppState(jar,false); if (callback === prCallback) { callback = function(err, api) { if (err) return prReject(err); return prResolve(api); }; } Database().set('Through2Fa', appState); return loginHelper(appState, email, password, loginOptions, callback); }) .catch(function(err) { if (callback === prCallback) prReject(err); else callback(err); }); } else { utils .post("https://www.facebook.com/checkpoint/?next=https%3A%2F%2Fwww.facebook.com%2Fhome.php", jar, form, loginOptions, null, { "Referer": "https://www.facebook.com/checkpoint/?next" }) .then(utils.saveCookies(jar)) .then(function(res) { try { JSON.parse(res.body.replace(/for\s*\(\s*;\s*;\s*\)\s*;\s*/, "")); } catch (ex) { clearInterval(checkVerified); logger.Warning(Language.VerifiedCheck); if (callback === prCallback) { callback = function(err, api) { if (err) return prReject(err); return prResolve(api); }; } let appState = utils.getAppState(jar,false); return loginHelper(appState, email, password, loginOptions, callback); } }) .catch((ex) => { log.error("login", ex); if (callback === prCallback) prReject(ex); else callback(ex); }); } return rtPromise; } return approvals(Code) } catch (e) { logger.Error(e) logger.Error(); process.exit(0); } } case false: { throw { error: 'login-approval', continue: function submit2FA(code) { form.approvals_code = code; form['submit[Continue]'] = $("#checkpointSubmitButton").html(); //'Continue'; var prResolve,prReject; var rtPromise = new Promise((resolve, reject) => { prResolve = resolve; prReject = reject; }); if (typeof code == "string") { utils .post(nextURL, jar, form, loginOptions) .then(utils.saveCookies(jar)) .then(function(/** @type {{ body: string | Buffer; }} */res) { var $ = cheerio.load(res.body); var error = $("#approvals_code").parent().attr("data-xui-error"); if (error) { throw { error: 'login-approval', errordesc: Language.InvaildTwoAuthCode, lerror: error, continue: submit2FA }; } }) .then(function() { delete form.no_fido;delete form.approvals_code; form.name_action_selected = 'dont_save'; //'save_device' || 'dont_save; return utils.post(nextURL, jar, form, loginOptions).then(utils.saveCookies(jar)); }) .then(function(res) { var headers = res.headers; if (!headers.location && res.headers['set-cookie'][0].includes('checkpoint')) throw { error: Language.ApprovalsErr }; var appState = utils.getAppState(jar,false); if (callback === prCallback) { callback = function(err, api) { if (err) return prReject(err); return prResolve(api); }; } return loginHelper(appState, email, password, loginOptions, callback); }) .catch(function(err) { if (callback === prCallback) prReject(err); else callback(err); }); } else { utils .post("https://www.facebook.com/checkpoint/?next=https%3A%2F%2Fwww.facebook.com%2Fhome.php", jar, form, loginOptions, null, { "Referer": "https://www.facebook.com/checkpoint/?next" }) .then(utils.saveCookies(jar)) .then((res) => { try { JSON.parse(res.body.replace(/for\s*\(\s*;\s*;\s*\)\s*;\s*/, "")); } catch (ex) { clearInterval(checkVerified); logger.Warning(Language.VerifiedCheck); if (callback === prCallback) { callback = function(err, api) { if (err) return prReject(err); return prResolve(api); }; } return loginHelper(utils.getAppState(jar,false), email, password, loginOptions, callback); } }) .catch((ex) => { log.error("login", ex); if (callback === prCallback) prReject(ex); else callback(ex); }); } return rtPromise; } }; } } } else { if (!loginOptions.forceLogin) throw { error: Language.ForceLoginNotEnable }; if (html.indexOf("Suspicious Login Attempt") > -1) form['submit[This was me]'] = "This was me"; else form['submit[This Is Okay]'] = "This Is Okay"; return utils .post(nextURL, jar, form, loginOptions) .then(utils.saveCookies(jar)) .then(function() { form.name_action_selected = 'dont_save'; return utils.post(nextURL, jar, form, loginOptions).then(utils.saveCookies(jar)); }) .then(function(res) { var headers = res.headers; if (!headers.location && res.body.indexOf('Review Recent Login') > -1) throw { error: "Something went wrong with review recent login." }; var appState = utils.getAppState(jar,false); return loginHelper(appState, email, password, loginOptions, callback); }) .catch((e) => callback(e)); } }); } return utils.get('https://www.facebook.com/', jar, null, loginOptions).then(utils.saveCookies(jar)); }); }; } /!-[ Function backup ]-!/ /** * @param {string} data * @param {any} globalOptions * @param {any} callback * @param {any} prCallback */ function backup(data,globalOptions, callback, prCallback) { try { var appstate; try { appstate = JSON.parse(data) } catch(e) { appstate = data; } logger.Warning(Language.BackupNoti); try { loginHelper(appstate,null,null,globalOptions, callback, prCallback) } catch (e) { logger.Error(Language.ErrBackup); process.exit(0); } } catch (e) { return logger.Error(); } } /!-[ function loginHelper ]-!/ /** * @param {string | any[]} appState * @param {any} email * @param {any} password * @param {{ selfListen?: boolean; listenEvents?: boolean; listenTyping?: boolean; updatePresence?: boolean; forceLogin?: boolean; autoMarkDelivery?: boolean; autoMarkRead?: boolean; autoReconnect?: boolean; logRecordSize?: number; online?: boolean; emitReady?: boolean; userAgent?: string; pageID?: any; }} globalOptions * @param {(arg0: any, arg1: undefined) => void} callback * @param {(error: any, api: any) => any} [prCallback] */ function loginHelper(appState, email, password, globalOptions, callback, prCallback) { var mainPromise = null; var jar = utils.getJar(); try { if (appState) { logger.Normal(Language.OnProcess); switch (Database().has("FBKEY")) { case true: { process.env.FBKEY = Database().get("FBKEY"); } break; case false: { const SecurityKey = global.Fca.Require.Security.create().apiKey; process.env['FBKEY'] = SecurityKey; Database().set('FBKEY', SecurityKey); } break; default: { const SecurityKey = global.Fca.Require.Security.create().apiKey; process.env['FBKEY'] = SecurityKey; Database().set('FBKEY', SecurityKey); } } try { switch (global.Fca.Require.FastConfig.EncryptFeature) { case true: { appState = JSON.parse(JSON.stringify(appState, null, "\t")); switch (utils.getType(appState)) { case "Array": { switch (utils.getType(appState[0])) { case "Object": { logger.Normal(Language.NotReadyToDecrypt); } break; case "String": { appState = Security(appState,process.env['FBKEY'],'Decrypt'); logger.Normal(Language.DecryptSuccess); } break; default: { logger.Warning(Language.InvaildAppState); process.exit(0) }