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
@@ -1,8 +1,8 @@
1
+ /* eslint-disable linebreak-style */
1
2
  "use strict";
2
3
 
3
- const utils = require("../utils");
4
- // @NethWs3Dev
5
-
4
+ var utils = require("../utils");
5
+ // tương lai đi rồi fix ahahha
6
6
  function formatEventReminders(reminder) {
7
7
  return {
8
8
  reminderID: reminder.id,
@@ -10,6 +10,7 @@ function formatEventReminders(reminder) {
10
10
  time: reminder.time,
11
11
  eventType: reminder.lightweight_event_type.toLowerCase(),
12
12
  locationName: reminder.location_name,
13
+ // @TODO verify this
13
14
  locationCoordinates: reminder.location_coordinates,
14
15
  locationPage: reminder.location_page,
15
16
  eventStatus: reminder.lightweight_event_status.toLowerCase(),
@@ -20,26 +21,29 @@ function formatEventReminders(reminder) {
20
21
  secondsToNotifyBefore: reminder.seconds_to_notify_before,
21
22
  allowsRsvp: reminder.allows_rsvp,
22
23
  relatedEvent: reminder.related_event,
23
- members: reminder.event_reminder_members.edges.map(function (member) {
24
+ members: reminder.event_reminder_members.edges.map(function(member) {
24
25
  return {
25
26
  memberID: member.node.id,
26
- state: member.guest_list_state.toLowerCase(),
27
+ state: member.guest_list_state.toLowerCase()
27
28
  };
28
- }),
29
+ })
29
30
  };
30
31
  }
31
32
 
32
33
  function formatThreadGraphQLResponse(data) {
33
- if (data.errors) return null; // Return null if there are errors
34
- const messageThread = data.message_thread;
35
- if (!messageThread) return null;
36
-
37
- const threadID = messageThread.thread_key.thread_fbid
34
+ try{
35
+ var messageThread = data.message_thread;
36
+ } catch (err){
37
+ console.error("GetThreadInfoGraphQL", "Can't get this thread info!");
38
+ return {err: err};
39
+ }
40
+ var threadID = messageThread.thread_key.thread_fbid
38
41
  ? messageThread.thread_key.thread_fbid
39
42
  : messageThread.thread_key.other_user_id;
40
43
 
41
- const lastM = messageThread.last_message;
42
- const snippetID =
44
+ // Remove me
45
+ var lastM = messageThread.last_message;
46
+ var snippetID =
43
47
  lastM &&
44
48
  lastM.nodes &&
45
49
  lastM.nodes[0] &&
@@ -47,10 +51,10 @@ function formatThreadGraphQLResponse(data) {
47
51
  lastM.nodes[0].message_sender.messaging_actor
48
52
  ? lastM.nodes[0].message_sender.messaging_actor.id
49
53
  : null;
50
- const snippetText =
54
+ var snippetText =
51
55
  lastM && lastM.nodes && lastM.nodes[0] ? lastM.nodes[0].snippet : null;
52
- const lastR = messageThread.last_read_receipt;
53
- const lastReadTimestamp =
56
+ var lastR = messageThread.last_read_receipt;
57
+ var lastReadTimestamp =
54
58
  lastR && lastR.nodes && lastR.nodes[0] && lastR.nodes[0].timestamp_precise
55
59
  ? lastR.nodes[0].timestamp_precise
56
60
  : null;
@@ -58,21 +62,18 @@ function formatThreadGraphQLResponse(data) {
58
62
  return {
59
63
  threadID: threadID,
60
64
  threadName: messageThread.name,
61
- participantIDs: messageThread.all_participants.edges.map(
62
- (d) => d.node.messaging_actor.id,
63
- ),
64
- userInfo: messageThread.all_participants.edges.map((d) => ({
65
+ participantIDs: messageThread.all_participants.edges.map(d => d.node.messaging_actor.id),
66
+ userInfo: messageThread.all_participants.edges.map(d => ({
65
67
  id: d.node.messaging_actor.id,
66
68
  name: d.node.messaging_actor.name,
67
69
  firstName: d.node.messaging_actor.short_name,
68
70
  vanity: d.node.messaging_actor.username,
69
- url: d.node.messaging_actor.url,
70
71
  thumbSrc: d.node.messaging_actor.big_image_src.uri,
71
72
  profileUrl: d.node.messaging_actor.big_image_src.uri,
72
73
  gender: d.node.messaging_actor.gender,
73
74
  type: d.node.messaging_actor.__typename,
74
75
  isFriend: d.node.messaging_actor.is_viewer_friend,
75
- isBirthday: !!d.node.messaging_actor.is_birthday,
76
+ isBirthday: !!d.node.messaging_actor.is_birthday //not sure?
76
77
  })),
77
78
  unreadCount: messageThread.unread_count,
78
79
  messageCount: messageThread.messages_count,
@@ -94,30 +95,33 @@ function formatThreadGraphQLResponse(data) {
94
95
  messageThread.customization_info.outgoing_bubble_color
95
96
  ? messageThread.customization_info.outgoing_bubble_color.slice(2)
96
97
  : null,
97
- threadTheme: messageThread.thread_theme,
98
98
  nicknames:
99
99
  messageThread.customization_info &&
100
100
  messageThread.customization_info.participant_customizations
101
101
  ? messageThread.customization_info.participant_customizations.reduce(
102
- function (res, val) {
102
+ function(res, val) {
103
103
  if (val.nickname) res[val.participant_id] = val.nickname;
104
104
  return res;
105
105
  },
106
- {},
106
+ {}
107
107
  )
108
108
  : {},
109
109
  adminIDs: messageThread.thread_admins,
110
110
  approvalMode: Boolean(messageThread.approval_mode),
111
- approvalQueue: messageThread.group_approval_queue.nodes.map((a) => ({
111
+ approvalQueue: messageThread.group_approval_queue.nodes.map(a => ({
112
112
  inviterID: a.inviter.id,
113
113
  requesterID: a.requester.id,
114
114
  timestamp: a.request_timestamp,
115
- request_source: a.request_source,
115
+ request_source: a.request_source // @Undocumented
116
116
  })),
117
+
118
+ // @Undocumented
117
119
  reactionsMuteMode: messageThread.reactions_mute_mode.toLowerCase(),
118
120
  mentionsMuteMode: messageThread.mentions_mute_mode.toLowerCase(),
119
121
  isPinProtected: messageThread.is_pin_protected,
120
122
  relatedPageThread: messageThread.related_page_thread,
123
+
124
+ // @Legacy
121
125
  name: messageThread.name,
122
126
  snippet: snippetText,
123
127
  snippetSender: snippetID,
@@ -136,30 +140,51 @@ function formatThreadGraphQLResponse(data) {
136
140
  lastMessageType: "message",
137
141
  lastReadTimestamp: lastReadTimestamp,
138
142
  threadType: messageThread.thread_type == "GROUP" ? 2 : 1,
139
- inviteLink: {
140
- enable: messageThread.joinable_mode
141
- ? messageThread.joinable_mode.mode == 1
142
- : false,
143
- link: messageThread.joinable_mode
144
- ? messageThread.joinable_mode.link
145
- : null,
146
- },
143
+ TimeCreate: Date.now(),
144
+ TimeUpdate: Date.now()
147
145
  };
148
146
  }
149
147
 
150
- module.exports = function (defaultFuncs, api, ctx) {
151
- return function getThreadInfoGraphQL(threadID, callback) {
152
- let resolveFunc = function () {};
153
- let rejectFunc = function () {};
154
- const returnPromise = new Promise(function (resolve, reject) {
148
+ const MAX_ARRAY_LENGTH = 6; //safe
149
+ var Request_Update_Time = 0;
150
+ var updateInterval;
151
+ var updateTimeout;
152
+ let Queues = [];
153
+
154
+ let onetimecook = false
155
+
156
+ function addToQueues(num) {
157
+ const existingArray = Queues.some(subArr => subArr.some(obj => obj.threadID == num.threadID));
158
+
159
+ if (!existingArray) {
160
+ if (Queues.length > 0 && Queues[Queues.length - 1].length === MAX_ARRAY_LENGTH) {
161
+ Queues.push([num]);
162
+ } else {
163
+ const lastArray = Queues.length > 0 ? Queues[Queues.length - 1] : [];
164
+ lastArray.push(num);
165
+
166
+ if (Queues.length === 0) {
167
+ Queues.push(lastArray);
168
+ }
169
+ }
170
+ }
171
+ }
172
+
173
+
174
+ module.exports = function(defaultFuncs, api, ctx) {
175
+
176
+ var { createData,getData,hasData,updateData, getAll } = require('../Extra/ExtraGetThread');
177
+ var Database = require('../Extra/Database');
178
+
179
+ return async function getThreadInfoGraphQL(threadID, callback) {
180
+ var resolveFunc = function(){};
181
+ var rejectFunc = function(){};
182
+ var returnPromise = new Promise(function (resolve, reject) {
155
183
  resolveFunc = resolve;
156
184
  rejectFunc = reject;
157
185
  });
158
186
 
159
- if (
160
- utils.getType(callback) != "Function" &&
161
- utils.getType(callback) != "AsyncFunction"
162
- ) {
187
+ if (utils.getType(callback) != "Function" && utils.getType(callback) != "AsyncFunction") {
163
188
  callback = function (err, data) {
164
189
  if (err) {
165
190
  return rejectFunc(err);
@@ -167,61 +192,233 @@ module.exports = function (defaultFuncs, api, ctx) {
167
192
  resolveFunc(data);
168
193
  };
169
194
  }
195
+
196
+ if (utils.getType(threadID) !== "Array") threadID = [threadID];
170
197
 
171
- if (utils.getType(threadID) !== "Array") {
172
- threadID = [threadID];
173
- }
174
198
 
175
- let form = {};
176
- threadID.map(function (t, i) {
177
- form["o" + i] = {
178
- doc_id: "3449967031715030",
179
- query_params: {
180
- id: t,
181
- message_limit: 0,
182
- load_messages: false,
183
- load_read_receipts: false,
184
- before: null,
185
- },
186
- };
187
- });
199
+ if (utils.getType(global.Fca.Data.Userinfo) == "Array" || global.Fca.Data.Userinfo == undefined) global.Fca.Data.Userinfo = new Map();
188
200
 
189
- form = {
190
- queries: JSON.stringify(form),
191
- batch_name: "MessengerGraphQLThreadFetcher",
201
+ const updateUserInfo = (threadInfo) => {
202
+ if (!global.Fca.Data.Userinfo) {
203
+ global.Fca.Data.Userinfo = new Map();
204
+ }
205
+
206
+ threadInfo.forEach(thread => {
207
+ const userInfo = thread.userInfo;
208
+
209
+ if (Array.isArray(userInfo)) {
210
+ const userInfoMap = new Map(userInfo.map(user => [user.id, user]));
211
+ for (const [id, user] of userInfoMap) {
212
+ global.Fca.Data.Userinfo.set(id, user);
213
+ }
214
+ }
215
+ });
192
216
  };
217
+
218
+ const getMultiInfo = async function (threadIDs) {
219
+ let form = {};
220
+ let tempThreadInf = [];
221
+ threadIDs.forEach((x,y) => {
222
+ form["o" + y] = {
223
+ doc_id: "3449967031715030",
224
+ query_params: { id: x, message_limit: 0, load_messages: false, load_read_receipts: false, before: null }
225
+ };
226
+ });
227
+ let Submit = { queries: JSON.stringify(form), batch_name: "MessengerGraphQLThreadFetcher" };
228
+
229
+ const promise = new Promise((resolve, reject) => {
230
+ defaultFuncs.post("https://www.facebook.com/api/graphqlbatch/", ctx.jar, Submit)
231
+ .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
232
+ .then(resData => {
233
+ if (resData.error || resData[resData.length - 1].error_results !== 0) throw "Lỗi: getThreadInfoGraphQL Có Thể Do Bạn Spam Quá Nhiều";
234
+ resData = resData.slice(0, -1).sort((a, b) => Object.keys(a)[0].localeCompare(Object.keys(b)[0]));
235
+ resData.forEach((x, y) => tempThreadInf.push(formatThreadGraphQLResponse(x["o" + y].data)));
236
+ return resolve({
237
+ Success: true,
238
+ Data: tempThreadInf
239
+ });
240
+ })
241
+ .catch(() => {
242
+ reject({ Success: false, Data: '' })
243
+ });
244
+ })
245
+
246
+ return await promise;
247
+ }
248
+
249
+ const formatAndUpdateData = (AllThreadInfo) => {
250
+ try {
251
+ AllThreadInfo.forEach(threadInf => { updateData(threadInf.threadID, threadInf); })
252
+ updateUserInfo(AllThreadInfo) // [ {}, {} ]
253
+
254
+ } catch (e) {
255
+ console.log(e);
256
+ }
257
+ }
193
258
 
194
- defaultFuncs
195
- .post("https://www.facebook.com/api/graphqlbatch/", ctx.jar, form)
196
- .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
197
- .then(function (resData) {
198
- if (resData.error) {
199
- throw resData;
200
- }
259
+ const formatAndCreateData = (AllThreadInfo) => {
260
+ try {
261
+ AllThreadInfo.forEach(threadInf => { createData(threadInf.threadID, threadInf); })
262
+ updateUserInfo(AllThreadInfo) // [ {}, {} ]
201
263
 
202
- const threadInfos = {};
203
- for (let i = resData.length - 2; i >= 0; i--) {
204
- const threadInfo = formatThreadGraphQLResponse(
205
- resData[i][Object.keys(resData[i])[0]].data,
206
- );
207
- if (threadInfo) { // Only add valid threadInfo
208
- threadInfos[
209
- threadInfo.threadID || threadID[threadID.length - 1 - i]
210
- ] = threadInfo;
264
+ } catch (e) {
265
+ console.log(e);
266
+ }
267
+ }
268
+
269
+ const checkAverageStaticTimestamp = function (avgTimeStamp) {
270
+ const DEFAULT_UPDATE_TIME = 900 * 1000; //thời gian cập nhật tối đa + với thời gian trung bình của tổng request 1 mảng
271
+ //khi request phút thứ 3, 1 req ở phút thứ 7, 1 req ở phút thứ 10, vậy trung bình là (3+7+1) / time.length (3) + với 15p = tg trung bình để cập nhật 1 mảng
272
+ const MAXIMUM_ERROR_TIME = 10 * 1000;
273
+ return { //khi check = false thì cần cập nhật vì đã hơn thời gian tb + 15p
274
+ Check: (parseInt(avgTimeStamp) + parseInt(DEFAULT_UPDATE_TIME)) + parseInt(MAXIMUM_ERROR_TIME) >= Date.now(), // ở đây avgTimeStamp là thời gian cố định của 1 mảng queue khi đầy
275
+ timeLeft: (parseInt(avgTimeStamp) + parseInt(DEFAULT_UPDATE_TIME)) - Date.now() + parseInt(MAXIMUM_ERROR_TIME)
276
+ }
277
+ }
278
+
279
+ const autoCheckAndUpdateRecallTime = () => {
280
+ let holdTime = [];
281
+ let oneTimeCall = false;
282
+ //lấy tất cả trung bình thời gian của tất cả mảng và tìm thời gian còn lại ngắn nhất, nếu có sẵn id cần cập nhật thì cập nhật ngày lập tức
283
+ Queues.forEach((i, index) => {
284
+ // [ { threadID, TimeCreate }, {} ]
285
+ const averageTimestamp = Math.round(i.reduce((acc, obj) => acc + obj.TimeCreate, 0) / i.length);
286
+ const DataAvg = checkAverageStaticTimestamp(averageTimestamp);
287
+ if (DataAvg.Check) {
288
+ //cần chờ
289
+ // holdTime.push(DataAvg.timeLeft);
290
+ //cho thi cho 10s sau check lai roi cho tiep nhe =))
211
291
  }
212
- }
292
+ else {
293
+ oneTimeCall = true;
294
+ }
295
+ });
213
296
 
214
- if (Object.values(threadInfos).length == 1) {
215
- callback(null, Object.values(threadInfos)[0]);
216
- } else {
217
- callback(null, threadInfos);
218
- }
219
- })
220
- .catch(function () {
221
- // Do nothing on error
222
- callback(null, null);
297
+ if (oneTimeCall) autoUpdateData(); // cập nhật ngay, nhin la biet tot hon hold roi =))
298
+
299
+ // if (holdTime.length >= 1) {
300
+ // holdTime.sort((a,b) => a - b) //low to high time
301
+ // if (holdTime[0] > Request_Update_Time) {
302
+ // Request_Update_Time = holdTime[0];
303
+ // clearInterval(updateInterval);
304
+ // updateInterval = setInterval(() => { autoUpdateData(); }, holdTime[0])
305
+ // }
306
+ // }
307
+
308
+ //hold lam cai cho gi khi ta co check lien tuc 10s 1 lan 😔
309
+
310
+ const MAXIMUM_RECALL_TIME = 30 * 1000;
311
+ clearTimeout(updateTimeout);
312
+ updateTimeout = setTimeout(() => { autoCheckAndUpdateRecallTime(); }, MAXIMUM_RECALL_TIME)
313
+ }
314
+
315
+ const autoUpdateData = async function() {
316
+ //[ [ {}, {} ], [ {}, {} ] ]
317
+ let doUpdate = [];
318
+ let holdTime = [];
319
+
320
+ Queues.forEach((i, index) => {
321
+ // [ {}, {} ]
322
+ const averageTimestamp = Math.round(i.reduce((acc, obj) => acc + obj.TimeCreate, 0) / i.length);
323
+ // thời gian trung bình của 1 mảng từ lúc bắt đầu request lần đầu, cần + thêm thời gian cố định là 15p !
324
+
325
+ const DataAvg = checkAverageStaticTimestamp(averageTimestamp)
326
+ if (DataAvg.Check) {
327
+ // chờ tiếp
328
+ }
329
+ else {
330
+ // đã hơn thời gian 15p
331
+ doUpdate.push(i) // [ {}, {} ]
332
+ Queues.splice(index, 1); //đạt điều kiện nên xoá để tý nó tự thêm 💀
333
+ }
334
+
223
335
  });
336
+
337
+ if (doUpdate.length >= 1) {
338
+ // maybe [ [ {}, {} ] [ {}, {} ] ]
339
+ let ids = []; // [ id, id ]
340
+ doUpdate.forEach(i => {
341
+ //[ {} {} ]
342
+ const onlyThreadID = [...new Set(i.map(obj => obj.threadID))]; // [ id1, id2 ]
343
+ ids.push(onlyThreadID) //[ [ id1, id2 ] ]
344
+ })
345
+
346
+ // [ [ id1, id2 ],[ id1, id2 ] ] 5 per arr
347
+
348
+ ids.forEach(async function(i) {
349
+ const dataResp = await getMultiInfo(i);
350
+ if (dataResp.Success == true) {
351
+ let MultiThread = dataResp.Data;
352
+ formatAndUpdateData(MultiThread)
353
+ }
354
+ else {
355
+ global.Fca.Require.logger.Warning('CANT NOT GET THREADINFO 💀 MAYBE U HAS BEEN BLOCKED FROM FACEBOOK');
356
+ }
357
+ })
358
+ }
359
+ }
360
+
361
+ const createOrTakeDataFromDatabase = async (threadIDs) => {
362
+ let inDb = []; //NOTE: xử lý resp thành 1 mảng nếu có nhiều hơn 1 threadID và obj nếu 1 threadID
363
+ let inFastArr = [];
364
+ let createNow = [];
365
+ let cbThreadInfos = [];
366
+ // kiểm tra và phân ra 2 loại 1 là chưa có 2 là có =))
367
+ // kiểm tra
368
+
369
+ threadIDs.forEach(id => {
370
+ // id, id ,id
371
+ hasData(id) == true ? inDb.push(id) : createNow.push(id)
372
+ });
373
+
374
+ if (inDb.length >= 1) {
375
+ let threadInfos = inDb.map(id => getData(id));
376
+ cbThreadInfos = cbThreadInfos.concat(threadInfos);
377
+ updateUserInfo(threadInfos);
378
+
379
+ //request update queue
380
+ threadInfos.forEach(i => addToQueues({ threadID: i.threadID, TimeCreate: Date.now() }));
381
+ }
382
+ if (createNow.length >= 1) {
383
+ //5 data per chunk []
384
+ const chunkSize = 5;
385
+ const totalChunk = []; // [ [ id, id ], [ id,id ] ]
386
+
387
+ for (let i = 0; i < createNow.length; i += chunkSize) {
388
+ const chunk = createNow.slice(i, i + chunkSize);
389
+ totalChunk.push(chunk);
390
+ }
391
+
392
+ for (let i of totalChunk) {
393
+ //i = [ id,id ]
394
+ const newThreadInf = await getMultiInfo(i); // always [ {} ] or [ {}, {} ]
395
+ if (newThreadInf.Success == true) {
396
+ let MultiThread = newThreadInf.Data;
397
+ formatAndCreateData(MultiThread)
398
+ cbThreadInfos = cbThreadInfos.concat(MultiThread)
399
+
400
+ //request update queue
401
+ MultiThread.forEach(i => addToQueues({ threadID: i.threadID, TimeCreate: Date.now() }));
402
+ }
403
+ else {
404
+ global.Fca.Require.logger.Warning('CANT NOT GET THREADINFO 💀 MAYBE U HAS BEEN BLOCKED FROM FACEBOOK');
405
+ }
406
+ }
407
+ }
408
+ return cbThreadInfos.length == 1 ? callback(null, cbThreadInfos[0]) : callback(null, cbThreadInfos)
409
+ }
410
+
411
+ if (global.Fca.Data.Already != true) {
412
+ global.Fca.Data.Already = true;
413
+ autoCheckAndUpdateRecallTime();
414
+ setInterval(function(){
415
+ const MapToArray = Array.from(global.Fca.Data.Userinfo, ([name, value]) => (value));
416
+ Database(true).set('UserInfo', MapToArray);
417
+ }, 420 * 1000);
418
+ }
224
419
 
420
+ await createOrTakeDataFromDatabase(threadID);
421
+
225
422
  return returnPromise;
226
423
  };
227
424
  };