fca-priyansh 19.0.0 → 20.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 (135) hide show
  1. package/.gitlab-ci.yml +22 -0
  2. package/CountTime.json +1 -0
  3. package/Extra/Balancer.js +49 -49
  4. package/Extra/BroadcastSystem.js +1 -0
  5. package/Extra/Bypass/956/index.js +233 -233
  6. package/Extra/Bypass/test/aaaa.json +169 -169
  7. package/Extra/Bypass/test/index.js +187 -187
  8. package/Extra/Database/index.js +468 -468
  9. package/Extra/ExtraAddons.js +82 -82
  10. package/Extra/ExtraFindUID.js +61 -61
  11. package/Extra/ExtraGetThread.js +365 -365
  12. package/Extra/ExtraScreenShot.js +430 -430
  13. package/Extra/ExtraUptimeRobot.js +142 -38
  14. package/Extra/Html/Classic/script.js +118 -118
  15. package/Extra/Html/Classic/style.css +7 -7
  16. package/Extra/Security/Base/Step_1.js +5 -5
  17. package/Extra/Security/Base/Step_2.js +22 -22
  18. package/Extra/Security/Base/Step_3.js +22 -22
  19. package/Extra/Security/Base/index.js +190 -190
  20. package/Extra/Security/Index.js +4 -4
  21. package/Extra/Security/Step_1.js +5 -5
  22. package/Extra/Security/Step_2.js +22 -22
  23. package/Extra/Security/Step_3.js +22 -22
  24. package/Extra/Src/Change_Environment.js +24 -24
  25. package/Extra/Src/Check_Update.js +66 -66
  26. package/Extra/Src/History.js +114 -114
  27. package/Extra/Src/Instant_Update.js +64 -64
  28. package/Extra/Src/Last-Run.js +64 -64
  29. package/Extra/Src/Premium.js +81 -81
  30. package/Extra/Src/Websocket.js +212 -212
  31. package/Extra/Src/uuid.js +137 -137
  32. package/Func/AcceptAgreement.js +31 -31
  33. package/Func/ClearCache.js +64 -64
  34. package/Func/ReportV1.js +54 -54
  35. package/LICENSE +21 -21
  36. package/Language/index.json +228 -228
  37. package/Main.js +1 -1290
  38. package/README.md +198 -198
  39. package/broadcast.js +1 -44
  40. package/errorHandler.js +151 -0
  41. package/index.js +1 -448
  42. package/logger.js +69 -66
  43. package/package.json +99 -98
  44. package/src/Dev_Horizon_Data.js +124 -124
  45. package/src/Dev_getThreadInfoOLD.js +421 -421
  46. package/src/Dev_shareTest2.js +68 -68
  47. package/src/Dev_shareTest3.js +71 -71
  48. package/src/Premium.js +24 -24
  49. package/src/Screenshot.js +82 -82
  50. package/src/addExternalModule.js +16 -16
  51. package/src/addUserToGroup.js +79 -79
  52. package/src/changeAdminStatus.js +79 -79
  53. package/src/changeArchivedStatus.js +41 -41
  54. package/src/changeAvt.js +84 -84
  55. package/src/changeBio.js +65 -65
  56. package/src/changeBlockedStatus.js +36 -36
  57. package/src/changeGroupImage.js +106 -106
  58. package/src/changeNickname.js +45 -45
  59. package/src/changeThreadColor.js +62 -62
  60. package/src/changeThreadEmoji.js +42 -42
  61. package/src/changeThreadTheme.js +263 -0
  62. package/src/comment.js +244 -0
  63. package/src/createNewGroup.js +70 -70
  64. package/src/createPoll.js +60 -60
  65. package/src/deleteMessage.js +45 -45
  66. package/src/deleteThread.js +43 -43
  67. package/src/editMessage.js +71 -53
  68. package/src/follow.js +119 -0
  69. package/src/forwardAttachment.js +48 -48
  70. package/src/friend.js +383 -0
  71. package/src/getAccessToken.js +27 -27
  72. package/src/getCurrentUserID.js +7 -7
  73. package/src/getEmojiUrl.js +27 -27
  74. package/src/getFriendsList.js +73 -73
  75. package/src/getMessage.js +102 -102
  76. package/src/getPendingFriendRequests.js +45 -0
  77. package/src/getThreadHistory.js +537 -537
  78. package/src/getThreadInfo.js +424 -423
  79. package/src/getThreadInfoOLD.js +421 -421
  80. package/src/getThreadList.js +213 -213
  81. package/src/getThreadMain.js +219 -219
  82. package/src/getThreadPictures.js +59 -59
  83. package/src/getUID.js +58 -58
  84. package/src/getUserID.js +62 -62
  85. package/src/getUserInfo.js +112 -112
  86. package/src/getUserInfoMain.js +64 -64
  87. package/src/getUserInfoV2.js +31 -31
  88. package/src/getUserInfoV3.js +62 -62
  89. package/src/getUserInfoV4.js +54 -54
  90. package/src/getUserInfoV5.js +60 -60
  91. package/src/handleFriendRequest.js +46 -46
  92. package/src/handleMessageRequest.js +49 -49
  93. package/src/httpGet.js +49 -49
  94. package/src/httpPost.js +48 -48
  95. package/src/httpPostFormData.js +40 -40
  96. package/src/listenMqtt.js +1 -956
  97. package/src/listenMqttV1.js +832 -846
  98. package/src/logout.js +68 -68
  99. package/src/markAsDelivered.js +48 -48
  100. package/src/markAsRead.js +70 -70
  101. package/src/markAsReadAll.js +42 -42
  102. package/src/markAsSeen.js +51 -51
  103. package/src/muteThread.js +47 -47
  104. package/src/notes.js +279 -0
  105. package/src/removeUserFromGroup.js +49 -49
  106. package/src/resolvePhotoUrl.js +37 -37
  107. package/src/searchForThread.js +43 -43
  108. package/src/sendMention.js +325 -0
  109. package/src/sendMessage.js +1 -386
  110. package/src/sendMqttMessage.js +70 -70
  111. package/src/sendTypingIndicator.js +79 -80
  112. package/src/setMessageReaction.js +109 -109
  113. package/src/setPostReaction.js +101 -101
  114. package/src/setTitle.js +74 -74
  115. package/src/share.js +98 -0
  116. package/src/shareContact.js +55 -55
  117. package/src/shareLink.js +58 -58
  118. package/src/stickers.js +525 -0
  119. package/src/story.js +267 -0
  120. package/src/threadColors.js +38 -38
  121. package/src/unfriend.js +43 -43
  122. package/src/unsendMessage.js +47 -47
  123. package/src/unsendMqttMessage.js +65 -65
  124. package/test/data/shareAttach.js +146 -146
  125. package/test/data/test.txt +7 -7
  126. package/test/example-config.json +18 -18
  127. package/test/test-page.js +140 -140
  128. package/test/test.js +385 -385
  129. package/test/testv2.js +2 -2
  130. package/userAgentManager.js +129 -0
  131. package/utils.js +1 -3077
  132. package/.github/workflows/publish.yml +0 -20
  133. package/Extra/Src/Release_Memory.js +0 -160
  134. package/Extra/Src/test.js +0 -28
  135. package/SECURITY.md +0 -17
package/src/follow.js ADDED
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Follow API Module
5
+ * Follow or unfollow users on Facebook
6
+ *
7
+ * @author Priyansh Rajput
8
+ * @github https://github.com/priyanshufsdev
9
+ * @license MIT
10
+ */
11
+
12
+ var utils = require("../utils");
13
+ var log = require("npmlog");
14
+
15
+ module.exports = function(defaultFuncs, api, ctx) {
16
+ /**
17
+ * Follow or unfollow a user on Facebook
18
+ *
19
+ * @param {string} userID - The ID of the user to follow/unfollow
20
+ * @param {boolean} shouldFollow - true to follow, false to unfollow
21
+ * @param {function} callback - Optional callback function
22
+ * @returns {Promise<object>}
23
+ */
24
+ return function follow(userID, shouldFollow, callback) {
25
+ var resolveFunc = function() {};
26
+ var rejectFunc = function() {};
27
+ var returnPromise = new Promise(function(resolve, reject) {
28
+ resolveFunc = resolve;
29
+ rejectFunc = reject;
30
+ });
31
+
32
+ if (!callback) {
33
+ callback = function(err, data) {
34
+ if (err) return rejectFunc(err);
35
+ resolveFunc(data);
36
+ };
37
+ }
38
+
39
+ // Validation
40
+ if (!userID || typeof userID !== 'string') {
41
+ var error = 'User ID is required and must be a string.';
42
+ log.error('follow', error);
43
+ return callback({ error: error });
44
+ }
45
+
46
+ if (typeof shouldFollow !== 'boolean') {
47
+ var error2 = 'shouldFollow must be a boolean (true/false).';
48
+ log.error('follow', error2);
49
+ return callback({ error: error2 });
50
+ }
51
+
52
+ var form;
53
+
54
+ if (shouldFollow) {
55
+ // Follow user
56
+ form = {
57
+ av: ctx.userID,
58
+ fb_api_req_friendly_name: "CometUserFollowMutation",
59
+ fb_api_caller_class: "RelayModern",
60
+ doc_id: "25472099855769847",
61
+ variables: JSON.stringify({
62
+ input: {
63
+ attribution_id_v2: "ProfileCometTimelineListViewRoot.react,comet.profile.timeline.list,via_cold_start,1717249218695,723451,250100865708545,,",
64
+ is_tracking_encrypted: true,
65
+ subscribe_location: "PROFILE",
66
+ subscribee_id: userID,
67
+ tracking: null,
68
+ actor_id: ctx.userID,
69
+ client_mutation_id: "1"
70
+ },
71
+ scale: 1
72
+ })
73
+ };
74
+ } else {
75
+ // Unfollow user
76
+ form = {
77
+ av: ctx.userID,
78
+ fb_api_req_friendly_name: "CometUserUnfollowMutation",
79
+ fb_api_caller_class: "RelayModern",
80
+ doc_id: "25472099855769847",
81
+ variables: JSON.stringify({
82
+ action_render_location: "WWW_COMET_FRIEND_MENU",
83
+ input: {
84
+ attribution_id_v2: "ProfileCometTimelineListViewRoot.react,comet.profile.timeline.list,tap_search_bar,1717294006136,602597,250100865708545,,",
85
+ is_tracking_encrypted: true,
86
+ subscribe_location: "PROFILE",
87
+ tracking: null,
88
+ unsubscribee_id: userID,
89
+ actor_id: ctx.userID,
90
+ client_mutation_id: "10"
91
+ },
92
+ scale: 1
93
+ })
94
+ };
95
+ }
96
+
97
+ defaultFuncs
98
+ .post("https://www.facebook.com/api/graphql/", ctx.jar, form)
99
+ .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
100
+ .then(function(res) {
101
+ if (res.errors) {
102
+ throw res.errors[0];
103
+ }
104
+
105
+ log.info('follow', (shouldFollow ? 'Followed' : 'Unfollowed') + ' user: ' + userID);
106
+ callback(null, {
107
+ success: true,
108
+ action: shouldFollow ? 'followed' : 'unfollowed',
109
+ userID: userID
110
+ });
111
+ })
112
+ .catch(function(err) {
113
+ log.error('follow', err);
114
+ callback(err);
115
+ });
116
+
117
+ return returnPromise;
118
+ };
119
+ };
@@ -1,48 +1,48 @@
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 forwardAttachment(attachmentID, userOrUsers, 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
- if (!callback) {
15
- callback = function (err) {
16
- if (err) return rejectFunc(err);
17
- resolveFunc();
18
- };
19
- }
20
-
21
- var form = {
22
- attachment_id: attachmentID
23
- };
24
-
25
- if (utils.getType(userOrUsers) !== "Array") userOrUsers = [userOrUsers];
26
-
27
- var timestamp = Math.floor(Date.now() / 1000);
28
-
29
- //That's good, the key of the array is really timestmap in seconds + index
30
- //Probably time when the attachment will be sent?
31
- for (var i = 0; i < userOrUsers.length; i++) form["recipient_map[" + (timestamp + i) + "]"] = userOrUsers[i];
32
-
33
- defaultFuncs
34
- .post("https://www.facebook.com/mercury/attachments/forward/", ctx.jar, form)
35
- .then(utils.parseAndCheckLogin(ctx.jar, defaultFuncs))
36
- .then(function (resData) {
37
- if (resData.error) throw resData;
38
-
39
- return callback();
40
- })
41
- .catch(function (err) {
42
- log.error("forwardAttachment", err);
43
- return callback(err);
44
- });
45
-
46
- return returnPromise;
47
- };
48
- };
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 forwardAttachment(attachmentID, userOrUsers, 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
+ if (!callback) {
15
+ callback = function (err) {
16
+ if (err) return rejectFunc(err);
17
+ resolveFunc();
18
+ };
19
+ }
20
+
21
+ var form = {
22
+ attachment_id: attachmentID
23
+ };
24
+
25
+ if (utils.getType(userOrUsers) !== "Array") userOrUsers = [userOrUsers];
26
+
27
+ var timestamp = Math.floor(Date.now() / 1000);
28
+
29
+ //That's good, the key of the array is really timestmap in seconds + index
30
+ //Probably time when the attachment will be sent?
31
+ for (var i = 0; i < userOrUsers.length; i++) form["recipient_map[" + (timestamp + i) + "]"] = userOrUsers[i];
32
+
33
+ defaultFuncs
34
+ .post("https://www.facebook.com/mercury/attachments/forward/", ctx.jar, form)
35
+ .then(utils.parseAndCheckLogin(ctx.jar, defaultFuncs))
36
+ .then(function (resData) {
37
+ if (resData.error) throw resData;
38
+
39
+ return callback();
40
+ })
41
+ .catch(function (err) {
42
+ log.error("forwardAttachment", err);
43
+ return callback(err);
44
+ });
45
+
46
+ return returnPromise;
47
+ };
48
+ };
package/src/friend.js ADDED
@@ -0,0 +1,383 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Friend API Module
5
+ * Manage friend requests, friend list, and friend suggestions
6
+ *
7
+ * @author Priyansh Rajput
8
+ * @github https://github.com/priyanshufsdev
9
+ * @license MIT
10
+ */
11
+
12
+ var utils = require("../utils");
13
+ var log = require("npmlog");
14
+
15
+ /**
16
+ * Format friends data from GraphQL response
17
+ * @private
18
+ */
19
+ function formatFriends(data, type) {
20
+ var viewer = data?.data?.viewer;
21
+ var edges;
22
+
23
+ if (type === 'requests' && viewer?.friend_requests?.edges) {
24
+ edges = viewer.friend_requests.edges;
25
+ } else if (type === 'suggestions' && viewer?.people_you_may_know?.edges) {
26
+ edges = viewer.people_you_may_know.edges;
27
+ } else if (type === 'list' && data?.data?.node?.all_collections?.nodes[0]?.style_renderer?.collection?.pageItems?.edges) {
28
+ edges = data.data.node.all_collections.nodes[0].style_renderer.collection.pageItems.edges;
29
+ } else {
30
+ return [];
31
+ }
32
+
33
+ return edges.map(function(edge) {
34
+ var node = edge.node;
35
+ return {
36
+ userID: node.id || node.node?.id,
37
+ name: node.name || node.title?.text,
38
+ profilePicture: node.profile_picture?.uri || node.image?.uri,
39
+ socialContext: node.social_context?.text || node.subtitle_text?.text,
40
+ url: node.url
41
+ };
42
+ });
43
+ }
44
+
45
+ module.exports = function(defaultFuncs, api, ctx) {
46
+
47
+ var friendModule = {
48
+ /**
49
+ * Get pending friend requests
50
+ * @param {function} callback - Optional callback
51
+ * @returns {Promise<Array>}
52
+ */
53
+ requests: function(callback) {
54
+ var resolveFunc = function() {};
55
+ var rejectFunc = function() {};
56
+ var returnPromise = new Promise(function(resolve, reject) {
57
+ resolveFunc = resolve;
58
+ rejectFunc = reject;
59
+ });
60
+
61
+ if (!callback) {
62
+ callback = function(err, data) {
63
+ if (err) return rejectFunc(err);
64
+ resolveFunc(data);
65
+ };
66
+ }
67
+
68
+ var form = {
69
+ av: ctx.userID,
70
+ __user: ctx.userID,
71
+ __a: "1",
72
+ fb_dtsg: ctx.fb_dtsg,
73
+ jazoest: ctx.jazoest,
74
+ lsd: ctx.lsd,
75
+ fb_api_caller_class: "RelayModern",
76
+ fb_api_req_friendly_name: "FriendingCometRootContentQuery",
77
+ variables: JSON.stringify({ scale: 3 }),
78
+ doc_id: "9103543533085580"
79
+ };
80
+
81
+ defaultFuncs
82
+ .post("https://www.facebook.com/api/graphql/", ctx.jar, form, {})
83
+ .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
84
+ .then(function(res) {
85
+ if (res.errors) throw new Error(JSON.stringify(res.errors));
86
+ var formatted = formatFriends(res, 'requests');
87
+ log.info('friend.requests', 'Found ' + formatted.length + ' friend requests');
88
+ callback(null, formatted);
89
+ })
90
+ .catch(function(err) {
91
+ log.error('friend.requests', err);
92
+ callback(err);
93
+ });
94
+
95
+ return returnPromise;
96
+ },
97
+
98
+ /**
99
+ * Accept a friend request
100
+ * @param {string} identifier - User ID or name
101
+ * @param {function} callback - Optional callback
102
+ * @returns {Promise<object>}
103
+ */
104
+ accept: function(identifier, callback) {
105
+ var resolveFunc = function() {};
106
+ var rejectFunc = function() {};
107
+ var returnPromise = new Promise(function(resolve, reject) {
108
+ resolveFunc = resolve;
109
+ rejectFunc = reject;
110
+ });
111
+
112
+ if (!callback) {
113
+ callback = function(err, data) {
114
+ if (err) return rejectFunc(err);
115
+ resolveFunc(data);
116
+ };
117
+ }
118
+
119
+ if (!identifier) {
120
+ return callback({ error: "A name or user ID is required." });
121
+ }
122
+
123
+ var targetUserID = identifier;
124
+
125
+ // If identifier is not a number, search in requests
126
+ if (isNaN(identifier)) {
127
+ friendModule.requests(function(err, requests) {
128
+ if (err) return callback(err);
129
+
130
+ var found = requests.find(function(req) {
131
+ return req.name.toLowerCase().includes(identifier.toLowerCase());
132
+ });
133
+
134
+ if (!found) {
135
+ return callback({ error: 'Could not find any friend request matching "' + identifier + '".' });
136
+ }
137
+
138
+ acceptRequest(found.userID, callback);
139
+ });
140
+ } else {
141
+ acceptRequest(targetUserID, callback);
142
+ }
143
+
144
+ function acceptRequest(userID, cb) {
145
+ var variables = {
146
+ input: {
147
+ friend_requester_id: userID,
148
+ friending_channel: "FRIENDS_HOME_MAIN",
149
+ actor_id: ctx.userID,
150
+ client_mutation_id: Math.floor(Math.random() * 10 + 1).toString()
151
+ },
152
+ scale: 3
153
+ };
154
+
155
+ var form = {
156
+ av: ctx.userID,
157
+ __user: ctx.userID,
158
+ __a: "1",
159
+ fb_dtsg: ctx.fb_dtsg,
160
+ jazoest: ctx.jazoest,
161
+ lsd: ctx.lsd,
162
+ fb_api_caller_class: "RelayModern",
163
+ fb_api_req_friendly_name: "FriendingCometFriendRequestConfirmMutation",
164
+ variables: JSON.stringify(variables),
165
+ doc_id: "24630768433181357"
166
+ };
167
+
168
+ defaultFuncs
169
+ .post("https://www.facebook.com/api/graphql/", ctx.jar, form, {})
170
+ .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
171
+ .then(function(res) {
172
+ if (res.errors) throw new Error(JSON.stringify(res.errors));
173
+ log.info('friend.accept', 'Accepted friend request from: ' + userID);
174
+ cb(null, res.data);
175
+ })
176
+ .catch(function(err) {
177
+ log.error('friend.accept', err);
178
+ cb(err);
179
+ });
180
+ }
181
+
182
+ return returnPromise;
183
+ },
184
+
185
+ /**
186
+ * Get friend list
187
+ * @param {string} userID - Optional user ID (defaults to current user)
188
+ * @param {function} callback - Optional callback
189
+ * @returns {Promise<Array>}
190
+ */
191
+ list: function(userID, callback) {
192
+ var resolveFunc = function() {};
193
+ var rejectFunc = function() {};
194
+ var returnPromise = new Promise(function(resolve, reject) {
195
+ resolveFunc = resolve;
196
+ rejectFunc = reject;
197
+ });
198
+
199
+ // Handle optional userID parameter
200
+ if (typeof userID === 'function') {
201
+ callback = userID;
202
+ userID = ctx.userID;
203
+ }
204
+
205
+ userID = userID || ctx.userID;
206
+
207
+ if (!callback) {
208
+ callback = function(err, data) {
209
+ if (err) return rejectFunc(err);
210
+ resolveFunc(data);
211
+ };
212
+ }
213
+
214
+ var sectionToken = Buffer.from('app_section:' + userID + ':2356318349').toString('base64');
215
+ var variables = {
216
+ collectionToken: null,
217
+ scale: 2,
218
+ sectionToken: sectionToken,
219
+ useDefaultActor: false,
220
+ userID: userID
221
+ };
222
+
223
+ var form = {
224
+ av: ctx.userID,
225
+ __user: ctx.userID,
226
+ __a: "1",
227
+ fb_dtsg: ctx.fb_dtsg,
228
+ jazoest: ctx.jazoest,
229
+ lsd: ctx.lsd,
230
+ fb_api_caller_class: "RelayModern",
231
+ fb_api_req_friendly_name: "ProfileCometTopAppSectionQuery",
232
+ variables: JSON.stringify(variables),
233
+ doc_id: "24492266383698794"
234
+ };
235
+
236
+ defaultFuncs
237
+ .post("https://www.facebook.com/api/graphql/", ctx.jar, form, {})
238
+ .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
239
+ .then(function(res) {
240
+ if (res.errors) throw new Error(JSON.stringify(res.errors));
241
+ var formatted = formatFriends(res, 'list');
242
+ log.info('friend.list', 'Found ' + formatted.length + ' friends for user: ' + userID);
243
+ callback(null, formatted);
244
+ })
245
+ .catch(function(err) {
246
+ log.error('friend.list', err);
247
+ callback(err);
248
+ });
249
+
250
+ return returnPromise;
251
+ },
252
+
253
+ /**
254
+ * Friend suggestions module
255
+ */
256
+ suggest: {
257
+ /**
258
+ * Get friend suggestions (People You May Know)
259
+ * @param {number} limit - Max number of suggestions
260
+ * @param {function} callback - Optional callback
261
+ * @returns {Promise<Array>}
262
+ */
263
+ list: function(limit, callback) {
264
+ var resolveFunc = function() {};
265
+ var rejectFunc = function() {};
266
+ var returnPromise = new Promise(function(resolve, reject) {
267
+ resolveFunc = resolve;
268
+ rejectFunc = reject;
269
+ });
270
+
271
+ // Handle optional limit parameter
272
+ if (typeof limit === 'function') {
273
+ callback = limit;
274
+ limit = 30;
275
+ }
276
+
277
+ limit = limit || 30;
278
+
279
+ if (!callback) {
280
+ callback = function(err, data) {
281
+ if (err) return rejectFunc(err);
282
+ resolveFunc(data);
283
+ };
284
+ }
285
+
286
+ var form = {
287
+ av: ctx.userID,
288
+ __user: ctx.userID,
289
+ __a: "1",
290
+ fb_dtsg: ctx.fb_dtsg,
291
+ jazoest: ctx.jazoest,
292
+ lsd: ctx.lsd,
293
+ fb_api_caller_class: "RelayModern",
294
+ fb_api_req_friendly_name: "FriendingCometPYMKPanelPaginationQuery",
295
+ variables: JSON.stringify({ count: limit, cursor: null, scale: 3 }),
296
+ doc_id: "9917809191634193"
297
+ };
298
+
299
+ defaultFuncs
300
+ .post("https://www.facebook.com/api/graphql/", ctx.jar, form, {})
301
+ .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
302
+ .then(function(res) {
303
+ if (res.errors) throw new Error(JSON.stringify(res.errors));
304
+ var formatted = formatFriends(res, 'suggestions');
305
+ log.info('friend.suggest.list', 'Found ' + formatted.length + ' suggestions');
306
+ callback(null, formatted);
307
+ })
308
+ .catch(function(err) {
309
+ log.error('friend.suggest.list', err);
310
+ callback(err);
311
+ });
312
+
313
+ return returnPromise;
314
+ },
315
+
316
+ /**
317
+ * Send friend request
318
+ * @param {string} userID - User ID to send request to
319
+ * @param {function} callback - Optional callback
320
+ * @returns {Promise<object>}
321
+ */
322
+ request: function(userID, callback) {
323
+ var resolveFunc = function() {};
324
+ var rejectFunc = function() {};
325
+ var returnPromise = new Promise(function(resolve, reject) {
326
+ resolveFunc = resolve;
327
+ rejectFunc = reject;
328
+ });
329
+
330
+ if (!callback) {
331
+ callback = function(err, data) {
332
+ if (err) return rejectFunc(err);
333
+ resolveFunc(data);
334
+ };
335
+ }
336
+
337
+ if (!userID) {
338
+ return callback({ error: "userID is required." });
339
+ }
340
+
341
+ var variables = {
342
+ input: {
343
+ friend_requestee_ids: [userID],
344
+ friending_channel: "FRIENDS_HOME_MAIN",
345
+ actor_id: ctx.userID,
346
+ client_mutation_id: Math.floor(Math.random() * 10 + 1).toString()
347
+ },
348
+ scale: 3
349
+ };
350
+
351
+ var form = {
352
+ av: ctx.userID,
353
+ __user: ctx.userID,
354
+ __a: "1",
355
+ fb_dtsg: ctx.fb_dtsg,
356
+ jazoest: ctx.jazoest,
357
+ lsd: ctx.lsd,
358
+ fb_api_caller_class: "RelayModern",
359
+ fb_api_req_friendly_name: "FriendingCometFriendRequestSendMutation",
360
+ variables: JSON.stringify(variables),
361
+ doc_id: "23982103144788355"
362
+ };
363
+
364
+ defaultFuncs
365
+ .post("https://www.facebook.com/api/graphql/", ctx.jar, form, {})
366
+ .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
367
+ .then(function(res) {
368
+ if (res.errors) throw new Error(JSON.stringify(res.errors));
369
+ log.info('friend.suggest.request', 'Sent friend request to: ' + userID);
370
+ callback(null, res.data);
371
+ })
372
+ .catch(function(err) {
373
+ log.error('friend.suggest.request', err);
374
+ callback(err);
375
+ });
376
+
377
+ return returnPromise;
378
+ }
379
+ }
380
+ };
381
+
382
+ return friendModule;
383
+ };
@@ -1,28 +1,28 @@
1
- /* eslint-disable linebreak-style */
2
- "use strict";
3
-
4
- module.exports = function (defaultFuncs, api, ctx) {
5
- return function getAccessToken(callback) {
6
- var resolveFunc = function () { };
7
- var rejectFunc = function () { };
8
- var returnPromise = new Promise(function (resolve, reject) {
9
- resolveFunc = resolve;
10
- rejectFunc = reject;
11
- });
12
-
13
- if (!callback) {
14
- callback = function (err, userInfo) {
15
- if (err) return rejectFunc(err);
16
- resolveFunc(userInfo);
17
- };
18
- }
19
- try {
20
- var { getAccessToken } = require('../Extra/ExtraAddons');
21
- getAccessToken(ctx.jar,ctx,defaultFuncs).then(data => callback(null,data));
22
- }
23
- catch (e) {
24
- callback(null, e);
25
- }
26
- return returnPromise;
27
- };
1
+ /* eslint-disable linebreak-style */
2
+ "use strict";
3
+
4
+ module.exports = function (defaultFuncs, api, ctx) {
5
+ return function getAccessToken(callback) {
6
+ var resolveFunc = function () { };
7
+ var rejectFunc = function () { };
8
+ var returnPromise = new Promise(function (resolve, reject) {
9
+ resolveFunc = resolve;
10
+ rejectFunc = reject;
11
+ });
12
+
13
+ if (!callback) {
14
+ callback = function (err, userInfo) {
15
+ if (err) return rejectFunc(err);
16
+ resolveFunc(userInfo);
17
+ };
18
+ }
19
+ try {
20
+ var { getAccessToken } = require('../Extra/ExtraAddons');
21
+ getAccessToken(ctx.jar,ctx,defaultFuncs).then(data => callback(null,data));
22
+ }
23
+ catch (e) {
24
+ callback(null, e);
25
+ }
26
+ return returnPromise;
27
+ };
28
28
  };
@@ -1,7 +1,7 @@
1
- "use strict";
2
-
3
- module.exports = function (defaultFuncs, api, ctx) {
4
- return function getCurrentUserID() {
5
- return ctx.userID;
6
- };
7
- };
1
+ "use strict";
2
+
3
+ module.exports = function (defaultFuncs, api, ctx) {
4
+ return function getCurrentUserID() {
5
+ return ctx.userID;
6
+ };
7
+ };