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
@@ -0,0 +1,525 @@
1
+ "use strict";
2
+
3
+ var utils = require("../utils");
4
+ var log = require("npmlog");
5
+
6
+ /**
7
+ * Sticker API Module
8
+ * Provides access to Facebook's GraphQL-based sticker endpoints
9
+ * Made by @ChoruOfficial - Ported to fca-updated format
10
+ */
11
+
12
+ /**
13
+ * Format the sticker pack list (store or tray)
14
+ * @param {object} data - Raw GraphQL response
15
+ * @returns {{ packs: Array<{id: string, name: string, thumbnail: string}>, page_info: object, store_id?: string }}
16
+ */
17
+ function formatPackList(data) {
18
+ var trayPacks = data?.data?.picker_plugins?.sticker_picker?.sticker_store?.tray_packs?.edges;
19
+ var storePacks = data?.data?.viewer?.sticker_store?.available_packs?.edges;
20
+
21
+ var packData = storePacks || trayPacks;
22
+ if (!packData || !packData.edges) {
23
+ return { packs: [], page_info: { has_next_page: false } };
24
+ }
25
+
26
+ var formattedPacks = packData.edges.map(function(edge) {
27
+ if (!edge.node) return null;
28
+ return {
29
+ id: edge.node.id,
30
+ name: edge.node.name,
31
+ thumbnail: edge.node.thumbnail_image?.uri
32
+ };
33
+ }).filter(Boolean);
34
+
35
+ return {
36
+ packs: formattedPacks,
37
+ page_info: packData.page_info,
38
+ store_id: data?.data?.viewer?.sticker_store?.id
39
+ };
40
+ }
41
+
42
+ /**
43
+ * Format search result stickers
44
+ * @param {object} data - Raw GraphQL response
45
+ * @returns {Array<Object>}
46
+ */
47
+ function formatStickerSearchResults(data) {
48
+ var stickers = data?.data?.sticker_search?.sticker_results?.edges;
49
+ if (!stickers) return [];
50
+
51
+ return stickers.map(function(edge) {
52
+ if (!edge.node) return null;
53
+ return {
54
+ type: "sticker",
55
+ ID: edge.node.id,
56
+ url: edge.node.image?.uri,
57
+ animatedUrl: edge.node.animated_image?.uri,
58
+ packID: edge.node.pack?.id,
59
+ label: edge.node.label || edge.node.accessibility_label,
60
+ stickerID: edge.node.id
61
+ };
62
+ }).filter(Boolean);
63
+ }
64
+
65
+ /**
66
+ * Format sticker pack content
67
+ * @param {object} data - Raw GraphQL response
68
+ * @returns {Array<Object>}
69
+ */
70
+ function formatStickerPackResults(data) {
71
+ var stickers = data?.data?.sticker_pack?.stickers?.edges;
72
+ if (!stickers) return [];
73
+
74
+ return stickers.map(function(edge) {
75
+ if (!edge.node) return null;
76
+ return {
77
+ type: "sticker",
78
+ ID: edge.node.id,
79
+ url: edge.node.image?.uri,
80
+ animatedUrl: edge.node.animated_image?.uri,
81
+ packID: edge.node.pack?.id,
82
+ label: edge.node.label || edge.node.accessibility_label,
83
+ stickerID: edge.node.id
84
+ };
85
+ }).filter(Boolean);
86
+ }
87
+
88
+ /**
89
+ * Format AI-generated stickers
90
+ * @param {object} data - Raw GraphQL response
91
+ * @returns {Array<Object>}
92
+ */
93
+ function formatAiStickers(data) {
94
+ var stickers = data?.data?.xfb_trending_generated_ai_stickers?.nodes;
95
+ if (!stickers) return [];
96
+
97
+ return stickers.map(function(node) {
98
+ return {
99
+ type: "sticker",
100
+ ID: node.id,
101
+ url: node.url,
102
+ label: node.label,
103
+ stickerID: node.id
104
+ };
105
+ }).filter(Boolean);
106
+ }
107
+
108
+ module.exports = function(defaultFuncs, api, ctx) {
109
+ /**
110
+ * Make a GraphQL request and handle login and error checking
111
+ * @param {object} form - Form data for the request
112
+ * @returns {Promise<object>}
113
+ */
114
+ function makeRequest(form) {
115
+ return 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) {
120
+ throw new Error("GraphQL request returned no data.");
121
+ }
122
+ if (resData.errors) {
123
+ log.error("StickerAPI GraphQL Error", resData.errors[0].message);
124
+ throw resData.errors[0];
125
+ }
126
+ return resData;
127
+ });
128
+ }
129
+
130
+ return {
131
+ /**
132
+ * Search for stickers by keyword
133
+ * @param {string} query - Search term
134
+ * @param {function} callback - Optional callback(err, result)
135
+ * @returns {Promise<Array<Object>>}
136
+ */
137
+ search: function(query, callback) {
138
+ var resolveFunc = function() {};
139
+ var rejectFunc = function() {};
140
+ var returnPromise = new Promise(function(resolve, reject) {
141
+ resolveFunc = resolve;
142
+ rejectFunc = reject;
143
+ });
144
+
145
+ if (!callback) {
146
+ callback = function(err, data) {
147
+ if (err) return rejectFunc(err);
148
+ resolveFunc(data);
149
+ };
150
+ }
151
+
152
+ if (!query) {
153
+ return callback({ error: "Search query is required." });
154
+ }
155
+
156
+ var form = {
157
+ fb_api_caller_class: 'RelayModern',
158
+ fb_api_req_friendly_name: 'CometStickerPickerSearchResultsRootQuery',
159
+ variables: JSON.stringify({
160
+ scale: 3,
161
+ search_query: query,
162
+ sticker_height: 128,
163
+ sticker_width: 128,
164
+ stickerInterface: "MESSAGES"
165
+ }),
166
+ doc_id: '24004987559125954'
167
+ };
168
+
169
+ makeRequest(form)
170
+ .then(function(res) {
171
+ var results = formatStickerSearchResults(res);
172
+ log.info("stickers.search", "Found " + results.length + " stickers for query: " + query);
173
+ callback(null, results);
174
+ })
175
+ .catch(function(err) {
176
+ log.error("stickers.search", err);
177
+ callback(err);
178
+ });
179
+
180
+ return returnPromise;
181
+ },
182
+
183
+ /**
184
+ * List user's sticker packs
185
+ * @param {function} callback - Optional callback(err, result)
186
+ * @returns {Promise<Array<Object>>}
187
+ */
188
+ listPacks: function(callback) {
189
+ var resolveFunc = function() {};
190
+ var rejectFunc = function() {};
191
+ var returnPromise = new Promise(function(resolve, reject) {
192
+ resolveFunc = resolve;
193
+ rejectFunc = reject;
194
+ });
195
+
196
+ if (!callback) {
197
+ callback = function(err, data) {
198
+ if (err) return rejectFunc(err);
199
+ resolveFunc(data);
200
+ };
201
+ }
202
+
203
+ var form = {
204
+ fb_api_caller_class: 'RelayModern',
205
+ fb_api_req_friendly_name: 'CometStickerPickerCardQuery',
206
+ variables: JSON.stringify({ scale: 3, stickerInterface: "MESSAGES" }),
207
+ doc_id: '10095807770482952'
208
+ };
209
+
210
+ makeRequest(form)
211
+ .then(function(res) {
212
+ var packs = formatPackList(res).packs;
213
+ log.info("stickers.listPacks", "Found " + packs.length + " user sticker packs");
214
+ callback(null, packs);
215
+ })
216
+ .catch(function(err) {
217
+ log.error("stickers.listPacks", err);
218
+ callback(err);
219
+ });
220
+
221
+ return returnPromise;
222
+ },
223
+
224
+ /**
225
+ * Get all available sticker packs from the store (with pagination)
226
+ * @param {function} callback - Optional callback(err, result)
227
+ * @returns {Promise<Array<Object>>}
228
+ */
229
+ getStorePacks: function(callback) {
230
+ var resolveFunc = function() {};
231
+ var rejectFunc = function() {};
232
+ var returnPromise = new Promise(function(resolve, reject) {
233
+ resolveFunc = resolve;
234
+ rejectFunc = reject;
235
+ });
236
+
237
+ if (!callback) {
238
+ callback = function(err, data) {
239
+ if (err) return rejectFunc(err);
240
+ resolveFunc(data);
241
+ };
242
+ }
243
+
244
+ log.info("stickers.getStorePacks", "Starting to fetch all sticker packs from store...");
245
+ var allPacks = [];
246
+
247
+ var initialForm = {
248
+ fb_api_caller_class: 'RelayModern',
249
+ fb_api_req_friendly_name: 'CometStickersStoreDialogQuery',
250
+ variables: JSON.stringify({}),
251
+ doc_id: '29237828849196584'
252
+ };
253
+
254
+ makeRequest(initialForm)
255
+ .then(function(res) {
256
+ var result = formatPackList(res);
257
+ var packs = result.packs;
258
+ var page_info = result.page_info;
259
+ var store_id = result.store_id;
260
+
261
+ allPacks = allPacks.concat(packs);
262
+ log.info("stickers.getStorePacks", "Fetched first page with " + packs.length + " packs.");
263
+
264
+ // Handle pagination
265
+ function fetchNextPage() {
266
+ if (!page_info || !page_info.has_next_page) {
267
+ log.info("stickers.getStorePacks", "Finished fetching. Total unique packs found: " + allPacks.length);
268
+ return callback(null, allPacks);
269
+ }
270
+
271
+ log.info("stickers.getStorePacks", "Fetching next page with cursor: " + page_info.end_cursor);
272
+
273
+ var paginatedForm = {
274
+ fb_api_caller_class: 'RelayModern',
275
+ fb_api_req_friendly_name: 'CometStickersStorePackListPaginationQuery',
276
+ variables: JSON.stringify({
277
+ count: 20,
278
+ cursor: page_info.end_cursor,
279
+ id: store_id
280
+ }),
281
+ doc_id: '9898634630218439'
282
+ };
283
+
284
+ makeRequest(paginatedForm)
285
+ .then(function(nextRes) {
286
+ var paginatedResult = formatPackList(nextRes);
287
+ allPacks = allPacks.concat(paginatedResult.packs);
288
+ page_info = paginatedResult.page_info;
289
+ log.info("stickers.getStorePacks", "Fetched " + paginatedResult.packs.length + " more packs. Total now: " + allPacks.length);
290
+ fetchNextPage();
291
+ })
292
+ .catch(function(err) {
293
+ log.error("stickers.getStorePacks", err);
294
+ callback(err);
295
+ });
296
+ }
297
+
298
+ fetchNextPage();
299
+ })
300
+ .catch(function(err) {
301
+ log.error("stickers.getStorePacks", err);
302
+ callback(err);
303
+ });
304
+
305
+ return returnPromise;
306
+ },
307
+
308
+ /**
309
+ * Merge user's and store sticker packs into one list
310
+ * @param {function} callback - Optional callback(err, result)
311
+ * @returns {Promise<Array<Object>>}
312
+ */
313
+ listAllPacks: function(callback) {
314
+ var resolveFunc = function() {};
315
+ var rejectFunc = function() {};
316
+ var returnPromise = new Promise(function(resolve, reject) {
317
+ resolveFunc = resolve;
318
+ rejectFunc = reject;
319
+ });
320
+
321
+ if (!callback) {
322
+ callback = function(err, data) {
323
+ if (err) return rejectFunc(err);
324
+ resolveFunc(data);
325
+ };
326
+ }
327
+
328
+ var self = this;
329
+
330
+ Promise.all([
331
+ new Promise(function(resolve, reject) {
332
+ self.listPacks(function(err, data) {
333
+ if (err) return reject(err);
334
+ resolve(data);
335
+ });
336
+ }),
337
+ new Promise(function(resolve, reject) {
338
+ self.getStorePacks(function(err, data) {
339
+ if (err) return reject(err);
340
+ resolve(data);
341
+ });
342
+ })
343
+ ])
344
+ .then(function(results) {
345
+ var myPacks = results[0];
346
+ var storePacks = results[1];
347
+
348
+ var allPacksMap = {};
349
+ myPacks.forEach(function(pack) {
350
+ allPacksMap[pack.id] = pack;
351
+ });
352
+ storePacks.forEach(function(pack) {
353
+ allPacksMap[pack.id] = pack;
354
+ });
355
+
356
+ var allPacks = Object.keys(allPacksMap).map(function(key) {
357
+ return allPacksMap[key];
358
+ });
359
+
360
+ log.info("stickers.listAllPacks", "Total unique packs: " + allPacks.length);
361
+ callback(null, allPacks);
362
+ })
363
+ .catch(function(err) {
364
+ log.error("stickers.listAllPacks", err);
365
+ callback(err);
366
+ });
367
+
368
+ return returnPromise;
369
+ },
370
+
371
+ /**
372
+ * Add a sticker pack by ID
373
+ * @param {string} packID - The ID of the sticker pack
374
+ * @param {function} callback - Optional callback(err, result)
375
+ * @returns {Promise<Object>}
376
+ */
377
+ addPack: function(packID, callback) {
378
+ var resolveFunc = function() {};
379
+ var rejectFunc = function() {};
380
+ var returnPromise = new Promise(function(resolve, reject) {
381
+ resolveFunc = resolve;
382
+ rejectFunc = reject;
383
+ });
384
+
385
+ if (!callback) {
386
+ callback = function(err, data) {
387
+ if (err) return rejectFunc(err);
388
+ resolveFunc(data);
389
+ };
390
+ }
391
+
392
+ if (!packID) {
393
+ return callback({ error: "Pack ID is required." });
394
+ }
395
+
396
+ var form = {
397
+ fb_api_caller_class: 'RelayModern',
398
+ fb_api_req_friendly_name: 'CometStickersStorePackMutationAddMutation',
399
+ variables: JSON.stringify({
400
+ input: {
401
+ pack_id: packID,
402
+ actor_id: ctx.userID,
403
+ client_mutation_id: Math.round(Math.random() * 10).toString()
404
+ }
405
+ }),
406
+ doc_id: '9877489362345320'
407
+ };
408
+
409
+ makeRequest(form)
410
+ .then(function(res) {
411
+ var pack = res.data.sticker_pack_add.sticker_pack;
412
+ log.info("stickers.addPack", "Successfully added sticker pack: " + packID);
413
+ callback(null, pack);
414
+ })
415
+ .catch(function(err) {
416
+ log.error("stickers.addPack", err);
417
+ callback(err);
418
+ });
419
+
420
+ return returnPromise;
421
+ },
422
+
423
+ /**
424
+ * Get all stickers in a pack
425
+ * @param {string} packID - Sticker pack ID
426
+ * @param {function} callback - Optional callback(err, result)
427
+ * @returns {Promise<Array<Object>>}
428
+ */
429
+ getStickersInPack: function(packID, callback) {
430
+ var resolveFunc = function() {};
431
+ var rejectFunc = function() {};
432
+ var returnPromise = new Promise(function(resolve, reject) {
433
+ resolveFunc = resolve;
434
+ rejectFunc = reject;
435
+ });
436
+
437
+ if (!callback) {
438
+ callback = function(err, data) {
439
+ if (err) return rejectFunc(err);
440
+ resolveFunc(data);
441
+ };
442
+ }
443
+
444
+ if (!packID) {
445
+ return callback({ error: "Pack ID is required." });
446
+ }
447
+
448
+ var form = {
449
+ fb_api_caller_class: 'RelayModern',
450
+ fb_api_req_friendly_name: 'CometStickerPickerPackContentRootQuery',
451
+ variables: JSON.stringify({
452
+ packID: packID,
453
+ stickerWidth: 128,
454
+ stickerHeight: 128,
455
+ scale: 3
456
+ }),
457
+ doc_id: '23982341384707469'
458
+ };
459
+
460
+ makeRequest(form)
461
+ .then(function(res) {
462
+ var stickers = formatStickerPackResults(res);
463
+ log.info("stickers.getStickersInPack", "Found " + stickers.length + " stickers in pack: " + packID);
464
+ callback(null, stickers);
465
+ })
466
+ .catch(function(err) {
467
+ log.error("stickers.getStickersInPack", err);
468
+ callback(err);
469
+ });
470
+
471
+ return returnPromise;
472
+ },
473
+
474
+ /**
475
+ * Get trending AI-generated stickers
476
+ * @param {Object} options - Options object { limit: number }
477
+ * @param {function} callback - Optional callback(err, result)
478
+ * @returns {Promise<Array<Object>>}
479
+ */
480
+ getAiStickers: function(options, callback) {
481
+ var resolveFunc = function() {};
482
+ var rejectFunc = function() {};
483
+ var returnPromise = new Promise(function(resolve, reject) {
484
+ resolveFunc = resolve;
485
+ rejectFunc = reject;
486
+ });
487
+
488
+ // Handle optional parameters
489
+ if (typeof options === 'function') {
490
+ callback = options;
491
+ options = {};
492
+ }
493
+
494
+ options = options || {};
495
+ var limit = options.limit || 10;
496
+
497
+ if (!callback) {
498
+ callback = function(err, data) {
499
+ if (err) return rejectFunc(err);
500
+ resolveFunc(data);
501
+ };
502
+ }
503
+
504
+ var form = {
505
+ fb_api_caller_class: 'RelayModern',
506
+ fb_api_req_friendly_name: 'CometStickerPickerStickerGeneratedCardQuery',
507
+ variables: JSON.stringify({ limit: limit }),
508
+ doc_id: '24151467751156443'
509
+ };
510
+
511
+ makeRequest(form)
512
+ .then(function(res) {
513
+ var stickers = formatAiStickers(res);
514
+ log.info("stickers.getAiStickers", "Found " + stickers.length + " AI stickers");
515
+ callback(null, stickers);
516
+ })
517
+ .catch(function(err) {
518
+ log.error("stickers.getAiStickers", err);
519
+ callback(err);
520
+ });
521
+
522
+ return returnPromise;
523
+ }
524
+ };
525
+ };