alicezetion 1.7.0 → 1.7.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (78) hide show
  1. package/.cache/replit/__replit_disk_meta.json +1 -1
  2. package/.cache/replit/nix/env.json +1 -1
  3. package/Extra/Database/index.js +399 -0
  4. package/Extra/Database/methods.js +286 -0
  5. package/Extra/ExtraAddons.js +213 -0
  6. package/Extra/ExtraGetThread.js +1 -0
  7. package/Extra/ExtraUptimeRobot.js +59 -0
  8. package/Extra/PM2/ecosystem.config.js +23 -0
  9. package/Extra/Src/Last-Run.js +48 -0
  10. package/Language/index.json +151 -0
  11. package/StateCrypt.js +22 -0
  12. package/broadcast.js +42 -0
  13. package/index.js +755 -533
  14. package/logger.js +21 -0
  15. package/package.json +35 -21
  16. package/replit.nix +0 -3
  17. package/src/addExternalModule.js +23 -0
  18. package/{leiamnash → src}/addUserToGroup.js +11 -23
  19. package/{leiamnash → src}/changeAdminStatus.js +32 -16
  20. package/{leiamnash → src}/changeArchivedStatus.js +9 -17
  21. package/src/changeAvt.js +91 -0
  22. package/{leiamnash → src}/changeBio.js +16 -24
  23. package/{leiamnash → src}/changeBlockedStatus.js +13 -18
  24. package/{leiamnash → src}/changeGroupImage.js +14 -23
  25. package/{leiamnash → src}/changeNickname.js +9 -14
  26. package/{leiamnash → src}/changeThreadColor.js +6 -10
  27. package/{leiamnash → src}/changeThreadEmoji.js +6 -11
  28. package/{leiamnash → src}/chat.js +116 -127
  29. package/{leiamnash → src}/createNewGroup.js +19 -27
  30. package/{leiamnash → src}/createPoll.js +6 -12
  31. package/{leiamnash → src}/deleteMessage.js +8 -13
  32. package/{leiamnash → src}/deleteThread.js +7 -14
  33. package/{leiamnash → src}/forwardAttachment.js +9 -16
  34. package/src/getAccessToken.js +32 -0
  35. package/{leiamnash → src}/getCurrentUserID.js +0 -0
  36. package/{leiamnash → src}/getEmojiUrl.js +1 -2
  37. package/{leiamnash → src}/getFriendsList.js +11 -14
  38. package/src/getMessage.js +84 -0
  39. package/{leiamnash → src}/getThreadHistory.js +27 -38
  40. package/{leiamnash → src}/getThreadHistoryDeprecated.js +14 -25
  41. package/src/getThreadInfo.js +197 -0
  42. package/{leiamnash → src}/getThreadInfoDeprecated.js +12 -24
  43. package/{leiamnash → src}/getThreadList.js +122 -88
  44. package/{leiamnash → src}/getThreadListDeprecated.js +9 -20
  45. package/{leiamnash → src}/getThreadPictures.js +9 -17
  46. package/{leiamnash → src}/getUserID.js +8 -11
  47. package/{leiamnash → src}/getUserInfo.js +12 -16
  48. package/src/getUserInfoV2.js +35 -0
  49. package/src/handleFriendRequest.js +47 -0
  50. package/{leiamnash → src}/handleMessageRequest.js +12 -22
  51. package/{leiamnash → src}/httpGet.js +15 -13
  52. package/{leiamnash → src}/httpPost.js +14 -13
  53. package/src/httpPostFormData.js +46 -0
  54. package/src/listenMqtt.js +1280 -0
  55. package/{leiamnash → src}/logout.js +7 -9
  56. package/{leiamnash → src}/markAsDelivered.js +14 -18
  57. package/{leiamnash → src}/markAsRead.js +30 -28
  58. package/{leiamnash → src}/markAsSeen.js +18 -19
  59. package/{leiamnash → src}/muteThread.js +7 -8
  60. package/{leiamnash/setMessageReaction.js → src/react.js} +15 -18
  61. package/{leiamnash → src}/removeUserFromGroup.js +13 -20
  62. package/{leiamnash → src}/resolvePhotoUrl.js +7 -13
  63. package/{leiamnash → src}/searchForThread.js +8 -13
  64. package/{leiamnash/markAsReadAll.js → src/seen.js} +10 -13
  65. package/{leiamnash → src}/sendTypingIndicator.js +23 -31
  66. package/src/setPostReaction.js +104 -0
  67. package/{leiamnash → src}/setTitle.js +15 -21
  68. package/src/threadColors.js +39 -0
  69. package/{leiamnash → src}/unfriend.js +9 -13
  70. package/{leiamnash/unsendMessage.js → src/unsend.js} +7 -16
  71. package/utils.js +1112 -1236
  72. package/leiamnash/addExternalModule.js +0 -19
  73. package/leiamnash/changeApprovalMode.js +0 -80
  74. package/leiamnash/getThreadInfo.js +0 -212
  75. package/leiamnash/handleFriendRequest.js +0 -61
  76. package/leiamnash/listenMqtt.js +0 -1129
  77. package/leiamnash/setPostReaction.js +0 -76
  78. package/leiamnash/threadColors.js +0 -57
package/index.js CHANGED
@@ -1,61 +1,139 @@
1
- "use strict";
1
+ 'use strict';
2
2
 
3
- var utils = require("./utils");
4
- var cheerio = require("cheerio");
5
- var log = require("npmlog");
3
+ /!-[ Max Cpu Speed ]-!/
6
4
 
5
+ process.env.UV_THREADPOOL_SIZE = require('os').cpus().length;
6
+
7
+ /!-[ Global Set ]-!/
8
+
9
+ global.isThread = new Array();
10
+ global.isUser = new Array();
11
+ global.startTime = Date.now();
12
+ global.getText = require('gettext.js')();
13
+
14
+ /!-[ Require All Package Need Use ]-!/
15
+ /*globalThis.Fca = new Object({
16
+ test: console,log("test"),
17
+ Require: new Object({})
18
+ });*/
19
+ var utils = require("./utils"),
20
+ cheerio = require("cheerio"),
21
+ log = require("npmlog"),
22
+ //{ getAccessToken } = require('./Extra/ExtraAddons'),
23
+ logger = require('./logger'),
24
+ fs = require('fs-extra'),
25
+ getText = require('gettext.js')(),
26
+ logger = require('./logger'),
27
+ Fetch = require('got'),
28
+ fs = require('fs-extra'),
29
+ StateCrypt = require('./StateCrypt'),
30
+ Client = require("@replit/database"),
31
+ languageFile = require('./Language/index.json'),
32
+ ObjFastConfig = {
33
+ "Language": "en",
34
+ "MainColor": "#9900FF",
35
+ "BroadCast": true,
36
+ "EncryptFeature": true,
37
+ "PreKey": "",
38
+ "Uptime": false
39
+ };
40
+
41
+
42
+ /!-[ Check File To Run Process ]-!/
43
+
44
+ try {
45
+ if (!fs.existsSync('./alice/alicezetion.json')) {
46
+ fs.writeFileSync("./alice/alicezetion.json", JSON.stringify(ObjFastConfig, null, "\t"));
47
+ process.exit(1);
48
+ } else if (fs.existsSync('./alice/alicezetion.json')) {
49
+ try {
50
+ var DataLanguageSetting = require("../../alicezetion.json");
51
+ } catch (e) {
52
+ logger("Invalid Config Settings, Restoring Default...");
53
+ fs.writeFileSync("./alice/alicezetion.json", JSON.stringify(ObjFastConfig, null, "\t"));
54
+ process.exit(1);
55
+ }
56
+ try {
57
+ if (DataLanguageSetting && !DataLanguageSetting.PreKey) {
58
+ DataLanguageSetting.PreKey = "";
59
+ fs.writeFileSync("./alice/alicezetion.json", JSON.stringify(DataLanguageSetting, null, "\t"));
60
+ }
61
+ } catch (e) {
62
+ console.log(e);
63
+ }
64
+ if (!languageFile.some(i => i.Language == DataLanguageSetting.Language)) {
65
+ logger("Not Support Language: " + DataLanguageSetting.Language + " Only 'en' and 'vi'", "[ Alicezetion ]");
66
+ process.exit(0);
67
+ }
68
+ var Language = languageFile.find(i => i.Language == DataLanguageSetting.Language).Folder.Index;
69
+ } else process.exit(1);
70
+ if (utils.getType(DataLanguageSetting.BroadCast) != "Boolean" && DataLanguageSetting.BroadCast != undefined) {
71
+ log.warn("FastConfig-BroadCast", getText.gettext(Language.IsNotABoolean, DataLanguageSetting.BroadCast));
72
+ process.exit(0)
73
+ } else if (DataLanguageSetting.BroadCast == undefined) {
74
+ fs.writeFileSync("./alice/alicezetion.json", JSON.stringify(ObjFastConfig, null, "\t"));
75
+ process.exit(1);
76
+ }
77
+
78
+ global.FastConfig = DataLanguageSetting;
79
+
80
+ } catch (e) {
81
+ console.log(e);
82
+ logger.Error();
83
+ }
84
+
85
+ /!-[ Set Variable For Process ]-!/
86
+
87
+ log.maxRecordSize = 100;
7
88
  var checkVerified = null;
8
89
 
9
- var defaultLogRecordSize = 100;
10
- log.maxRecordSize = defaultLogRecordSize;
90
+ /!-[ Function setOptions ]-!/
11
91
 
12
92
  function setOptions(globalOptions, options) {
13
93
  Object.keys(options).map(function(key) {
14
94
  switch (key) {
15
- case "pauseLog":
95
+ case 'pauseLog':
16
96
  if (options.pauseLog) log.pause();
17
97
  break;
18
- case "online":
98
+ case 'online':
19
99
  globalOptions.online = Boolean(options.online);
20
100
  break;
21
- case "logLevel":
101
+ case 'logLevel':
22
102
  log.level = options.logLevel;
23
103
  globalOptions.logLevel = options.logLevel;
24
104
  break;
25
- case "logRecordSize":
105
+ case 'logRecordSize':
26
106
  log.maxRecordSize = options.logRecordSize;
27
107
  globalOptions.logRecordSize = options.logRecordSize;
28
108
  break;
29
- case "selfListen":
109
+ case 'selfListen':
30
110
  globalOptions.selfListen = Boolean(options.selfListen);
31
111
  break;
32
- case "listenEvents":
112
+ case 'listenEvents':
33
113
  globalOptions.listenEvents = Boolean(options.listenEvents);
34
114
  break;
35
- case "pageID":
115
+ case 'pageID':
36
116
  globalOptions.pageID = options.pageID.toString();
37
117
  break;
38
- case "updatePresence":
118
+ case 'updatePresence':
39
119
  globalOptions.updatePresence = Boolean(options.updatePresence);
40
120
  break;
41
- case "forceLogin":
121
+ case 'forceLogin':
42
122
  globalOptions.forceLogin = Boolean(options.forceLogin);
43
123
  break;
44
- case "userAgent":
124
+ case 'userAgent':
45
125
  globalOptions.userAgent = options.userAgent;
46
126
  break;
47
- case "autoMarkDelivery":
48
- globalOptions.autoMarkDelivery = Boolean(
49
- options.autoMarkDelivery
50
- );
127
+ case 'autoMarkDelivery':
128
+ globalOptions.autoMarkDelivery = Boolean(options.autoMarkDelivery);
51
129
  break;
52
- case "autoMarkRead":
130
+ case 'autoMarkRead':
53
131
  globalOptions.autoMarkRead = Boolean(options.autoMarkRead);
54
132
  break;
55
- case "listenTyping":
133
+ case 'listenTyping':
56
134
  globalOptions.listenTyping = Boolean(options.listenTyping);
57
135
  break;
58
- case "proxy":
136
+ case 'proxy':
59
137
  if (typeof options.proxy != "string") {
60
138
  delete globalOptions.proxy;
61
139
  utils.setProxy();
@@ -64,58 +142,40 @@ function setOptions(globalOptions, options) {
64
142
  utils.setProxy(globalOptions.proxy);
65
143
  }
66
144
  break;
67
- case "autoReconnect":
145
+ case 'autoReconnect':
68
146
  globalOptions.autoReconnect = Boolean(options.autoReconnect);
69
147
  break;
70
- case "emitReady":
148
+ case 'emitReady':
71
149
  globalOptions.emitReady = Boolean(options.emitReady);
72
150
  break;
73
151
  default:
74
- log.warn(
75
- "setOptions",
76
- "Unrecognized option given to setOptions: " + key
77
- );
152
+ log.warn("setOptions", "Unrecognized option given to setOptions: " + key);
78
153
  break;
79
154
  }
80
155
  });
81
156
  }
82
157
 
83
- function buildAPI(globalOptions, html, jar) {
84
- var maybeCookie = jar
85
- .getCookies("https://www.facebook.com")
86
- .filter(function(val) {
87
- return val.cookieString().split("=")[0] === "c_user";
88
- });
158
+ /!-[ Function BuildAPI ]-!/
89
159
 
90
- if (maybeCookie.length === 0) {
91
- throw {
92
- error:
93
- "Error retrieving userID. This can be caused by a lot of things, including getting blocked by Facebook for logging in from an unknown location. Try logging in with a browser to verify.",
94
- };
95
- }
160
+ async function buildAPI(globalOptions, html, jar) {
161
+ var maybeCookie = jar.getCookies("https://www.facebook.com").filter(function(val) { return val.cookieString().split("=")[0] === "c_user"; });
96
162
 
97
- if (html.indexOf("/checkpoint/block/?next") > -1) {
98
- log.warn(
99
- "login",
100
- "Checkpoint detected. Please log in with a browser to verify."
101
- );
102
- }
163
+ if (maybeCookie.length === 0) throw { error: Language.ErrAppState };
164
+
165
+ if (html.indexOf("/checkpoint/block/?next") > -1) log.warn("login", Language.CheckPointLevelI);
103
166
 
104
- var userID = maybeCookie[0]
105
- .cookieString()
106
- .split("=")[1]
107
- .toString();
108
- //log.info("login", `Logged in as ${userID}`);
167
+ var userID = maybeCookie[0].cookieString().split("=")[1].toString();
168
+ process.env['UID'] = userID;
109
169
 
110
170
  try {
111
171
  clearInterval(checkVerified);
112
- } catch (_) {}
172
+ } catch (e) {
173
+ console.log(e);
174
+ }
113
175
 
114
- var clientID = ((Math.random() * 2147483648) | 0).toString(16);
176
+ var clientID = (Math.random() * 2147483648 | 0).toString(16);
115
177
 
116
- let oldFBMQTTMatch = html.match(
117
- /irisSeqID:"(.+?)",appID:219994525426954,endpoint:"(.+?)"/
118
- );
178
+ let oldFBMQTTMatch = html.match(/irisSeqID:"(.+?)",appID:219994525426954,endpoint:"(.+?)"/);
119
179
  let mqttEndpoint = null;
120
180
  let region = null;
121
181
  let irisSeqID = null;
@@ -125,140 +185,58 @@ function buildAPI(globalOptions, html, jar) {
125
185
  irisSeqID = oldFBMQTTMatch[1];
126
186
  mqttEndpoint = oldFBMQTTMatch[2];
127
187
  region = new URL(mqttEndpoint).searchParams.get("region").toUpperCase();
128
- // log.info("login", `Got this account's message region: ${region}`);
188
+ logger(getText.gettext(Language.Area, region), "[ FCA-SUS ]");
129
189
  } else {
130
- let newFBMQTTMatch = html.match(
131
- /{"app_id":"219994525426954","endpoint":"(.+?)","iris_seq_id":"(.+?)"}/
132
- );
190
+ let newFBMQTTMatch = html.match(/{"app_id":"219994525426954","endpoint":"(.+?)","iris_seq_id":"(.+?)"}/);
133
191
  if (newFBMQTTMatch) {
134
192
  irisSeqID = newFBMQTTMatch[2];
135
193
  mqttEndpoint = newFBMQTTMatch[1].replace(/\\\//g, "/");
136
- region = new URL(mqttEndpoint).searchParams
137
- .get("region")
138
- .toUpperCase();
139
- // log.info("login", `Got this account's message region: ${region}`);
194
+ region = new URL(mqttEndpoint).searchParams.get("region").toUpperCase();
140
195
  } else {
141
- let legacyFBMQTTMatch = html.match(
142
- /(\["MqttWebConfig",\[\],{fbid:")(.+?)(",appID:219994525426954,endpoint:")(.+?)(",pollingEndpoint:")(.+?)(3790])/
143
- );
196
+ let legacyFBMQTTMatch = html.match(/(\["MqttWebConfig",\[\],{fbid:")(.+?)(",appID:219994525426954,endpoint:")(.+?)(",pollingEndpoint:")(.+?)(3790])/);
144
197
  if (legacyFBMQTTMatch) {
145
198
  mqttEndpoint = legacyFBMQTTMatch[4];
146
- region = new URL(mqttEndpoint).searchParams
147
- .get("region")
148
- .toUpperCase();
149
- /* log.warn(
150
- "login",
151
- `Cannot get sequence ID with new RegExp. Fallback to old RegExp (without seqID)...`
152
- );
153
- log.info(
154
- "login",
155
- `Got this account's message region: ${region}`
156
- );
157
- log.info(
158
- "login",
159
- `[Unused] Polling endpoint: ${legacyFBMQTTMatch[6]}`
160
- );*/
199
+ region = new URL(mqttEndpoint).searchParams.get("region").toUpperCase();
200
+ log.warn("login", `Cannot get sequence ID with new RegExp. Fallback to old RegExp (without seqID)...`);
201
+ logger("login", `[Unused] Polling endpoint: ${legacyFBMQTTMatch[6]}`);
161
202
  } else {
162
- // log.warn("login", "Cannot get MQTT region & sequence ID.");
203
+ log.warn("login", getText.gettext(Language.NoAreaData));
163
204
  noMqttData = html;
164
205
  }
165
206
  }
166
207
  }
167
208
 
168
- // All data available to api functions
169
209
  var ctx = {
170
210
  userID: userID,
171
211
  jar: jar,
172
212
  clientID: clientID,
173
213
  globalOptions: globalOptions,
174
214
  loggedIn: true,
175
- access_token: "NONE",
215
+ access_token: 'none',
176
216
  clientMutationId: 0,
177
217
  mqttClient: undefined,
178
218
  lastSeqId: irisSeqID,
179
219
  syncToken: undefined,
180
220
  mqttEndpoint,
181
221
  region,
182
- firstListen: true,
222
+ firstListen: true
183
223
  };
184
224
 
185
225
  var api = {
186
226
  setOptions: setOptions.bind(null, globalOptions),
187
227
  getAppState: function getAppState() {
188
228
  return utils.getAppState(jar);
189
- },
229
+ }
190
230
  };
191
231
 
192
- if (noMqttData) {
193
- api["htmlData"] = noMqttData;
194
- }
232
+ if (noMqttData) api["htmlData"] = noMqttData;
195
233
 
196
- const apiFuncNames = [
197
- "addExternalModule",
198
- "addUserToGroup",
199
- "changeAdminStatus",
200
- "changeApprovalMode",
201
- "changeArchivedStatus",
202
- "changeBio",
203
- "changeBlockedStatus",
204
- "changeGroupImage",
205
- "changeNickname",
206
- "changeThreadColor",
207
- "changeThreadEmoji",
208
- "createNewGroup",
209
- "createPoll",
210
- "deleteMessage",
211
- "deleteThread",
212
- "forwardAttachment",
213
- "getCurrentUserID",
214
- "getEmojiUrl",
215
- "getFriendsList",
216
- "getThreadHistory",
217
- "getThreadInfo",
218
- "getThreadList",
219
- "getThreadPictures",
220
- "getUserID",
221
- "getUserInfo",
222
- "handleMessageRequest",
223
- "listenMqtt",
224
- "logout",
225
- "markAsDelivered",
226
- "markAsRead",
227
- "markAsReadAll",
228
- "markAsSeen",
229
- "muteThread",
230
- "removeUserFromGroup",
231
- "resolvePhotoUrl",
232
- "searchForThread",
233
- "chat",
234
- "sendTypingIndicator",
235
- "setMessageReaction",
236
- "setTitle",
237
- "threadColors",
238
- "unsendMessage",
239
- "unfriend",
240
-
241
- // HTTP
242
- "httpGet",
243
- "httpPost",
244
-
245
- // Deprecated features
246
- "getThreadListDeprecated",
247
- "getThreadHistoryDeprecated",
248
- "getThreadInfoDeprecated",
249
- ];
234
+ const apiFuncNames = fs.readdirSync(__dirname + "/src").filter((File) => File.endsWith(".js") && !File.includes('Dev'));
250
235
 
251
236
  var defaultFuncs = utils.makeDefaults(html, userID, ctx);
252
237
 
253
238
  // Load all api functions in a loop
254
- apiFuncNames.map(function(v) {
255
- api[v] = require("./leiamnash/" + v)(defaultFuncs, api, ctx);
256
- });
257
-
258
- //Removing original `listen` that uses pull.
259
- //Map it to listenMqtt instead for backward compatibly.
260
- api.listen = api.listenMqtt;
261
-
239
+ apiFuncNames.map(v => api[v.replace(".js", "")] = require('./src/' + v)(defaultFuncs, api, ctx));
262
240
  return [ctx, defaultFuncs, api];
263
241
  }
264
242
 
@@ -269,27 +247,24 @@ function makeLogin(jar, email, password, loginOptions, callback, prCallback) {
269
247
  var arr = [];
270
248
 
271
249
  // This will be empty, but just to be sure we leave it
272
- $("#login_form input").map(function(i, v) {
273
- arr.push({ val: $(v).val(), name: $(v).attr("name") });
274
- });
250
+ $("#login_form input").map((i, v) => arr.push({ val: $(v).val(), name: $(v).attr("name") }));
275
251
 
276
252
  arr = arr.filter(function(v) {
277
253
  return v.val && v.val.length;
278
254
  });
279
255
 
280
256
  var form = utils.arrToForm(arr);
281
- form.lsd = utils.getFrom(html, '["LSD",[],{"token":"', '"}');
282
- form.lgndim = Buffer.from(
283
- '{"w":1440,"h":900,"aw":1440,"ah":834,"c":24}'
284
- ).toString("base64");
257
+ form.lsd = utils.getFrom(html, "[\"LSD\",[],{\"token\":\"", "\"}");
258
+ form.lgndim = Buffer.from("{\"w\":1440,\"h\":900,\"aw\":1440,\"ah\":834,\"c\":24}").toString('base64');
285
259
  form.email = email;
286
260
  form.pass = password;
287
- form.default_persistent = "0";
288
- form.lgnrnd = utils.getFrom(html, 'name="lgnrnd" value="', '"');
289
- form.locale = "en_US";
290
- form.timezone = "240";
261
+ form.default_persistent = '0';
262
+ form.lgnrnd = utils.getFrom(html, "name=\"lgnrnd\" value=\"", "\"");
263
+ form.locale = 'en_US';
264
+ form.timezone = '240';
291
265
  form.lgnjs = ~~(Date.now() / 1000);
292
266
 
267
+
293
268
  // Getting cookies from the HTML page... (kill me now plz)
294
269
  // we used to get a bunch of cookies in the headers of the response of the
295
270
  // request, but FB changed and they now send those cookies inside the JS.
@@ -299,42 +274,23 @@ function makeLogin(jar, email, password, loginOptions, callback, prCallback) {
299
274
  // variable name.
300
275
  //
301
276
  // ---------- Very Hacky Part Starts -----------------
302
- var willBeCookies = html.split('"_js_');
277
+ var willBeCookies = html.split("\"_js_");
303
278
  willBeCookies.slice(1).map(function(val) {
304
- var cookieData = JSON.parse(
305
- '["' + utils.getFrom(val, "", "]") + "]"
306
- );
307
- jar.setCookie(
308
- utils.formatCookie(cookieData, "facebook"),
309
- "https://www.facebook.com"
310
- );
279
+ var cookieData = JSON.parse("[\"" + utils.getFrom(val, "", "]") + "]");
280
+ jar.setCookie(utils.formatCookie(cookieData, "facebook"), "https://www.facebook.com");
311
281
  });
312
282
  // ---------- Very Hacky Part Ends -----------------
313
283
 
314
- // log.info("login", "Logging in...");
315
284
  return utils
316
- .post(
317
- "https://www.facebook.com/login/device-based/regular/login/?login_attempt=1&lwv=110",
318
- jar,
319
- form,
320
- loginOptions
321
- )
285
+ .post("https://www.facebook.com/login/device-based/regular/login/?login_attempt=1&lwv=110", jar, form, loginOptions)
322
286
  .then(utils.saveCookies(jar))
323
287
  .then(function(res) {
324
288
  var headers = res.headers;
325
- if (!headers.location) {
326
- throw { error: "Wrong username/password." };
327
- }
289
+ if (!headers.location) throw { error: Language.InvaildAccount };
328
290
 
329
291
  // This means the account has login approvals turned on.
330
- if (
331
- headers.location.indexOf(
332
- "https://www.facebook.com/checkpoint/"
333
- ) > -1
334
- ) {
335
- log.info("login", "You have login approvals turned on.");
336
- var nextURL =
337
- "https://www.facebook.com/checkpoint/?next=https%3A%2F%2Fwww.facebook.com%2Fhome.php";
292
+ if (headers.location.indexOf('https://www.facebook.com/checkpoint/') > -1) {
293
+ var nextURL = 'https://www.facebook.com/checkpoint/?next=https%3A%2F%2Fwww.facebook.com%2Fhome.php';
338
294
 
339
295
  return utils
340
296
  .get(headers.location, jar, null, loginOptions)
@@ -344,12 +300,7 @@ function makeLogin(jar, email, password, loginOptions, callback, prCallback) {
344
300
  // Make the form in advance which will contain the fb_dtsg and nh
345
301
  var $ = cheerio.load(html);
346
302
  var arr = [];
347
- $("form input").map(function(i, v) {
348
- arr.push({
349
- val: $(v).val(),
350
- name: $(v).attr("name"),
351
- });
352
- });
303
+ $("form input").map((i, v) => arr.push({ val: $(v).val(), name: $(v).attr("name") }));
353
304
 
354
305
  arr = arr.filter(function(v) {
355
306
  return v.val && v.val.length;
@@ -358,76 +309,36 @@ function makeLogin(jar, email, password, loginOptions, callback, prCallback) {
358
309
  var form = utils.arrToForm(arr);
359
310
  if (html.indexOf("checkpoint/?next") > -1) {
360
311
  setTimeout(() => {
361
- checkVerified = setInterval(
362
- (_form) => {
363
- /* utils
364
- .post("https://www.facebook.com/login/approvals/approved_machine_check/", jar, form, loginOptions, null, {
365
- "Referer": "https://www.facebook.com/checkpoint/?next"
366
- })
367
- .then(utils.saveCookies(jar))
368
- .then(res => {
369
- try {
370
- JSON.parse(res.body.replace(/for\s*\(\s*;\s*;\s*\)\s*;\s*()/, ""));
371
- } catch (ex) {
372
- clearInterval(checkVerified);
373
- log.info("login", "Verified from browser. Logging in...");
374
- return loginHelper(utils.getAppState(jar), email, password, loginOptions, callback);
375
- }
376
- })
377
- .catch(ex => {
378
- log.error("login", ex);
379
- }); */
380
- },
381
- 5000,
382
- {
383
- fb_dtsg: form.fb_dtsg,
384
- jazoest: form.jazoest,
385
- dpr: 1,
386
- }
387
- );
312
+ checkVerified = setInterval((_form) => {}, 5000, {
313
+ fb_dtsg: form.fb_dtsg,
314
+ jazoest: form.jazoest,
315
+ dpr: 1
316
+ });
388
317
  }, 2500);
389
318
  throw {
390
- error: "login-approval",
319
+ error: 'login-approval',
391
320
  continue: function submit2FA(code) {
392
321
  form.approvals_code = code;
393
- form["submit[Continue]"] = $(
394
- "#checkpointSubmitButton"
395
- ).html(); //'Continue';
322
+ form['submit[Continue]'] = $("#checkpointSubmitButton").html(); //'Continue';
396
323
  var prResolve = null;
397
324
  var prReject = null;
398
- var rtPromise = new Promise(function(
399
- resolve,
400
- reject
401
- ) {
325
+ var rtPromise = new Promise(function(resolve, reject) {
402
326
  prResolve = resolve;
403
327
  prReject = reject;
404
328
  });
405
329
  if (typeof code == "string") {
406
330
  utils
407
- .post(
408
- nextURL,
409
- jar,
410
- form,
411
- loginOptions
412
- )
331
+ .post(nextURL, jar, form, loginOptions)
413
332
  .then(utils.saveCookies(jar))
414
333
  .then(function(res) {
415
- var $ = cheerio.load(
416
- res.body
417
- );
418
- var error = $(
419
- "#approvals_code"
420
- )
421
- .parent()
422
- .attr("data-xui-error");
334
+ var $ = cheerio.load(res.body);
335
+ var error = $("#approvals_code").parent().attr("data-xui-error");
423
336
  if (error) {
424
337
  throw {
425
- error:
426
- "login-approval",
427
- errordesc:
428
- "Invalid 2FA code.",
338
+ error: 'login-approval',
339
+ errordesc: Language.InvaildTwoAuthCode,
429
340
  lerror: error,
430
- continue: submit2FA,
341
+ continue: submit2FA
431
342
  };
432
343
  }
433
344
  })
@@ -435,287 +346,585 @@ function makeLogin(jar, email, password, loginOptions, callback, prCallback) {
435
346
  // Use the same form (safe I hope)
436
347
  delete form.no_fido;
437
348
  delete form.approvals_code;
438
- form.name_action_selected =
439
- "dont_save"; //'save_device';
440
-
441
- return utils
442
- .post(
443
- nextURL,
444
- jar,
445
- form,
446
- loginOptions
447
- )
448
- .then(
449
- utils.saveCookies(
450
- jar
451
- )
452
- );
349
+ form.name_action_selected = 'save_device'; //'save_device' || 'dont_save;
350
+
351
+ return utils.post(nextURL, jar, form, loginOptions).then(utils.saveCookies(jar));
453
352
  })
454
353
  .then(function(res) {
455
354
  var headers = res.headers;
456
- if (
457
- !headers.location &&
458
- res.body.indexOf(
459
- "Review Recent Login"
460
- ) > -1
461
- ) {
462
- throw {
463
- error:
464
- "Something went wrong with login approvals.",
465
- };
466
- }
355
+ if (!headers.location && res.body.indexOf('Review Recent Login') > -1) throw { error: Language.ApprovalsErr };
467
356
 
468
- var appState = utils.getAppState(
469
- jar
470
- );
471
-
472
- if (
473
- callback === prCallback
474
- ) {
475
- callback = function(
476
- err,
477
- api
478
- ) {
479
- if (err) {
480
- return prReject(
481
- err
482
- );
483
- }
484
- return prResolve(
485
- api
486
- );
357
+ var appState = utils.getAppState(jar);
358
+
359
+ if (callback === prCallback) {
360
+ callback = function(err, api) {
361
+ if (err) return prReject(err);
362
+ return prResolve(api);
487
363
  };
488
364
  }
489
365
 
490
366
  // Simply call loginHelper because all it needs is the jar
491
367
  // and will then complete the login process
492
- return loginHelper(
493
- appState,
494
- email,
495
- password,
496
- loginOptions,
497
- callback
498
- );
368
+ return loginHelper(appState, email, password, loginOptions, callback);
499
369
  })
500
370
  .catch(function(err) {
501
371
  // Check if using Promise instead of callback
502
- if (
503
- callback === prCallback
504
- ) {
505
- prReject(err);
506
- } else {
507
- callback(err);
508
- }
372
+ if (callback === prCallback) prReject(err);
373
+ else callback(err);
509
374
  });
510
375
  } else {
511
376
  utils
512
- .post(
513
- "https://www.facebook.com/checkpoint/?next=https%3A%2F%2Fwww.facebook.com%2Fhome.php",
514
- jar,
515
- form,
516
- loginOptions,
517
- null,
518
- {
519
- Referer:
520
- "https://www.facebook.com/checkpoint/?next",
521
- }
522
- )
377
+ .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" })
523
378
  .then(utils.saveCookies(jar))
524
- .then((res) => {
379
+ .then(res => {
525
380
  try {
526
- JSON.parse(
527
- res.body.replace(
528
- /for\s*\(\s*;\s*;\s*\)\s*;\s*/,
529
- ""
530
- )
531
- );
381
+ JSON.parse(res.body.replace(/for\s*\(\s*;\s*;\s*\)\s*;\s*/, ""));
532
382
  } catch (ex) {
533
- clearInterval(
534
- checkVerified
535
- );
536
- /* log.info(
537
- "login",
538
- "Verified from browser. Logging in..."
539
- );*/
540
- if (
541
- callback ===
542
- prCallback
543
- ) {
544
- callback = function(
545
- err,
546
- api
547
- ) {
548
- if (err) {
549
- return prReject(
550
- err
551
- );
552
- }
553
- return prResolve(
554
- api
555
- );
383
+ clearInterval(checkVerified);
384
+ if (callback === prCallback) {
385
+ callback = function(err, api) {
386
+ if (err) return prReject(err);
387
+ return prResolve(api);
556
388
  };
557
389
  }
558
- return loginHelper(
559
- utils.getAppState(
560
- jar
561
- ),
562
- email,
563
- password,
564
- loginOptions,
565
- callback
566
- );
390
+ return loginHelper(utils.getAppState(jar), email, password, loginOptions, callback);
567
391
  }
568
392
  })
569
- .catch((ex) => {
393
+ .catch(ex => {
570
394
  log.error("login", ex);
571
- if (
572
- callback === prCallback
573
- ) {
574
- prReject(ex);
575
- } else {
576
- callback(ex);
577
- }
395
+ if (callback === prCallback) prReject(ex);
396
+ else callback(ex);
578
397
  });
579
398
  }
580
399
  return rtPromise;
581
- },
400
+ }
582
401
  };
583
402
  } else {
584
- if (!loginOptions.forceLogin) {
585
- throw {
586
- error:
587
- "Couldn't login. Facebook might have blocked this account. Please login with a browser or enable the option 'forceLogin' and try again.",
588
- };
589
- }
590
- if (
591
- html.indexOf("Suspicious Login Attempt") >
592
- -1
593
- ) {
594
- form["submit[This was me]"] = "This was me";
595
- } else {
596
- form["submit[This Is Okay]"] =
597
- "This Is Okay";
598
- }
403
+ if (!loginOptions.forceLogin) throw { error: Language.ForceLoginNotEnable };
404
+
405
+ if (html.indexOf("Suspicious Login Attempt") > -1) form['submit[This was me]'] = "This was me";
406
+ else form['submit[This Is Okay]'] = "This Is Okay";
599
407
 
600
408
  return utils
601
409
  .post(nextURL, jar, form, loginOptions)
602
410
  .then(utils.saveCookies(jar))
603
411
  .then(function() {
604
412
  // Use the same form (safe I hope)
605
- form.name_action_selected =
606
- "save_device";
607
-
608
- return utils
609
- .post(
610
- nextURL,
611
- jar,
612
- form,
613
- loginOptions
614
- )
615
- .then(utils.saveCookies(jar));
413
+ form.name_action_selected = 'save_device';
414
+
415
+ return utils.post(nextURL, jar, form, loginOptions).then(utils.saveCookies(jar));
616
416
  })
617
417
  .then(function(res) {
618
418
  var headers = res.headers;
619
419
 
620
- if (
621
- !headers.location &&
622
- res.body.indexOf(
623
- "Review Recent Login"
624
- ) > -1
625
- ) {
626
- throw {
627
- error:
628
- "Something went wrong with review recent login.",
629
- };
630
- }
420
+ if (!headers.location && res.body.indexOf('Review Recent Login') > -1) throw { error: "Something went wrong with review recent login." };
631
421
 
632
422
  var appState = utils.getAppState(jar);
633
423
 
634
424
  // Simply call loginHelper because all it needs is the jar
635
425
  // and will then complete the login process
636
- return loginHelper(
637
- appState,
638
- email,
639
- password,
640
- loginOptions,
641
- callback
642
- );
426
+ return loginHelper(appState, email, password, loginOptions, callback);
643
427
  })
644
- .catch(function(e) {
645
- callback(e);
646
- });
428
+ .catch(e => callback(e));
647
429
  }
648
430
  });
649
431
  }
650
432
 
651
- return utils
652
- .get("https://www.facebook.com/", jar, null, loginOptions)
653
- .then(utils.saveCookies(jar));
433
+ return utils.get('https://www.facebook.com/', jar, null, loginOptions).then(utils.saveCookies(jar));
654
434
  });
655
435
  };
656
436
  }
657
437
 
438
+ function makeid(length) {
439
+ var result = '';
440
+ var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
441
+ var charactersLength = characters.length;
442
+ for (var i = 0; i < length; i++) {
443
+ result += characters.charAt(Math.floor(Math.random() * charactersLength));
444
+ }
445
+ return result;
446
+ }
447
+
448
+
658
449
  // Helps the login
659
- function loginHelper(
660
- appState,
661
- email,
662
- password,
663
- globalOptions,
664
- callback,
665
- prCallback
666
- ) {
450
+ async function loginHelper(appState, email, password, globalOptions, callback, prCallback) {
667
451
  var mainPromise = null;
668
452
  var jar = utils.getJar();
669
453
 
670
454
  // If we're given an appState we loop through it and save each cookie
671
455
  // back into the jar.
672
- if (appState) {
673
- appState.map(function(c) {
674
- var str =
675
- c.key +
676
- "=" +
677
- c.value +
678
- "; expires=" +
679
- c.expires +
680
- "; domain=" +
681
- c.domain +
682
- "; path=" +
683
- c.path +
684
- ";";
685
- jar.setCookie(str, "http://" + c.domain);
686
- });
456
+ try {
457
+ if (appState) {
458
+ //const readline = require("readline");
459
+ //const chalk = require("chalk");
460
+ //const figlet = require("figlet");
461
+ //const os = require("os");
462
+ //const { execSync } = require('child_process');
463
+ // let rl = readline.createInterface({
464
+ // input: process.stdin,
465
+ // output: process.stdout,
466
+ // prompt: chalk.hex('#00CCCC').bold('[FCA-SUS] • ')
467
+ // });
468
+ // let type = {
469
+ // 1: {
470
+ // "name": "Tạo Mật Khẩu Cho Appstate",
471
+ // onRun: async function() {
472
+ // try {
473
+ // rl.question("Hãy Nhập Mật Khẩu Bạn Muốn Đặt Cho Appstate !", (answer) => {
474
+ // console.log("Được Rồi Mật Khẩu Của Bạn Là: " + answer + ", Bạn Hãy Nhớ Kĩ Nhé !");
475
+ // process.env["FBKEY"] = answer;
476
+ // fs.writeFile('../.env', `FBKEY=${answer}`, function (err) {
477
+ // if (err) {
478
+ // submiterr(err)
479
+ // logger("Tạo File ENV Thất Bại !", "[ FCA-SUS ]")
480
+ // rl.pause();
481
+ // }
482
+ // else logger("Tạo Thành Công File ENV !","[ FCA-SUS ]")
483
+ // rl.pause();
484
+ // });
485
+ // })
486
+ // }
487
+ // catch (e) {
488
+ // console.log(e);
489
+ // logger("Đã Có Lỗi Khi Đang Try Tạo Ra Câu Hỏi =))", "[ FCA-SUS ]");
490
+ // rl.pause();
491
+ // }
492
+ // }
493
+ // },
494
+ // 2: {
495
+ // "name": "Tiếp Tục Chạy Fca Mà Không Cần Mã Hóa AppState",
496
+ // onRun: async function () {
497
+ // rl.pause();
498
+ // }
499
+ // },
500
+ // 3: {
501
+ // "name": "Đổi Mật Khẩu AppState (Comming Soon..)",
502
+ // onRun: async function () {
503
+ // console.log(chalk.red.bold("Đã bảo là comming soon rồi mà >:v"));
504
+ // }
505
+ // }
506
+ // }
507
+ // const localbrand = JSON.parse(readFileSync('./package.json')).name;
508
+ // const localbrand2 = JSON.parse(readFileSync('./node_modules/fca-sus/package.json')).version;
509
+ // var axios = require('axios');
510
+ // axios.get('https://raw.githubusercontent.com/amogusdevlol/fca-sus/main/package.json').then(async (res) => {
511
+ // if (localbrand.toUpperCase() == 'HORIZON') {
512
+ // console.group(chalk.bold.cyan('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'))
513
+ // console.log(chalk.bold.hex('#00FFCC')("[</>]") + chalk.bold.yellow(' => ') + "Hệ Điều Hành: " + chalk.bold.red(os.type()));
514
+ // console.log(chalk.bold.hex('#00FFCC')("[</>]") + chalk.bold.yellow(' => ') + "Thông Tin Máy: " + chalk.bold.red(os.version()));
515
+ // console.log(chalk.bold.hex('#00FFCC')("[</>]") + chalk.bold.yellow(' => ') + "Phiên Bản Hiện Tại: " + chalk.bold.red(localbrand2));
516
+ // console.log(chalk.bold.hex('#00FFCC')("[</>]") + chalk.bold.yellow(' => ') + "Phiên Bản Mới Nhất: " + chalk.bold.red(res.data.version));
517
+ // console.groupEnd();
518
+ // }
519
+ // else {
520
+ // console.clear();
521
+ // console.log(figlet.textSync('TeamHorizon', {font: 'ANSI Shadow',horizontalLayout: 'default',verticalLayout: 'default',width: 0,whitespaceBreak: true }))
522
+ // console.log(chalk.hex('#9966CC')(`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`));
523
+ // }
524
+ // });
687
525
 
688
- // Load the main page.
689
- mainPromise = utils
690
- .get("https://www.facebook.com/", jar, null, globalOptions, {
691
- noRef: true,
692
- })
693
- .then(utils.saveCookies(jar));
694
- } else {
695
- // Open the main page, then we login with the given credentials and finally
696
- // load the main page again (it'll give us some IDs that we need)
697
- mainPromise = utils
698
- .get("https://www.facebook.com/", null, null, globalOptions, {
699
- noRef: true,
700
- })
701
- .then(utils.saveCookies(jar))
702
- .then(
703
- makeLogin(
704
- jar,
705
- email,
706
- password,
707
- globalOptions,
708
- callback,
709
- prCallback
710
- )
711
- )
712
- .then(function() {
713
- return utils
714
- .get("https://www.facebook.com/", jar, null, globalOptions)
715
- .then(utils.saveCookies(jar));
716
- });
717
- }
526
+ var backup = async(data) => {
527
+ if (fs.existsSync('./alicestate.json')) {
528
+ try {
529
+ fs.writeFileSync('./alicestate.json', data);
530
+ } catch (e) {
531
+ fs.writeFileSync('./alicestate.json', JSON.stringify(data, null, "\t"));
532
+ }
533
+ await new Promise(resolve => setTimeout(resolve, 5 * 1000));
534
+ process.exit(1);
535
+ } else return logger.Error();
536
+ }
537
+
538
+ switch (process.platform) {
539
+ case "win32":
540
+ {
541
+ try {
542
+ var { body } = await Fetch('https://decrypt-appstate-production.up.railway.app/getKey');
543
+ process.env['FBKEY'] = JSON.parse(body).Data;
544
+ } catch (e) {
545
+ logger(Language.ErrGetPassWord);
546
+ logger.Error();
547
+ process.exit(1);
548
+ }
549
+ }
550
+ break;
551
+ case "linux":
552
+ {
553
+ if (process.env["REPL_ID"] == undefined) {
554
+ try {
555
+ var { body } = await Fetch.get('https://decrypt-appstate-production.up.railway.app/getKey');
556
+ process.env['FBKEY'] = JSON.parse(body).Data;
557
+ } catch (e) {
558
+ logger.Error();
559
+ process.exit(1);
560
+ }
561
+ } else {
562
+ /* try {
563
+ const client = new Client();
564
+ let key = await client.get("FBKEY");
565
+ if (!key) {
566
+ await client.set("FBKEY", makeid(49));
567
+ let key = await client.get("FBKEY");
568
+ process.env['FBKEY'] = key;
569
+ } else {
570
+ process.env['FBKEY'] = key;
571
+ }
572
+ } catch (e) {
573
+ logger(Language.ErrGenerateKey, '[ FCA-SUS ]');
574
+ logger(e, '[ FCA-SUS ]');
575
+ logger.Error();
576
+ process.exit(0)
577
+ }*/
578
+ }
579
+ }
580
+ break;
581
+ case "android":
582
+ {
583
+ try {
584
+ var { body } = await Fetch.get('https://decrypt-appstate-production.up.railway.app/getKey');
585
+ process.env['FBKEY'] = JSON.parse(body).Data;
586
+ } catch (e) {
587
+
588
+ return logger.Error();
589
+ }
590
+ }
591
+ break;
592
+ default:
593
+ {
594
+
595
+ logger.Error();
596
+ process.exit(0);
597
+ }
598
+ }
599
+
600
+ try {
601
+ switch (require("../../FastConfigFca.json").EncryptFeature) {
602
+ case true:
603
+ {
604
+ appState = JSON.parse(JSON.stringify(appState, null, "\t"));
605
+ switch (utils.getType(appState)) {
606
+ case "Array":
607
+ {
608
+
609
+ }
610
+ break;
611
+ case "String":
612
+ {
613
+ try {
614
+ appState = StateCrypt.decryptState(appState, process.env['FBKEY']);
615
+ logger(Language.DecryptSuccess, '[ FCA-SUS ]');
616
+ } catch (e) {
617
+ if (process.env.Backup != undefined && process.env.Backup) {
618
+ backup(process.env.Backup);
619
+ } else switch (process.platform) {
620
+ case "win32":
621
+ {
622
+ try {
623
+ if (fs.existsSync('./backupappstate.json')) {
624
+ let content = fs.readFileSync('./backupappstate.json', 'utf8');
625
+ return backup(content);
626
+ }
627
+ } catch (e) {
628
+
629
+ logger.Error();
630
+ process.exit(0);
631
+ }
632
+ }
633
+ break;
634
+ case "linux":
635
+ {
636
+ if (process.env["REPL_ID"] == undefined) {
637
+ try {
638
+ if (fs.existsSync('./backupappstate.json')) {
639
+ let content = fs.readFileSync('./backupappstate.json', 'utf8');
640
+ return backup(content);
641
+ }
642
+ } catch (e) {
643
+ //logger(Language.ErrBackup, '[ FCA-SUS ]');
644
+ logger.Error();
645
+ process.exit(0);
646
+ }
647
+ } else {
648
+ try {
649
+ const client = new Client();
650
+ let key = await client.get("Backup");
651
+ if (key) {
652
+ return backup(JSON.stringify(key));
653
+ } else {
654
+ logger(Language.ErrBackup, '[ FCA-SUS ]');
655
+ }
656
+ } catch (e) {
657
+ logger(Language.ErrBackup, '[ FCA-SUS ]');
658
+ }
659
+ }
660
+ }
661
+ break;
662
+ case "android":
663
+ {
664
+ try {
665
+ if (fs.existsSync('./backupappstate.json')) {
666
+ let content = fs.readFileSync('./backupappstate.json', 'utf8');
667
+ return backup(content);
668
+ }
669
+ } catch (e) {
670
+ logger(Language.ErrBackup, '[ FCA-SUS ]');
671
+ logger.Error();
672
+ process.exit(0);
673
+ }
674
+ }
675
+ }
676
+ logger(Language.DecryptFailed, '[ FCA-SUS ]');
677
+ return logger.Error();
678
+ }
679
+ logger(getText.gettext(Language.YourAppStatePass, process.env.FBKEY), '[ FCA-SUS ]');
680
+ }
681
+ break;
682
+ default:
683
+ {
684
+ logger(Language.InvaildAppState, "[ FCA-SUS ]");
685
+ process.exit(0)
686
+ }
687
+ }
688
+ }
689
+ break;
690
+ case false:
691
+ {
692
+ switch (utils.getType(appState)) {
693
+ case "Array":
694
+ {
695
+ logger(Language.EncryptStateOff, "[ FCA-SUS ]");
696
+ }
697
+ break;
698
+ case "String":
699
+ {
700
+ logger(Language.EncryptStateOff, "[ FCA-SUS ]");
701
+ try {
702
+ appState = StateCrypt.decryptState(appState, process.env['FBKEY']);
703
+ logger(Language.DecryptSuccess, '[ FCA-SUS ]');
704
+ } catch (e) {
705
+ if (process.env.Backup != undefined && process.env.Backup) {
706
+ backup(process.env.Backup);
707
+ } else switch (process.platform) {
708
+ case "win32":
709
+ {
710
+ try {
711
+ if (fs.existsSync('./backupappstate.json')) {
712
+ let content = fs.readFileSync('./backupappstate.json', 'utf8');
713
+ return backup(content);
714
+ }
715
+ } catch (e) {
716
+ logger(Language.ErrBackup, '[ FCA-SUS ]');
717
+ logger.Error();
718
+ process.exit(0);
719
+ }
720
+ }
721
+ break;
722
+ case "linux":
723
+ {
724
+ if (process.env["REPL_ID"] == undefined) {
725
+ try {
726
+ if (fs.existsSync('./backupappstate.json')) {
727
+ let content = fs.readFileSync('./backupappstate.json', 'utf8');
728
+ return backup(content);
729
+ }
730
+ } catch (e) {
731
+ logger(Language.ErrBackup, '[ FCA-SUS ]');
732
+ logger.Error();
733
+ process.exit(0);
734
+ }
735
+ } else {
736
+ try {
737
+ const client = new Client();
738
+ let key = await client.get("Backup");
739
+ if (key) {
740
+ return backup(JSON.stringify(key));
741
+ } else {
742
+ logger(Language.ErrBackup, '[ FCA-SUS ]');
743
+ }
744
+ } catch (e) {
745
+ logger(Language.ErrBackup, '[ FCA-SUS ]');
746
+ }
747
+ }
748
+ }
749
+ break;
750
+ case "android":
751
+ {
752
+ try {
753
+ if (fs.existsSync('./backupappstate.json')) {
754
+ let content = fs.readFileSync('./backupappstate.json', 'utf8');
755
+ return backup(content);
756
+ }
757
+ } catch (e) {
758
+ logger(Language.ErrBackup, '[ FCA-SUS ]');
759
+ logger.Error();
760
+ process.exit(0);
761
+ }
762
+ }
763
+ }
764
+ logger(Language.DecryptFailed, '[ FCA-SUS ]');
765
+ return logger.Error();
766
+ }
767
+ }
768
+ break;
769
+ default:
770
+ {
771
+ logger(Language.InvaildAppState, "[ FCA-SUS ]");
772
+ process.exit(0)
773
+ }
774
+ }
775
+ }
776
+ break;
777
+ default:
778
+ {
779
+ logger(getText.gettext(Language.IsNotABoolean, require("../../FastConfigFca.json").EncryptFeature), "[ FCA-SUS ]")
780
+ process.exit(0);
781
+ }
782
+ }
783
+ } catch (e) {
784
+ console.log(e);
785
+ }
786
+
787
+ try {
788
+ appState = JSON.parse(appState);
789
+ } catch (e) {
790
+ try {
791
+ appState = appState;
792
+ } catch (e) {
793
+ return logger.Error();
794
+ }
795
+ }
796
+ try {
797
+ appState.map(function(c) {
798
+ var str = c.key + "=" + c.value + "; expires=" + c.expires + "; domain=" + c.domain + "; path=" + c.path + ";";
799
+ jar.setCookie(str, "http://" + c.domain);
800
+ });
801
+ switch (process.platform) {
802
+ case "win32":
803
+ {
804
+ try {
805
+ fs.writeFileSync("./backupappstate.json", JSON.stringify(appState, null, "\t"));
806
+ process.env.Backup = JSON.stringify(appState, null, "\t");
807
+ } catch (e) {
808
+ logger(Language.BackupFailed, '[ FCA-SUS ]');
809
+ }
810
+ }
811
+ break;
812
+ case "linux":
813
+ {
814
+ if (process.env["REPL_ID"] == undefined) {
815
+ try {
816
+ fs.writeFileSync("./backupappstate.json", JSON.stringify(appState, null, "\t"));
817
+ process.env.Backup = JSON.stringify(appState, null, "\t");
818
+ } catch (e) {
819
+ logger(Language.BackupFailed, '[ FCA-SUS ]');
820
+ }
821
+ } else {
822
+ try {
823
+ if (fs.existsSync('./backupappstate.json')) {
824
+ fs.unlinkSync('./backupappstate.json');
825
+ }
826
+ const client = new Client();
827
+ await client.set("Backup", appState);
828
+ process.env.Backup = JSON.stringify(appState, null, "\t");
829
+ } catch (e) {
830
+ logger(Language.BackupFailed, '[ FCA-SUS ]');
831
+ }
832
+ }
833
+ }
834
+ break;
835
+ case "android":
836
+ {
837
+ try {
838
+ fs.writeFileSync("./backupappstate.json", JSON.stringify(appState, null, "\t"));
839
+ process.env.Backup = JSON.stringify(appState, null, "\t");
840
+ } catch (e) {
841
+ logger(Language.BackupFailed, '[ FCA-SUS ]');
842
+ }
843
+ }
844
+ }
845
+
846
+ mainPromise = utils.get('https://www.facebook.com/', jar, null, globalOptions, { noRef: true }).then(utils.saveCookies(jar));
847
+ } catch (e) {
848
+
849
+ if (process.env.Backup != undefined && process.env.Backup) {
850
+ return backup(process.env.Backup);
851
+ }
852
+ switch (process.platform) {
853
+ case "win32":
854
+ {
855
+ try {
856
+ if (fs.existsSync('./backupappstate.json')) {
857
+ let content = fs.readFileSync('./backupappstate.json', 'utf8');
858
+ return backup(content);
859
+ }
860
+ } catch (e) {
861
+ logger(Language.ErrBackup, '[ FCA-SUS ]');
862
+ logger.Error();
863
+ process.exit(0);
864
+ }
865
+ }
866
+ break;
867
+ case "linux":
868
+ {
869
+ if (process.env["REPL_ID"] == undefined) {
870
+ try {
871
+ if (fs.existsSync('./backupappstate.json')) {
872
+ let content = fs.readFileSync('./backupappstate.json', 'utf8');
873
+ return backup(content);
874
+ }
875
+ } catch (e) {
876
+ logger(Language.ErrBackup, '[ FCA-SUS ]');
877
+ logger.Error();
878
+ process.exit(0);
879
+ }
880
+ } else {
881
+ try {
882
+ const client = new Client();
883
+ let key = await client.get("Backup");
884
+ if (key) {
885
+ backup(JSON.stringify(key));
886
+ } else {
887
+ logger(Language.ErrBackup, '[ FCA-SUS ]');
888
+ }
889
+ } catch (e) {
890
+ logger(Language.ErrBackup, '[ FCA-SUS ]');
891
+ }
892
+ }
893
+ }
894
+ break;
895
+ case "android":
896
+ {
897
+ try {
898
+ if (fs.existsSync('./backupappstate.json')) {
899
+ let content = fs.readFileSync('./backupappstate.json', 'utf8');
900
+ return backup(content);
901
+ }
902
+ } catch (e) {
903
+ logger(Language.ErrBackup, '[ FCA-SUS ]');
904
+ logger.Error();
905
+ process.exit(0);
906
+ }
907
+ }
908
+ break;
909
+ }
718
910
 
911
+ console.log(e);
912
+ return //logger(Language.ScreenShotConsoleAndSendToAdmin, '[ FCA-SUS ]');
913
+ }
914
+ } else {
915
+ // Open the main page, then we login with the given credentials and finally
916
+ // load the main page again (it'll give us some IDs that we need)
917
+ mainPromise = utils
918
+ .get("https://www.facebook.com/", null, null, globalOptions, { noRef: true })
919
+ .then(utils.saveCookies(jar))
920
+ .then(makeLogin(jar, email, password, globalOptions, callback, prCallback))
921
+ .then(function() {
922
+ return utils.get('https://www.facebook.com/', jar, null, globalOptions).then(utils.saveCookies(jar));
923
+ });
924
+ }
925
+ } catch (e) {
926
+ console.log(e);
927
+ }
719
928
  var ctx = null;
720
929
  var _defaultFuncs = null;
721
930
  var api = null;
@@ -725,72 +934,88 @@ function loginHelper(
725
934
  // Hacky check for the redirection that happens on some ISPs, which doesn't return statusCode 3xx
726
935
  var reg = /<meta http-equiv="refresh" content="0;url=([^"]+)[^>]+>/;
727
936
  var redirect = reg.exec(res.body);
728
- if (redirect && redirect[1]) {
729
- return utils
730
- .get(redirect[1], jar, null, globalOptions)
731
- .then(utils.saveCookies(jar));
732
- }
937
+ if (redirect && redirect[1]) return utils.get(redirect[1], jar, null, globalOptions).then(utils.saveCookies(jar));
733
938
  return res;
734
939
  })
735
- .then(function(res) {
940
+ .then(async function(res) {
736
941
  var html = res.body;
737
- var stuff = buildAPI(globalOptions, html, jar);
942
+ var stuff = await buildAPI(globalOptions, html, jar);
738
943
  ctx = stuff[0];
739
944
  _defaultFuncs = stuff[1];
740
945
  api = stuff[2];
741
946
  return res;
742
947
  });
743
-
744
948
  // given a pageID we log in as a page
745
949
  if (globalOptions.pageID) {
746
950
  mainPromise = mainPromise
747
951
  .then(function() {
748
- return utils.get(
749
- "https://www.facebook.com/" +
750
- ctx.globalOptions.pageID +
751
- "/messages/?section=messages&subsection=inbox",
752
- ctx.jar,
753
- null,
754
- globalOptions
755
- );
952
+ return utils.get('https://www.facebook.com/' + ctx.globalOptions.pageID + '/messages/?section=messages&subsection=inbox', ctx.jar, null, globalOptions);
756
953
  })
757
954
  .then(function(resData) {
758
- var url = utils
759
- .getFrom(
760
- resData.body,
761
- 'window.location.replace("https:\\/\\/www.facebook.com\\',
762
- '");'
763
- )
764
- .split("\\")
765
- .join("");
955
+ var url = utils.getFrom(resData.body, 'window.location.replace("https:\\/\\/www.facebook.com\\', '");').split('\\').join('');
766
956
  url = url.substring(0, url.length - 1);
767
-
768
- return utils.get(
769
- "https://www.facebook.com" + url,
770
- ctx.jar,
771
- null,
772
- globalOptions
773
- );
957
+ return utils.get('https://www.facebook.com' + url, ctx.jar, null, globalOptions);
774
958
  });
775
959
  }
776
960
 
777
961
  // At the end we call the callback or catch an exception
778
962
  mainPromise
779
963
  .then(function() {
780
- //log.info("login", "Done logging in.");
781
- return callback(null, api);
782
- })
783
- .catch(function(e) {
784
- //log.error("login", e.error || e);
964
+ /*logger(Language.DoneLogin, "[ FCA-SUS ]");
965
+ logger(Language.AutoCheckUpdate, "[ FCA-SUS ]");*/
966
+ //!---------- Auto Check, Update START -----------------!//
967
+ var Fetch = require('got');
968
+ var { readFileSync } = require('fs-extra');
969
+ const { execSync } = require('child_process');
970
+ Fetch('https://raw.githubusercontent.com/amogusdevlol/node-ainzfb/main/package.json').then(async(res) => {
971
+ const localbrand = JSON.parse(readFileSync('./node_modules/node-ainzfb-new/package.json')).version;
972
+ if (Number(localbrand.replace(/\./g, "")) < Number(JSON.parse(res.body.toString()).version.replace(/\./g, ""))) {
973
+ // log.warn("[ FCA-SUS ] •", getText.gettext(Language.NewVersionFound, JSON.parse(readFileSync('./node_modules/node-ainzfb/package.json')).version, JSON.parse(res.body.toString()).version));
974
+ log.warn("[ FCA-SUS ] •", Language.AutoUpdate);
975
+ try {
976
+ execSync('npm install node-ainzfb-new@latest', { stdio: 'inherit' });
977
+ logger(Language.UpdateSuccess, "[ FCA-SUS ]")
978
+ logger(Language.RestartAfterUpdate, '[ FCA-SUS ]');
979
+ await new Promise(resolve => setTimeout(resolve, 5 * 1000));
980
+ console.clear();
981
+ process.exit(1);
982
+ } catch (err) {
983
+ log.warn('Error Update: ' + err);
984
+ logger(Language.UpdateFailed, "[ FCA-SUS ]");
985
+ try {
986
+ require.resolve('sus-support');
987
+ } catch (e) {
988
+ logger(Language.InstallSupportTool, "[ FCA-SUS ]");
989
+ execSync('npm install git+https://github.com/amogusdevlol/sus-support.git', { stdio: 'inherit' });
990
+ process.exit(1);
991
+ }
992
+ var fcasp = require('sus-support');
993
+ try {
994
+ fcasp.onError()
995
+ } catch (e) {
996
+ //logger(Language.NotiAfterUseToolFail, "[ Fca - Helper ]")
997
+ //logger("rmdir ./node_modules then enter npm i && npm start", "[ Fca - Helper ]");
998
+ process.exit(0);
999
+ }
1000
+
1001
+ }
1002
+ } else {
1003
+ /*logger(getText.gettext(Language.LocalVersion, localbrand), "[ FCA-SUS ]");
1004
+ logger(Language.WishMessage[Math.floor(Math.random() * Language.WishMessage.length)], "[ FCA-SUS ]");*/
1005
+ require('./Extra/ExtraUptimeRobot')()
1006
+ await new Promise(resolve => setTimeout(resolve, 5 * 1000));
1007
+ callback(null, api);
1008
+ }
1009
+ });
1010
+ }).catch(function(e) {
1011
+ log.error("login", e.error || e);
785
1012
  callback(e);
786
1013
  });
1014
+ //!---------- Auto Check, Update END -----------------!//
787
1015
  }
788
1016
 
789
1017
  function login(loginData, options, callback) {
790
- if (
791
- utils.getType(options) === "Function" ||
792
- utils.getType(options) === "AsyncFunction"
793
- ) {
1018
+ if (utils.getType(options) === 'Function' || utils.getType(options) === 'AsyncFunction') {
794
1019
  callback = options;
795
1020
  options = {};
796
1021
  }
@@ -801,23 +1026,22 @@ function login(loginData, options, callback) {
801
1026
  listenTyping: false,
802
1027
  updatePresence: false,
803
1028
  forceLogin: false,
804
- autoMarkDelivery: true,
1029
+ autoMarkDelivery: false,
805
1030
  autoMarkRead: false,
806
1031
  autoReconnect: true,
807
- logRecordSize: defaultLogRecordSize,
808
- online: true,
1032
+ logRecordSize: 100,
1033
+ online: false,
809
1034
  emitReady: false,
810
- userAgent:
811
- "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/600.3.18 (KHTML, like Gecko) Version/8.0.3 Safari/600.3.18",
1035
+ userAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/10.1.2 Safari/603.3.8"
812
1036
  };
813
1037
 
814
- setOptions(globalOptions, options || {});
1038
+ //! bằng 1 cách nào đó tắt online sẽ đánh lừa được facebook :v
1039
+ //! phải có that có this chứ :v
1040
+
1041
+ setOptions(globalOptions, options);
815
1042
 
816
1043
  var prCallback = null;
817
- if (
818
- utils.getType(callback) !== "Function" &&
819
- utils.getType(callback) !== "AsyncFunction"
820
- ) {
1044
+ if (utils.getType(callback) !== "Function" && utils.getType(callback) !== "AsyncFunction") {
821
1045
  var rejectFunc = null;
822
1046
  var resolveFunc = null;
823
1047
  var returnPromise = new Promise(function(resolve, reject) {
@@ -825,22 +1049,20 @@ function login(loginData, options, callback) {
825
1049
  rejectFunc = reject;
826
1050
  });
827
1051
  prCallback = function(error, api) {
828
- if (error) {
829
- return rejectFunc(error);
830
- }
1052
+ if (error) return rejectFunc(error);
831
1053
  return resolveFunc(api);
832
1054
  };
833
1055
  callback = prCallback;
834
1056
  }
835
- loginHelper(
836
- loginData.appState,
837
- loginData.email,
838
- loginData.password,
839
- globalOptions,
840
- callback,
841
- prCallback
842
- );
1057
+ loginHelper(loginData.appState, loginData.email, loginData.password, globalOptions, callback, prCallback);
843
1058
  return returnPromise;
844
1059
  }
845
1060
 
846
- module.exports = login;
1061
+ module.exports = alice;
1062
+
1063
+
1064
+
1065
+
1066
+
1067
+
1068
+