stfca 1.0.2 → 1.0.4

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 (142) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/README.md +45 -2
  3. package/checkUpdate.js +109 -0
  4. package/index.js +460 -1
  5. package/package.json +22 -46
  6. package/src/OldMessage.js +234 -0
  7. package/src/{api/action/addExternalModule.js → addExternalModule.js} +25 -25
  8. package/src/addUserToGroup.js +115 -0
  9. package/src/changeAdminStatus.js +103 -0
  10. package/src/changeArchivedStatus.js +55 -0
  11. package/src/{api/action/changeAvatar.js → changeAvatar.js} +136 -137
  12. package/src/changeAvatarV2.js +86 -0
  13. package/src/changeAvt.js +85 -0
  14. package/src/{api/action/changeBio.js → changeBio.js} +76 -75
  15. package/src/{api/messaging/changeBlockedStatus.js → changeBlockedStatus.js} +49 -48
  16. package/src/changeBlockedStatusMqtt.js +80 -0
  17. package/src/changeCover.js +72 -0
  18. package/src/changeGroupImage.js +135 -0
  19. package/src/changeName.js +79 -0
  20. package/src/changeNickname.js +59 -0
  21. package/src/changeThreadColor.js +65 -0
  22. package/src/changeThreadEmoji.js +55 -0
  23. package/src/changeUsername.js +59 -0
  24. package/src/createCommentPost.js +230 -0
  25. package/src/{api/messaging/createNewGroup.js → createNewGroup.js} +88 -88
  26. package/src/createPoll.js +71 -0
  27. package/src/createPost.js +276 -0
  28. package/src/{api/messaging/deleteMessage.js → deleteMessage.js} +56 -56
  29. package/src/{api/messaging/deleteThread.js → deleteThread.js} +56 -56
  30. package/src/editMessage.js +68 -0
  31. package/src/editMessageOld.js +67 -0
  32. package/src/follow.js +74 -0
  33. package/src/forwardAttachment.js +60 -0
  34. package/src/getAccess.js +112 -0
  35. package/src/getAvatarUser.js +78 -0
  36. package/src/{api/action/getCurrentUserID.js → getCurrentUserID.js} +7 -7
  37. package/src/{api/messaging/getEmojiUrl.js → getEmojiUrl.js} +2 -2
  38. package/src/{api/messaging/getFriendsList.js → getFriendsList.js} +83 -82
  39. package/src/{api/messaging/getMessage.js → getMessage.js} +847 -829
  40. package/src/getRegion.js +7 -0
  41. package/src/{api/threads/getThreadHistory.js → getThreadHistory.js} +680 -664
  42. package/src/getThreadHistoryDeprecated.js +71 -0
  43. package/src/getThreadInfo.js +232 -0
  44. package/src/getThreadInfoDeprecated.js +56 -0
  45. package/src/getThreadList.js +213 -0
  46. package/src/getThreadListDeprecated.js +46 -0
  47. package/src/getThreadPictures.js +59 -0
  48. package/src/getUID.js +119 -0
  49. package/src/{api/users/getUserID.js → getUserID.js} +61 -65
  50. package/src/getUserInfo.js +66 -0
  51. package/src/handleFriendRequest.js +46 -0
  52. package/src/handleMessageRequest.js +47 -0
  53. package/src/httpGet.js +49 -0
  54. package/src/httpPost.js +48 -0
  55. package/src/listenMqtt.js +864 -0
  56. package/src/logout.js +75 -0
  57. package/src/markAsDelivered.js +47 -0
  58. package/src/markAsRead.js +70 -0
  59. package/src/markAsReadAll.js +40 -0
  60. package/src/markAsSeen.js +48 -0
  61. package/src/muteThread.js +45 -0
  62. package/src/refreshFb_dtsg.js +89 -0
  63. package/src/removeUserFromGroup.js +79 -0
  64. package/src/{api/messaging/resolvePhotoUrl.js → resolvePhotoUrl.js} +45 -43
  65. package/src/{api/messaging/searchForThread.js → searchForThread.js} +53 -52
  66. package/src/searchStickers.js +53 -0
  67. package/src/sendMessage.js +234 -0
  68. package/src/{api/messaging/sendMessageMqtt.js → sendMessageMqtt.js} +322 -323
  69. package/src/sendTypingIndicator.js +101 -0
  70. package/src/sendTypingIndicatorV2.js +28 -0
  71. package/src/setMessageReaction.js +122 -0
  72. package/src/setMessageReactionMqtt.js +62 -0
  73. package/src/{api/action/setPostReaction.js → setPostReaction.js} +112 -106
  74. package/src/setStoryReaction.js +64 -0
  75. package/src/setTitle.js +90 -0
  76. package/src/shareContact.js +110 -0
  77. package/src/shareLink.js +59 -0
  78. package/src/stopListenMqtt.js +23 -0
  79. package/src/{api/messaging/threadColors.js → threadColors.js} +131 -128
  80. package/src/{api/action/unfriend.js → unfriend.js} +52 -54
  81. package/src/unsendMessage.js +45 -0
  82. package/src/{api/messaging/uploadAttachment.js → uploadAttachment.js} +93 -95
  83. package/utils.js +2876 -0
  84. package/LICENSE-MIT +0 -4
  85. package/index.d.ts +0 -615
  86. package/module/config.js +0 -33
  87. package/module/login.js +0 -48
  88. package/module/loginHelper.js +0 -722
  89. package/module/options.js +0 -44
  90. package/src/api/action/handleFriendRequest.js +0 -57
  91. package/src/api/action/logout.js +0 -76
  92. package/src/api/action/refreshFb_dtsg.js +0 -71
  93. package/src/api/http/httpGet.js +0 -46
  94. package/src/api/http/httpPost.js +0 -52
  95. package/src/api/http/postFormData.js +0 -47
  96. package/src/api/messaging/addUserToGroup.js +0 -68
  97. package/src/api/messaging/changeAdminStatus.js +0 -122
  98. package/src/api/messaging/changeArchivedStatus.js +0 -55
  99. package/src/api/messaging/changeGroupImage.js +0 -90
  100. package/src/api/messaging/changeNickname.js +0 -70
  101. package/src/api/messaging/changeThreadColor.js +0 -79
  102. package/src/api/messaging/changeThreadEmoji.js +0 -106
  103. package/src/api/messaging/createPoll.js +0 -43
  104. package/src/api/messaging/editMessage.js +0 -68
  105. package/src/api/messaging/forwardAttachment.js +0 -51
  106. package/src/api/messaging/handleMessageRequest.js +0 -65
  107. package/src/api/messaging/markAsDelivered.js +0 -57
  108. package/src/api/messaging/markAsRead.js +0 -88
  109. package/src/api/messaging/markAsReadAll.js +0 -49
  110. package/src/api/messaging/markAsSeen.js +0 -61
  111. package/src/api/messaging/muteThread.js +0 -50
  112. package/src/api/messaging/removeUserFromGroup.js +0 -105
  113. package/src/api/messaging/sendMessage.js +0 -379
  114. package/src/api/messaging/sendTypingIndicator.js +0 -67
  115. package/src/api/messaging/setMessageReaction.js +0 -75
  116. package/src/api/messaging/setTitle.js +0 -119
  117. package/src/api/messaging/shareContact.js +0 -49
  118. package/src/api/messaging/unsendMessage.js +0 -81
  119. package/src/api/socket/core/connectMqtt.js +0 -179
  120. package/src/api/socket/core/getSeqID.js +0 -25
  121. package/src/api/socket/core/getTaskResponseData.js +0 -22
  122. package/src/api/socket/core/markDelivery.js +0 -12
  123. package/src/api/socket/core/parseDelta.js +0 -351
  124. package/src/api/socket/detail/buildStream.js +0 -208
  125. package/src/api/socket/detail/constants.js +0 -24
  126. package/src/api/socket/listenMqtt.js +0 -133
  127. package/src/api/threads/getThreadInfo.js +0 -358
  128. package/src/api/threads/getThreadList.js +0 -248
  129. package/src/api/threads/getThreadPictures.js +0 -78
  130. package/src/api/users/getUserInfo.js +0 -319
  131. package/src/api/users/getUserInfoV2.js +0 -133
  132. package/src/core/sendReqMqtt.js +0 -63
  133. package/src/database/models/index.js +0 -49
  134. package/src/database/models/thread.js +0 -31
  135. package/src/database/models/user.js +0 -32
  136. package/src/database/threadData.js +0 -98
  137. package/src/database/userData.js +0 -89
  138. package/src/utils/client.js +0 -214
  139. package/src/utils/constants.js +0 -23
  140. package/src/utils/format.js +0 -1111
  141. package/src/utils/headers.js +0 -41
  142. package/src/utils/request.js +0 -215
@@ -0,0 +1,59 @@
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 changeUsername(username, callback) {
8
+ var cb;
9
+ var rt = new Promise(function (resolve, reject) {
10
+ cb = (error, info) => info ? resolve(info) : reject(error);
11
+ });
12
+
13
+ if (typeof username == 'function') {
14
+ var error = 'username must be a string, and not ' + utils.getType(username);
15
+ console.error('changeUsername', error);
16
+ return username(error);
17
+ }
18
+ if (typeof callback == 'function') cb = callback;
19
+ if (typeof username != 'string') {
20
+ var error = 'username must be a string, and not ' + utils.getType(username);
21
+ console.error('changeUsername', error);
22
+ return cb(error);
23
+ }
24
+
25
+ var form = {
26
+ fb_api_caller_class: 'RelayModern',
27
+ fb_api_req_friendly_name: 'useFXIMUpdateUsernameMutation',
28
+ variables: JSON.stringify({
29
+ client_mutation_id: utils.getGUID(),
30
+ family_device_id: "device_id_fetch_datr",
31
+ identity_ids: [ctx.userID],
32
+ username,
33
+ interface: "FB_WEB"
34
+ }),
35
+ server_timestamps: true,
36
+ doc_id: 5737739449613305
37
+ }
38
+
39
+ defaultFuncs
40
+ .post('https://accountscenter.facebook.com/api/graphql/', ctx.jar, form, null, null, {
41
+ Origin: 'https://accountscenter.facebook.com',
42
+ Referer: `https://accountscenter.facebook.com/profiles/${ctx.userID}/username/?entrypoint=fb_account_center`
43
+ })
44
+ .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
45
+ .then(function (res) {
46
+ if (res.errors)
47
+ throw res;
48
+ else if (res.data.fxim_update_identity_username.error)
49
+ throw res.data.fxim_update_identity_username.error;
50
+ return cb();
51
+ })
52
+ .catch(function (err) {
53
+ console.error('changeUsername', err);
54
+ return cb(err);
55
+ });
56
+
57
+ return rt;
58
+ }
59
+ }
@@ -0,0 +1,230 @@
1
+ 'use strict';
2
+
3
+ var utils = require('../utils.js');
4
+ var log = require('npmlog');
5
+
6
+ module.exports = function (defaultFuncs, api, ctx) {
7
+ function handleUpload(msg, form) {
8
+ var cb;
9
+ var uploads = [];
10
+ var returnPromise = new Promise(function (resolve, reject) {
11
+ cb = error => error ? reject(error) : resolve();
12
+ });
13
+
14
+ for (let item of msg.attachments) {
15
+ if (!utils.isReadableStream(item))
16
+ return cb({ error: 'image should be a readable stream and not ' + utils.getType(image) });
17
+
18
+ var httpData = defaultFuncs
19
+ .postFormData('https://www.facebook.com/ajax/ufi/upload/', ctx.jar, {
20
+ profile_id: ctx.userID,
21
+ source: 19,
22
+ target_id: ctx.userID,
23
+ file: item
24
+ })
25
+ .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
26
+ .then(function (res) {
27
+ if (res.errors || res.error || !res.payload)
28
+ throw res;
29
+
30
+ return {
31
+ media: {
32
+ id: res.payload.fbid
33
+ }
34
+ }
35
+ })
36
+ .catch(cb);
37
+
38
+ uploads.push(httpData);
39
+ }
40
+
41
+ Promise
42
+ .all(uploads)
43
+ .then(function (main) {
44
+ main.forEach(item => form.input.attachments.push(item));
45
+
46
+ return cb();
47
+ })
48
+ .catch(cb);
49
+
50
+ return returnPromise;
51
+ }
52
+
53
+ function handleURL(msg, form) {
54
+ if (typeof msg.url == 'string') {
55
+ form.input.attachments = [
56
+ {
57
+ link: {
58
+ external: {
59
+ url: msg.url
60
+ }
61
+ }
62
+ }
63
+ ];
64
+ }
65
+ }
66
+
67
+ function handleMentions(msg, form) {
68
+ for (let item of msg.mentions) {
69
+ var { tag, id, fromIndex } = item;
70
+
71
+ if (typeof tag != 'string')
72
+ throw 'Mention tag must be string';
73
+ if (!id)
74
+ throw 'id must be string';
75
+ var offset = msg.body.indexOf(tag, fromIndex || 0);
76
+ if (offset < 0)
77
+ throw 'Mention for "' + tag + '" not found in message string.';
78
+ form.input.message.ranges.push({
79
+ entity: { id },
80
+ length: tag.length,
81
+ offset
82
+ });
83
+ }
84
+ }
85
+
86
+ function handleSticker(msg, form) {
87
+ if (msg.sticker) {
88
+ form.input.attachments = [
89
+ {
90
+ media: {
91
+ id: msg.sticker
92
+ }
93
+ }
94
+ ];
95
+ }
96
+ }
97
+
98
+ function createContent(form) {
99
+ var cb;
100
+ var returnPromise = new Promise(function (resolve, reject) {
101
+ cb = (error, info) => info ? resolve(info) : reject(error);
102
+ });
103
+
104
+ defaultFuncs
105
+ .post('https://www.facebook.com/api/graphql/', ctx.jar, {
106
+ fb_api_caller_class: 'RelayModern',
107
+ fb_api_req_friendly_name: 'useCometUFICreateCommentMutation',
108
+ variables: JSON.stringify(form),
109
+ server_timestamps: !0,
110
+ doc_id: 6993516810709754
111
+ })
112
+ .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
113
+ .then(function (res) {
114
+ if (res.errors)
115
+ throw res;
116
+
117
+ var res = res.data.comment_create;
118
+ var info = {
119
+ id: res.feedback_comment_edge.node.id,
120
+ url: res.feedback_comment_edge.node.feedback.url,
121
+ count: res.feedback.total_comment_count
122
+ }
123
+ return cb(null, info);
124
+ })
125
+ .catch(cb);
126
+
127
+ return returnPromise;
128
+ }
129
+
130
+ return function createCommentPost(msg, postID, callback, replyCommentID) {
131
+ var cb;
132
+ var returnPromise = new Promise(function (resolve, reject) {
133
+ cb = (error, info) => info ? resolve(info) : reject(error);
134
+ });
135
+
136
+ if (typeof msg == 'function') {
137
+ var error = 'Message must be a string or object!!';
138
+ console.error('createCommentPost', error);
139
+ return msg(error);
140
+ }
141
+ if (typeof postID == 'function') {
142
+ var error = 'postID must be a string!!';
143
+ console.error('createCommentPost', error);
144
+ return postID(error);
145
+ }
146
+ if (typeof callback == 'string') {
147
+ replyCommentID = callback;
148
+ callback = null;
149
+ }
150
+ if (typeof callback == 'function')
151
+ cb = calback;
152
+
153
+ var MessageType = utils.getType(msg);
154
+
155
+ if (MessageType == 'String')
156
+ msg = {
157
+ body: msg,
158
+ attachments: [],
159
+ mentions: [],
160
+ sticker: null,
161
+ url: null
162
+ }
163
+ else if (MessageType == 'Object') {
164
+ msg.mentions ? !Array.isArray(msg.mentions) ? msg.mentions = [msg.mentions] : null : msg.mentions = [];
165
+ msg.attachments ? !Array.isArray(msg.attachments) ? msg.attachments = [msg.attachments] : null : msg.attachments = [];
166
+ isNaN(msg.sticker) ? msg.sticker = null : null;
167
+ msg.body ? typeof msg.body == 'object' ? msg.body = JSON.stringify(msg.body) : null : msg.body = '';
168
+ } else {
169
+ var error = 'Message must be a string or object!!';
170
+ console.error('createCommentPost', error);
171
+ return cb(error);
172
+ }
173
+ if (typeof postID != 'string') {
174
+ var error = 'postID must be a string!!';
175
+ console.error('createCommentPost', error);
176
+ return cb(error);
177
+ }
178
+
179
+ if (typeof replyCommentID != 'string')
180
+ replyCommentID = null;
181
+
182
+ var form = {
183
+ feedLocation: 'NEWSFEED',
184
+ feedbackSource: 1,
185
+ groupID: null,
186
+ input: {
187
+ client_mutation_id: Math.round(Math.random() * 19).toString(),
188
+ actor_id: ctx.userID,
189
+ attachments: [],
190
+ feedback_id: Buffer.from('feedback:' + postID).toString('base64'),
191
+ formatting_style: null,
192
+ message: {
193
+ ranges: [],
194
+ text: msg.body
195
+ },
196
+ reply_comment_parent_fbid: replyCommentID ? isNaN(replyCommentID) ? replyCommentID : Buffer.from('comment:' + postID + '_' + replyCommentID).toString('base64') : null,
197
+ reply_target_clicked: !!replyCommentID,
198
+ attribution_id_v2:
199
+ 'CometHomeRoot.react,comet.home,via_cold_start,'
200
+ + Date.now()
201
+ + ',156248,4748854339,,',
202
+ vod_video_timestamp: null,
203
+ feedback_referrer: '/',
204
+ is_tracking_encrypted: !0,
205
+ tracking: [],
206
+ feedback_source: 'NEWS_FEED',
207
+ idempotence_token: 'client:' + utils.getGUID(),
208
+ session_id: utils.getGUID()
209
+ },
210
+ inviteShortLinkKey: null,
211
+ renderLocation: null,
212
+ scale: 1,
213
+ useDefaultActor: !1,
214
+ focusCommentID: null
215
+ }
216
+
217
+ handleUpload(msg, form)
218
+ .then(_ => handleURL(msg, form))
219
+ .then(_ => handleMentions(msg, form))
220
+ .then(_ => handleSticker(msg, form))
221
+ .then(_ => createContent(form))
222
+ .then(info => cb(null, info))
223
+ .catch(function (err) {
224
+ console.error('createCommentPost', err);
225
+ return cb(null, err);
226
+ })
227
+
228
+ return returnPromise;
229
+ }
230
+ }
@@ -1,88 +1,88 @@
1
- "use strict";
2
-
3
- const log = require("npmlog");
4
- const { parseAndCheckLogin } = require("../../utils/client");
5
- const { getType } = require("../../utils/format");
6
- module.exports = function(defaultFuncs, api, ctx) {
7
- return function createNewGroup(participantIDs, groupTitle, callback) {
8
- if (getType(groupTitle) == "Function") {
9
- callback = groupTitle;
10
- groupTitle = null;
11
- }
12
-
13
- if (getType(participantIDs) !== "Array") {
14
- throw { error: "createNewGroup: participantIDs should be an array." };
15
- }
16
-
17
- if (participantIDs.length < 2) {
18
- throw {
19
- error: "createNewGroup: participantIDs should have at least 2 IDs."
20
- };
21
- }
22
-
23
- let resolveFunc = function() {};
24
- let rejectFunc = function() {};
25
- const returnPromise = new Promise(function(resolve, reject) {
26
- resolveFunc = resolve;
27
- rejectFunc = reject;
28
- });
29
-
30
- if (!callback) {
31
- callback = function(err, threadID) {
32
- if (err) {
33
- return rejectFunc(err);
34
- }
35
- resolveFunc(threadID);
36
- };
37
- }
38
-
39
- const pids = [];
40
- for (const n in participantIDs) {
41
- pids.push({
42
- fbid: participantIDs[n]
43
- });
44
- }
45
- pids.push({ fbid: ctx.i_userID || ctx.userID });
46
-
47
- const form = {
48
- fb_api_caller_class: "RelayModern",
49
- fb_api_req_friendly_name: "MessengerGroupCreateMutation",
50
- av: ctx.i_userID || ctx.userID,
51
- //This doc_id is valid as of January 11th, 2020
52
- doc_id: "577041672419534",
53
- variables: JSON.stringify({
54
- input: {
55
- entry_point: "jewel_new_group",
56
- actor_id: ctx.i_userID || ctx.userID,
57
- participants: pids,
58
- client_mutation_id: Math.round(Math.random() * 1024).toString(),
59
- thread_settings: {
60
- name: groupTitle,
61
- joinable_mode: "PRIVATE",
62
- thread_image_fbid: null
63
- }
64
- }
65
- })
66
- };
67
-
68
- defaultFuncs
69
- .post("https://www.facebook.com/api/graphql/", ctx.jar, form)
70
- .then(parseAndCheckLogin(ctx, defaultFuncs))
71
- .then(function(resData) {
72
- if (resData.errors) {
73
- throw resData;
74
- }
75
- return callback(
76
- null,
77
- resData.data.messenger_group_thread_create.thread.thread_key
78
- .thread_fbid
79
- );
80
- })
81
- .catch(function(err) {
82
- log.error("createNewGroup", err);
83
- return callback(err);
84
- });
85
-
86
- return returnPromise;
87
- };
88
- };
1
+ "use strict";
2
+
3
+ const utils = require("../utils");
4
+ // @NethWs3Dev
5
+
6
+ module.exports = function (defaultFuncs, api, ctx) {
7
+ return function createNewGroup(participantIDs, groupTitle, callback) {
8
+ if (utils.getType(groupTitle) == "Function") {
9
+ callback = groupTitle;
10
+ groupTitle = null;
11
+ }
12
+
13
+ if (utils.getType(participantIDs) !== "Array") {
14
+ throw { error: "createNewGroup: participantIDs should be an array." };//
15
+ }
16
+
17
+ if (participantIDs.length < 2) {
18
+ throw {
19
+ error: "createNewGroup: participantIDs should have at least 2 IDs.",
20
+ };
21
+ }
22
+
23
+ let resolveFunc = function () {};
24
+ let rejectFunc = function () {};
25
+ const returnPromise = new Promise(function (resolve, reject) {
26
+ resolveFunc = resolve;
27
+ rejectFunc = reject;
28
+ });
29
+
30
+ if (!callback) {
31
+ callback = function (err, threadID) {
32
+ if (err) {
33
+ return rejectFunc(err);
34
+ }
35
+ resolveFunc(threadID);
36
+ };
37
+ }
38
+
39
+ const pids = [];
40
+ for (const n in participantIDs) {
41
+ pids.push({
42
+ fbid: participantIDs[n],
43
+ });
44
+ }
45
+ pids.push({ fbid: ctx.userID });
46
+
47
+ const form = {
48
+ fb_api_caller_class: "RelayModern",
49
+ fb_api_req_friendly_name: "MessengerGroupCreateMutation",
50
+ av: ctx.userID,
51
+ //This doc_id is valid as of January 11th, 2020
52
+ doc_id: "577041672419534",
53
+ variables: JSON.stringify({
54
+ input: {
55
+ entry_point: "jewel_new_group",
56
+ actor_id: ctx.userID,
57
+ participants: pids,
58
+ client_mutation_id: Math.round(Math.random() * 1024).toString(),
59
+ thread_settings: {
60
+ name: groupTitle,
61
+ joinable_mode: "PRIVATE",
62
+ thread_image_fbid: null,
63
+ },
64
+ },
65
+ }),
66
+ };
67
+
68
+ defaultFuncs
69
+ .post("https://www.facebook.com/api/graphql/", ctx.jar, form)
70
+ .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
71
+ .then(function (resData) {
72
+ if (resData.errors) {
73
+ throw resData;
74
+ }
75
+ return callback(
76
+ null,
77
+ resData.data.messenger_group_thread_create.thread.thread_key
78
+ .thread_fbid,
79
+ );
80
+ })
81
+ .catch(function (err) {
82
+ console.error("createNewGroup", err);
83
+ return callback(err);
84
+ });
85
+
86
+ return returnPromise;
87
+ };
88
+ };
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+
3
+ const utils = require("../utils");
4
+ // @NethWs3Dev
5
+
6
+ module.exports = function (defaultFuncs, api, ctx) {
7
+ return function createPoll(title, threadID, options, callback) {
8
+ let resolveFunc = function () {};
9
+ let rejectFunc = function () {};
10
+ const returnPromise = new Promise(function (resolve, reject) {
11
+ resolveFunc = resolve;
12
+ rejectFunc = reject;
13
+ });
14
+
15
+ if (!callback) {
16
+ if (utils.getType(options) == "Function") {
17
+ callback = options;
18
+ options = null;
19
+ } else {
20
+ callback = function (err) {
21
+ if (err) {
22
+ return rejectFunc(err);
23
+ }
24
+ resolveFunc();
25
+ };
26
+ }
27
+ }
28
+ if (!options) {
29
+ options = {}; // Initial poll options are optional
30
+ }
31
+
32
+ const form = {
33
+ target_id: threadID,
34
+ question_text: title,
35
+ };
36
+
37
+ // Set fields for options (and whether they are selected initially by the posting user)
38
+ let ind = 0;
39
+ for (const opt in options) {
40
+ // eslint-disable-next-line no-prototype-builtins
41
+ if (options.hasOwnProperty(opt)) {
42
+ form["option_text_array[" + ind + "]"] = opt;
43
+ form["option_is_selected_array[" + ind + "]"] = options[opt]
44
+ ? "1"
45
+ : "0";
46
+ ind++;
47
+ }
48
+ }
49
+
50
+ defaultFuncs
51
+ .post(
52
+ "https://www.facebook.com/messaging/group_polling/create_poll/?dpr=1",
53
+ ctx.jar,
54
+ form,
55
+ )
56
+ .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
57
+ .then(function (resData) {
58
+ if (resData.payload.status != "success") {
59
+ throw resData;
60
+ }
61
+
62
+ return callback();
63
+ })
64
+ .catch(function (err) {
65
+ console.error("createPoll", err);
66
+ return callback(err);
67
+ });
68
+
69
+ return returnPromise;
70
+ };
71
+ };