alicezetion 1.7.6 → 1.7.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (83) hide show
  1. package/.cache/replit/__replit_disk_meta.json +1 -1
  2. package/.cache/replit/nix/env.json +1 -1
  3. package/.travis.yml +6 -0
  4. package/index.js +120 -655
  5. package/package.json +25 -37
  6. package/replit.nix +4 -3
  7. package/src/addExternalModule.js +5 -13
  8. package/src/addUserToGroup.js +12 -36
  9. package/src/changeAdminStatus.js +37 -85
  10. package/src/changeArchivedStatus.js +9 -15
  11. package/src/changeBio.js +8 -13
  12. package/src/changeBlockedStatus.js +8 -14
  13. package/src/changeGroupImage.js +13 -28
  14. package/src/changeNickname.js +11 -22
  15. package/src/changeThreadColor.js +10 -16
  16. package/src/changeThreadEmoji.js +9 -18
  17. package/src/chat.js +280 -401
  18. package/src/createNewGroup.js +10 -18
  19. package/src/createPoll.js +11 -17
  20. package/src/deleteMessage.js +10 -17
  21. package/src/deleteThread.js +10 -17
  22. package/src/forwardAttachment.js +9 -15
  23. package/src/forwardMessage.js +0 -0
  24. package/src/getCurrentUserID.js +1 -1
  25. package/src/getEmojiUrl.js +2 -3
  26. package/src/getFriendsList.js +10 -18
  27. package/src/getThreadHistory.js +59 -156
  28. package/src/getThreadHistoryDeprecated.js +15 -26
  29. package/src/getThreadInfo.js +42 -68
  30. package/src/getThreadInfoDeprecated.js +13 -25
  31. package/src/getThreadList.js +53 -112
  32. package/src/getThreadListDeprecated.js +12 -30
  33. package/src/getThreadPictures.js +13 -25
  34. package/src/getUserID.js +7 -9
  35. package/src/getUserInfo.js +10 -12
  36. package/src/handleFriendRequest.js +35 -36
  37. package/src/handleMessageRequest.js +10 -18
  38. package/src/httpGet.js +13 -20
  39. package/src/httpPost.js +13 -19
  40. package/src/listen.js +553 -0
  41. package/src/listenMqtt-Test.js +687 -0
  42. package/src/listenMqtt.js +621 -1224
  43. package/src/logout.js +13 -18
  44. package/src/markAsDelivered.js +10 -17
  45. package/src/markAsRead.js +24 -36
  46. package/src/{seen.js → markAsReadAll.js} +10 -17
  47. package/src/markAsSeen.js +12 -22
  48. package/src/muteThread.js +9 -15
  49. package/src/removeUserFromGroup.js +11 -38
  50. package/src/resolvePhotoUrl.js +6 -9
  51. package/src/searchForThread.js +8 -14
  52. package/src/sendMessage.js +315 -0
  53. package/src/sendTypingIndicator.js +19 -44
  54. package/src/{react.js → setMessageReaction.js} +9 -20
  55. package/src/setPostReaction.js +22 -63
  56. package/src/setTitle.js +12 -22
  57. package/src/threadColors.js +19 -17
  58. package/src/unfriend.js +9 -15
  59. package/src/{unsend.js → unsendMessage.js} +8 -9
  60. package/test/data/shareAttach.js +146 -0
  61. package/test/data/something.mov +0 -0
  62. package/test/data/test.png +0 -0
  63. package/test/data/test.txt +7 -0
  64. package/test/example-config.json +18 -0
  65. package/test/test-page.js +140 -0
  66. package/test/test.js +385 -0
  67. package/utils.js +27 -120
  68. package/Extra/Database/index.js +0 -399
  69. package/Extra/Database/methods.js +0 -286
  70. package/Extra/ExtraAddons.js +0 -213
  71. package/Extra/ExtraGetThread.js +0 -1
  72. package/Extra/ExtraUptimeRobot.js +0 -59
  73. package/Extra/PM2/ecosystem.config.js +0 -23
  74. package/Extra/Src/Last-Run.js +0 -48
  75. package/Language/index.json +0 -151
  76. package/StateCrypt.js +0 -22
  77. package/broadcast.js +0 -42
  78. package/logger.js +0 -21
  79. package/src/changeAvt.js +0 -91
  80. package/src/getAccessToken.js +0 -32
  81. package/src/getMessage.js +0 -84
  82. package/src/getUserInfoV2.js +0 -35
  83. package/src/httpPostFormData.js +0 -46
@@ -0,0 +1,315 @@
1
+ "use strict";
2
+
3
+ var utils = require("../utils");
4
+ var log = require("npmlog");
5
+ var bluebird = require("bluebird");
6
+
7
+ var allowedProperties = {
8
+ attachment: true,
9
+ url: true,
10
+ sticker: true,
11
+ emoji: true,
12
+ emojiSize: true,
13
+ body: true,
14
+ mentions: true,
15
+ location: true,
16
+ };
17
+
18
+ module.exports = function(defaultFuncs, api, ctx) {
19
+ function uploadAttachment(attachments, callback) {
20
+ var uploads = [];
21
+
22
+ // create an array of promises
23
+ for (var i = 0; i < attachments.length; i++) {
24
+ if (!utils.isReadableStream(attachments[i])) throw { error: "Attachment should be a readable stream and not " + utils.getType(attachments[i]) + "." };
25
+ var form = {
26
+ upload_1024: attachments[i],
27
+ voice_clip: "true"
28
+ };
29
+
30
+ uploads.push(
31
+ defaultFuncs
32
+ .postFormData("https://upload.facebook.com/ajax/mercury/upload.php", ctx.jar, form, {})
33
+ .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
34
+ .then(function(resData) {
35
+ if (resData.error) throw resData;
36
+ // We have to return the data unformatted unless we want to change it
37
+ // back in sendMessage.
38
+ return resData.payload.metadata[0];
39
+ })
40
+ );
41
+ }
42
+
43
+ // resolve all promises
44
+ bluebird
45
+ .all(uploads)
46
+ .then(resData => callback(null, resData))
47
+ .catch(function(err) {
48
+ log.error("uploadAttachment", err);
49
+ return callback(err);
50
+ });
51
+ }
52
+
53
+ function getUrl(url, callback) {
54
+ var form = {
55
+ image_height: 960,
56
+ image_width: 960,
57
+ uri: url
58
+ };
59
+
60
+ defaultFuncs
61
+ .post("https://www.facebook.com/message_share_attachment/fromURI/", ctx.jar, form)
62
+ .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
63
+ .then(function(resData) {
64
+ if (resData.error) return callback(resData);
65
+ if (!resData.payload) return callback({ error: "Invalid url" });
66
+ callback(null, resData.payload.share_data.share_params);
67
+ })
68
+ .catch(function(err) {
69
+ log.error("getUrl", err);
70
+ return callback(err);
71
+ });
72
+ }
73
+
74
+ function sendContent(form, threadID, isSingleUser, messageAndOTID, callback) {
75
+ // There are three cases here:
76
+ // 1. threadID is of type array, where we're starting a new group chat with users
77
+ // specified in the array.
78
+ // 2. User is sending a message to a specific user.
79
+ // 3. No additional form params and the message goes to an existing group chat.
80
+ if (utils.getType(threadID) === "Array") {
81
+ for (var i = 0; i < threadID.length; i++) form["specific_to_list[" + i + "]"] = "fbid:" + threadID[i];
82
+ form["specific_to_list[" + threadID.length + "]"] = "fbid:" + ctx.userID;
83
+ form["client_thread_id"] = "root:" + messageAndOTID;
84
+ log.info("sendMessage", "Sending message to multiple users: " + threadID);
85
+ } else {
86
+ // This means that threadID is the id of a user, and the chat
87
+ // is a single person chat
88
+ if (isSingleUser) {
89
+ form["specific_to_list[0]"] = "fbid:" + threadID;
90
+ form["specific_to_list[1]"] = "fbid:" + ctx.userID;
91
+ form["other_user_fbid"] = threadID;
92
+ } else form["thread_fbid"] = threadID;
93
+ }
94
+
95
+ if (ctx.globalOptions.pageID) {
96
+ form["author"] = "fbid:" + ctx.globalOptions.pageID;
97
+ form["specific_to_list[1]"] = "fbid:" + ctx.globalOptions.pageID;
98
+ form["creator_info[creatorID]"] = ctx.userID;
99
+ form["creator_info[creatorType]"] = "direct_admin";
100
+ form["creator_info[labelType]"] = "sent_message";
101
+ form["creator_info[pageID]"] = ctx.globalOptions.pageID;
102
+ form["request_user_id"] = ctx.globalOptions.pageID;
103
+ form["creator_info[profileURI]"] = "https://www.facebook.com/profile.php?id=" + ctx.userID;
104
+ }
105
+
106
+ defaultFuncs
107
+ .post("https://www.facebook.com/messaging/send/", ctx.jar, form)
108
+ .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
109
+ .then(function(resData) {
110
+ if (!resData) return callback({ error: "Send message failed." });
111
+ if (resData.error) {
112
+ if (resData.error === 1545012) log.warn("sendMessage", "Got error 1545012. This might mean that you're not part of the conversation " + threadID);
113
+ return callback(resData);
114
+ }
115
+
116
+ var messageInfo = resData.payload.actions.reduce(function(p, v) {
117
+ return ({
118
+ threadID: v.thread_fbid,
119
+ messageID: v.message_id,
120
+ timestamp: v.timestamp
121
+ } || p);
122
+ }, null);
123
+
124
+ return callback(null, messageInfo);
125
+ })
126
+ .catch(function(err) {
127
+ log.error("sendMessage", err);
128
+ if (utils.getType(err) == "Object" && err.error === "Not logged in.") ctx.loggedIn = false;
129
+ return callback(err);
130
+ });
131
+ }
132
+
133
+ function send(form, threadID, messageAndOTID, callback, isGroup) {
134
+ // fix lỗi = cach fetch threadID
135
+ // iq 5 trieu nam =))
136
+ if (utils.getType(threadID) === "Array") sendContent(form, threadID, false, messageAndOTID, callback);
137
+ else {
138
+ var THREADFIX = "ThreadID".replace("ThreadID", threadID);
139
+ if (THREADFIX.length <= 15 && THREADFIX.indexOf(1) == 0) return sendContent(form, threadID, !isGroup, messageAndOTID, callback);
140
+ else if (THREADFIX.length >= 15) return sendContent(form, threadID, threadID.length === 15, messageAndOTID, callback);
141
+ else return sendContent(form, threadID, threadID.length === 15, messageAndOTID, callback);
142
+ }
143
+ }
144
+
145
+ function handleUrl(msg, form, callback, cb) {
146
+ if (msg.url) {
147
+ form["shareable_attachment[share_type]"] = "100";
148
+ getUrl(msg.url, function(err, params) {
149
+ if (err) return callback(err);
150
+ form["shareable_attachment[share_params]"] = params;
151
+ cb();
152
+ });
153
+ } else cb();
154
+ }
155
+
156
+ function handleLocation(msg, form, callback, cb) {
157
+ if (msg.location) {
158
+ if (msg.location.latitude == null || msg.location.longitude == null) return callback({ error: "location property needs both latitude and longitude" });
159
+ form["location_attachment[coordinates][latitude]"] = msg.location.latitude;
160
+ form["location_attachment[coordinates][longitude]"] = msg.location.longitude;
161
+ form["location_attachment[is_current_location]"] = !!msg.location.current;
162
+ }
163
+ cb();
164
+ }
165
+
166
+ function handleSticker(msg, form, callback, cb) {
167
+ if (msg.sticker) form["sticker_id"] = msg.sticker;
168
+ cb();
169
+ }
170
+
171
+ function handleEmoji(msg, form, callback, cb) {
172
+ if (msg.emojiSize != null && msg.emoji == null) return callback({ error: "emoji property is empty" });
173
+ if (msg.emoji) {
174
+ if (msg.emojiSize == null) msg.emojiSize = "medium";
175
+ if (msg.emojiSize != "small" && msg.emojiSize != "medium" && msg.emojiSize != "large") return callback({ error: "emojiSize property is invalid" });
176
+ if (form["body"] != null && form["body"] != "") return callback({ error: "body is not empty" });
177
+ form["body"] = msg.emoji;
178
+ form["tags[0]"] = "hot_emoji_size:" + msg.emojiSize;
179
+ }
180
+ cb();
181
+ }
182
+
183
+ function handleAttachment(msg, form, callback, cb) {
184
+ if (msg.attachment) {
185
+ form["image_ids"] = [];
186
+ form["gif_ids"] = [];
187
+ form["file_ids"] = [];
188
+ form["video_ids"] = [];
189
+ form["audio_ids"] = [];
190
+
191
+ if (utils.getType(msg.attachment) !== "Array") msg.attachment = [msg.attachment];
192
+
193
+ uploadAttachment(msg.attachment, function(err, files) {
194
+ if (err) return callback(err);
195
+ files.forEach(function(file) {
196
+ var key = Object.keys(file);
197
+ var type = key[0]; // image_id, file_id, etc
198
+ form["" + type + "s"].push(file[type]); // push the id
199
+ });
200
+ cb();
201
+ });
202
+ } else cb();
203
+ }
204
+
205
+ function handleMention(msg, form, callback, cb) {
206
+ if (msg.mentions) {
207
+ for (let i = 0; i < msg.mentions.length; i++) {
208
+ const mention = msg.mentions[i];
209
+ const tag = mention.tag;
210
+ if (typeof tag !== "string") return callback({ error: "Mention tags must be strings." });
211
+ const offset = msg.body.indexOf(tag, mention.fromIndex || 0);
212
+ if (offset < 0) log.warn("handleMention", 'Mention for "' + tag + '" not found in message string.');
213
+ if (mention.id == null) log.warn("handleMention", "Mention id should be non-null.");
214
+
215
+ const id = mention.id || 0;
216
+ const emptyChar = '\u200E';
217
+ form["body"] = emptyChar + msg.body;
218
+ form["profile_xmd[" + i + "][offset]"] = offset + 1;
219
+ form["profile_xmd[" + i + "][length]"] = tag.length;
220
+ form["profile_xmd[" + i + "][id]"] = id;
221
+ form["profile_xmd[" + i + "][type]"] = "p";
222
+ }
223
+ }
224
+ cb();
225
+ }
226
+
227
+ return function sendMessage(msg, threadID, callback, replyToMessage, isGroup) {
228
+ typeof isGroup == "undefined" ? isGroup = null : "";
229
+ if (!callback && (utils.getType(threadID) === "Function" || utils.getType(threadID) === "AsyncFunction")) return threadID({ error: "Pass a threadID as a second argument." });
230
+ if (!replyToMessage && utils.getType(callback) === "String") {
231
+ replyToMessage = callback;
232
+ callback = function() {};
233
+ }
234
+
235
+ var resolveFunc = function() {};
236
+ var rejectFunc = function() {};
237
+ var returnPromise = new Promise(function(resolve, reject) {
238
+ resolveFunc = resolve;
239
+ rejectFunc = reject;
240
+ });
241
+
242
+ if (!callback) {
243
+ callback = function(err, data) {
244
+ if (err) return rejectFunc(err);
245
+ resolveFunc(data);
246
+ };
247
+ }
248
+
249
+ var msgType = utils.getType(msg);
250
+ var threadIDType = utils.getType(threadID);
251
+ var messageIDType = utils.getType(replyToMessage);
252
+
253
+ if (msgType !== "String" && msgType !== "Object") return callback({ error: "Message should be of type string or object and not " + msgType + "." });
254
+
255
+ // Changing this to accomodate an array of users
256
+ if (threadIDType !== "Array" && threadIDType !== "Number" && threadIDType !== "String") return callback({ error: "ThreadID should be of type number, string, or array and not " + threadIDType + "." });
257
+
258
+ if (replyToMessage && messageIDType !== 'String') return callback({ error: "MessageID should be of type string and not " + threadIDType + "." });
259
+
260
+ if (msgType === "String") msg = { body: msg };
261
+ var disallowedProperties = Object.keys(msg).filter(prop => !allowedProperties[prop]);
262
+ if (disallowedProperties.length > 0) return callback({ error: "Dissallowed props: `" + disallowedProperties.join(", ") + "`" });
263
+
264
+ var messageAndOTID = utils.generateOfflineThreadingID();
265
+
266
+ var form = {
267
+ client: "mercury",
268
+ action_type: "ma-type:user-generated-message",
269
+ author: "fbid:" + ctx.userID,
270
+ timestamp: Date.now(),
271
+ timestamp_absolute: "Today",
272
+ timestamp_relative: utils.generateTimestampRelative(),
273
+ timestamp_time_passed: "0",
274
+ is_unread: false,
275
+ is_cleared: false,
276
+ is_forward: false,
277
+ is_filtered_content: false,
278
+ is_filtered_content_bh: false,
279
+ is_filtered_content_account: false,
280
+ is_filtered_content_quasar: false,
281
+ is_filtered_content_invalid_app: false,
282
+ is_spoof_warning: false,
283
+ source: "source:chat:web",
284
+ "source_tags[0]": "source:chat",
285
+ body: msg.body ? msg.body.toString() : "",
286
+ html_body: false,
287
+ ui_push_phase: "V3",
288
+ status: "0",
289
+ offline_threading_id: messageAndOTID,
290
+ message_id: messageAndOTID,
291
+ threading_id: utils.generateThreadingID(ctx.clientID),
292
+ "ephemeral_ttl_mode:": "0",
293
+ manual_retry_cnt: "0",
294
+ has_attachment: !!(msg.attachment || msg.url || msg.sticker),
295
+ signatureID: utils.getSignatureID(),
296
+ replied_to_message_id: replyToMessage
297
+ };
298
+
299
+ handleLocation(msg, form, callback, () =>
300
+ handleSticker(msg, form, callback, () =>
301
+ handleAttachment(msg, form, callback, () =>
302
+ handleUrl(msg, form, callback, () =>
303
+ handleEmoji(msg, form, callback, () =>
304
+ handleMention(msg, form, callback, () =>
305
+ send(form, threadID, messageAndOTID, callback, isGroup)
306
+ )
307
+ )
308
+ )
309
+ )
310
+ )
311
+ );
312
+
313
+ return returnPromise;
314
+ };
315
+ };
@@ -3,7 +3,7 @@
3
3
  var utils = require("../utils");
4
4
  var log = require("npmlog");
5
5
 
6
- module.exports = function(defaultFuncs, api, ctx) {
6
+ module.exports = function (defaultFuncs, api, ctx) {
7
7
  function makeTypingIndicator(typ, threadID, callback, isGroup) {
8
8
  var form = {
9
9
  typ: +typ,
@@ -15,46 +15,36 @@ module.exports = function(defaultFuncs, api, ctx) {
15
15
  // Check if thread is a single person chat or a group chat
16
16
  // More info on this is in api.sendMessage
17
17
  if (utils.getType(isGroup) == "Boolean") {
18
- if (!isGroup) {
19
- form.to = threadID;
20
- }
18
+ if (!isGroup) form.to = threadID;
19
+
21
20
  defaultFuncs
22
21
  .post("https://www.facebook.com/ajax/messaging/typ.php", ctx.jar, form)
23
22
  .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
24
- .then(function(resData) {
23
+ .then(function (resData) {
25
24
  if (resData.error) throw resData;
26
25
  return callback();
27
26
  })
28
- .catch(function(err) {
27
+ .catch(function (err) {
29
28
  log.error("sendTypingIndicator", err);
30
- if (utils.getType(err) == "Object" && err.error === "Not logged in") {
31
- ctx.loggedIn = false;
32
- }
29
+ if (utils.getType(err) == "Object" && err.error === "Not logged in") ctx.loggedIn = false;
33
30
  return callback(err);
34
31
  });
35
- } else {
36
- api.getUserInfo(threadID, function(err, res) {
32
+ }
33
+ else {
34
+ api.getUserInfo(threadID, function (err, res) {
37
35
  if (err) return callback(err);
38
36
  // If id is single person chat
39
37
  if (Object.keys(res).length > 0) form.to = threadID;
40
38
  defaultFuncs
41
- .post(
42
- "https://www.facebook.com/ajax/messaging/typ.php",
43
- ctx.jar,
44
- form
45
- )
39
+ .post("https://www.facebook.com/ajax/messaging/typ.php", ctx.jar, form)
46
40
  .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
47
- .then(function(resData) {
41
+ .then(function (resData) {
48
42
  if (resData.error) throw resData;
49
43
  return callback();
50
44
  })
51
- .catch(function(err) {
45
+ .catch(function (err) {
52
46
  log.error("sendTypingIndicator", err);
53
- if (
54
- utils.getType(err) == "Object" &&
55
- err.error === "Not logged in."
56
- )
57
- ctx.loggedIn = false;
47
+ if (utils.getType(err) == "Object" && err.error === "Not logged in.") ctx.loggedIn = false;
58
48
  return callback(err);
59
49
  });
60
50
  });
@@ -62,33 +52,18 @@ module.exports = function(defaultFuncs, api, ctx) {
62
52
  }
63
53
 
64
54
  return function sendTypingIndicator(threadID, callback, isGroup) {
65
- if (
66
- utils.getType(callback) !== "Function" &&
67
- utils.getType(callback) !== "AsyncFunction"
68
- ) {
69
- if (callback)
70
- log.warn(
71
- "sendTypingIndicator",
72
- "callback is not a function - ignoring."
73
- );
74
- callback = () => {};
55
+ if (utils.getType(callback) !== "Function" && utils.getType(callback) !== "AsyncFunction") {
56
+ if (callback) log.warn("sendTypingIndicator", "callback is not a function - ignoring.");
57
+ callback = () => { };
75
58
  }
76
59
 
77
60
  makeTypingIndicator(true, threadID, callback, isGroup);
78
61
 
79
62
  return function end(cb) {
80
- if (
81
- utils.getType(cb) !== "Function" &&
82
- utils.getType(cb) !== "AsyncFunction"
83
- ) {
84
- if (cb)
85
- log.warn(
86
- "sendTypingIndicator",
87
- "callback is not a function - ignoring."
88
- );
89
- cb = () => {};
63
+ if (utils.getType(cb) !== "Function" && utils.getType(cb) !== "AsyncFunction") {
64
+ if (cb) log.warn("sendTypingIndicator", "callback is not a function - ignoring.");
65
+ cb = () => { };
90
66
  }
91
-
92
67
  makeTypingIndicator(false, threadID, cb, isGroup);
93
68
  };
94
69
  };
@@ -3,22 +3,17 @@
3
3
  var utils = require("../utils");
4
4
  var log = require("npmlog");
5
5
 
6
- module.exports = function(defaultFuncs, api, ctx) {
7
- return function setMessageReaction(
8
- reaction,
9
- messageID,
10
- callback,
11
- forceCustomReaction
12
- ) {
13
- var resolveFunc = function() {};
14
- var rejectFunc = function() {};
15
- var returnPromise = new Promise(function(resolve, reject) {
6
+ module.exports = function (defaultFuncs, api, ctx) {
7
+ return function setMessageReaction(reaction, messageID, callback, forceCustomReaction) {
8
+ var resolveFunc = function () { };
9
+ var rejectFunc = function () { };
10
+ var returnPromise = new Promise(function (resolve, reject) {
16
11
  resolveFunc = resolve;
17
12
  rejectFunc = reject;
18
13
  });
19
14
 
20
15
  if (!callback) {
21
- callback = function(err, data) {
16
+ callback = function (err, data) {
22
17
  if (err) return rejectFunc(err);
23
18
  resolveFunc(data);
24
19
  };
@@ -92,23 +87,17 @@ module.exports = function(defaultFuncs, api, ctx) {
92
87
  };
93
88
 
94
89
  defaultFuncs
95
- .postFormData(
96
- "https://www.facebook.com/webgraphql/mutation/",
97
- ctx.jar,
98
- {},
99
- qs
100
- )
90
+ .postFormData("https://www.facebook.com/webgraphql/mutation/", ctx.jar, {}, qs)
101
91
  .then(utils.parseAndCheckLogin(ctx.jar, defaultFuncs))
102
- .then(function(resData) {
92
+ .then(function (resData) {
103
93
  if (!resData) throw { error: "setReaction returned empty object." };
104
94
  if (resData.error) throw resData;
105
95
  callback(null);
106
96
  })
107
- .catch(function(err) {
97
+ .catch(function (err) {
108
98
  log.error("setReaction", err);
109
99
  return callback(err);
110
100
  });
111
-
112
101
  return returnPromise;
113
102
  };
114
103
  };
@@ -1,104 +1,63 @@
1
- /**
2
- * @fix by NTKhang
3
- * update as Thursday, 10 February 2022
4
- * do not remove the author name to get more updates
5
- */
6
-
7
1
  "use strict";
8
2
 
9
3
  var utils = require("../utils");
10
4
  var log = require("npmlog");
11
5
 
12
- function formatData(resData) {
13
- return {
14
- viewer_feedback_reaction_info:
15
- resData.feedback_react.feedback.viewer_feedback_reaction_info,
16
- supported_reactions: resData.feedback_react.feedback.supported_reactions,
17
- top_reactions: resData.feedback_react.feedback.top_reactions.edges,
18
- reaction_count: resData.feedback_react.feedback.reaction_count
19
- };
20
- }
21
-
22
- module.exports = function(defaultFuncs, api, ctx) {
6
+ module.exports = function (defaultFuncs, api, ctx) {
23
7
  return function setPostReaction(postID, type, callback) {
24
- var resolveFunc = function() {};
25
- var rejectFunc = function() {};
26
- var returnPromise = new Promise(function(resolve, reject) {
8
+ var resolveFunc = function () { };
9
+ var rejectFunc = function () { };
10
+ var returnPromise = new Promise(function (resolve, reject) {
27
11
  resolveFunc = resolve;
28
12
  rejectFunc = reject;
29
13
  });
30
14
 
31
15
  if (!callback) {
32
- if (
33
- utils.getType(type) === "Function" ||
34
- utils.getType(type) === "AsyncFunction"
35
- ) {
36
- callback = type;
37
- type = 0;
38
- } else {
39
- callback = function(err, data) {
40
- if (err) {
41
- return rejectFunc(err);
42
- }
43
- resolveFunc(data);
44
- };
45
- }
16
+ callback = function (err, data) {
17
+ if (err) return rejectFunc(err);
18
+ resolveFunc(data);
19
+ };
46
20
  }
47
21
 
48
22
  var map = {
49
- unlike: 0,
50
23
  like: 1,
51
24
  heart: 2,
52
- love: 16,
53
- haha: 4,
54
25
  wow: 3,
26
+ haha: 4,
55
27
  sad: 7,
56
28
  angry: 8
57
29
  };
58
-
59
- if (utils.getType(type) !== "Number" && utils.getType(type) === "String") {
60
- type = map[type.toLowerCase()];
61
- } else {
62
- throw {
63
- error: "setPostReaction: Invalid reaction type"
64
- };
30
+ if (typeof type != "number") {
31
+ type = map[type.toLocaleLowerCase()];
32
+ if (!type) type = 1;
65
33
  }
66
-
67
34
  var form = {
68
35
  av: ctx.userID,
69
36
  fb_api_caller_class: "RelayModern",
70
- fb_api_req_friendly_name: "CometUFIFeedbackReactMutation",
71
- doc_id: "4769042373179384",
37
+ fb_api_req_friendly_name: "UFI2FeedbackReactMutation",
38
+ //This doc_id is valid as of January 17th, 2020
39
+ doc_id: "2580813318646067",
72
40
  variables: JSON.stringify({
73
41
  input: {
42
+ client_mutation_id: "7",
74
43
  actor_id: ctx.userID,
75
- feedback_id: new Buffer.from("feedback:" + postID).toString("base64"),
76
- feedback_reaction: type,
77
- feedback_source: "OBJECT",
78
- is_tracking_encrypted: true,
79
- tracking: [],
80
- session_id: "f7dd50dd-db6e-4598-8cd9-561d5002b423",
81
- client_mutation_id: Math.round(Math.random() * 19).toString()
44
+ feedback_reaction: type
82
45
  },
83
- useDefaultActor: false,
84
- scale: 3
46
+ useDefaultActor: true
85
47
  })
86
48
  };
87
49
 
88
50
  defaultFuncs
89
51
  .post("https://www.facebook.com/api/graphql/", ctx.jar, form)
90
52
  .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
91
- .then(function(resData) {
92
- if (resData.errors) {
93
- throw resData;
94
- }
95
- return callback(null, formatData(resData.data));
53
+ .then(function (resData) {
54
+ if (resData.error) throw resData;
55
+ return callback();
96
56
  })
97
- .catch(function(err) {
57
+ .catch(function (err) {
98
58
  log.error("setPostReaction", err);
99
59
  return callback(err);
100
60
  });
101
-
102
61
  return returnPromise;
103
62
  };
104
63
  };
package/src/setTitle.js CHANGED
@@ -3,24 +3,21 @@
3
3
  var utils = require("../utils");
4
4
  var log = require("npmlog");
5
5
 
6
- module.exports = function(defaultFuncs, api, ctx) {
6
+ module.exports = function (defaultFuncs, api, ctx) {
7
7
  return function setTitle(newTitle, threadID, callback) {
8
- if (
9
- !callback &&
10
- (utils.getType(threadID) === "Function" ||
11
- utils.getType(threadID) === "AsyncFunction")
12
- )
8
+ if (!callback && (utils.getType(threadID) === "Function" || utils.getType(threadID) === "AsyncFunction"))
13
9
  throw { error: "please pass a threadID as a second argument." };
14
10
 
15
- var resolveFunc = function() {};
16
- var rejectFunc = function() {};
17
- var returnPromise = new Promise(function(resolve, reject) {
11
+
12
+ var resolveFunc = function () { };
13
+ var rejectFunc = function () { };
14
+ var returnPromise = new Promise(function (resolve, reject) {
18
15
  resolveFunc = resolve;
19
16
  rejectFunc = reject;
20
17
  });
21
18
 
22
19
  if (!callback) {
23
- callback = function(err, data) {
20
+ callback = function (err, data) {
24
21
  if (err) return rejectFunc(err);
25
22
  resolveFunc(data);
26
23
  };
@@ -56,25 +53,18 @@ module.exports = function(defaultFuncs, api, ctx) {
56
53
  };
57
54
 
58
55
  defaultFuncs
59
- .post(
60
- "https://www.facebook.com/messaging/set_thread_name/",
61
- ctx.jar,
62
- form
63
- )
56
+ .post("https://www.facebook.com/messaging/set_thread_name/", ctx.jar, form)
64
57
  .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
65
- .then(function(resData) {
66
- if (resData.error && resData.error === 1545012)
67
- throw { error: "Cannot change chat title: Not member of chat." };
68
- if (resData.error && resData.error === 1545003)
69
- throw { error: "Cannot set title of single-user chat." };
58
+ .then(function (resData) {
59
+ if (resData.error && resData.error === 1545012) throw { error: "Cannot change chat title: Not member of chat." };
60
+ if (resData.error && resData.error === 1545003) throw { error: "Cannot set title of single-user chat." };
70
61
  if (resData.error) throw resData;
71
62
  return callback();
72
63
  })
73
- .catch(function(err) {
64
+ .catch(function (err) {
74
65
  log.error("setTitle", err);
75
66
  return callback(err);
76
67
  });
77
-
78
68
  return returnPromise;
79
69
  };
80
70
  };