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.
- package/Extra/Balancer.js +49 -0
- package/Extra/Bypass/956/index.js +234 -0
- package/Extra/Bypass/test/aaaa.json +169 -0
- package/Extra/Bypass/test/index.js +188 -0
- package/Extra/Database/index.js +469 -0
- package/Extra/ExtraAddons.js +82 -0
- package/Extra/ExtraFindUID.js +62 -0
- package/Extra/ExtraGetThread.js +365 -0
- package/Extra/ExtraScreenShot.js +430 -0
- package/Extra/ExtraUptimeRobot.js +38 -0
- package/Extra/Html/Classic/script.js +119 -0
- package/Extra/Html/Classic/style.css +8 -0
- package/Extra/Security/AES_256_GCM/index.js +1 -0
- package/Extra/Security/Base/Step_1.js +6 -0
- package/Extra/Security/Base/Step_2.js +22 -0
- package/Extra/Security/Base/Step_3.js +22 -0
- package/Extra/Security/Base/index.js +191 -0
- package/Extra/Security/Step_1.js +6 -0
- package/Extra/Security/Step_2.js +22 -0
- package/Extra/Security/Step_3.js +22 -0
- package/Extra/Security/index.js +5 -0
- package/Extra/Src/Change_Environment.js +24 -0
- package/Extra/Src/Check_Update.js +67 -0
- package/Extra/Src/History.js +115 -0
- package/Extra/Src/Instant_Update.js +65 -0
- package/Extra/Src/Last-Run.js +65 -0
- package/Extra/Src/Premium.js +81 -0
- package/Extra/Src/Release_Memory.js +160 -0
- package/Extra/Src/Websocket.js +213 -0
- package/Extra/Src/image/62518eafb0670b697788ce4f9a4f71d1.jpg +0 -0
- package/Extra/Src/test.js +28 -0
- package/Extra/Src/uuid.js +137 -0
- package/Func/AcceptAgreement.js +31 -0
- package/Func/ClearCache.js +64 -0
- package/Func/ReportV1.js +54 -0
- package/{LICENSE-MIT → LICENSE.txt} +6 -6
- package/Language/index.json +228 -0
- package/Main.js +1290 -0
- package/README.md +8 -6
- package/SECURITY.md +17 -0
- package/broadcast.js +44 -0
- package/index.js +424 -465
- package/logger.js +66 -0
- package/package.json +91 -42
- package/src/Dev_Horizon_Data.js +125 -0
- package/src/Dev_getThreadInfoOLD.js +422 -0
- package/src/Dev_shareTest2.js +68 -0
- package/src/Dev_shareTest3.js +71 -0
- package/src/Premium.js +25 -0
- package/src/Screenshot.js +83 -0
- package/src/addExternalModule.js +5 -14
- package/src/addUserToGroup.js +21 -57
- package/src/changeAdminStatus.js +22 -46
- package/src/changeArchivedStatus.js +12 -26
- package/src/{changeAvatarV2.js → changeAvt.js} +2 -3
- package/src/changeBio.js +15 -26
- package/src/changeBlockedStatus.js +9 -22
- package/src/changeGroupImage.js +26 -55
- package/src/changeNickname.js +14 -28
- package/src/changeThreadColor.js +19 -22
- package/src/changeThreadEmoji.js +12 -25
- package/src/createNewGroup.js +18 -36
- package/src/createPoll.js +17 -28
- package/src/deleteMessage.js +14 -25
- package/src/deleteThread.js +13 -26
- package/src/editMessage.js +50 -56
- package/src/forwardAttachment.js +16 -28
- package/src/getAccessToken.js +28 -0
- package/src/getCurrentUserID.js +3 -3
- package/src/getEmojiUrl.js +8 -10
- package/src/getFriendsList.js +15 -25
- package/src/getMessage.js +81 -813
- package/src/getThreadHistory.js +98 -241
- package/src/getThreadInfo.js +286 -89
- package/src/getThreadInfoOLD.js +422 -0
- package/src/getThreadList.js +158 -215
- package/src/getThreadMain.js +220 -0
- package/src/getThreadPictures.js +20 -40
- package/src/getUID.js +49 -112
- package/src/getUserID.js +14 -18
- package/src/getUserInfo.js +75 -34
- package/src/getUserInfoMain.js +65 -0
- package/src/getUserInfoV2.js +32 -0
- package/src/getUserInfoV3.js +63 -0
- package/src/getUserInfoV4.js +55 -0
- package/src/getUserInfoV5.js +61 -0
- package/src/handleFriendRequest.js +14 -25
- package/src/handleMessageRequest.js +21 -37
- package/src/httpGet.js +22 -37
- package/src/httpPost.js +20 -36
- package/src/httpPostFormData.js +23 -52
- package/src/listenMqtt.js +667 -414
- package/src/listenMqttV1.js +846 -0
- package/src/logout.js +17 -24
- package/src/markAsDelivered.js +16 -23
- package/src/markAsRead.js +28 -43
- package/src/markAsReadAll.js +14 -21
- package/src/markAsSeen.js +19 -29
- package/src/muteThread.js +13 -18
- package/src/removeUserFromGroup.js +18 -48
- package/src/resolvePhotoUrl.js +14 -22
- package/src/searchForThread.js +13 -23
- package/src/sendMessage.js +125 -181
- package/src/sendMqttMessage.js +71 -0
- package/src/sendTypingIndicator.js +80 -28
- package/src/setMessageReaction.js +20 -33
- package/src/setPostReaction.js +95 -105
- package/src/setTitle.js +19 -35
- package/src/shareContact.js +37 -92
- package/src/shareLink.js +5 -6
- package/src/threadColors.js +17 -109
- package/src/unfriend.js +11 -20
- package/src/unsendMessage.js +33 -30
- package/src/unsendMqttMessage.js +66 -0
- package/test/data/shareAttach.js +146 -0
- package/test/data/something.mov +1 -0
- package/test/data/test.png +1 -0
- package/test/data/test.txt +1 -0
- package/test/env/.env +1 -0
- package/test/example-config.json +18 -0
- package/test/test-page.js +140 -0
- package/test/test.js +385 -0
- package/test/testv2.js +3 -0
- package/utils.js +2908 -1247
- package/replit.nix +0 -3
- package/src/changeAvatar.js +0 -136
- package/src/changeBlockedStatusMqtt.js +0 -80
- package/src/changeCover.js +0 -72
- package/src/changeName.js +0 -78
- package/src/changeUsername.js +0 -58
- package/src/createCommentPost.js +0 -229
- package/src/createPost.js +0 -275
- package/src/data/getThreadInfo.json +0 -1
- package/src/editMessageOld.js +0 -67
- package/src/follow.js +0 -74
- package/src/getAccess.js +0 -112
- package/src/getAvatarUser.js +0 -78
- package/src/getBotInitialData.js +0 -42
- package/src/getRegion.js +0 -7
- package/src/getThreadHistoryDeprecated.js +0 -93
- package/src/getThreadInfoDeprecated.js +0 -80
- package/src/getThreadListDeprecated.js +0 -75
- package/src/listenNotification.js +0 -85
- package/src/pinMessage.js +0 -59
- package/src/refreshFb_dtsg.js +0 -89
- package/src/searchStickers.js +0 -53
- package/src/sendMessageMqtt.js +0 -316
- package/src/setMessageReactionMqtt.js +0 -62
- package/src/setProfileGuard.js +0 -44
- package/src/setStoryReaction.js +0 -64
- package/src/stopListenMqtt.js +0 -23
- package/src/uploadAttachment.js +0 -94
package/src/getThreadInfo.js
CHANGED
@@ -1,8 +1,8 @@
|
|
1
|
+
/* eslint-disable linebreak-style */
|
1
2
|
"use strict";
|
2
3
|
|
3
|
-
|
4
|
-
//
|
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
|
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
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
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
|
-
|
42
|
-
|
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
|
-
|
54
|
+
var snippetText =
|
51
55
|
lastM && lastM.nodes && lastM.nodes[0] ? lastM.nodes[0].snippet : null;
|
52
|
-
|
53
|
-
|
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
|
-
|
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
|
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(
|
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
|
-
|
140
|
-
|
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
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
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
|
-
|
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
|
-
|
190
|
-
|
191
|
-
|
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
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
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
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
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
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
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
|
};
|