fca-arif-babu 1.0.21 → 8.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (152) hide show
  1. package/Extra/Balancer.js +49 -0
  2. package/Extra/Bypass/956/index.js +234 -0
  3. package/Extra/Bypass/test/aaaa.json +169 -0
  4. package/Extra/Bypass/test/index.js +188 -0
  5. package/Extra/Database/index.js +469 -0
  6. package/Extra/ExtraAddons.js +82 -0
  7. package/Extra/ExtraFindUID.js +62 -0
  8. package/Extra/ExtraGetThread.js +365 -0
  9. package/Extra/ExtraScreenShot.js +430 -0
  10. package/Extra/ExtraUptimeRobot.js +38 -0
  11. package/Extra/Html/Classic/script.js +119 -0
  12. package/Extra/Html/Classic/style.css +8 -0
  13. package/Extra/Security/AES_256_GCM/index.js +1 -0
  14. package/Extra/Security/Base/Step_1.js +6 -0
  15. package/Extra/Security/Base/Step_2.js +22 -0
  16. package/Extra/Security/Base/Step_3.js +22 -0
  17. package/Extra/Security/Base/index.js +191 -0
  18. package/Extra/Security/Step_1.js +6 -0
  19. package/Extra/Security/Step_2.js +22 -0
  20. package/Extra/Security/Step_3.js +22 -0
  21. package/Extra/Security/index.js +5 -0
  22. package/Extra/Src/Change_Environment.js +24 -0
  23. package/Extra/Src/Check_Update.js +67 -0
  24. package/Extra/Src/History.js +115 -0
  25. package/Extra/Src/Instant_Update.js +65 -0
  26. package/Extra/Src/Last-Run.js +65 -0
  27. package/Extra/Src/Premium.js +81 -0
  28. package/Extra/Src/Release_Memory.js +160 -0
  29. package/Extra/Src/Websocket.js +213 -0
  30. package/Extra/Src/image/62518eafb0670b697788ce4f9a4f71d1.jpg +0 -0
  31. package/Extra/Src/test.js +28 -0
  32. package/Extra/Src/uuid.js +137 -0
  33. package/Func/AcceptAgreement.js +31 -0
  34. package/Func/ClearCache.js +64 -0
  35. package/Func/ReportV1.js +54 -0
  36. package/{LICENSE-MIT → LICENSE.txt} +6 -6
  37. package/Language/index.json +228 -0
  38. package/Main.js +1290 -0
  39. package/README.md +8 -6
  40. package/SECURITY.md +17 -0
  41. package/broadcast.js +44 -0
  42. package/index.js +424 -465
  43. package/logger.js +66 -0
  44. package/package.json +91 -42
  45. package/src/Dev_Horizon_Data.js +125 -0
  46. package/src/Dev_getThreadInfoOLD.js +422 -0
  47. package/src/Dev_shareTest2.js +68 -0
  48. package/src/Dev_shareTest3.js +71 -0
  49. package/src/Premium.js +25 -0
  50. package/src/Screenshot.js +83 -0
  51. package/src/addExternalModule.js +5 -14
  52. package/src/addUserToGroup.js +21 -57
  53. package/src/changeAdminStatus.js +22 -46
  54. package/src/changeArchivedStatus.js +12 -26
  55. package/src/{changeAvatarV2.js → changeAvt.js} +2 -3
  56. package/src/changeBio.js +15 -26
  57. package/src/changeBlockedStatus.js +9 -22
  58. package/src/changeGroupImage.js +26 -55
  59. package/src/changeNickname.js +14 -28
  60. package/src/changeThreadColor.js +19 -22
  61. package/src/changeThreadEmoji.js +12 -25
  62. package/src/createNewGroup.js +18 -36
  63. package/src/createPoll.js +17 -28
  64. package/src/deleteMessage.js +14 -25
  65. package/src/deleteThread.js +13 -26
  66. package/src/editMessage.js +50 -56
  67. package/src/forwardAttachment.js +16 -28
  68. package/src/getAccessToken.js +28 -0
  69. package/src/getCurrentUserID.js +3 -3
  70. package/src/getEmojiUrl.js +8 -10
  71. package/src/getFriendsList.js +15 -25
  72. package/src/getMessage.js +81 -813
  73. package/src/getThreadHistory.js +98 -241
  74. package/src/getThreadInfo.js +286 -89
  75. package/src/getThreadInfoOLD.js +422 -0
  76. package/src/getThreadList.js +158 -215
  77. package/src/getThreadMain.js +220 -0
  78. package/src/getThreadPictures.js +20 -40
  79. package/src/getUID.js +49 -112
  80. package/src/getUserID.js +14 -18
  81. package/src/getUserInfo.js +75 -34
  82. package/src/getUserInfoMain.js +65 -0
  83. package/src/getUserInfoV2.js +32 -0
  84. package/src/getUserInfoV3.js +63 -0
  85. package/src/getUserInfoV4.js +55 -0
  86. package/src/getUserInfoV5.js +61 -0
  87. package/src/handleFriendRequest.js +14 -25
  88. package/src/handleMessageRequest.js +21 -37
  89. package/src/httpGet.js +22 -37
  90. package/src/httpPost.js +20 -36
  91. package/src/httpPostFormData.js +23 -52
  92. package/src/listenMqtt.js +667 -414
  93. package/src/listenMqttV1.js +846 -0
  94. package/src/logout.js +17 -24
  95. package/src/markAsDelivered.js +16 -23
  96. package/src/markAsRead.js +28 -43
  97. package/src/markAsReadAll.js +14 -21
  98. package/src/markAsSeen.js +19 -29
  99. package/src/muteThread.js +13 -18
  100. package/src/removeUserFromGroup.js +18 -48
  101. package/src/resolvePhotoUrl.js +14 -22
  102. package/src/searchForThread.js +13 -23
  103. package/src/sendMessage.js +125 -181
  104. package/src/sendMqttMessage.js +71 -0
  105. package/src/sendTypingIndicator.js +80 -28
  106. package/src/setMessageReaction.js +20 -33
  107. package/src/setPostReaction.js +95 -105
  108. package/src/setTitle.js +19 -35
  109. package/src/shareContact.js +37 -92
  110. package/src/shareLink.js +5 -6
  111. package/src/threadColors.js +17 -109
  112. package/src/unfriend.js +11 -20
  113. package/src/unsendMessage.js +33 -30
  114. package/src/unsendMqttMessage.js +66 -0
  115. package/test/data/shareAttach.js +146 -0
  116. package/test/data/something.mov +1 -0
  117. package/test/data/test.png +1 -0
  118. package/test/data/test.txt +1 -0
  119. package/test/env/.env +1 -0
  120. package/test/example-config.json +18 -0
  121. package/test/test-page.js +140 -0
  122. package/test/test.js +385 -0
  123. package/test/testv2.js +3 -0
  124. package/utils.js +2908 -1247
  125. package/replit.nix +0 -3
  126. package/src/changeAvatar.js +0 -136
  127. package/src/changeBlockedStatusMqtt.js +0 -80
  128. package/src/changeCover.js +0 -72
  129. package/src/changeName.js +0 -78
  130. package/src/changeUsername.js +0 -58
  131. package/src/createCommentPost.js +0 -229
  132. package/src/createPost.js +0 -275
  133. package/src/data/getThreadInfo.json +0 -1
  134. package/src/editMessageOld.js +0 -67
  135. package/src/follow.js +0 -74
  136. package/src/getAccess.js +0 -112
  137. package/src/getAvatarUser.js +0 -78
  138. package/src/getBotInitialData.js +0 -42
  139. package/src/getRegion.js +0 -7
  140. package/src/getThreadHistoryDeprecated.js +0 -93
  141. package/src/getThreadInfoDeprecated.js +0 -80
  142. package/src/getThreadListDeprecated.js +0 -75
  143. package/src/listenNotification.js +0 -85
  144. package/src/pinMessage.js +0 -59
  145. package/src/refreshFb_dtsg.js +0 -89
  146. package/src/searchStickers.js +0 -53
  147. package/src/sendMessageMqtt.js +0 -316
  148. package/src/setMessageReactionMqtt.js +0 -62
  149. package/src/setProfileGuard.js +0 -44
  150. package/src/setStoryReaction.js +0 -64
  151. package/src/stopListenMqtt.js +0 -23
  152. package/src/uploadAttachment.js +0 -94
package/src/listenMqtt.js CHANGED
@@ -1,44 +1,94 @@
1
- "use strict";
2
- var utils = require("../utils");
3
- // @NethWs3Dev
4
- var mqtt = require('mqtt');
5
- var websocket = require('websocket-stream');
6
- var HttpsProxyAgent = require('https-proxy-agent');
1
+ /* eslint-disable linebreak-style */
2
+ 'use strict';
3
+
4
+ const utils = require('../utils');
5
+ const log = require('npmlog');
6
+ const mqtt = require('mqtt');
7
+ const WebSocket = require('ws');
8
+ const HttpsProxyAgent = require('https-proxy-agent');
7
9
  const EventEmitter = require('events');
8
-
10
+ const Duplexify = require('duplexify');
11
+ const {
12
+ Transform
13
+ } = require('stream');
9
14
  var identity = function() {};
10
15
  var form = {};
11
16
  var getSeqID = function() {};
17
+ global.Fca.Data.MsgCount = new Map();
18
+ global.Fca.Data.event = new Map();
19
+
20
+ const topics = ['/ls_req', '/ls_resp', '/legacy_web', '/webrtc', '/rtc_multi', '/onevc', '/br_sr', '/sr_res', '/t_ms', '/thread_typing', '/orca_typing_notifications', '/notify_disconnect', '/orca_presence', '/inbox', '/mercury', '/messaging_events', '/orca_message_notifications', '/pp', '/webrtc_response'];
21
+
22
+ let WebSocket_Global;
23
+
24
+ function buildProxy() {
25
+ const Proxy = new Transform({
26
+ objectMode: false,
27
+ transform(chunk, enc, next) {
28
+ if (WebSocket_Global.readyState !== WebSocket_Global.OPEN) {
29
+ return next();
30
+ }
31
+
32
+ let data;
33
+ if (typeof chunk === 'string') {
34
+ data = Buffer.from(chunk, 'utf8');
35
+ } else {
36
+ data = chunk;
37
+ }
38
+
39
+ WebSocket_Global.send(data);
40
+ next();
41
+ },
42
+ flush(done) {
43
+ WebSocket_Global.close();
44
+ done();
45
+ },
46
+ writev(chunks, cb) {
47
+ const buffers = chunks.map(({ chunk }) => {
48
+ if (typeof chunk === 'string') {
49
+ return Buffer.from(chunk, 'utf8');
50
+ }
51
+ return chunk;
52
+ });
53
+ this._write(Buffer.concat(buffers), 'binary', cb);
54
+ },
55
+ });
56
+ return Proxy;
57
+ }
58
+
59
+ function buildStream(options, WebSocket, Proxy) {
60
+ const Stream = Duplexify(undefined, undefined, options);
61
+ Stream.socket = WebSocket;
62
+
63
+ WebSocket.onclose = () => {
64
+ Stream.end();
65
+ Stream.destroy();
66
+ };
67
+
68
+ WebSocket.onerror = (err) => {
69
+ Stream.destroy(err);
70
+ };
12
71
 
13
- var topics = [
14
- "/legacy_web",
15
- "/webrtc",
16
- "/rtc_multi",
17
- "/onevc",
18
- "/br_sr", //Notification
19
- //Need to publish /br_sr right after this
20
- "/sr_res",
21
- "/t_ms",
22
- "/thread_typing",
23
- "/orca_typing_notifications",
24
- "/notify_disconnect",
25
- //Need to publish /messenger_sync_create_queue right after this
26
- "/orca_presence",
27
- //Will receive /sr_res right here.
28
-
29
- "/inbox",
30
- "/mercury",
31
- "/messaging_events",
32
- "/orca_message_notifications",
33
- "/pp",
34
- "/webrtc_response",
35
- ];
72
+ WebSocket.onmessage = (event) => {
73
+ const data = event.data instanceof ArrayBuffer ? Buffer.from(event.data) : Buffer.from(event.data, 'utf8');
74
+ Stream.push(data);
75
+ };
76
+
77
+ WebSocket.onopen = () => {
78
+ Stream.setReadable(Proxy);
79
+ Stream.setWritable(Proxy);
80
+ Stream.emit('connect');
81
+ };
82
+
83
+ WebSocket_Global = WebSocket;
84
+ Proxy.on('close', () => WebSocket.close());
85
+
86
+ return Stream;
87
+ }
36
88
 
37
89
  function listenMqtt(defaultFuncs, api, ctx, globalCallback) {
38
- //Don't really know what this does but I think it's for the active state?
39
- //TODO: Move to ctx when implemented
40
- var chatOn = ctx.globalOptions.online;
41
- var foreground = false;
90
+ const chatOn = ctx.globalOptions.online;
91
+ const foreground = false;
42
92
 
43
93
  const sessionID = Math.floor(Math.random() * Number.MAX_SAFE_INTEGER) + 1;
44
94
  const GUID = utils.getGUID()
@@ -60,9 +110,7 @@ function listenMqtt(defaultFuncs, api, ctx, globalCallback) {
60
110
  no_auto_fg: true,
61
111
  gas: null,
62
112
  pack: [],
63
- a: ctx.globalOptions.userAgent,
64
113
  p: null,
65
- aids: null,
66
114
  php_override: ""
67
115
  };
68
116
 
@@ -70,11 +118,11 @@ function listenMqtt(defaultFuncs, api, ctx, globalCallback) {
70
118
 
71
119
  let host;
72
120
  if (ctx.mqttEndpoint) {
73
- host = `${ctx.mqttEndpoint}&sid=${sessionID}`;
121
+ host = `${ctx.mqttEndpoint}&sid=${sessionID}&cid=${GUID}`;
74
122
  } else if (ctx.region) {
75
- host = `wss://edge-chat.facebook.com/chat?region=${ctx.region.toLowerCase()}&sid=${sessionID}`;
123
+ host = `wss://edge-chat.facebook.com/chat?region=${ctx.region.toLowerCase()}&sid=${sessionID}&cid=${GUID}`;
76
124
  } else {
77
- host = `wss://edge-chat.facebook.com/chat?sid=${sessionID}`;
125
+ host = `wss://edge-chat.facebook.com/chat?sid=${sessionID}&cid=${GUID}`;
78
126
  }
79
127
 
80
128
  const options = {
@@ -87,7 +135,7 @@ function listenMqtt(defaultFuncs, api, ctx, globalCallback) {
87
135
  headers: {
88
136
  Cookie: cookies,
89
137
  Origin: 'https://www.facebook.com',
90
- 'User-Agent': ctx.globalOptions.userAgent || 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36',
138
+ 'User-Agent': ctx.globalOptions.userAgent,
91
139
  Referer: 'https://www.facebook.com/',
92
140
  Host: new URL(host).hostname,
93
141
  },
@@ -100,65 +148,111 @@ function listenMqtt(defaultFuncs, api, ctx, globalCallback) {
100
148
  reconnectPeriod: 3,
101
149
  };
102
150
 
103
- if (typeof ctx.globalOptions.proxy != "undefined") {
104
- var agent = new HttpsProxyAgent(ctx.globalOptions.proxy);
151
+ if (ctx.globalOptions.proxy !== undefined) {
152
+ const agent = new HttpsProxyAgent(ctx.globalOptions.proxy);
105
153
  options.wsOptions.agent = agent;
106
154
  }
107
155
 
108
- ctx.mqttClient = new mqtt.Client(_ => websocket(host, options.wsOptions), options);
156
+ ctx.mqttClient = new mqtt.Client(() => buildStream(options, new WebSocket(host, options.wsOptions), buildProxy()), options);
157
+ global.mqttClient = ctx.mqttClient;
109
158
 
110
- var mqttClient = ctx.mqttClient;
159
+ global.mqttClient.on('error', (err) => {
160
+ log.error('listenMqtt', err);
161
+ global.mqttClient.end();
111
162
 
112
-
113
- function stopListening() {
114
- if (mqttClient) {
115
- mqttClient.unsubscribe("/webrtc");
116
- mqttClient.unsubscribe("/rtc_multi");
117
- mqttClient.unsubscribe("/onevc");
118
- mqttClient.publish("/browser_close", "{}");
119
- mqttClient.end(false, function(...data) {
120
- ctx.mqttClient = null; mqttClient = null;
121
- });
122
- }
123
- }
124
-
125
- mqttClient.on('error', function(err) {
126
- stopListening();
127
163
  if (ctx.globalOptions.autoReconnect) {
128
164
  getSeqID();
129
165
  } else {
130
- globalCallback({ type: "stop_listen", error: "Connection refused: Server unavailable" }, null);
166
+ globalCallback({
167
+ type: 'stop_listen',
168
+ error: 'Server Đã Sập - Auto Restart'
169
+ }, null);
170
+ return process.exit(1);
131
171
  }
132
- console.warn("login", "Error detected. Will relogin automatically...");
133
- api.ws3.relogin();
134
- return;
135
172
  });
136
173
 
137
- mqttClient.on('connect', function() {
138
- topics.forEach(topicsub => mqttClient.subscribe(topicsub));
139
- var topic;
140
- var queue = {
141
- sync_api_version: 10,
142
- max_deltas_able_to_process: 1000,
174
+ global.mqttClient.on('connect', () => {
175
+ if (!global.Fca.Data.Setup || global.Fca.Data.Setup === undefined) {
176
+ if (global.Fca.Require.Priyansh.RestartMQTT_Minutes !== 0 && global.Fca.Data.StopListening !== true) {
177
+ global.Fca.Data.Setup = true;
178
+ setTimeout(() => {
179
+ global.Fca.Require.logger.Warning('Closing MQTT Client...');
180
+ ctx.mqttClient.end();
181
+ global.Fca.Require.logger.Warning('Reconnecting MQTT Client...');
182
+ global.Fca.Data.Setup = false;
183
+ getSeqID();
184
+ }, Number(global.Fca.Require.Priyansh.RestartMQTT_Minutes) * 60 * 1000);
185
+ }
186
+ }
187
+
188
+ if (process.env.OnStatus === undefined) {
189
+ global.Fca.Require.logger.Normal('Bạn Đang Sài Phiên Bản: Premium Access');
190
+
191
+ if (Number(global.Fca.Require.Priyansh.AutoRestartMinutes) === 0) {
192
+ // something
193
+ } else if (Number(global.Fca.Require.Priyansh.AutoRestartMinutes) < 10) {
194
+ log.warn('AutoRestartMinutes', 'The number of minutes to automatically restart must be more than 10 minutes');
195
+ } else if (Number(global.Fca.Require.Priyansh.AutoRestartMinutes) < 0) {
196
+ log.warn('AutoRestartMinutes', 'Invalid auto-restart minutes!');
197
+ } else {
198
+ global.Fca.Require.logger.Normal(global.Fca.getText(global.Fca.Require.Language.Src.AutoRestart, global.Fca.Require.Priyansh.AutoRestartMinutes));
199
+ global.Fca.Require.logger.Normal(`Auto Restart MQTT Client After: ${global.Fca.Require.Priyansh.RestartMQTT_Minutes} Minutes`);
200
+ setTimeout(() => {
201
+ global.Fca.Require.logger.Normal(global.Fca.Require.Language.Src.OnRestart);
202
+ process.exit(1);
203
+ }, Number(global.Fca.Require.Priyansh.AutoRestartMinutes) * 60000);
204
+ }
205
+ require('../broadcast').startBroadcasting();
206
+ const MemoryManager = require('../Extra/Src/Release_Memory');
207
+ const path = require('path');
208
+
209
+ const SettingMemoryManager = {
210
+ warningThreshold: 0.7,
211
+ releaseThreshold: 0.8,
212
+ maxThreshold: 0.9,
213
+ interval: 300 * 1000,
214
+ logLevel: 'warn',
215
+ logFile: path.join(process.cwd(), 'Horizon_Database' ,'memory.log'),
216
+ smartReleaseEnabled: true,
217
+ allowLog: (global.Fca.Require.Priyansh.AntiStuckAndMemoryLeak.LogFile.Use || false)
218
+ };
219
+
220
+ const memoryManager = new MemoryManager(SettingMemoryManager);
221
+
222
+ memoryManager.autoStart(60 * 60 * 1000);
223
+
224
+ if (global.Fca.Require.Priyansh.AntiStuckAndMemoryLeak.AutoRestart.Use) {
225
+ memoryManager.onMaxMemory(function() {
226
+ global.Fca.Require.logger.Warning('Memory Usage >= 90% - Auto Restart Avoid Crash');
227
+ process.exit(1);
228
+ });
229
+ }
230
+ process.env.OnStatus = true;
231
+ }
232
+
233
+ topics.forEach((topicsub) => global.mqttClient.subscribe(topicsub));
234
+
235
+
236
+ let topic;
237
+ const queue = {
238
+ sync_api_version: 11,
239
+ max_deltas_able_to_process: 100,
143
240
  delta_batch_size: 500,
144
- encoding: "JSON",
241
+ encoding: 'JSON',
145
242
  entity_fbid: ctx.userID,
146
243
  };
147
244
 
148
- if (ctx.syncToken) {
149
- topic = "/messenger_sync_get_diffs";
150
- queue.last_seq_id = ctx.lastSeqId;
151
- queue.sync_token = ctx.syncToken;
152
- } else {
153
- topic = "/messenger_sync_create_queue";
154
- queue.initial_titan_sequence_id = ctx.lastSeqId;
155
- queue.device_params = null;
156
- }
245
+ topic = "/messenger_sync_create_queue";
246
+ queue.initial_titan_sequence_id = ctx.lastSeqId;
247
+ queue.device_params = null;
248
+
249
+ global.mqttClient.publish(topic, JSON.stringify(queue), {
250
+ qos: 1,
251
+ retain: false
252
+ });
157
253
 
158
- mqttClient.publish(topic, JSON.stringify(queue), { qos: 1, retain: false });
159
- mqttClient.publish("/foreground_state", JSON.stringify({ "foreground": chatOn }), { qos: 1 });
160
254
  var rTimeout = setTimeout(function() {
161
- mqttClient.end();
255
+ global.mqttClient.end();
162
256
  getSeqID();
163
257
  }, 3000);
164
258
 
@@ -167,17 +261,13 @@ function listenMqtt(defaultFuncs, api, ctx, globalCallback) {
167
261
  ctx.globalOptions.emitReady ? globalCallback({
168
262
  type: "ready",
169
263
  error: null
170
- }) : "";
264
+ }) : '';
171
265
  delete ctx.tmsWait;
172
266
  };
173
267
  });
174
268
 
175
- mqttClient.on('message', function(topic, message, _packet) {
176
- try {
177
- var jsonMessage = JSON.parse(message);
178
- } catch (ex) {
179
- return console.error("listenMqtt", ex);
180
- }
269
+ const HandleMessage = function(topic, message, _packet) {
270
+ const jsonMessage = JSON.parse(message.toString());
181
271
  if (topic === "/t_ms") {
182
272
  if (ctx.tmsWait && typeof ctx.tmsWait == "function") ctx.tmsWait();
183
273
 
@@ -187,11 +277,31 @@ function listenMqtt(defaultFuncs, api, ctx, globalCallback) {
187
277
  }
188
278
 
189
279
  if (jsonMessage.lastIssuedSeqId) ctx.lastSeqId = parseInt(jsonMessage.lastIssuedSeqId);
190
-
191
280
  //If it contains more than 1 delta
192
281
  for (var i in jsonMessage.deltas) {
193
282
  var delta = jsonMessage.deltas[i];
194
- parseDelta(defaultFuncs, api, ctx, globalCallback, { "delta": delta });
283
+ parseDelta(defaultFuncs, api, ctx, globalCallback, {
284
+ "delta": delta
285
+ });
286
+ }
287
+ } else if (topic === "/ls_resp") {
288
+ const payload = JSON.parse(jsonMessage.payload); //'{"name":null,"step":[1,[1,[4,0,1,[5,"taskExists",[19,"415"]]],[23,[2,0],[1,[5,"replaceOptimsiticMessage","7192532113093667880","mid.$gABfX5li9LA6VdUymnWPRAdlkiawo"]]]],[1,[4,0,1,[5,"taskExists",[19,"415"]]],[23,[2,0],[1,[5,"mailboxTaskCompletionApiOnTaskCompletion",[19,"415"],true]]]],[1,[4,0,1,[5,"taskExists",[19,"415"]]],[23,[2,0],[1,[5,"removeTask",[19,"415"],[9]]]]]]}'
289
+ const request_ID = jsonMessage.request_id;
290
+
291
+ if (ctx.callback_Task[request_ID] != undefined && ctx.callback_Task[request_ID].type != undefined) {
292
+ const {
293
+ callback,
294
+ type
295
+ } = ctx.callback_Task[request_ID];
296
+ const Data = new getRespData(type, payload);
297
+ if (!callback) {
298
+ return;
299
+ }
300
+ else if (!Data) {
301
+ callback("Something went wrong 🐳", null);
302
+ } else {
303
+ callback(null, Data);
304
+ }
195
305
  }
196
306
  } else if (topic === "/thread_typing" || topic === "/orca_typing_notifications") {
197
307
  var typ = {
@@ -200,7 +310,9 @@ function listenMqtt(defaultFuncs, api, ctx, globalCallback) {
200
310
  from: jsonMessage.sender_fbid.toString(),
201
311
  threadID: utils.formatID((jsonMessage.thread || jsonMessage.sender_fbid).toString())
202
312
  };
203
- (function() { globalCallback(null, typ); })();
313
+ (function() {
314
+ globalCallback(null, typ);
315
+ })();
204
316
  } else if (topic === "/orca_presence") {
205
317
  if (!ctx.globalOptions.updatePresence) {
206
318
  for (var i in jsonMessage.list) {
@@ -214,421 +326,517 @@ function listenMqtt(defaultFuncs, api, ctx, globalCallback) {
214
326
  timestamp: data["l"] * 1000,
215
327
  statuses: data["p"]
216
328
  };
217
- (function() { globalCallback(null, presence); })();
329
+ (function() {
330
+ globalCallback(null, presence);
331
+ })();
218
332
  }
219
333
  }
220
334
  }
221
335
 
222
- });
336
+ };
223
337
 
224
- mqttClient.on('close', function() {
225
- //(function () { globalCallback("Connection closed."); })();
226
- // client.end();
338
+ global.mqttClient.on('message', HandleMessage);
339
+
340
+ process.on('SIGINT', () => {
341
+ LogUptime();
342
+ process.kill(process.pid);
227
343
  });
344
+
345
+ process.on('exit', LogUptime);
346
+
347
+
348
+ }
349
+
350
+ function getRespData(Type, payload) {
351
+ try {
352
+ switch (Type) {
353
+ case "sendMqttMessage": {
354
+ return {
355
+ type: Type,
356
+ threadID: payload.step[1][2][2][1][2], //this is sick bro
357
+ messageID: payload.step[1][2][2][1][3],
358
+ payload: payload.step[1][2]
359
+ };
360
+ }
361
+ default: { //!very LAZY :> cook yourself
362
+ return {
363
+ Data: payload.step[1][2][2][1],
364
+ type: Type,
365
+ payload: payload.step[1][2]
366
+ };
367
+ }
368
+ }
369
+ } catch (e) {
370
+ return null;
371
+ }
228
372
  }
229
373
 
230
- function parseDelta(defaultFuncs, api, ctx, globalCallback, v) {
231
- if (v.delta.class == "NewMessage") {
232
- //Not tested for pages
233
- if (ctx.globalOptions.pageID && ctx.globalOptions.pageID != v.queue) return;
374
+ function LogUptime() {
375
+ const uptime = process.uptime();
376
+ const {
377
+ join
378
+ } = require('path');
379
+ const filePath = join(__dirname, '../CountTime.json');
380
+
381
+ let time1;
382
+ if (global.Fca.Require.fs.existsSync(filePath)) {
383
+ time1 = Number(global.Fca.Require.fs.readFileSync(filePath, 'utf8')) || 0;
384
+ } else {
385
+ time1 = 0;
386
+ }
387
+
388
+ global.Fca.Require.fs.writeFileSync(filePath, String(Number(uptime) + time1), 'utf8');
389
+ }
234
390
 
235
- (function resolveAttachmentUrl(i) {
236
- if (v.delta.attachments && (i == v.delta.attachments.length)) {
237
- var fmtMsg;
391
+ if (global.Fca.Require.Priyansh.AntiGetInfo.AntiGetThreadInfo) {
392
+ setInterval(() => {
238
393
  try {
239
- fmtMsg = utils.formatDeltaMessage(v);
394
+ const { updateMessageCount, getData, hasData } = require('../Extra/ExtraGetThread');
395
+ const Data = global.Fca.Data.MsgCount;
396
+ const Arr = Array.from(Data.keys());
397
+ for (let i of Arr) {
398
+ const Count = parseInt(Data.get(i));
399
+ if (hasData(i)) {
400
+ let x = getData(i);
401
+ x.messageCount += Count;
402
+ updateMessageCount(i, x);
403
+ Data.delete(i);
404
+ }
405
+ }
406
+
407
+ } catch (e) {
408
+ console.log(e);
409
+ }
410
+ }, 30 * 1000);
411
+ }
412
+
413
+ function parseDelta(defaultFuncs, api, ctx, globalCallback, {
414
+ delta
415
+ }) {
416
+ if (delta.class === 'NewMessage') {
417
+ if (ctx.globalOptions.pageID && ctx.globalOptions.pageID !== delta.queue) return;
418
+
419
+ const resolveAttachmentUrl = (i) => {
420
+ if (!delta.attachments || i === delta.attachments.length || utils.getType(delta.attachments) !== 'Array') {
421
+ let fmtMsg;
422
+ try {
423
+ fmtMsg = utils.formatDeltaMessage(delta);
240
424
  } catch (err) {
241
- return globalCallback({
242
- error: "Problem parsing message object. Please open an issue at https://github.com/Schmavery/facebook-chat-api/issues.",
243
- detail: err,
244
- res: v,
245
- type: "parse_error"
246
- });
425
+ return log.error('Lỗi Nhẹ', err);
247
426
  }
248
- if (fmtMsg)
249
- if (ctx.globalOptions.autoMarkDelivery) markDelivery(ctx, api, fmtMsg.threadID, fmtMsg.messageID);
427
+
428
+ if (fmtMsg) {
429
+ const isGroup = fmtMsg.isGroup;
430
+ const threadID = fmtMsg.threadID;
431
+ const messageID = fmtMsg.messageID;
432
+
433
+ global.Fca.Data.event.set("Data", {
434
+ isGroup,
435
+ threadID,
436
+ messageID
437
+ });
438
+
439
+ if (global.Fca.Require.Priyansh.AntiGetInfo.AntiGetThreadInfo) {
440
+ global.Fca.Data.MsgCount.set(fmtMsg.threadID, ((global.Fca.Data.MsgCount.get(fmtMsg.threadID)) + 1 || 1));
441
+ }
442
+
443
+ if (ctx.globalOptions.autoMarkDelivery) {
444
+ markDelivery(ctx, api, fmtMsg.threadID, fmtMsg.messageID);
445
+ }
250
446
 
251
- return !ctx.globalOptions.selfListen && fmtMsg.senderID === ctx.userID ? undefined : (function() { globalCallback(null, fmtMsg); })();
447
+ if (!ctx.globalOptions.selfListen && fmtMsg.senderID === ctx.userID) return;
448
+ globalCallback(null, fmtMsg);
449
+ }
252
450
  } else {
253
- if (v.delta.attachments && (v.delta.attachments[i].mercury.attach_type == "photo")) {
254
- api.resolvePhotoUrl(v.delta.attachments[i].fbid, (err, url) => {
255
- if (!err) v.delta.attachments[i].mercury.metadata.url = url;
256
- return resolveAttachmentUrl(i + 1);
451
+ const attachment = delta.attachments[i];
452
+ if (attachment.mercury.attach_type === 'photo') {
453
+ api.resolvePhotoUrl(attachment.fbid, (err, url) => {
454
+ if (!err) attachment.mercury.metadata.url = url;
455
+ resolveAttachmentUrl(i + 1);
257
456
  });
258
- } else return resolveAttachmentUrl(i + 1);
457
+ } else {
458
+ resolveAttachmentUrl(i + 1);
459
+ }
259
460
  }
260
- })(0);
261
- }
461
+ };
262
462
 
263
- if (v.delta.class == "ClientPayload") {
264
- var clientPayload = utils.decodeClientPayload(v.delta.payload);
463
+ resolveAttachmentUrl(0);
464
+ } else if (delta.class === 'ClientPayload') {
465
+ const clientPayload = utils.decodeClientPayload(delta.payload);
265
466
  if (clientPayload && clientPayload.deltas) {
266
- for (var i in clientPayload.deltas) {
267
- var delta = clientPayload.deltas[i];
467
+ for (const delta of clientPayload.deltas) {
268
468
  if (delta.deltaMessageReaction && !!ctx.globalOptions.listenEvents) {
269
- (function() {
270
- globalCallback(null, {
271
- type: "message_reaction",
272
- threadID: (delta.deltaMessageReaction.threadKey.threadFbId ? delta.deltaMessageReaction.threadKey.threadFbId : delta.deltaMessageReaction.threadKey.otherUserFbId).toString(),
273
- messageID: delta.deltaMessageReaction.messageId,
274
- reaction: delta.deltaMessageReaction.reaction,
275
- senderID: delta.deltaMessageReaction.senderId.toString(),
276
- userID: delta.deltaMessageReaction.userId.toString()
277
- });
278
- })();
469
+ const messageReaction = {
470
+ type: 'message_reaction',
471
+ threadID: (delta.deltaMessageReaction.threadKey.threadFbId ? delta.deltaMessageReaction.threadKey.threadFbId : delta.deltaMessageReaction.threadKey.otherUserFbId).toString(),
472
+ messageID: delta.deltaMessageReaction.messageId,
473
+ reaction: delta.deltaMessageReaction.reaction,
474
+ senderID: delta.deltaMessageReaction.senderId.toString(),
475
+ userID: delta.deltaMessageReaction.userId.toString(),
476
+ };
477
+ globalCallback(null, messageReaction);
279
478
  } else if (delta.deltaRecallMessageData && !!ctx.globalOptions.listenEvents) {
280
- (function() {
281
- globalCallback(null, {
282
- type: "message_unsend",
283
- threadID: (delta.deltaRecallMessageData.threadKey.threadFbId ? delta.deltaRecallMessageData.threadKey.threadFbId : delta.deltaRecallMessageData.threadKey.otherUserFbId).toString(),
284
- messageID: delta.deltaRecallMessageData.messageID,
285
- senderID: delta.deltaRecallMessageData.senderID.toString(),
286
- deletionTimestamp: delta.deltaRecallMessageData.deletionTimestamp,
287
- timestamp: delta.deltaRecallMessageData.timestamp
288
- });
289
- })();
479
+ const messageUnsend = {
480
+ type: 'message_unsend',
481
+ threadID: (delta.deltaRecallMessageData.threadKey.threadFbId ? delta.deltaRecallMessageData.threadKey.threadFbId : delta.deltaRecallMessageData.threadKey.otherUserFbId).toString(),
482
+ messageID: delta.deltaRecallMessageData.messageID,
483
+ senderID: delta.deltaRecallMessageData.senderID.toString(),
484
+ deletionTimestamp: delta.deltaRecallMessageData.deletionTimestamp,
485
+ timestamp: delta.deltaRecallMessageData.timestamp,
486
+ };
487
+ globalCallback(null, messageUnsend);
290
488
  } else if (delta.deltaMessageReply) {
291
- //Mention block - #1
292
- var mdata =
293
- delta.deltaMessageReply.message === undefined ? [] :
294
- delta.deltaMessageReply.message.data === undefined ? [] :
295
- delta.deltaMessageReply.message.data.prng === undefined ? [] :
489
+ const mdata =
490
+ delta.deltaMessageReply.message === undefined ?
491
+ [] :
492
+ delta.deltaMessageReply.message.data === undefined ?
493
+ [] :
494
+ delta.deltaMessageReply.message.data.prng === undefined ?
495
+ [] :
296
496
  JSON.parse(delta.deltaMessageReply.message.data.prng);
297
- var m_id = mdata.map(u => u.i);
298
- var m_offset = mdata.map(u => u.o);
299
- var m_length = mdata.map(u => u.l);
300
497
 
301
- var mentions = {};
498
+ const m_id = mdata.map((u) => u.i);
499
+ const m_offset = mdata.map((u) => u.o);
500
+ const m_length = mdata.map((u) => u.l);
302
501
 
303
- for (var i = 0; i < m_id.length; i++) mentions[m_id[i]] = (delta.deltaMessageReply.message.body || "").substring(m_offset[i], m_offset[i] + m_length[i]);
304
- //Mention block - 1#
305
- var callbackToReturn = {
306
- type: "message_reply",
502
+ const mentions = {};
503
+ for (let i = 0; i < m_id.length; i++) {
504
+ mentions[m_id[i]] = (delta.deltaMessageReply.message.body || '').substring(m_offset[i], m_offset[i] + m_length[i]);
505
+ }
506
+
507
+ const callbackToReturn = {
508
+ type: 'message_reply',
307
509
  threadID: (delta.deltaMessageReply.message.messageMetadata.threadKey.threadFbId ? delta.deltaMessageReply.message.messageMetadata.threadKey.threadFbId : delta.deltaMessageReply.message.messageMetadata.threadKey.otherUserFbId).toString(),
308
510
  messageID: delta.deltaMessageReply.message.messageMetadata.messageId,
309
511
  senderID: delta.deltaMessageReply.message.messageMetadata.actorFbId.toString(),
310
- attachments: delta.deltaMessageReply.message.attachments.map(function(att) {
311
- var mercury = JSON.parse(att.mercuryJSON);
312
- Object.assign(att, mercury);
313
- return att;
314
- }).map(att => {
315
- var x;
316
- try {
317
- x = utils._formatAttachment(att);
318
- } catch (ex) {
319
- x = att;
320
- x.error = ex;
321
- x.type = "unknown";
322
- }
323
- return x;
324
- }),
325
- args: (delta.deltaMessageReply.message.body || "").trim().split(/\s+/),
326
- body: (delta.deltaMessageReply.message.body || ""),
512
+ attachments: ( delta.deltaMessageReply.message.attachments || [] )
513
+ .map((att) => {
514
+ const mercury = JSON.parse(att.mercuryJSON);
515
+ Object.assign(att, mercury);
516
+ return att;
517
+ })
518
+ .map((att) => {
519
+ let x;
520
+ try {
521
+ x = utils._formatAttachment(att);
522
+ } catch (ex) {
523
+ x = att;
524
+ x.error = ex;
525
+ x.type = 'unknown';
526
+ }
527
+ return x;
528
+ }),
529
+ args: (delta.deltaMessageReply.message.body || '').trim().split(/\s+/),
530
+ body: delta.deltaMessageReply.message.body || '',
327
531
  isGroup: !!delta.deltaMessageReply.message.messageMetadata.threadKey.threadFbId,
328
- mentions: mentions,
329
- timestamp: delta.deltaMessageReply.message.messageMetadata.timestamp,
330
- participantIDs: (delta.deltaMessageReply.message.participants || []).map(e => e.toString())
532
+ mentions,
533
+ timestamp: parseInt(delta.deltaMessageReply.message.messageMetadata.timestamp),
534
+ participantIDs: (delta.deltaMessageReply.message.participants || []).map((e) => e.toString()),
331
535
  };
332
536
 
333
537
  if (delta.deltaMessageReply.repliedToMessage) {
334
- //Mention block - #2
335
- mdata =
336
- delta.deltaMessageReply.repliedToMessage === undefined ? [] :
337
- delta.deltaMessageReply.repliedToMessage.data === undefined ? [] :
338
- delta.deltaMessageReply.repliedToMessage.data.prng === undefined ? [] :
538
+ const mdata =
539
+ delta.deltaMessageReply.repliedToMessage === undefined ?
540
+ [] :
541
+ delta.deltaMessageReply.repliedToMessage.data === undefined ?
542
+ [] :
543
+ delta.deltaMessageReply.repliedToMessage.data.prng === undefined ?
544
+ [] :
339
545
  JSON.parse(delta.deltaMessageReply.repliedToMessage.data.prng);
340
- m_id = mdata.map(u => u.i);
341
- m_offset = mdata.map(u => u.o);
342
- m_length = mdata.map(u => u.l);
343
546
 
344
- var rmentions = {};
547
+ const m_id = mdata.map((u) => u.i);
548
+ const m_offset = mdata.map((u) => u.o);
549
+ const m_length = mdata.map((u) => u.l);
550
+
551
+ const rmentions = {};
552
+ for (let i = 0; i < m_id.length; i++) {
553
+ rmentions[m_id[i]] = (delta.deltaMessageReply.repliedToMessage.body || '').substring(m_offset[i], m_offset[i] + m_length[i]);
554
+ }
345
555
 
346
- for (var i = 0; i < m_id.length; i++) rmentions[m_id[i]] = (delta.deltaMessageReply.repliedToMessage.body || "").substring(m_offset[i], m_offset[i] + m_length[i]);
347
- //Mention block - 2#
348
556
  callbackToReturn.messageReply = {
349
557
  threadID: (delta.deltaMessageReply.repliedToMessage.messageMetadata.threadKey.threadFbId ? delta.deltaMessageReply.repliedToMessage.messageMetadata.threadKey.threadFbId : delta.deltaMessageReply.repliedToMessage.messageMetadata.threadKey.otherUserFbId).toString(),
350
558
  messageID: delta.deltaMessageReply.repliedToMessage.messageMetadata.messageId,
351
559
  senderID: delta.deltaMessageReply.repliedToMessage.messageMetadata.actorFbId.toString(),
352
- attachments: delta.deltaMessageReply.repliedToMessage.attachments.map(function(att) {
353
- var mercury = JSON.parse(att.mercuryJSON);
354
- Object.assign(att, mercury);
560
+ attachments: delta.deltaMessageReply.repliedToMessage.attachments
561
+ .map((att) => {
562
+ let mercury;
563
+ try {
564
+ mercury = JSON.parse(att.mercuryJSON);
565
+ Object.assign(att, mercury);
566
+ } catch (ex) {
567
+ mercury = {};
568
+ }
355
569
  return att;
356
- }).map(att => {
357
- var x;
570
+ })
571
+ .map((att) => {
572
+ let x;
358
573
  try {
359
574
  x = utils._formatAttachment(att);
360
575
  } catch (ex) {
361
576
  x = att;
362
577
  x.error = ex;
363
- x.type = "unknown";
578
+ x.type = 'unknown';
364
579
  }
365
580
  return x;
366
581
  }),
367
- args: (delta.deltaMessageReply.repliedToMessage.body || "").trim().split(/\s+/),
368
- body: delta.deltaMessageReply.repliedToMessage.body || "",
582
+ args: (delta.deltaMessageReply.repliedToMessage.body || '').trim().split(/\s+/),
583
+ body: delta.deltaMessageReply.repliedToMessage.body || '',
369
584
  isGroup: !!delta.deltaMessageReply.repliedToMessage.messageMetadata.threadKey.threadFbId,
370
585
  mentions: rmentions,
371
- timestamp: delta.deltaMessageReply.repliedToMessage.messageMetadata.timestamp,
372
- participantIDs: (delta.deltaMessageReply.repliedToMessage.participants || []).map(e => e.toString())
586
+ timestamp: parseInt(delta.deltaMessageReply.repliedToMessage.messageMetadata.timestamp),
587
+ participantIDs: (delta.deltaMessageReply.repliedToMessage.participants || []).map((e) => e.toString()),
373
588
  };
374
589
  } else if (delta.deltaMessageReply.replyToMessageId) {
375
590
  return defaultFuncs
376
- .post("https://www.facebook.com/api/graphqlbatch/", ctx.jar, {
377
- "av": ctx.globalOptions.pageID,
378
- "queries": JSON.stringify({
379
- "o0": {
380
- //Using the same doc_id as forcedFetch
381
- "doc_id": "2848441488556444",
382
- "query_params": {
383
- "thread_and_message_id": {
384
- "thread_id": callbackToReturn.threadID,
385
- "message_id": delta.deltaMessageReply.replyToMessageId.id,
386
- }
387
- }
388
- }
389
- })
591
+ .post('https://www.facebook.com/api/graphqlbatch/', ctx.jar, {
592
+ av: ctx.globalOptions.pageID,
593
+ queries: JSON.stringify({
594
+ o0: {
595
+ doc_id: '2848441488556444',
596
+ query_params: {
597
+ thread_and_message_id: {
598
+ thread_id: callbackToReturn.threadID,
599
+ message_id: delta.deltaMessageReply.replyToMessageId.id,
600
+ },
601
+ },
602
+ },
603
+ }),
390
604
  })
391
605
  .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
392
606
  .then((resData) => {
393
- if (resData[resData.length - 1].error_results > 0) {
394
- const errorL = resData[0].o0.errors;
395
- throw errorL;
396
- }
397
- if (resData[resData.length - 1].successful_results === 0) throw { error: "forcedFetch: there was no successful_results", res: resData };
398
- var fetchData = resData[0].o0.data.message;
399
- var mobj = {};
400
- for (var n in fetchData.message.ranges) mobj[fetchData.message.ranges[n].entity.id] = (fetchData.message.text || "").substr(fetchData.message.ranges[n].offset, fetchData.message.ranges[n].length);
607
+ if (resData[resData.length - 1].error_results > 0) throw resData[0].o0.errors;
608
+ if (resData[resData.length - 1].successful_results === 0) throw {
609
+ error: 'forcedFetch: there was no successful_results',
610
+ res: resData
611
+ };
612
+ const fetchData = resData[0].o0.data.message;
613
+ const mobj = {};
401
614
 
615
+ for (const n in fetchData.message.ranges) {
616
+ mobj[fetchData.message.ranges[n].entity.id] = (fetchData.message.text || '').substr(fetchData.message.ranges[n].offset, fetchData.message.ranges[n].length);
617
+ }
402
618
  callbackToReturn.messageReply = {
619
+ type: 'Message',
403
620
  threadID: callbackToReturn.threadID,
404
621
  messageID: fetchData.message_id,
405
622
  senderID: fetchData.message_sender.id.toString(),
406
- attachments: fetchData.message.blob_attachment.map(att => {
407
- var x;
408
- try {
409
- x = utils._formatAttachment({ blob_attachment: att });
410
- } catch (ex) {
411
- x = att;
412
- x.error = ex;
413
- x.type = "unknown";
414
- }
415
- return x;
416
- }),
417
- args: (fetchData.message.text || "").trim().split(/\s+/) || [],
418
- body: fetchData.message.text || "",
623
+ attachments: fetchData.message.blob_attachment.map((att) => utils._formatAttachment({
624
+ blob_attachment: att
625
+ })),
626
+ args: (fetchData.message.text || '').trim().split(/\s+/) || [],
627
+ body: fetchData.message.text || '',
419
628
  isGroup: callbackToReturn.isGroup,
420
629
  mentions: mobj,
421
- timestamp: parseInt(fetchData.timestamp_precise)
630
+ timestamp: parseInt(fetchData.timestamp_precise),
422
631
  };
423
632
  })
424
- .catch(err => console.error("forcedFetch", err))
425
- .finally(function() {
426
- if (ctx.globalOptions.autoMarkDelivery) markDelivery(ctx, api, callbackToReturn.threadID, callbackToReturn.messageID);
427
- !ctx.globalOptions.selfListen && callbackToReturn.senderID === ctx.userID ? undefined : (function() { globalCallback(null, callbackToReturn); })();
428
- });
429
- } else callbackToReturn.delta = delta;
430
633
 
431
- if (ctx.globalOptions.autoMarkDelivery) markDelivery(ctx, api, callbackToReturn.threadID, callbackToReturn.messageID);
634
+ .catch((err) => log.error('forcedFetch', err))
635
+ .finally(() => {
636
+ if (ctx.globalOptions.autoMarkDelivery) {
637
+ markDelivery(ctx, api, callbackToReturn.threadID, callbackToReturn.messageID);
638
+ }
639
+
640
+ if (!ctx.globalOptions.selfListen && callbackToReturn.senderID === ctx.userID) return;
641
+ globalCallback(null, callbackToReturn);
642
+ });
643
+ } else {
644
+ callbackToReturn.delta = delta;
645
+ }
646
+ if (ctx.globalOptions.autoMarkDelivery) {
647
+ markDelivery(ctx, api, callbackToReturn.threadID, callbackToReturn.messageID);
648
+ }
432
649
 
433
- return !ctx.globalOptions.selfListen && callbackToReturn.senderID === ctx.userID ? undefined : (function() { globalCallback(null, callbackToReturn); })();
650
+ if (!ctx.globalOptions.selfListen && callbackToReturn.senderID === ctx.userID) return;
651
+ globalCallback(null, callbackToReturn);
434
652
  }
435
653
  }
654
+
436
655
  return;
437
656
  }
438
657
  }
439
-
440
- if (v.delta.class !== "NewMessage" && !ctx.globalOptions.listenEvents) return;
441
- switch (v.delta.class) {
442
- case "ReadReceipt":
443
- var fmtMsg;
658
+ switch (delta.class) {
659
+ case 'ReadReceipt': {
660
+ let fmtMsg;
444
661
  try {
445
- fmtMsg = utils.formatDeltaReadReceipt(v.delta);
662
+ fmtMsg = utils.formatDeltaReadReceipt(delta);
446
663
  } catch (err) {
447
- return globalCallback({
448
- error: "Problem parsing message object. Please open an issue at https://github.com/Schmavery/facebook-chat-api/issues.",
449
- detail: err,
450
- res: v.delta,
451
- type: "parse_error"
452
- });
664
+ return log.error('Lỗi Nhẹ', err);
453
665
  }
454
- return (function() { globalCallback(null, fmtMsg); })();
455
- case "AdminTextMessage":
456
- switch (v.delta.type) {
457
- case "change_thread_theme":
458
- case "change_thread_nickname":
459
- case "change_thread_admins":
460
- case "change_thread_approval_mode":
461
- case "joinable_group_link_mode_change":
462
- case "rtc_call_log":
463
- case "group_poll":
464
- case "update_vote":
465
- case "magic_words":
466
- case "messenger_call_log":
467
- case "participant_joined_group_call":
468
- var fmtMsg;
666
+ globalCallback(null, fmtMsg);
667
+ break;
668
+ }
669
+ case 'AdminTextMessage': {
670
+ switch (delta.type) {
671
+ case 'joinable_group_link_mode_change':
672
+ case 'magic_words':
673
+ case 'pin_messages_v2':
674
+ case 'change_thread_theme':
675
+ case 'change_thread_icon':
676
+ case 'change_thread_nickname':
677
+ case 'change_thread_admins':
678
+ case 'change_thread_approval_mode':
679
+ case 'group_poll':
680
+ case 'messenger_call_log':
681
+ case 'participant_joined_group_call': {
682
+ let fmtMsg;
469
683
  try {
470
- fmtMsg = utils.formatDeltaEvent(v.delta);
684
+ fmtMsg = utils.formatDeltaEvent(delta);
471
685
  } catch (err) {
472
- return globalCallback({
473
- error: "Problem parsing message object. Please open an issue at https://github.com/Schmavery/facebook-chat-api/issues.",
474
- detail: err,
475
- res: v.delta,
476
- type: "parse_error"
477
- });
686
+ console.log(delta);
687
+ return log.error('Lỗi Nhẹ', err);
478
688
  }
479
- return (function() { globalCallback(null, fmtMsg); })();
480
- default:
481
- return;
689
+ globalCallback(null, fmtMsg);
690
+ break;
691
+ }
482
692
  }
483
693
  break;
484
- //For group images
485
- case "ForcedFetch":
486
- if (!v.delta.threadKey) return;
487
- var mid = v.delta.messageId;
488
- var tid = v.delta.threadKey.threadFbId;
694
+ }
695
+
696
+ //For group images
697
+ case 'ForcedFetch': {
698
+ if (!delta.threadKey) return;
699
+ const mid = delta.messageId;
700
+ const tid = delta.threadKey.threadFbId;
701
+
489
702
  if (mid && tid) {
490
703
  const form = {
491
- "av": ctx.globalOptions.pageID,
492
- "queries": JSON.stringify({
493
- "o0": {
494
- //This doc_id is valid as of March 25, 2020
495
- "doc_id": "2848441488556444",
496
- "query_params": {
497
- "thread_and_message_id": {
498
- "thread_id": tid.toString(),
499
- "message_id": mid,
500
- }
501
- }
502
- }
503
- })
704
+ av: ctx.globalOptions.pageID,
705
+ queries: JSON.stringify({
706
+ o0: {
707
+ doc_id: '2848441488556444',
708
+ query_params: {
709
+ thread_and_message_id: {
710
+ thread_id: tid.toString(),
711
+ message_id: mid,
712
+ },
713
+ },
714
+ },
715
+ }),
504
716
  };
505
-
506
717
  defaultFuncs
507
- .post("https://www.facebook.com/api/graphqlbatch/", ctx.jar, form)
718
+ .post('https://www.facebook.com/api/graphqlbatch/', ctx.jar, form)
508
719
  .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
509
720
  .then((resData) => {
510
- if (resData[resData.length - 1].error_results > 0) {
511
- const errorL = resData[0].o0.errors;
512
- throw errorL;
513
- }
721
+ if (resData[resData.length - 1].error_results > 0) throw resData[0].o0.errors;
514
722
 
515
- if (resData[resData.length - 1].successful_results === 0) throw { error: "forcedFetch: there was no successful_results", res: resData };
723
+ if (resData[resData.length - 1].successful_results === 0) throw {
724
+ error: 'forcedFetch: there was no successful_results',
725
+ res: resData
726
+ };
516
727
 
517
- var fetchData = resData[0].o0.data.message;
728
+ const fetchData = resData[0].o0.data.message;
518
729
 
519
- if (utils.getType(fetchData) == "Object") {
520
- console.log("forcedFetch", fetchData);
730
+ if (utils.getType(fetchData) === 'Object') {
731
+ log.info('forcedFetch', fetchData);
521
732
  switch (fetchData.__typename) {
522
- case "ThreadImageMessage":
523
- (!ctx.globalOptions.selfListen &&
524
- fetchData.message_sender.id.toString() === ctx.userID) ||
525
- !ctx.loggedIn ?
526
- undefined :
527
- (function() {
528
- globalCallback(null, {
529
- type: "change_thread_image",
530
- threadID: utils.formatID(tid.toString()),
531
- snippet: fetchData.snippet,
532
- timestamp: fetchData.timestamp_precise,
533
- author: fetchData.message_sender.id,
534
- image: {
535
- attachmentID: fetchData.image_with_metadata && fetchData.image_with_metadata.legacy_attachment_id,
536
- width: fetchData.image_with_metadata && fetchData.image_with_metadata.original_dimensions.x,
537
- height: fetchData.image_with_metadata && fetchData.image_with_metadata.original_dimensions.y,
538
- url: fetchData.image_with_metadata && fetchData.image_with_metadata.preview.uri
539
- }
540
- });
541
- })();
542
- break;
543
- case "UserMessage":
544
- console.log("ff-Return", {
545
- type: "message",
546
- senderID: utils.formatID(fetchData.message_sender.id),
547
- body: fetchData.message.text || "",
548
- threadID: utils.formatID(tid.toString()),
549
- messageID: fetchData.message_id,
550
- attachments: [{
551
- type: "share",
552
- ID: fetchData.extensible_attachment.legacy_attachment_id,
553
- url: fetchData.extensible_attachment.story_attachment.url,
554
-
555
- title: fetchData.extensible_attachment.story_attachment.title_with_entities.text,
556
- description: fetchData.extensible_attachment.story_attachment.description.text,
557
- source: fetchData.extensible_attachment.story_attachment.source,
558
-
559
- image: ((fetchData.extensible_attachment.story_attachment.media || {}).image || {}).uri,
560
- width: ((fetchData.extensible_attachment.story_attachment.media || {}).image || {}).width,
561
- height: ((fetchData.extensible_attachment.story_attachment.media || {}).image || {}).height,
562
- playable: (fetchData.extensible_attachment.story_attachment.media || {}).is_playable || false,
563
- duration: (fetchData.extensible_attachment.story_attachment.media || {}).playable_duration_in_ms || 0,
733
+ case 'ThreadImageMessage':
734
+ if (!ctx.globalOptions.selfListen && fetchData.message_sender.id.toString() === ctx.userID) return;
735
+ if (!ctx.loggedIn) return;
564
736
 
565
- subattachments: fetchData.extensible_attachment.subattachments,
566
- properties: fetchData.extensible_attachment.story_attachment.properties,
567
- }],
568
- mentions: {},
569
- timestamp: parseInt(fetchData.timestamp_precise),
570
- isGroup: (fetchData.message_sender.id != tid.toString())
571
- });
572
737
  globalCallback(null, {
573
- type: "message",
738
+ type: 'change_thread_image',
739
+ threadID: utils.formatID(tid.toString()),
740
+ snippet: fetchData.snippet,
741
+ timestamp: fetchData.timestamp_precise,
742
+ author: fetchData.message_sender.id,
743
+ image: {
744
+ attachmentID: fetchData.image_with_metadata && fetchData.image_with_metadata.legacy_attachment_id,
745
+ width: fetchData.image_with_metadata && fetchData.image_with_metadata.original_dimensions.x,
746
+ height: fetchData.image_with_metadata && fetchData.image_with_metadata.original_dimensions.y,
747
+ url: fetchData.image_with_metadata && fetchData.image_with_metadata.preview.uri,
748
+ },
749
+ });
750
+ break;
751
+ case 'UserMessage': {
752
+ const event = {
753
+ type: 'message',
574
754
  senderID: utils.formatID(fetchData.message_sender.id),
575
- body: fetchData.message.text || "",
755
+ body: fetchData.message.text || '',
576
756
  threadID: utils.formatID(tid.toString()),
577
757
  messageID: fetchData.message_id,
578
758
  attachments: [{
579
- type: "share",
759
+ type: 'share',
580
760
  ID: fetchData.extensible_attachment.legacy_attachment_id,
581
761
  url: fetchData.extensible_attachment.story_attachment.url,
582
-
583
762
  title: fetchData.extensible_attachment.story_attachment.title_with_entities.text,
584
763
  description: fetchData.extensible_attachment.story_attachment.description.text,
585
764
  source: fetchData.extensible_attachment.story_attachment.source,
586
-
587
765
  image: ((fetchData.extensible_attachment.story_attachment.media || {}).image || {}).uri,
588
766
  width: ((fetchData.extensible_attachment.story_attachment.media || {}).image || {}).width,
589
767
  height: ((fetchData.extensible_attachment.story_attachment.media || {}).image || {}).height,
590
768
  playable: (fetchData.extensible_attachment.story_attachment.media || {}).is_playable || false,
591
769
  duration: (fetchData.extensible_attachment.story_attachment.media || {}).playable_duration_in_ms || 0,
592
-
593
770
  subattachments: fetchData.extensible_attachment.subattachments,
594
771
  properties: fetchData.extensible_attachment.story_attachment.properties,
595
- }],
772
+ }],
596
773
  mentions: {},
597
774
  timestamp: parseInt(fetchData.timestamp_precise),
598
- isGroup: (fetchData.message_sender.id != tid.toString())
599
- });
775
+ isGroup: (fetchData.message_sender.id !== tid.toString()),
776
+ };
777
+
778
+ log.info('ff-Return', event);
779
+ globalCallback(null, event);
780
+ break;
781
+ }
782
+ default:
783
+ log.error('forcedFetch', fetchData);
600
784
  }
601
- } else console.error("forcedFetch", fetchData);
785
+ } else {
786
+ log.error('forcedFetch', fetchData);
787
+ }
602
788
  })
603
- .catch((err) => console.error("forcedFetch", err));
789
+ .catch((err) => log.error('forcedFetch', err));
604
790
  }
605
791
  break;
606
- case "ThreadName":
607
- case "ParticipantsAddedToGroupThread":
608
- case "ParticipantLeftGroupThread":
609
- var formattedEvent;
792
+ }
793
+ case 'ThreadName':
794
+ case 'ParticipantsAddedToGroupThread':
795
+ case 'ParticipantLeftGroupThread': {
796
+ let formattedEvent;
610
797
  try {
611
- formattedEvent = utils.formatDeltaEvent(v.delta);
798
+ formattedEvent = utils.formatDeltaEvent(delta);
612
799
  } catch (err) {
613
- return globalCallback({
614
- error: "Problem parsing message object. Please open an issue at https://github.com/Schmavery/facebook-chat-api/issues.",
615
- detail: err,
616
- res: v.delta,
617
- type: "parse_error"
618
- });
800
+ console.log(err);
801
+ return log.error('Lỗi Nhẹ', err);
619
802
  }
620
- return (!ctx.globalOptions.selfListen && formattedEvent.author.toString() === ctx.userID) || !ctx.loggedIn ? undefined : (function() { globalCallback(null, formattedEvent); })();
803
+
804
+ if (!ctx.globalOptions.selfListen && formattedEvent.author.toString() === ctx.userID) return;
805
+ if (!ctx.loggedIn) return;
806
+ globalCallback(null, formattedEvent);
807
+ break;
808
+ }
809
+ case 'NewMessage': {
810
+ const hasLiveLocation = delta => {
811
+ const attachment = delta.attachments?.[0]?.mercury?.extensible_attachment;
812
+ const storyAttachment = attachment?.story_attachment;
813
+ return storyAttachment?.style_list?.includes('message_live_location');
814
+ };
815
+
816
+ if (delta.attachments?.length === 1 && hasLiveLocation(delta)) {
817
+ delta.class = 'UserLocation';
818
+
819
+ try {
820
+ const fmtMsg = utils.formatDeltaEvent(delta);
821
+ globalCallback(null, fmtMsg);
822
+ } catch (err) {
823
+ console.log(delta);
824
+ log.error('Lỗi Nhẹ', err);
825
+ }
826
+ }
827
+ break;
828
+ }
621
829
  }
622
830
  }
623
831
 
624
832
  function markDelivery(ctx, api, threadID, messageID) {
625
833
  if (threadID && messageID) {
626
834
  api.markAsDelivered(threadID, messageID, (err) => {
627
- if (err) console.error("markAsDelivered", err);
835
+ if (err) log.error('markAsDelivered', err);
628
836
  else {
629
837
  if (ctx.globalOptions.autoMarkRead) {
630
838
  api.markAsRead(threadID, (err) => {
631
- if (err) console.error("markAsDelivered", err);
839
+ if (err) log.error('markAsDelivered', err);
632
840
  });
633
841
  }
634
842
  }
@@ -636,37 +844,81 @@ function markDelivery(ctx, api, threadID, messageID) {
636
844
  }
637
845
  }
638
846
 
847
+
848
+
639
849
  module.exports = function(defaultFuncs, api, ctx) {
640
850
  var globalCallback = identity;
851
+ var okeoke;
641
852
  getSeqID = function getSeqID() {
642
853
  ctx.t_mqttCalled = false;
643
854
  defaultFuncs
644
855
  .post("https://www.facebook.com/api/graphqlbatch/", ctx.jar, form)
856
+ .then(res => {
857
+ okeoke = res;
858
+ return res;
859
+ })
645
860
  .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
646
861
  .then((resData) => {
647
- if (utils.getType(resData) != "Array")
648
- throw { error: "Not logged in", res: resData };
649
- if (resData[resData.length - 1].error_results > 0) {
650
- const errorL = resData[0].o0.errors;
651
- throw errorL;
862
+ if (utils.getType(resData) != "Array") {
863
+ if (okeoke.request.uri && okeoke.request.uri.href.includes("https://www.facebook.com/checkpoint/")) {
864
+ if (okeoke.request.uri.href.includes('601051028565049')) {
865
+ return global.Fca.BypassAutomationNotification(undefined, ctx.jar, ctx.globalOptions, undefined ,process.env.UID)
866
+ }
867
+ }
868
+ if (global.Fca.Require.Priyansh.AutoLogin) {
869
+ return global.Fca.Require.logger.Warning(global.Fca.Require.Language.Index.AutoLogin, function() {
870
+ return global.Fca.Action('AutoLogin');
871
+ });
872
+ } else if (!global.Fca.Require.Priyansh.AutoLogin) {
873
+ return global.Fca.Require.logger.Error(global.Fca.Require.Language.Index.ErrAppState);
874
+ }
875
+ return;
876
+ } else {
877
+ if (resData && resData[resData.length - 1].error_results > 0) throw resData[0].o0.errors;
878
+ if (resData[resData.length - 1].successful_results === 0) throw {
879
+ error: "getSeqId: there was no successful_results",
880
+ res: resData
881
+ };
882
+ if (resData[0].o0.data.viewer.message_threads.sync_sequence_id) {
883
+ ctx.lastSeqId = resData[0].o0.data.viewer.message_threads.sync_sequence_id;
884
+ listenMqtt(defaultFuncs, api, ctx, globalCallback);
885
+ } else throw {
886
+ error: "getSeqId: no sync_sequence_id found.",
887
+ res: resData
888
+ };
652
889
  }
653
- if (resData[resData.length - 1].successful_results === 0) throw { error: "getSeqId: there was no successful_results", res: resData };
654
- if (resData[0].o0.data.viewer.message_threads.sync_sequence_id) {
655
- ctx.lastSeqId = resData[0].o0.data.viewer.message_threads.sync_sequence_id;
656
- listenMqtt(defaultFuncs, api, ctx, globalCallback);
657
- } else throw { error: "getSeqId: no sync_sequence_id found.", res: resData };
658
890
  })
659
891
  .catch((err) => {
660
- if (utils.getType(err) == "Object" && err.error === "Not logged in") {
661
- ctx.loggedIn = false;
662
- }
892
+ log.error("getSeqId", err);
893
+ if (okeoke.request.uri && okeoke.request.uri.href.includes("https://www.facebook.com/checkpoint/")) {
894
+ if (okeoke.request.uri.href.includes('601051028565049')) {
895
+ return global.Fca.BypassAutomationNotification(undefined, ctx.jar, ctx.globalOptions, undefined ,process.env.UID)
896
+ }
897
+ }
898
+ if (utils.getType(err) == "Object" && err.error === global.Fca.Require.Language.Index.ErrAppState) ctx.loggedIn = false;
663
899
  return globalCallback(err);
664
900
  });
665
901
  };
666
902
 
667
- return async function(callback) {
903
+ return function(callback) {
904
+ class MessageEmitter extends EventEmitter {
905
+ stopListening(callback) {
906
+ callback = callback || (() => {});
907
+ globalCallback = identity;
908
+ if (ctx.mqttClient) {
909
+ ctx.mqttClient.unsubscribe("/webrtc");
910
+ ctx.mqttClient.unsubscribe("/rtc_multi");
911
+ ctx.mqttClient.unsubscribe("/onevc");
912
+ ctx.mqttClient.publish("/browser_close", "{}");
913
+ ctx.mqttClient.end(false, function(...data) {
914
+ ctx.mqttClient = undefined;
915
+ });
916
+ }
917
+ global.Fca.Data.StopListening = true;
918
+ }
919
+ }
668
920
 
669
- var msgEmitter = new EventEmitter();
921
+ var msgEmitter = new MessageEmitter();
670
922
  globalCallback = (callback || function(error, message) {
671
923
  if (error) return msgEmitter.emit("error", error);
672
924
  msgEmitter.emit("message", message);
@@ -676,28 +928,29 @@ module.exports = function(defaultFuncs, api, ctx) {
676
928
  if (!ctx.firstListen) ctx.lastSeqId = null;
677
929
  ctx.syncToken = undefined;
678
930
  ctx.t_mqttCalled = false;
931
+
679
932
  //Same request as getThreadList
680
933
  form = {
681
- "av": ctx.globalOptions.pageID,
682
- "queries": JSON.stringify({
683
- "o0": {
684
- "doc_id": "3336396659757871",
685
- "query_params": {
686
- "limit": 1,
687
- "before": null,
688
- "tags": ["INBOX"],
689
- "includeDeliveryReceipts": false,
690
- "includeSeqID": true
691
- }
692
- }
693
- })
934
+ av: ctx.globalOptions.pageID,
935
+ queries: JSON.stringify({
936
+ o0: {
937
+ doc_id: '3336396659757871',
938
+ query_params: {
939
+ limit: 1,
940
+ before: null,
941
+ tags: ['INBOX'],
942
+ includeDeliveryReceipts: false,
943
+ includeSeqID: true,
944
+ },
945
+ },
946
+ }),
694
947
  };
695
948
 
949
+
696
950
  if (!ctx.firstListen || !ctx.lastSeqId) getSeqID();
697
- else {
698
- listenMqtt(defaultFuncs, api, ctx, globalCallback);
699
- }
951
+ else listenMqtt(defaultFuncs, api, ctx, globalCallback);
700
952
  ctx.firstListen = false;
953
+
701
954
  return msgEmitter;
702
955
  };
703
- };
956
+ };