fca-nazrul-remastered
Version:
Facebook-chat-api protect and deploy by Kanzu and HZI Team
213 lines (207 loc) • 12.7 kB
JavaScript
/* eslint-disable no-prototype-builtins */
/* eslint-disable linebreak-style */
/**
const Eval = require('eval');
const Database = require('../Database');
global.ws = new Object({
client: {},
});
const All_Session_ID = Database().get('Session_ID') || []; [ { Session_ID: ".", TimeStamp: "" }]
for (let v of All_Session_ID) {
if (v.TimeStamp <= Date.now()) {
const index = All_Session_ID.findIndex(i => i.Session_ID == v.Session_ID);
All_Session_ID.splice(index,1);
}
else {
setTimeout(() => {
const index = All_Session_ID.findIndex(i => i.Session_ID == v.Session_ID);
All_Session_ID.splice(index,1);
}, v.TimeStamp - Date.now());
}
}
Database().set("Session_ID", All_Session_ID);
function generateRandomString() {
var string = '';
var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
for (var i = 0; i < 16; i++) {
if (i == 4 || i == 8 || i == 12) {
string += '-';
}
var randomIndex = Math.floor(Math.random() * characters.length);
string += characters.charAt(randomIndex);
}
return string;
}
const HowTo = {
AutoUpdate: "Automatically update if there is a new version. (Restart required)",
AutoLogin: "Automatically login and retrieve cookies to continue running the bot whenever kicked out of the account. (Restart required)",
Login2Fa: "Use two-factor authentication code to log in. (Restart required)",
Uptime: "Help your process to operate for a longer period of time.(Restart required)",
BroadCast: "Receive messages from the server.(Restart required)",
EncryptFeature: "Encrypt your account (appstate) to prevent it from being accessed or damaged by others.(Restart required)",
ResetDataLogin: "Used to reset autologin account and password.(Restart required)",
DevMode: "Developer mode, insider, testing untested features.(Restart required)",
AutoInstallNode: "Automatically download NodeJS version as per system's requirement.(Restart required)",
AntiSendAppState: "Check and prevent sending your account (appstate) via messages.",
HTML: "Display the website of FCA.(Restart required)",
Accept: "Is a part of stable_version, turned on to use a stable version without errors! (Restart required)",
AntiGetThreadInfo: "Using data storage and release algorithms to avoid being blocked by Facebook.",
AntiGetUserInfo: "Using data storage and release algorithms to avoid being blocked by Facebook.",
Status: "Turn on/off the websocket-extension feature. (Restart required)",
Language: "Select system language (Restart required)",
MainName: "Name on the top whenever log data. (Restart required)",
UserName: "Your name display in Express - HTML. (Restart required)",
MusicLink: "Your music link. (Restart required)",
AuthString: "Code to retrieve 2FA authenticator. (Restart required)",
PreKey: "Obsolete feature.",
Config: "Feature is delayed.",
Version: "stable version - Stable_Version Feature. (Restart required)",
Database_Type: "Type of database. (Restart required)",
AppState_Path: "Name of the file containing your appstate.",
AutoRestartMinutes: "Auto-restart after a certain number of minutes. (Restart required)",
RestartMQTT_Minutes: "Automatically restarting MQTT without restarting the bot helps prevent console hangups. (Restart required)",
Example: {
Language: "vi or en",
AuthString: "Like this SD4S XQ32 O2JA WXB3 FUX2 OPJ7 Q7JZ 4R6Z | https://i.imgur.com/RAg3rvw.png",
Version: "Valid version: https://github.com/KanzuXHorizon/Global_Horizon/blob/main/InstantAction.json",
Database_Type: "default or json",
AppState_Path: "fbstate.json, appstate.json,...",
AutoRestartMinutes: "Number 0 to turn off, Encourage number 60",
RestartMQTT_Minutes: "Number 0 to turn off, Encourage number 45"
}
};
module.exports.connect = function(WebSocket) {
WebSocket.on('connection', function (Websocket, req) {
var Ws_Client;
if (!global.ws.client.hasOwnProperty(req.socket.remoteAddress)) {
global.ws.client[req.socket.remoteAddress] = { Websocket, Status: false, ResetPassWordTime: 0 };
Ws_Client = global.ws.client[req.socket.remoteAddress];
}
else {
global.ws.client[req.socket.remoteAddress] = { Websocket, Status: global.ws.client[req.socket.remoteAddress].Status, ResetPassWordTime: global.ws.client[req.socket.remoteAddress].ResetPassWordTime };
Ws_Client = global.ws.client[req.socket.remoteAddress];
}
Ws_Client.Websocket.send(JSON.stringify({ Status: "Username&PassWord"}));
Ws_Client.Websocket.on('message', function(message) {
message = JSON.parse(message);
switch (message.type) {
case "login": {
if (!message.username || !message.password) return Ws_Client.Websocket.send(JSON.stringify({ Status: false, Code: 1 }));
const User_UserName = Database().get('Ws_UserName');
const User_PassWord = Database().get('Ws_PassWord');
if (message.username != User_UserName || User_PassWord != message.password) return Ws_Client.Websocket.send(JSON.stringify({ Status: false, Code: 2}));
const Format = {
Session_ID: generateRandomString(),
TimeStamp: Date.now() + 24 * 60 * 60 * 1000
};
All_Session_ID.push(Format);
Database().set("Session_ID", All_Session_ID);
global.ws.client[req.socket.remoteAddress].Status = true;
setTimeout(() => {
global.ws.client[req.socket.remoteAddress].Status = false;
}, (Date.now() + 24 * 60 * 60 * 1000) - Date.now());
return Ws_Client.Websocket.send(JSON.stringify({ Status: "Success", Session_ID: Format.Session_ID, TimeStamp: Format.TimeStamp }));
}
case "check": {
if (!message.Session_ID || !message.TimeStamp) return Ws_Client.Websocket.send(JSON.stringify({ Status: false, Code: 3}));
const Format = {
Session_ID: message.Session_ID,
TimeStamp: message.TimeStamp
};
if (Format.TimeStamp <= Date.now()) {
let index = All_Session_ID.findIndex(i => i.Session_ID == Format.Session_ID);
All_Session_ID.splice(index,1);
Database().set("Session_ID", All_Session_ID);
Ws_Client.Status = false;
Ws_Client.Websocket.send(JSON.stringify({ Status: false, Code: 4}));
return delete global.ws.client[Format.Session_ID];
}
if (All_Session_ID.some(i => i.Session_ID == message.Session_ID)) {
global.ws.client[req.socket.remoteAddress].Status = true;
return Ws_Client.Websocket.send(JSON.stringify({ Status: "Success" }));
}
else {
global.ws.client[req.socket.remoteAddress].Status = false;
return Ws_Client.Websocket.send(JSON.stringify({ Status: false, Code: 5 }));
}
}
case "resetPassword": {
if (!message.Otp || !message.NewPassword) return Ws_Client.Websocket.send(JSON.stringify({ Status: false, Code: 7 }));
if (global.ws.client[req.socket.remoteAddress].ResetPassWordTime == 3) return Ws_Client.Websocket.send(JSON.stringify({ Status: false, Code: 9 }));
const speakeasy = require('speakeasy');
const secret = Database().get('Ws_2Fa');
if (message.Otp != speakeasy.totp({
secret: secret,
encoding: 'base32'
})) {
global.ws.client[req.socket.remoteAddress].ResetPassWordTime += 1;
return Ws_Client.Websocket.send(JSON.stringify({ Status: false, Code: 8 }));
}
else {
Database().set('Ws_PassWord', message.NewPassword);
return Ws_Client.Websocket.send(JSON.stringify({ Status: 'Success' }));
}
}
default: {
if (Ws_Client.Status != true) return Ws_Client.Websocket.send(JSON.stringify({ Status: false, Code: 6 }));
switch (message.type) {
case "Command": {
if (message.Data == "Stop") {
return process.exit(0);
}
else Eval(message.Data, {} ,true);
}
break;
case "ChangeAppState": {
try {
const AppState = JSON.stringify(JSON.parse(message.Data), null ,2);
require('fs').writeFileSync(process.cwd() + `/${global.Fca.Require.FastConfig.Websocket_Extension.AppState_Path}`, AppState, 'utf-8');
return Ws_Client.Websocket.send(JSON.stringify({ Type: "ChangeAppState", Data: 0 }));
}
catch (e) {
return Ws_Client.Websocket.send(JSON.stringify({ Type: "ChangeAppState", Data: e }));
}
}
case "GetDocument": {
return Ws_Client.Websocket.send(JSON.stringify({ Status: "Success", Data: HowTo }));
}
case "getFastConfig": {
return Ws_Client.Websocket.send(JSON.stringify({ Status: "Success", Data: global.Fca.Require.FastConfig }));
}
case "ping": {
return Ws_Client.Websocket.send(JSON.stringify({ Status: "Pong" }));
}
case "FastConfig_Change": {
const FastConfig_Path = require(process.cwd() + "/FastConfigFca.json");
const FastConfig_Global = global.Fca.Require.FastConfig;
const SetConfig = function(Name, Value, Path, Main_Path) {
try {
if (Path && Main_Path) {
FastConfig_Path[Main_Path][Name] = Value;
(HowTo[Name]).includes('(Restart required)') == false ? global.Fca.Require.FastConfig = FastConfig_Path : '';
}
else {
FastConfig_Path[Name] = Value;
(HowTo[Name]).includes('(Restart required)') == false ? global.Fca.Require.FastConfig[Name] = Value : '';
}
global.Fca.Require.fs.writeFileSync(process.cwd() + "/FastConfigFca.json", JSON.stringify(FastConfig_Path, null, "\t"));
return Ws_Client.Websocket.send(JSON.stringify({ Type: 'Noti', Action: `Success ${ (HowTo[Name]).includes('(Restart required)') == true ? 'RestartRequired' : ''}` }));
}
catch (e) {
global.Fca.Require.fs.writeFileSync(process.cwd() + "/FastConfigFca.json", JSON.stringify(FastConfig_Global, null, "\t"));
return Ws_Client.Websocket.send(JSON.stringify({ Type: 'Noti', Action: e}));
}
};
return SetConfig(message.Data.Name, message.Data.Value, message.Data.Path, message.Data.Main_Path);
}
case "All_logs": {
return Ws_Client.Websocket.send(JSON.stringify({ Type: "Console", Data: console.history.join(" <br> ")}));
}
}
}
}
});
});
return { Client: global.ws.client, WSS: WebSocket };
};
*/