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/notes.js ADDED
@@ -0,0 +1,279 @@
1
+ "use strict";
2
+
3
+ var utils = require("../utils");
4
+ var log = require("npmlog");
5
+
6
+ /**
7
+ * Notes API Module
8
+ * For interacting with Facebook Messenger Notes (24-hour status messages)
9
+ * Made by @ChoruOfficial - Ported to fca-updated format
10
+ *
11
+ * Note: This is for temporary status-like notes in Messenger, NOT profile page notes
12
+ */
13
+
14
+ module.exports = function(defaultFuncs, api, ctx) {
15
+
16
+ /**
17
+ * Check for the currently active note
18
+ * @param {function} callback - Optional callback(err, note)
19
+ * @returns {Promise<Object>}
20
+ */
21
+ function checkNote(callback) {
22
+ var resolveFunc = function() {};
23
+ var rejectFunc = function() {};
24
+ var returnPromise = new Promise(function(resolve, reject) {
25
+ resolveFunc = resolve;
26
+ rejectFunc = reject;
27
+ });
28
+
29
+ if (!callback) {
30
+ callback = function(err, data) {
31
+ if (err) return rejectFunc(err);
32
+ resolveFunc(data);
33
+ };
34
+ }
35
+
36
+ var form = {
37
+ fb_api_caller_class: "RelayModern",
38
+ fb_api_req_friendly_name: "MWInboxTrayNoteCreationDialogQuery",
39
+ variables: JSON.stringify({ scale: 2 }),
40
+ doc_id: "30899655739648624"
41
+ };
42
+
43
+ defaultFuncs
44
+ .post("https://www.facebook.com/api/graphql/", ctx.jar, form)
45
+ .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
46
+ .then(function(resData) {
47
+ if (resData && resData.errors) {
48
+ throw resData.errors[0];
49
+ }
50
+ var currentNote = resData?.data?.viewer?.actor?.msgr_user_rich_status;
51
+ log.info("notes.check", "Current note retrieved");
52
+ callback(null, currentNote);
53
+ })
54
+ .catch(function(err) {
55
+ log.error("notes.check", err);
56
+ callback(err);
57
+ });
58
+
59
+ return returnPromise;
60
+ }
61
+
62
+ /**
63
+ * Create a new note (lasts 24 hours)
64
+ * @param {string} text - Note content
65
+ * @param {string} privacy - "EVERYONE" or "FRIENDS" (default: "EVERYONE")
66
+ * @param {function} callback - Optional callback(err, status)
67
+ * @returns {Promise<Object>}
68
+ */
69
+ function createNote(text, privacy, callback) {
70
+ var resolveFunc = function() {};
71
+ var rejectFunc = function() {};
72
+ var returnPromise = new Promise(function(resolve, reject) {
73
+ resolveFunc = resolve;
74
+ rejectFunc = reject;
75
+ });
76
+
77
+ // Handle optional privacy parameter
78
+ if (typeof privacy === 'function') {
79
+ callback = privacy;
80
+ privacy = "EVERYONE";
81
+ }
82
+
83
+ privacy = privacy || "EVERYONE";
84
+
85
+ if (!callback) {
86
+ callback = function(err, data) {
87
+ if (err) return rejectFunc(err);
88
+ resolveFunc(data);
89
+ };
90
+ }
91
+
92
+ if (!text || typeof text !== 'string') {
93
+ return callback({ error: "Note text is required and must be a string." });
94
+ }
95
+
96
+ var variables = {
97
+ input: {
98
+ client_mutation_id: Math.round(Math.random() * 10).toString(),
99
+ actor_id: ctx.userID,
100
+ description: text,
101
+ duration: 86400, // 24 hours in seconds
102
+ note_type: "TEXT_NOTE",
103
+ privacy: privacy,
104
+ session_id: utils.getGUID()
105
+ }
106
+ };
107
+
108
+ var form = {
109
+ fb_api_caller_class: "RelayModern",
110
+ fb_api_req_friendly_name: "MWInboxTrayNoteCreationDialogCreationStepContentMutation",
111
+ variables: JSON.stringify(variables),
112
+ doc_id: "24060573783603122"
113
+ };
114
+
115
+ defaultFuncs
116
+ .post("https://www.facebook.com/api/graphql/", ctx.jar, form)
117
+ .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
118
+ .then(function(resData) {
119
+ if (resData && resData.errors) {
120
+ throw resData.errors[0];
121
+ }
122
+ var status = resData?.data?.xfb_rich_status_create?.status;
123
+ if (!status) {
124
+ throw new Error("Could not find note status in the server response.");
125
+ }
126
+ log.info("notes.create", "Note created successfully: " + text.substring(0, 30) + "...");
127
+ callback(null, status);
128
+ })
129
+ .catch(function(err) {
130
+ log.error("notes.create", err);
131
+ callback(err);
132
+ });
133
+
134
+ return returnPromise;
135
+ }
136
+
137
+ /**
138
+ * Delete a specific note by ID
139
+ * @param {string} noteID - The ID of the note to delete
140
+ * @param {function} callback - Optional callback(err, deletedStatus)
141
+ * @returns {Promise<Object>}
142
+ */
143
+ function deleteNote(noteID, callback) {
144
+ var resolveFunc = function() {};
145
+ var rejectFunc = function() {};
146
+ var returnPromise = new Promise(function(resolve, reject) {
147
+ resolveFunc = resolve;
148
+ rejectFunc = reject;
149
+ });
150
+
151
+ if (!callback) {
152
+ callback = function(err, data) {
153
+ if (err) return rejectFunc(err);
154
+ resolveFunc(data);
155
+ };
156
+ }
157
+
158
+ if (!noteID) {
159
+ return callback({ error: "Note ID is required." });
160
+ }
161
+
162
+ var variables = {
163
+ input: {
164
+ client_mutation_id: Math.round(Math.random() * 10).toString(),
165
+ actor_id: ctx.userID,
166
+ rich_status_id: noteID
167
+ }
168
+ };
169
+
170
+ var form = {
171
+ fb_api_caller_class: "RelayModern",
172
+ fb_api_req_friendly_name: "useMWInboxTrayDeleteNoteMutation",
173
+ variables: JSON.stringify(variables),
174
+ doc_id: "9532619970198958"
175
+ };
176
+
177
+ defaultFuncs
178
+ .post("https://www.facebook.com/api/graphql/", ctx.jar, form)
179
+ .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
180
+ .then(function(resData) {
181
+ if (resData && resData.errors) {
182
+ throw resData.errors[0];
183
+ }
184
+ var deletedStatus = resData?.data?.xfb_rich_status_delete;
185
+ if (!deletedStatus) {
186
+ throw new Error("Could not find deletion status in the server response.");
187
+ }
188
+ log.info("notes.delete", "Note deleted successfully: " + noteID);
189
+ callback(null, deletedStatus);
190
+ })
191
+ .catch(function(err) {
192
+ log.error("notes.delete", err);
193
+ callback(err);
194
+ });
195
+
196
+ return returnPromise;
197
+ }
198
+
199
+ /**
200
+ * Delete old note and create a new one (convenience function)
201
+ * @param {string} oldNoteID - The ID of the note to delete
202
+ * @param {string} newText - Text for the new note
203
+ * @param {string} privacy - "EVERYONE" or "FRIENDS" (optional)
204
+ * @param {function} callback - Optional callback(err, result)
205
+ * @returns {Promise<Object>}
206
+ */
207
+ function recreateNote(oldNoteID, newText, privacy, callback) {
208
+ var resolveFunc = function() {};
209
+ var rejectFunc = function() {};
210
+ var returnPromise = new Promise(function(resolve, reject) {
211
+ resolveFunc = resolve;
212
+ rejectFunc = reject;
213
+ });
214
+
215
+ // Handle optional privacy parameter
216
+ if (typeof privacy === 'function') {
217
+ callback = privacy;
218
+ privacy = "EVERYONE";
219
+ }
220
+
221
+ privacy = privacy || "EVERYONE";
222
+
223
+ if (!callback) {
224
+ callback = function(err, data) {
225
+ if (err) return rejectFunc(err);
226
+ resolveFunc(data);
227
+ };
228
+ }
229
+
230
+ deleteNote(oldNoteID, function(err, deleted) {
231
+ if (err) {
232
+ return callback(err);
233
+ }
234
+
235
+ createNote(newText, privacy, function(err, created) {
236
+ if (err) {
237
+ return callback(err);
238
+ }
239
+
240
+ log.info("notes.recreate", "Note recreated successfully");
241
+ callback(null, { deleted: deleted, created: created });
242
+ });
243
+ });
244
+
245
+ return returnPromise;
246
+ }
247
+
248
+ return {
249
+ /**
250
+ * Create a new Messenger note (24 hours)
251
+ * @param {string} text - Note content
252
+ * @param {string} privacy - "EVERYONE" or "FRIENDS" (optional, default: "EVERYONE")
253
+ * @param {function} callback - Optional callback(err, status)
254
+ */
255
+ create: createNote,
256
+
257
+ /**
258
+ * Delete a note by ID
259
+ * @param {string} noteID - Note ID to delete
260
+ * @param {function} callback - Optional callback(err, deletedStatus)
261
+ */
262
+ delete: deleteNote,
263
+
264
+ /**
265
+ * Delete old note and create new one
266
+ * @param {string} oldNoteID - Old note ID to delete
267
+ * @param {string} newText - New note text
268
+ * @param {string} privacy - "EVERYONE" or "FRIENDS" (optional)
269
+ * @param {function} callback - Optional callback(err, result)
270
+ */
271
+ recreate: recreateNote,
272
+
273
+ /**
274
+ * Check current active note
275
+ * @param {function} callback - Optional callback(err, currentNote)
276
+ */
277
+ check: checkNote
278
+ };
279
+ };
@@ -1,49 +1,49 @@
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 removeUserFromGroup(userID, threadID, callback) {
8
- if (!callback && (utils.getType(threadID) === "Function" || utils.getType(threadID) === "AsyncFunction")) throw { error: "please pass a threadID as a second argument." };
9
- if (utils.getType(threadID) !== "Number" && utils.getType(threadID) !== "String") throw { error: "threadID should be of type Number or String and not " + utils.getType(threadID) + "." };
10
- if (utils.getType(userID) !== "Number" && utils.getType(userID) !== "String") throw { error: "userID should be of type Number or String and not " + utils.getType(userID) + "." };
11
-
12
- var resolveFunc = function () { };
13
- var rejectFunc = function () { };
14
- var returnPromise = new Promise(function (resolve, reject) {
15
- resolveFunc = resolve;
16
- rejectFunc = reject;
17
- });
18
-
19
- if (!callback) {
20
- callback = function (err, data) {
21
- if (err) return rejectFunc(err);
22
-
23
- resolveFunc(data);
24
- };
25
- }
26
-
27
- var form = {
28
- uid: userID,
29
- tid: threadID
30
- };
31
-
32
- defaultFuncs
33
- .post("https://www.facebook.com/chat/remove_participants", ctx.jar, form)
34
- .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
35
- .then(function (resData) {
36
- if (!resData) throw { error: "Remove from group failed." };
37
-
38
- if (resData.error) throw resData;
39
-
40
- return callback();
41
- })
42
- .catch(function (err) {
43
- log.error("removeUserFromGroup", err);
44
- return callback(err);
45
- });
46
-
47
- return returnPromise;
48
- };
49
- };
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 removeUserFromGroup(userID, threadID, callback) {
8
+ if (!callback && (utils.getType(threadID) === "Function" || utils.getType(threadID) === "AsyncFunction")) throw { error: "please pass a threadID as a second argument." };
9
+ if (utils.getType(threadID) !== "Number" && utils.getType(threadID) !== "String") throw { error: "threadID should be of type Number or String and not " + utils.getType(threadID) + "." };
10
+ if (utils.getType(userID) !== "Number" && utils.getType(userID) !== "String") throw { error: "userID should be of type Number or String and not " + utils.getType(userID) + "." };
11
+
12
+ var resolveFunc = function () { };
13
+ var rejectFunc = function () { };
14
+ var returnPromise = new Promise(function (resolve, reject) {
15
+ resolveFunc = resolve;
16
+ rejectFunc = reject;
17
+ });
18
+
19
+ if (!callback) {
20
+ callback = function (err, data) {
21
+ if (err) return rejectFunc(err);
22
+
23
+ resolveFunc(data);
24
+ };
25
+ }
26
+
27
+ var form = {
28
+ uid: userID,
29
+ tid: threadID
30
+ };
31
+
32
+ defaultFuncs
33
+ .post("https://www.facebook.com/chat/remove_participants", ctx.jar, form)
34
+ .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
35
+ .then(function (resData) {
36
+ if (!resData) throw { error: "Remove from group failed." };
37
+
38
+ if (resData.error) throw resData;
39
+
40
+ return callback();
41
+ })
42
+ .catch(function (err) {
43
+ log.error("removeUserFromGroup", err);
44
+ return callback(err);
45
+ });
46
+
47
+ return returnPromise;
48
+ };
49
+ };
@@ -1,37 +1,37 @@
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 resolvePhotoUrl(photoID, 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
- defaultFuncs
23
- .get("https://www.facebook.com/mercury/attachments/photo", ctx.jar, { photo_id: photoID })
24
- .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
25
- .then(resData => {
26
- if (resData.error) throw resData;
27
- var photoUrl = resData.jsmods.require[0][3][0];
28
- return callback(null, photoUrl);
29
- })
30
- .catch(err => {
31
- log.error("resolvePhotoUrl", err);
32
- return callback(err);
33
- });
34
-
35
- return returnPromise;
36
- };
37
- };
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 resolvePhotoUrl(photoID, 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
+ defaultFuncs
23
+ .get("https://www.facebook.com/mercury/attachments/photo", ctx.jar, { photo_id: photoID })
24
+ .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
25
+ .then(resData => {
26
+ if (resData.error) throw resData;
27
+ var photoUrl = resData.jsmods.require[0][3][0];
28
+ return callback(null, photoUrl);
29
+ })
30
+ .catch(err => {
31
+ log.error("resolvePhotoUrl", err);
32
+ return callback(err);
33
+ });
34
+
35
+ return returnPromise;
36
+ };
37
+ };
@@ -1,43 +1,43 @@
1
- "use strict";
2
-
3
- var utils = require("../utils");
4
-
5
- module.exports = function (defaultFuncs, api, ctx) {
6
- return function searchForThread(name, callback) {
7
- var resolveFunc = function () { };
8
- var rejectFunc = function () { };
9
- var returnPromise = new Promise(function (resolve, reject) {
10
- resolveFunc = resolve;
11
- rejectFunc = reject;
12
- });
13
-
14
- if (!callback) {
15
- callback = function (err, data) {
16
- if (err) return rejectFunc(err);
17
- resolveFunc(data);
18
- };
19
- }
20
-
21
- var tmpForm = {
22
- client: "web_messenger",
23
- query: name,
24
- offset: 0,
25
- limit: 21,
26
- index: "fbid"
27
- };
28
-
29
- defaultFuncs
30
- .post("https://www.facebook.com/ajax/mercury/search_threads.php", ctx.jar, tmpForm)
31
- .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
32
- .then(function (resData) {
33
- if (resData.error) throw resData;
34
- if (!resData.payload.mercury_payload.threads) return callback({ error: "Could not find thread `" + name + "`." });
35
- return callback(
36
- null,
37
- resData.payload.mercury_payload.threads.map(utils.formatThread)
38
- );
39
- });
40
-
41
- return returnPromise;
42
- };
43
- };
1
+ "use strict";
2
+
3
+ var utils = require("../utils");
4
+
5
+ module.exports = function (defaultFuncs, api, ctx) {
6
+ return function searchForThread(name, callback) {
7
+ var resolveFunc = function () { };
8
+ var rejectFunc = function () { };
9
+ var returnPromise = new Promise(function (resolve, reject) {
10
+ resolveFunc = resolve;
11
+ rejectFunc = reject;
12
+ });
13
+
14
+ if (!callback) {
15
+ callback = function (err, data) {
16
+ if (err) return rejectFunc(err);
17
+ resolveFunc(data);
18
+ };
19
+ }
20
+
21
+ var tmpForm = {
22
+ client: "web_messenger",
23
+ query: name,
24
+ offset: 0,
25
+ limit: 21,
26
+ index: "fbid"
27
+ };
28
+
29
+ defaultFuncs
30
+ .post("https://www.facebook.com/ajax/mercury/search_threads.php", ctx.jar, tmpForm)
31
+ .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
32
+ .then(function (resData) {
33
+ if (resData.error) throw resData;
34
+ if (!resData.payload.mercury_payload.threads) return callback({ error: "Could not find thread `" + name + "`." });
35
+ return callback(
36
+ null,
37
+ resData.payload.mercury_payload.threads.map(utils.formatThread)
38
+ );
39
+ });
40
+
41
+ return returnPromise;
42
+ };
43
+ };