alicezetion 1.6.9 → 1.7.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (86) 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 +182 -495
  5. package/package.json +10 -8
  6. package/replit.nix +4 -6
  7. package/src/addExternalModule.js +15 -0
  8. package/{leiamnash → src}/addUserToGroup.js +16 -52
  9. package/src/changeAdminStatus.js +47 -0
  10. package/src/changeArchivedStatus.js +41 -0
  11. package/{leiamnash → src}/changeBio.js +6 -19
  12. package/{leiamnash → src}/changeBlockedStatus.js +3 -14
  13. package/{leiamnash → src}/changeGroupImage.js +16 -40
  14. package/src/changeNickname.js +43 -0
  15. package/{leiamnash → src}/changeThreadColor.js +10 -20
  16. package/src/changeThreadEmoji.js +41 -0
  17. package/src/chat.js +315 -0
  18. package/{leiamnash → src}/createNewGroup.js +12 -28
  19. package/{leiamnash → src}/createPoll.js +13 -25
  20. package/src/deleteMessage.js +44 -0
  21. package/src/deleteThread.js +42 -0
  22. package/src/forwardAttachment.js +47 -0
  23. package/src/forwardMessage.js +0 -0
  24. package/{leiamnash → src}/getCurrentUserID.js +1 -1
  25. package/{leiamnash → src}/getEmojiUrl.js +2 -4
  26. package/{leiamnash → src}/getFriendsList.js +10 -21
  27. package/{leiamnash → src}/getThreadHistory.js +58 -166
  28. package/{leiamnash → src}/getThreadHistoryDeprecated.js +20 -42
  29. package/src/getThreadInfo.js +171 -0
  30. package/src/getThreadInfoDeprecated.js +56 -0
  31. package/{leiamnash → src}/getThreadList.js +41 -66
  32. package/src/getThreadListDeprecated.js +46 -0
  33. package/src/getThreadPictures.js +59 -0
  34. package/{leiamnash → src}/getUserID.js +9 -14
  35. package/{leiamnash → src}/getUserInfo.js +12 -18
  36. package/src/handleFriendRequest.js +46 -0
  37. package/src/handleMessageRequest.js +47 -0
  38. package/{leiamnash → src}/httpGet.js +12 -17
  39. package/{leiamnash → src}/httpPost.js +12 -17
  40. package/src/listen.js +553 -0
  41. package/src/listenMqtt-Test.js +687 -0
  42. package/src/listenMqtt.js +677 -0
  43. package/{leiamnash → src}/logout.js +13 -20
  44. package/{leiamnash → src}/markAsDelivered.js +11 -22
  45. package/{leiamnash → src}/markAsRead.js +11 -21
  46. package/{leiamnash → src}/markAsReadAll.js +10 -20
  47. package/{leiamnash → src}/markAsSeen.js +7 -18
  48. package/{leiamnash → src}/muteThread.js +11 -18
  49. package/src/removeUserFromGroup.js +45 -0
  50. package/{leiamnash → src}/resolvePhotoUrl.js +8 -17
  51. package/{leiamnash → src}/searchForThread.js +10 -21
  52. package/src/sendMessage.js +315 -0
  53. package/{leiamnash → src}/sendTypingIndicator.js +14 -47
  54. package/{leiamnash → src}/setMessageReaction.js +12 -26
  55. package/{leiamnash → src}/setPostReaction.js +13 -26
  56. package/{leiamnash → src}/setTitle.js +13 -29
  57. package/src/threadColors.js +41 -0
  58. package/{leiamnash → src}/unfriend.js +9 -19
  59. package/{leiamnash → src}/unsendMessage.js +9 -19
  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 +1021 -1238
  68. package/leiamnash/addExternalModule.js +0 -19
  69. package/leiamnash/changeAdminStatus.js +0 -79
  70. package/leiamnash/changeApprovalMode.js +0 -80
  71. package/leiamnash/changeArchivedStatus.js +0 -55
  72. package/leiamnash/changeNickname.js +0 -59
  73. package/leiamnash/changeThreadEmoji.js +0 -55
  74. package/leiamnash/chat.js +0 -447
  75. package/leiamnash/deleteMessage.js +0 -56
  76. package/leiamnash/deleteThread.js +0 -56
  77. package/leiamnash/forwardAttachment.js +0 -60
  78. package/leiamnash/getThreadInfo.js +0 -212
  79. package/leiamnash/getThreadInfoDeprecated.js +0 -80
  80. package/leiamnash/getThreadListDeprecated.js +0 -75
  81. package/leiamnash/getThreadPictures.js +0 -79
  82. package/leiamnash/handleFriendRequest.js +0 -61
  83. package/leiamnash/handleMessageRequest.js +0 -65
  84. package/leiamnash/listenMqtt.js +0 -1129
  85. package/leiamnash/removeUserFromGroup.js +0 -79
  86. package/leiamnash/threadColors.js +0 -57
@@ -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
+ };
@@ -15,52 +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
23
  .then(function (resData) {
25
- if (resData.error) {
26
- throw resData;
27
- }
28
-
24
+ if (resData.error) throw resData;
29
25
  return callback();
30
26
  })
31
27
  .catch(function (err) {
32
28
  log.error("sendTypingIndicator", err);
33
- if (utils.getType(err) == "Object" && err.error === "Not logged in") {
34
- ctx.loggedIn = false;
35
- }
29
+ if (utils.getType(err) == "Object" && err.error === "Not logged in") ctx.loggedIn = false;
36
30
  return callback(err);
37
31
  });
38
- } else {
32
+ }
33
+ else {
39
34
  api.getUserInfo(threadID, function (err, res) {
40
- if (err) {
41
- return callback(err);
42
- }
43
-
35
+ if (err) return callback(err);
44
36
  // If id is single person chat
45
- if (Object.keys(res).length > 0) {
46
- form.to = threadID;
47
- }
48
-
37
+ if (Object.keys(res).length > 0) form.to = threadID;
49
38
  defaultFuncs
50
39
  .post("https://www.facebook.com/ajax/messaging/typ.php", ctx.jar, form)
51
40
  .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
52
41
  .then(function (resData) {
53
- if (resData.error) {
54
- throw resData;
55
- }
56
-
42
+ if (resData.error) throw resData;
57
43
  return callback();
58
44
  })
59
45
  .catch(function (err) {
60
46
  log.error("sendTypingIndicator", err);
61
- if (utils.getType(err) == "Object" && err.error === "Not logged in.") {
62
- ctx.loggedIn = false;
63
- }
47
+ if (utils.getType(err) == "Object" && err.error === "Not logged in.") ctx.loggedIn = false;
64
48
  return callback(err);
65
49
  });
66
50
  });
@@ -68,35 +52,18 @@ module.exports = function (defaultFuncs, api, ctx) {
68
52
  }
69
53
 
70
54
  return function sendTypingIndicator(threadID, callback, isGroup) {
71
- if (
72
- utils.getType(callback) !== "Function" &&
73
- utils.getType(callback) !== "AsyncFunction"
74
- ) {
75
- if (callback) {
76
- log.warn(
77
- "sendTypingIndicator",
78
- "callback is not a function - ignoring."
79
- );
80
- }
55
+ if (utils.getType(callback) !== "Function" && utils.getType(callback) !== "AsyncFunction") {
56
+ if (callback) log.warn("sendTypingIndicator", "callback is not a function - ignoring.");
81
57
  callback = () => { };
82
58
  }
83
59
 
84
60
  makeTypingIndicator(true, threadID, callback, isGroup);
85
61
 
86
62
  return function end(cb) {
87
- if (
88
- utils.getType(cb) !== "Function" &&
89
- utils.getType(cb) !== "AsyncFunction"
90
- ) {
91
- if (cb) {
92
- log.warn(
93
- "sendTypingIndicator",
94
- "callback is not a function - ignoring."
95
- );
96
- }
63
+ if (utils.getType(cb) !== "Function" && utils.getType(cb) !== "AsyncFunction") {
64
+ if (cb) log.warn("sendTypingIndicator", "callback is not a function - ignoring.");
97
65
  cb = () => { };
98
66
  }
99
-
100
67
  makeTypingIndicator(false, threadID, cb, isGroup);
101
68
  };
102
69
  };
@@ -3,21 +3,19 @@
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 setMessageReaction(reaction, messageID, callback, forceCustomReaction) {
8
- var resolveFunc = function(){};
9
- var rejectFunc = function(){};
8
+ var resolveFunc = function () { };
9
+ var rejectFunc = function () { };
10
10
  var returnPromise = new Promise(function (resolve, reject) {
11
11
  resolveFunc = resolve;
12
12
  rejectFunc = reject;
13
13
  });
14
14
 
15
15
  if (!callback) {
16
- callback = function (err, friendList) {
17
- if (err) {
18
- return rejectFunc(err);
19
- }
20
- resolveFunc(friendList);
16
+ callback = function (err, data) {
17
+ if (err) return rejectFunc(err);
18
+ resolveFunc(data);
21
19
  };
22
20
  }
23
21
 
@@ -68,9 +66,7 @@ module.exports = function(defaultFuncs, api, ctx) {
68
66
  reaction = "\uD83D\uDC97";
69
67
  break;
70
68
  default:
71
- if (forceCustomReaction) {
72
- break;
73
- }
69
+ if (forceCustomReaction) break;
74
70
  return callback({ error: "Reaction is not a valid emoji." });
75
71
  }
76
72
 
@@ -91,27 +87,17 @@ module.exports = function(defaultFuncs, api, ctx) {
91
87
  };
92
88
 
93
89
  defaultFuncs
94
- .postFormData(
95
- "https://www.facebook.com/webgraphql/mutation/",
96
- ctx.jar,
97
- {},
98
- qs
99
- )
90
+ .postFormData("https://www.facebook.com/webgraphql/mutation/", ctx.jar, {}, qs)
100
91
  .then(utils.parseAndCheckLogin(ctx.jar, defaultFuncs))
101
- .then(function(resData) {
102
- if (!resData) {
103
- throw { error: "setReaction returned empty object." };
104
- }
105
- if (resData.error) {
106
- throw resData;
107
- }
92
+ .then(function (resData) {
93
+ if (!resData) throw { error: "setReaction returned empty object." };
94
+ if (resData.error) throw resData;
108
95
  callback(null);
109
96
  })
110
- .catch(function(err) {
97
+ .catch(function (err) {
111
98
  log.error("setReaction", err);
112
99
  return callback(err);
113
100
  });
114
-
115
101
  return returnPromise;
116
102
  };
117
103
  };
@@ -3,21 +3,19 @@
3
3
  var utils = require("../utils");
4
4
  var log = require("npmlog");
5
5
 
6
- module.exports = function(defaultFuncs, api, ctx) {
7
- return function unsendMessage(postID, type, callback) {
8
- var resolveFunc = function(){};
9
- var rejectFunc = function(){};
6
+ module.exports = function (defaultFuncs, api, ctx) {
7
+ return function setPostReaction(postID, type, callback) {
8
+ var resolveFunc = function () { };
9
+ var rejectFunc = function () { };
10
10
  var returnPromise = new Promise(function (resolve, reject) {
11
11
  resolveFunc = resolve;
12
12
  rejectFunc = reject;
13
13
  });
14
14
 
15
15
  if (!callback) {
16
- callback = function (err, friendList) {
17
- if (err) {
18
- return rejectFunc(err);
19
- }
20
- resolveFunc(friendList);
16
+ callback = function (err, data) {
17
+ if (err) return rejectFunc(err);
18
+ resolveFunc(data);
21
19
  };
22
20
  }
23
21
 
@@ -31,9 +29,7 @@ module.exports = function(defaultFuncs, api, ctx) {
31
29
  };
32
30
  if (typeof type != "number") {
33
31
  type = map[type.toLocaleLowerCase()];
34
- if (!type) {
35
- type = 1;
36
- }
32
+ if (!type) type = 1;
37
33
  }
38
34
  var form = {
39
35
  av: ctx.userID,
@@ -45,32 +41,23 @@ module.exports = function(defaultFuncs, api, ctx) {
45
41
  input: {
46
42
  client_mutation_id: "7",
47
43
  actor_id: ctx.userID,
48
- feedback_reaction: type,
49
-
44
+ feedback_reaction: type
50
45
  },
51
46
  useDefaultActor: true
52
47
  })
53
48
  };
54
49
 
55
50
  defaultFuncs
56
- .post(
57
- "https://www.facebook.com/api/graphql/",
58
- ctx.jar,
59
- form
60
- )
51
+ .post("https://www.facebook.com/api/graphql/", ctx.jar, form)
61
52
  .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
62
- .then(function(resData) {
63
- if (resData.error) {
64
- throw resData;
65
- }
66
-
53
+ .then(function (resData) {
54
+ if (resData.error) throw resData;
67
55
  return callback();
68
56
  })
69
- .catch(function(err) {
57
+ .catch(function (err) {
70
58
  log.error("setPostReaction", err);
71
59
  return callback(err);
72
60
  });
73
-
74
61
  return returnPromise;
75
62
  };
76
63
  };
@@ -3,29 +3,23 @@
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
- }
15
10
 
16
- var resolveFunc = function(){};
17
- var rejectFunc = function(){};
11
+
12
+ var resolveFunc = function () { };
13
+ var rejectFunc = function () { };
18
14
  var returnPromise = new Promise(function (resolve, reject) {
19
15
  resolveFunc = resolve;
20
16
  rejectFunc = reject;
21
17
  });
22
18
 
23
19
  if (!callback) {
24
- callback = function (err, friendList) {
25
- if (err) {
26
- return rejectFunc(err);
27
- }
28
- resolveFunc(friendList);
20
+ callback = function (err, data) {
21
+ if (err) return rejectFunc(err);
22
+ resolveFunc(data);
29
23
  };
30
24
  }
31
25
 
@@ -61,26 +55,16 @@ module.exports = function(defaultFuncs, api, ctx) {
61
55
  defaultFuncs
62
56
  .post("https://www.facebook.com/messaging/set_thread_name/", ctx.jar, form)
63
57
  .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
64
- .then(function(resData) {
65
- if (resData.error && resData.error === 1545012) {
66
- throw { error: "Cannot change chat title: Not member of chat." };
67
- }
68
-
69
- if (resData.error && resData.error === 1545003) {
70
- throw { error: "Cannot set title of single-user chat." };
71
- }
72
-
73
- if (resData.error) {
74
- throw resData;
75
- }
76
-
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." };
61
+ if (resData.error) throw resData;
77
62
  return callback();
78
63
  })
79
- .catch(function(err) {
64
+ .catch(function (err) {
80
65
  log.error("setTitle", err);
81
66
  return callback(err);
82
67
  });
83
-
84
68
  return returnPromise;
85
69
  };
86
70
  };
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+
3
+ module.exports = function (_defaultFuncs, _api, _ctx) {
4
+ // Currently the only colors that can be passed to api.changeThreadColor(); may change if Facebook adds more
5
+ return {
6
+
7
+ //#region This part is for backward compatibly
8
+ //trying to match the color one-by-one. kill me plz
9
+ MessengerBlue: "196241301102133", //DefaultBlue
10
+ Viking: "1928399724138152", //TealBlue
11
+ GoldenPoppy: "174636906462322", //Yellow
12
+ RadicalRed: "2129984390566328", //Red
13
+ Shocking: "2058653964378557", //LavenderPurple
14
+ FreeSpeechGreen: "2136751179887052", //Green
15
+ Pumpkin: "175615189761153", //Orange
16
+ LightCoral: "980963458735625", //CoralPink
17
+ MediumSlateBlue: "234137870477637", //BrightPurple
18
+ DeepSkyBlue: "2442142322678320", //AquaBlue
19
+ BrilliantRose: "169463077092846", //HotPink
20
+ //i've tried my best, everything else can't be mapped. (or is it?) -UIRI 2020
21
+ //#endregion
22
+
23
+ DefaultBlue: "196241301102133",
24
+ HotPink: "169463077092846",
25
+ AquaBlue: "2442142322678320",
26
+ BrightPurple: "234137870477637",
27
+ CoralPink: "980963458735625",
28
+ Orange: "175615189761153",
29
+ Green: "2136751179887052",
30
+ LavenderPurple: "2058653964378557",
31
+ Red: "2129984390566328",
32
+ Yellow: "174636906462322",
33
+ TealBlue: "1928399724138152",
34
+ Aqua: "417639218648241",
35
+ Mango: "930060997172551",
36
+ Berry: "164535220883264",
37
+ Citrus: "370940413392601",
38
+ Candy: "205488546921017",
39
+ //StarWars: "809305022860427" Removed.
40
+ };
41
+ };