fca-horidai-remastered 1.0.0 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. package/CountTime.json +1 -0
  2. package/Extra/Balancer.js +49 -0
  3. package/Extra/Database/index.js +4 -4
  4. package/Extra/ExtraGetThread.js +22 -22
  5. package/Extra/Security/Base/index.js +5 -5
  6. package/Extra/Src/Release_Memory.js +5 -5
  7. package/Extra/Src/Websocket.js +3 -3
  8. package/Language/index.json +10 -4
  9. package/Main.js +209 -29
  10. package/index.js +11 -11
  11. package/package.json +7 -7
  12. package/src/acpUsers.js +40 -0
  13. package/src/addFriends.js +37 -0
  14. package/src/changeAvatar.js +93 -0
  15. package/src/changeBlockedStatusMqtt.js +79 -0
  16. package/src/changeCover.js +73 -0
  17. package/src/changeName.js +79 -0
  18. package/src/createCommentPost.js +228 -0
  19. package/src/createPollMqtt.js +56 -0
  20. package/src/createPost.js +277 -0
  21. package/src/createPostGroup.js +79 -0
  22. package/src/forwardMessage.js +60 -0
  23. package/src/getAcceptList.js +38 -0
  24. package/src/getThreadInfoDeprecated.js +56 -0
  25. package/src/listenMqtt.js +38 -18
  26. package/src/pinMessage.js +58 -0
  27. package/src/refreshFb_dtsg.js +81 -0
  28. package/src/sendComment.js +161 -0
  29. package/src/setMessageReactionMqtt.js +62 -0
  30. package/src/setStoryReaction.js +53 -0
  31. package/src/setTheme.js +310 -0
  32. package/src/unsendMessage.js +28 -20
  33. package/src/unsendMessageMqtt.js +59 -0
  34. package/src/unsendMqttMessage.js +66 -0
  35. package/src/uploadAttachment.js +95 -0
  36. package/test/Db2.js +4 -4
  37. package/test/Horizon_Database/Database.sqlite +0 -0
  38. package/test/Horizon_Database/SyntheticDatabase.sqlite +0 -0
  39. package/utils.js +45 -6
  40. package/.gitattributes +0 -2
  41. package/LICENSE +0 -21
  42. package/README.md +0 -152
  43. package/SECURITY.md +0 -18
@@ -0,0 +1,277 @@
1
+ 'use strict';
2
+
3
+ var utils = require('../utils');
4
+ var log = require('npmlog');
5
+
6
+ module.exports = function (http, api, ctx) {
7
+ function handleUpload(msg, form) {
8
+ var cb;
9
+ var rt = new Promise(function (resolve, reject) {
10
+ cb = error => error ? reject(error) : resolve();
11
+ });
12
+
13
+ if (!msg.attachment) cb();
14
+ else {
15
+ msg.attachment = Array.isArray(msg.attachment) ? msg.attachment : [msg.attachment];
16
+ let uploads = [];
17
+ for (let attachment of msg.attachment) {
18
+ if (!utils.isReadableStream(attachment))
19
+ cb('Attachment should be a readable stream, not ' + utils.getType(attachment));
20
+
21
+ var vari = {
22
+ source: 8,
23
+ profile_id: ctx.userID,
24
+ waterfallxapp: 'comet',
25
+ farr: attachment,
26
+ upload_id: 'jsc_c_6'
27
+ }
28
+ var main = http
29
+ .postFormData('https://upload.facebook.com/ajax/react_composer/attachments/photo/upload', ctx.jar, vari)
30
+ .then(utils.parseAndCheckLogin(ctx, http))
31
+ .then(function (res) {
32
+ if (res.error || res.errors)
33
+ throw res;
34
+
35
+ return res.payload;
36
+ });
37
+
38
+ uploads.push(main);
39
+ }
40
+
41
+ Promise
42
+ .all(uploads)
43
+ .then(function (res) {
44
+ for (let payload of res) {
45
+ if (!payload) break;
46
+ form.input.attachments.push({
47
+ photo: {
48
+ id: payload.photoID
49
+ }
50
+ });
51
+ }
52
+
53
+ return cb();
54
+ })
55
+ .catch(cb);
56
+ }
57
+
58
+ return rt;
59
+ }
60
+
61
+ function handleUrl(msg, form) {
62
+ var cb;
63
+ var rt = new Promise(function (resolve, reject) {
64
+ cb = error => error ? reject(error) : resolve();
65
+ });
66
+
67
+ if (!msg.url) cb();
68
+ else {
69
+ var vari = {
70
+ feedLocation: "FEED_COMPOSER",
71
+ focusCommentID: null,
72
+ goodwillCampaignId: "",
73
+ goodwillCampaignMediaIds: [],
74
+ goodwillContentType: null,
75
+ params: {
76
+ url: msg.url
77
+ },
78
+ privacySelectorRenderLocation: "COMET_COMPOSER",
79
+ renderLocation: "composer_preview",
80
+ parentStoryID: null,
81
+ scale: 1,
82
+ useDefaultActor: false,
83
+ shouldIncludeStoryAttachment: false,
84
+ __relay_internal__pv__IsWorkUserrelayprovider: false,
85
+ __relay_internal__pv__IsMergQAPollsrelayprovider: false
86
+ }
87
+
88
+ http
89
+ .post('https://www.facebook.com/api/graphql/', ctx.jar, {
90
+ fb_api_req_friendly_name: 'ComposerLinkAttachmentPreviewQuery',
91
+ variables: JSON.stringify(vari),
92
+ server_timestamps: true,
93
+ doc_id: 6549975235094234
94
+ })
95
+ .then(utils.parseAndCheckLogin(ctx, http))
96
+ .then(function (res) {
97
+ var res = (res[0] || res).data.link_preview;
98
+ if (JSON.parse(res.share_scrape_data).share_type == 400)
99
+ throw { error: 'url is not accepted' }
100
+
101
+ form.input.attachments.push({
102
+ link: {
103
+ share_scrape_data: res.share_scrape_data
104
+ }
105
+ });
106
+
107
+ return cb();
108
+ })
109
+ .catch(cb);
110
+ }
111
+
112
+ return rt;
113
+ }
114
+
115
+ function handleMention(msg, form) {
116
+ if (!msg.mentions) return;
117
+
118
+ msg.mentions = Array.isArray(msg.mentions) ? msg.mentions : [msg.mentions];
119
+ for (let mention of msg.mentions) {
120
+ var { id, tag, fromIndex } = mention;
121
+
122
+ if (typeof tag != 'string')
123
+ throw 'Mention tag must be string';
124
+ if (!id)
125
+ throw 'id must be string';
126
+ var offset = msg.body.indexOf(tag, fromIndex || 0);
127
+ if (offset < 0)
128
+ throw 'Mention for "' + tag + '" not found in message string.';
129
+ form.input.message.ranges.push({
130
+ entity: { id },
131
+ length: tag.length,
132
+ offset
133
+ });
134
+ }
135
+ }
136
+
137
+ function createContent(vari) {
138
+ var cb;
139
+ var rt = new Promise(function (resolve, reject) {
140
+ cb = (error, postData) => error ? reject(error) : resolve(postData);
141
+ });
142
+
143
+ var form = {
144
+ fb_api_req_friendly_name: 'ComposerStoryCreateMutation',
145
+ variables: JSON.stringify(vari),
146
+ server_timestamps: true,
147
+ doc_id: 6255089511280268
148
+ }
149
+
150
+ http
151
+ .post('https://www.facebook.com/api/graphql/', ctx.jar, form)
152
+ .then(utils.parseAndCheckLogin(ctx, http))
153
+ .then(res => cb(null, res))
154
+ .catch(cb);
155
+
156
+ return rt;
157
+ }
158
+
159
+ return function createPost(msg, callback) {
160
+ var cb;
161
+ var rt = new Promise(function (resolve, reject) {
162
+ cb = (error, url) => url ? resolve(url) : reject(error);
163
+ });
164
+
165
+ if (typeof msg == 'function') {
166
+ var error = 'Msg must be a string or object and not function';
167
+ log.error('createPost', error);
168
+ return msg(error);
169
+ }
170
+ if (typeof callback == 'function') cb = callback;
171
+
172
+ var typeMsg = utils.getType(msg);
173
+ if (!['Object', 'String'].includes(typeMsg)) {
174
+ var error = 'Msg must be a string or object and not ' + typeMsg;
175
+ log.error('createPost', error);
176
+ return cb(error);
177
+ } else if (typeMsg == 'String') msg = { body: msg };
178
+ msg.allowUserID = msg.allowUserID ? !Array.isArray(msg.allowUserID) ? [msg.allowUserID] : msg.allowUserID : null;
179
+
180
+ var sessionID = utils.getGUID();
181
+ var base = [
182
+ 'EVERYONE',
183
+ 'FRIENDS',
184
+ 'SELF'
185
+ ];
186
+ var form = {
187
+ input: {
188
+ composer_entry_point: !msg.groupID && msg.url ? 'share_modal' : "inline_composer",
189
+ composer_source_surface: !msg.groupID && msg.url ? 'feed_story' : msg.groupID ? "group" : "timeline",
190
+ composer_type: !msg.groupID && msg.url ? 'share' : msg.groupID ? "group" : "timeline",
191
+ idempotence_token: sessionID + "_FEED",
192
+ source: "WWW",
193
+ attachments: [],
194
+ audience: msg.groupID ? {
195
+ to_id: msg.groupID
196
+ } : {
197
+ privacy: {
198
+ allow: msg.allowUserID ? msg.allowUserID : [],
199
+ base_state: msg.allowUserID && msg.allowUserID.length > 0 ? base[2] : (base[msg.baseState - 1] || base[0]),
200
+ deny: [],
201
+ tag_expansion_state: "UNSPECIFIED"
202
+ }
203
+ },
204
+ message: {
205
+ ranges: [],
206
+ text: msg.body ? typeof msg.body == 'object' ? JSON.stringify(msg.body, null, 2) : msg.body : ''
207
+ },
208
+ with_tags_ids: [],
209
+ inline_activities: [],
210
+ explicit_place_id: 0,
211
+ text_format_preset_id: 0,
212
+ logging: {
213
+ composer_session_id: sessionID
214
+ },
215
+ navigation_data: {
216
+ attribution_id_v2: msg.groupID ? "CometGroupDiscussionRoot.react,comet.group,tap_search_bar," + Date.now() + ",909538,2361831622," : "ProfileCometTimelineListViewRoot.react,comet.profile.timeline.list,via_cold_start," + Date.now() + ",796829,190055527696468,"
217
+ },
218
+ is_tracking_encrypted: !!msg.url,
219
+ tracking: [],
220
+ event_share_metadata: {
221
+ surface: "newsfeed"
222
+ },
223
+ actor_id: ctx.globalOptions.pageID || ctx.userID,
224
+ client_mutation_id: Math.round(Math.random() * 19).toString()
225
+ },
226
+ displayCommentsFeedbackContext: null,
227
+ displayCommentsContextEnableComment: null,
228
+ displayCommentsContextIsAdPreview: null,
229
+ displayCommentsContextIsAggregatedShare: null,
230
+ displayCommentsContextIsStorySet: null,
231
+ feedLocation: msg.groupID ? "GROUP" : "TIMELINE",
232
+ feedbackSource: 0,
233
+ focusCommentID: null,
234
+ gridMediaWidth: 230,
235
+ groupID: null,
236
+ scale: 1,
237
+ privacySelectorRenderLocation: "COMET_STREAM",
238
+ renderLocation: msg.groupID ? "group" : "timeline",
239
+ useDefaultActor: false,
240
+ inviteShortLinkKey: null,
241
+ isFeed: false,
242
+ isFundraiser: false,
243
+ isFunFactPost: false,
244
+ isGroup: !!msg.groupID,
245
+ isEvent: false,
246
+ isTimeline: !msg.groupID,
247
+ isSocialLearning: false,
248
+ isPageNewsFeed: !!ctx.globalOptions.pageID,
249
+ isProfileReviews: false,
250
+ isWorkSharedDraft: false,
251
+ UFI2CommentsProvider_commentsKey: msg.groupID ? "CometGroupDiscussionRootSuccessQuery" : "ProfileCometTimelineRoute",
252
+ hashtag: null,
253
+ canUserManageOffers: false,
254
+ __relay_internal__pv__CometUFIIsRTAEnabledrelayprovider: false,
255
+ __relay_internal__pv__IsWorkUserrelayprovider: false,
256
+ __relay_internal__pv__IsMergQAPollsrelayprovider: false,
257
+ __relay_internal__pv__StoriesArmadilloReplyEnabledrelayprovider: false,
258
+ __relay_internal__pv__StoriesRingrelayprovider: false
259
+ }
260
+
261
+ handleUpload(msg, form)
262
+ .then(_ => handleUrl(msg, form))
263
+ .then(_ => handleMention(msg, form))
264
+ .then(_ => createContent(form))
265
+ .then(function (res) {
266
+ if (res.error || res.errors) throw res;
267
+
268
+ return cb(null, (res[0] || res).data.story_create.story.url);
269
+ })
270
+ .catch(function (err) {
271
+ log.error('createPost', err);
272
+ return cb(err);
273
+ });
274
+
275
+ return rt;
276
+ }
277
+ }
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+
3
+ const utils = require('../utils');
4
+ const log = require('npmlog');
5
+
6
+ module.exports = function (http, api, ctx) {
7
+ return async function createPostGroup(text, groupID, callback) {
8
+ try {
9
+ const formData = {
10
+ input: {
11
+ composer_entry_point: "hosted_inline_composer",
12
+ composer_source_surface: "group",
13
+ composer_type: "group",
14
+ logging: {
15
+ composer_session_id: utils.getGUID()
16
+ },
17
+ source: "WWW",
18
+ message: {
19
+ ranges: [],
20
+ text: text
21
+ },
22
+ with_tags_ids: null,
23
+ inline_activities: [],
24
+ explicit_place_id: "0",
25
+ text_format_preset_id: "0",
26
+ navigation_data: {
27
+ attribution_id_v2: `CometGroupDiscussionRoot.react,comet.group,unexpected,${Date.now()},582916,2361831622,,;GroupsCometJoinsRoot.react,comet.groups.joins,unexpected,1723903257951,878430,,,;GroupsCometCrossGroupFeedRoot.react,comet.groups.feed,tap_bookmark,${Date.now()},406054,2361831622,,`
28
+ },
29
+ tracking: [null],
30
+ event_share_metadata: {
31
+ surface: "newsfeed"
32
+ },
33
+ audience: {
34
+ to_id: groupID
35
+ },
36
+ actor_id: ctx.userID,
37
+ client_mutation_id: Math.floor(Math.random() * 17)
38
+ },
39
+ feedLocation: "GROUP",
40
+ feedbackSource: 0,
41
+ focusCommentID: null,
42
+ gridMediaWidth: null,
43
+ groupID: null,
44
+ scale: 1,
45
+ privacySelectorRenderLocation: "COMET_STREAM",
46
+ checkPhotosToReelsUpsellEligibility: false,
47
+ renderLocation: "group",
48
+ useDefaultActor: false,
49
+ inviteShortLinkKey: null,
50
+ isFeed: false,
51
+ isFundraiser: false,
52
+ isFunFactPost: false,
53
+ isGroup: true,
54
+ isEvent: false,
55
+ isTimeline: false,
56
+ isSocialLearning: false,
57
+ isPageNewsFeed: false,
58
+ isProfileReviews: false,
59
+ isWorkSharedDraft: false,
60
+ hashtag: null,
61
+ canUserManageOffers: false
62
+ };
63
+
64
+ const form = {
65
+ av: ctx.userID,
66
+ fb_api_req_friendly_name: "ComposerStoryCreateMutation",
67
+ fb_api_caller_class: "RelayModern",
68
+ doc_id: "7913168052133025",
69
+ variables: JSON.stringify(formData),
70
+ server_timestamps: true
71
+ };
72
+ const res = await http.post('https://www.facebook.com/api/graphql/', ctx.jar, form, null, null).then(utils.parseAndCheckLogin(ctx, http));
73
+ return callback(JSON.stringify(res?.[0]?.data?.story_create, null, 2) || { error: "Không thể tạo bài viết" });
74
+ } catch (err) {
75
+ log.error('createPostGroup', err);
76
+ return callback(err);
77
+ }
78
+ };
79
+ };
@@ -0,0 +1,60 @@
1
+ 'use strict';
2
+
3
+ const { generateOfflineThreadingID, getCurrentTimestamp } = require('../utils');
4
+
5
+ function isCallable(func) {
6
+ try {
7
+ Reflect.apply(func, null, []);
8
+ return true;
9
+ } catch (error) {
10
+ return false;
11
+ }
12
+ }
13
+
14
+ module.exports = function (defaultFuncs, api, ctx) {
15
+ return function forwardMessage(messageID, threadID, callback) {
16
+ if (!ctx.mqttClient) {
17
+ throw new Error('Not connected to MQTT');
18
+ }
19
+
20
+ ctx.wsReqNumber += 1;
21
+ ctx.wsTaskNumber += 1;
22
+
23
+ const taskPayload = {
24
+ thread_id: threadID,
25
+ otid: parseInt(generateOfflineThreadingID()),
26
+ source: 65544,
27
+ send_type: 5,
28
+ sync_group: 1,
29
+ forwarded_msg_id: messageID,
30
+ strip_forwarded_msg_caption: 0,
31
+ initiating_source: 1,
32
+ };
33
+
34
+ const task = {
35
+ failure_count: null,
36
+ label: '46',
37
+ payload: JSON.stringify(taskPayload),
38
+ queue_name: `${threadID}`,
39
+ task_id: ctx.wsTaskNumber,
40
+ };
41
+
42
+ const content = {
43
+ app_id: '2220391788200892',
44
+ payload: JSON.stringify({
45
+ data_trace_id: null,
46
+ epoch_id: parseInt(generateOfflineThreadingID()),
47
+ tasks: [task],
48
+ version_id: '25095469420099952',
49
+ }),
50
+ request_id: ctx.wsReqNumber,
51
+ type: 3,
52
+ };
53
+
54
+ if (isCallable(callback)) {
55
+ // to be implemented
56
+ }
57
+
58
+ ctx.mqttClient.publish('/ls_req', JSON.stringify(content), { qos: 1, retain: false });
59
+ };
60
+ };
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+
3
+ var utils = require('../utils');
4
+ var log = require('npmlog');
5
+
6
+ module.exports = function (http, api, ctx) {
7
+ return function getAcceptList(callback) {
8
+ var form = {
9
+ av: ctx.userID,
10
+ fb_api_caller_class: "RelayModern",
11
+ fb_api_req_friendly_name: "FriendingCometFriendsBadgeCountClearMutation",
12
+ variables: JSON.stringify({
13
+ hasTopTab: true,
14
+ hasBookmark: true,
15
+ input: {
16
+ source: "friending_tab",
17
+ actor_id: ctx.userID,
18
+ client_mutation_id: Math.round(Math.random() * 19).toString()
19
+ }
20
+ }),
21
+ server_timestamps: true,
22
+ doc_id: "6500595106704138"
23
+ };
24
+
25
+ http.post('https://www.facebook.com/api/graphql/', ctx.jar, form, null, null)
26
+ .then(utils.parseAndCheckLogin(ctx, http))
27
+ .then(function (res) {
28
+ if (res.errors) {
29
+ return callback(JSON.stringify(res.errors, null, 2));
30
+ }
31
+ return callback(JSON.stringify(res.data, null, 2));
32
+ })
33
+ .catch(function (err) {
34
+ log.error('addFriends', err);
35
+ return callback(err);
36
+ });
37
+ };
38
+ };
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+
3
+ var utils = require("../utils");
4
+ var log = require("npmlog");
5
+
6
+ module.exports = function (defaultFuncs, api, ctx) {
7
+ return function getThreadInfo(threadID, callback) {
8
+ var resolveFunc = function () { };
9
+ var rejectFunc = function () { };
10
+ var returnPromise = new Promise(function (resolve, reject) {
11
+ resolveFunc = resolve;
12
+ rejectFunc = reject;
13
+ });
14
+
15
+ if (!callback) {
16
+ callback = function (err, data) {
17
+ if (err) return rejectFunc(err);
18
+ resolveFunc(data);
19
+ };
20
+ }
21
+
22
+ var form = {
23
+ client: "mercury"
24
+ };
25
+
26
+ api.getUserInfo(threadID, function (err, userRes) {
27
+ if (err) return callback(err);
28
+ var key = Object.keys(userRes).length > 0 ? "user_ids" : "thread_fbids";
29
+ form["threads[" + key + "][0]"] = threadID;
30
+
31
+ if (ctx.globalOptions.pageId) form.request_user_id = ctx.globalOptions.pageId;
32
+
33
+ defaultFuncs
34
+ .post("https://www.facebook.com/ajax/mercury/thread_info.php", ctx.jar, form)
35
+ .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
36
+ .then(function (resData) {
37
+ if (resData.error) throw resData;
38
+ else if (!resData.payload) throw { error: "Could not retrieve thread Info." };
39
+
40
+ var threadData = resData.payload.threads[0];
41
+ var userData = userRes[threadID];
42
+
43
+ if (threadData == null) throw { error: "ThreadData is null" };
44
+
45
+ threadData.name = userData != null && userData.name != null ? userData.name : threadData.name;
46
+ threadData.image_src = userData != null && userData.thumbSrc != null ? userData.thumbSrc : threadData.image_src;
47
+ callback(null, utils.formatThread(threadData));
48
+ })
49
+ .catch(function (err) {
50
+ log.error("getThreadInfo", err);
51
+ return callback(err);
52
+ });
53
+ });
54
+ return returnPromise;
55
+ };
56
+ };
package/src/listenMqtt.js CHANGED
@@ -135,7 +135,7 @@ function listenMqtt(defaultFuncs, api, ctx, globalCallback) {
135
135
  headers: {
136
136
  Cookie: cookies,
137
137
  Origin: 'https://www.facebook.com',
138
- '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,
139
139
  Referer: 'https://www.facebook.com/',
140
140
  Host: new URL(host).hostname,
141
141
  },
@@ -210,9 +210,9 @@ function listenMqtt(defaultFuncs, api, ctx, globalCallback) {
210
210
  warningThreshold: 0.7,
211
211
  releaseThreshold: 0.8,
212
212
  maxThreshold: 0.9,
213
- interval: 60 * 1000,
213
+ interval: 300 * 1000,
214
214
  logLevel: 'warn',
215
- logFile: path.join(process.cwd(), 'Horizon_Database' ,'memory.log'),
215
+ logFile: path.join(process.cwd(), 'main/database_fca' ,'memory.log'),
216
216
  smartReleaseEnabled: true,
217
217
  allowLog: (global.Fca.Require.FastConfig.AntiStuckAndMemoryLeak.LogFile.Use || false)
218
218
  };
@@ -558,22 +558,27 @@ function parseDelta(defaultFuncs, api, ctx, globalCallback, {
558
558
  messageID: delta.deltaMessageReply.repliedToMessage.messageMetadata.messageId,
559
559
  senderID: delta.deltaMessageReply.repliedToMessage.messageMetadata.actorFbId.toString(),
560
560
  attachments: delta.deltaMessageReply.repliedToMessage.attachments
561
- .map((att) => {
562
- const mercury = JSON.parse(att.mercuryJSON);
561
+ .map((att) => {
562
+ let mercury;
563
+ try {
564
+ mercury = JSON.parse(att.mercuryJSON);
563
565
  Object.assign(att, mercury);
564
- return att;
565
- })
566
- .map((att) => {
567
- let x;
568
- try {
569
- x = utils._formatAttachment(att);
570
- } catch (ex) {
571
- x = att;
572
- x.error = ex;
573
- x.type = 'unknown';
574
- }
575
- return x;
576
- }),
566
+ } catch (ex) {
567
+ mercury = {};
568
+ }
569
+ return att;
570
+ })
571
+ .map((att) => {
572
+ let x;
573
+ try {
574
+ x = utils._formatAttachment(att);
575
+ } catch (ex) {
576
+ x = att;
577
+ x.error = ex;
578
+ x.type = 'unknown';
579
+ }
580
+ return x;
581
+ }),
577
582
  args: (delta.deltaMessageReply.repliedToMessage.body || '').trim().split(/\s+/),
578
583
  body: delta.deltaMessageReply.repliedToMessage.body || '',
579
584
  isGroup: !!delta.deltaMessageReply.repliedToMessage.messageMetadata.threadKey.threadFbId,
@@ -843,13 +848,23 @@ function markDelivery(ctx, api, threadID, messageID) {
843
848
 
844
849
  module.exports = function(defaultFuncs, api, ctx) {
845
850
  var globalCallback = identity;
851
+ var okeoke;
846
852
  getSeqID = function getSeqID() {
847
853
  ctx.t_mqttCalled = false;
848
854
  defaultFuncs
849
855
  .post("https://www.facebook.com/api/graphqlbatch/", ctx.jar, form)
856
+ .then(res => {
857
+ okeoke = res;
858
+ return res;
859
+ })
850
860
  .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
851
861
  .then((resData) => {
852
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
+ }
853
868
  if (global.Fca.Require.FastConfig.AutoLogin) {
854
869
  return global.Fca.Require.logger.Warning(global.Fca.Require.Language.Index.AutoLogin, function() {
855
870
  return global.Fca.Action('AutoLogin');
@@ -875,6 +890,11 @@ module.exports = function(defaultFuncs, api, ctx) {
875
890
  })
876
891
  .catch((err) => {
877
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
+ }
878
898
  if (utils.getType(err) == "Object" && err.error === global.Fca.Require.Language.Index.ErrAppState) ctx.loggedIn = false;
879
899
  return globalCallback(err);
880
900
  });
@@ -0,0 +1,58 @@
1
+ 'use strict';
2
+
3
+ const { generateOfflineThreadingID, getCurrentTimestamp } = require('../utils');
4
+
5
+ function isCallable(func) {
6
+ try {
7
+ Reflect.apply(func, null, []);
8
+ return true;
9
+ } catch (error) {
10
+ return false;
11
+ }
12
+ }
13
+
14
+ module.exports = function (defaultFuncs, api, ctx) {
15
+ return function pinMessage(pinMode, messageID, threadID, callback) {
16
+ if (!ctx.mqttClient) {
17
+ throw new Error('Not connected to MQTT');
18
+ }
19
+
20
+ ctx.wsReqNumber += 1;
21
+ ctx.wsTaskNumber += 1;
22
+
23
+ const taskLabel = pinMode ? '430' : '431';
24
+ const queueNamePrefix = pinMode ? 'pin_msg_v2_' : 'unpin_msg_v2_';
25
+
26
+ const taskPayload = {
27
+ thread_key: threadID,
28
+ message_id: messageID,
29
+ timestamp_ms: getCurrentTimestamp(),
30
+ };
31
+
32
+ const task = {
33
+ failure_count: null,
34
+ label: taskLabel,
35
+ payload: JSON.stringify(taskPayload),
36
+ queue_name: `${queueNamePrefix}${threadID}`,
37
+ task_id: ctx.wsTaskNumber,
38
+ };
39
+
40
+ const content = {
41
+ app_id: '2220391788200892',
42
+ payload: JSON.stringify({
43
+ data_trace_id: null,
44
+ epoch_id: parseInt(generateOfflineThreadingID()),
45
+ tasks: [task],
46
+ version_id: '25095469420099952',
47
+ }),
48
+ request_id: ctx.wsReqNumber,
49
+ type: 3,
50
+ };
51
+
52
+ if (isCallable(callback)) {
53
+ // to be implemented
54
+ }
55
+
56
+ ctx.mqttClient.publish('/ls_req', JSON.stringify(content), { qos: 1, retain: false });
57
+ };
58
+ };