alicezetion 1.2.7 → 1.2.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. package/.cache/replit/__replit_disk_meta.json +1 -1
  2. package/.cache/replit/nix/env.json +1 -1
  3. package/index.js +2 -5
  4. package/leiamnash/addExternalModule.js +10 -6
  5. package/leiamnash/addUserToGroup.js +52 -16
  6. package/leiamnash/changeAdminStatus.js +69 -37
  7. package/leiamnash/changeArchivedStatus.js +26 -12
  8. package/leiamnash/changeBio.js +19 -6
  9. package/leiamnash/changeBlockedStatus.js +14 -3
  10. package/leiamnash/changeGroupImage.js +40 -16
  11. package/leiamnash/changeNickname.js +27 -11
  12. package/leiamnash/changeThreadColor.js +20 -10
  13. package/leiamnash/changeThreadEmoji.js +24 -10
  14. package/leiamnash/chat.js +414 -279
  15. package/leiamnash/createNewGroup.js +28 -12
  16. package/leiamnash/createPoll.js +25 -13
  17. package/leiamnash/deleteMessage.js +24 -12
  18. package/leiamnash/deleteThread.js +25 -11
  19. package/leiamnash/forwardAttachment.js +26 -13
  20. package/leiamnash/getCurrentUserID.js +1 -1
  21. package/leiamnash/getEmojiUrl.js +4 -2
  22. package/leiamnash/getFriendsList.js +21 -10
  23. package/leiamnash/getThreadHistory.js +166 -58
  24. package/leiamnash/getThreadHistoryDeprecated.js +42 -20
  25. package/leiamnash/getThreadInfo.js +60 -25
  26. package/leiamnash/getThreadInfoDeprecated.js +42 -18
  27. package/leiamnash/getThreadList.js +66 -41
  28. package/leiamnash/getThreadListDeprecated.js +43 -14
  29. package/leiamnash/getThreadPictures.js +37 -17
  30. package/leiamnash/getUserID.js +14 -9
  31. package/leiamnash/getUserInfo.js +18 -12
  32. package/leiamnash/handleFriendRequest.js +52 -37
  33. package/leiamnash/handleMessageRequest.js +32 -14
  34. package/leiamnash/httpGet.js +17 -12
  35. package/leiamnash/httpPost.js +17 -12
  36. package/leiamnash/listenMqtt.js +2 -1
  37. package/leiamnash/logout.js +20 -13
  38. package/leiamnash/markAsDelivered.js +22 -11
  39. package/leiamnash/markAsRead.js +21 -11
  40. package/leiamnash/markAsReadAll.js +20 -10
  41. package/leiamnash/markAsSeen.js +18 -7
  42. package/leiamnash/muteThread.js +18 -11
  43. package/leiamnash/removeUserFromGroup.js +48 -14
  44. package/leiamnash/resolvePhotoUrl.js +17 -8
  45. package/leiamnash/searchForThread.js +21 -10
  46. package/leiamnash/sendTypingIndicator.js +47 -14
  47. package/leiamnash/setMessageReaction.js +26 -12
  48. package/leiamnash/setPostReaction.js +26 -13
  49. package/leiamnash/setTitle.js +29 -13
  50. package/leiamnash/threadColors.js +44 -28
  51. package/leiamnash/unfriend.js +19 -9
  52. package/leiamnash/unsendMessage.js +19 -9
  53. package/package.json +1 -1
  54. package/replit.nix +3 -1
  55. package/utils.js +0 -0
  56. package/leiamnash/forwardMessage.js +0 -0
  57. package/leiamnash/listen.js +0 -553
  58. package/leiamnash/listenMqtt-Test.js +0 -687
@@ -3,19 +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 getThreadInfo(threadID, callback) {
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, data) {
17
- if (err) return rejectFunc(err);
18
- resolveFunc(data);
16
+ callback = function (err, friendList) {
17
+ if (err) {
18
+ return rejectFunc(err);
19
+ }
20
+ resolveFunc(friendList);
19
21
  };
20
22
  }
21
23
 
@@ -23,30 +25,52 @@ module.exports = function (defaultFuncs, api, ctx) {
23
25
  client: "mercury"
24
26
  };
25
27
 
26
- api.getUserInfo(threadID, function (err, userRes) {
27
- if (err) return callback(err);
28
+ api.getUserInfo(threadID, function(err, userRes) {
29
+ if (err) {
30
+ return callback(err);
31
+ }
28
32
  var key = Object.keys(userRes).length > 0 ? "user_ids" : "thread_fbids";
29
33
  form["threads[" + key + "][0]"] = threadID;
30
34
 
31
- if (ctx.globalOptions.pageId) form.request_user_id = ctx.globalOptions.pageId;
35
+ if (ctx.globalOptions.pageId)
36
+ form.request_user_id = ctx.globalOptions.pageId;
32
37
 
33
38
  defaultFuncs
34
- .post("https://www.facebook.com/ajax/mercury/thread_info.php", ctx.jar, form)
39
+ .post(
40
+ "https://www.facebook.com/ajax/mercury/thread_info.php",
41
+ ctx.jar,
42
+ form
43
+ )
35
44
  .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
36
- .then(function (resData) {
37
- if (resData.error) throw resData;
38
- else if (!resData.payload) throw { error: "Could not retrieve thread Info." };
39
-
45
+ .then(function(resData) {
46
+ if (resData.error) {
47
+ throw resData;
48
+ } else if (!resData.payload) {
49
+ throw {
50
+ error: "Could not retrieve thread Info."
51
+ };
52
+ }
40
53
  var threadData = resData.payload.threads[0];
41
54
  var userData = userRes[threadID];
42
55
 
43
- if (threadData == null) throw { error: "ThreadData is null" };
56
+ if (threadData == null) {
57
+ throw {
58
+ error: "ThreadData is null"
59
+ };
60
+ }
61
+
62
+ threadData.name =
63
+ userData != null && userData.name != null
64
+ ? userData.name
65
+ : threadData.name;
66
+ threadData.image_src =
67
+ userData != null && userData.thumbSrc != null
68
+ ? userData.thumbSrc
69
+ : threadData.image_src;
44
70
 
45
- threadData.name = userData != null && userData.name != null ? userData.name : threadData.name;
46
- threadData.image_src = userData != null && userData.thumbSrc != null ? userData.thumbSrc : threadData.image_src;
47
71
  callback(null, utils.formatThread(threadData));
48
72
  })
49
- .catch(function (err) {
73
+ .catch(function(err) {
50
74
  log.error("getThreadInfo", err);
51
75
  return callback(err);
52
76
  });
@@ -9,7 +9,7 @@ function createProfileUrl(url, username, id) {
9
9
  }
10
10
 
11
11
  function formatParticipants(participants) {
12
- return participants.edges.map((p) => {
12
+ return participants.edges.map((p)=>{
13
13
  p = p.node.messaging_actor;
14
14
  switch (p["__typename"]) {
15
15
  case "User":
@@ -21,7 +21,7 @@ function formatParticipants(participants) {
21
21
  gender: p.gender,
22
22
  url: p.url, // how about making it profileURL
23
23
  profilePicture: p.big_image_src.uri,
24
- username: (p.username || null),
24
+ username: (p.username||null),
25
25
  // TODO: maybe better names for these?
26
26
  isViewerFriend: p.is_viewer_friend, // true/false
27
27
  isMessengerUser: p.is_messenger_user, // true/false
@@ -37,7 +37,7 @@ function formatParticipants(participants) {
37
37
  name: p.name,
38
38
  url: p.url,
39
39
  profilePicture: p.big_image_src.uri,
40
- username: (p.username || null),
40
+ username: (p.username||null),
41
41
  // uhm... better names maybe?
42
42
  acceptsMessengerUserFeedback: p.accepts_messenger_user_feedback, // true/false
43
43
  isMessengerUser: p.is_messenger_user, // true/false
@@ -46,18 +46,27 @@ function formatParticipants(participants) {
46
46
  isMessageBlockedByViewer: p.is_message_blocked_by_viewer, // true/false
47
47
  };
48
48
  case "ReducedMessagingActor":
49
- case "UnavailableMessagingActor":
50
49
  return {
51
50
  accountType: p["__typename"],
52
51
  userID: utils.formatID(p.id.toString()),
53
52
  name: p.name,
54
53
  url: createProfileUrl(p.url, p.username, p.id), // in this case p.url is null all the time
55
54
  profilePicture: p.big_image_src.uri, // in this case it is default facebook photo, we could determine gender using it
56
- username: (p.username || null), // maybe we could use it to generate profile URL?
55
+ username: (p.username||null), // maybe we could use it to generate profile URL?
56
+ isMessageBlockedByViewer: p.is_message_blocked_by_viewer, // true/false
57
+ };
58
+ case "UnavailableMessagingActor":
59
+ return {
60
+ accountType: p["__typename"],
61
+ userID: utils.formatID(p.id.toString()),
62
+ name: p.name, // "Facebook User" in user's language
63
+ url: createProfileUrl(p.url, p.username, p.id), // in this case p.url is null all the time
64
+ profilePicture: p.big_image_src.uri, // default male facebook photo
65
+ username: (p.username||null), // maybe we could use it to generate profile URL?
57
66
  isMessageBlockedByViewer: p.is_message_blocked_by_viewer, // true/false
58
67
  };
59
68
  default:
60
- log.warn("getThreadList", "Found participant with unsupported typename. Please open an issue at https://github.com/Schmavery/facebook-chat-api/issues\n" + JSON.stringify(p, null, 2));
69
+ log.warn("getThreadList", "Found participant with unsupported typename. Please open an issue at https://github.com/Schmavery/fca-unofficial/issues\n" + JSON.stringify(p, null, 2));
61
70
  return {
62
71
  accountType: p["__typename"],
63
72
  userID: utils.formatID(p.id.toString()),
@@ -69,7 +78,9 @@ function formatParticipants(participants) {
69
78
 
70
79
  // "FF8C0077" -> "8C0077"
71
80
  function formatColor(color) {
72
- if (color && color.match(/^(?:[0-9a-fA-F]{8})$/g)) return color.slice(2);
81
+ if (color && color.match(/^(?:[0-9a-fA-F]{8})$/g)) {
82
+ return color.slice(2);
83
+ }
73
84
  return color;
74
85
  }
75
86
 
@@ -84,24 +95,24 @@ function getThreadName(t) {
84
95
 
85
96
  function mapNicknames(customizationInfo) {
86
97
  return (customizationInfo && customizationInfo.participant_customizations) ? customizationInfo.participant_customizations.map(u => {
87
- return {
88
- "userID": u.participant_id,
89
- "nickname": u.nickname
90
- };
91
- }) : [];
98
+ return {
99
+ "userID": u.participant_id,
100
+ "nickname": u.nickname
101
+ };
102
+ }):[];
92
103
  }
93
104
 
94
105
  function formatThreadList(data) {
95
106
  return data.map(t => {
96
- let lastMessageNode = (t.last_message && t.last_message.nodes && t.last_message.nodes.length > 0) ? t.last_message.nodes[0] : null;
107
+ let lastMessageNode = (t.last_message&&t.last_message.nodes&&t.last_message.nodes.length>0)?t.last_message.nodes[0]:null;
97
108
  return {
98
- threadID: t.thread_key ? utils.formatID(t.thread_key.thread_fbid || t.thread_key.other_user_id) : null, // shall never be null
109
+ threadID: t.thread_key?utils.formatID(t.thread_key.thread_fbid || t.thread_key.other_user_id):null, // shall never be null
99
110
  name: getThreadName(t),
100
111
  unreadCount: t.unread_count,
101
112
  messageCount: t.messages_count,
102
- imageSrc: t.image ? t.image.uri : null,
103
- emoji: t.customization_info ? t.customization_info.emoji : null,
104
- color: formatColor(t.customization_info ? t.customization_info.outgoing_bubble_color : null),
113
+ imageSrc: t.image?t.image.uri:null,
114
+ emoji: t.customization_info?t.customization_info.emoji:null,
115
+ color: formatColor(t.customization_info?t.customization_info.outgoing_bubble_color:null),
105
116
  nicknames: mapNicknames(t.customization_info),
106
117
  muteUntil: t.mute_until,
107
118
  participants: formatParticipants(t.all_participants),
@@ -112,7 +123,7 @@ function formatThreadList(data) {
112
123
  // isPinProtected: t.is_pin_protected, // feature from future? always false (2018-04-04)
113
124
  customizationEnabled: t.customization_enabled, // false for ONE_TO_ONE with Page or ReducedMessagingActor
114
125
  participantAddMode: t.participant_add_mode_as_string, // "ADD" if "GROUP" and null if "ONE_TO_ONE"
115
- montageThread: t.montage_thread ? Buffer.from(t.montage_thread.id, "base64").toString() : null, // base64 encoded string "message_thread:0000000000000000"
126
+ montageThread: t.montage_thread?Buffer.from(t.montage_thread.id,"base64").toString():null, // base64 encoded string "message_thread:0000000000000000"
116
127
  // it is not userID nor any other ID known to me...
117
128
  // can somebody inspect it? where is it used?
118
129
  // probably Messenger Day uses it
@@ -123,13 +134,13 @@ function formatThreadList(data) {
123
134
  timestamp: t.updated_time_precise, // in miliseconds
124
135
  // isCanonicalUser: t.is_canonical_neo_user, // is it always false?
125
136
  // TODO: how about putting snippet in another object? current implementation does not handle every possibile message type etc.
126
- snippet: lastMessageNode ? lastMessageNode.snippet : null,
127
- snippetAttachments: lastMessageNode ? lastMessageNode.extensible_attachment : null, // TODO: not sure if it works
128
- snippetSender: lastMessageNode ? utils.formatID((lastMessageNode.message_sender.messaging_actor.id || "").toString()) : null,
129
- lastMessageTimestamp: lastMessageNode ? lastMessageNode.timestamp_precise : null, // timestamp in miliseconds
130
- lastReadTimestamp: (t.last_read_receipt && t.last_read_receipt.nodes.length > 0)
131
- ? (t.last_read_receipt.nodes[0] ? t.last_read_receipt.nodes[0].timestamp_precise : null)
132
- : null, // timestamp in miliseconds
137
+ snippet: lastMessageNode?lastMessageNode.snippet:null,
138
+ snippetAttachments: lastMessageNode?lastMessageNode.extensible_attachment:null, // TODO: not sure if it works
139
+ snippetSender: lastMessageNode?utils.formatID((lastMessageNode.message_sender.messaging_actor.id || "").toString()):null,
140
+ lastMessageTimestamp: lastMessageNode?lastMessageNode.timestamp_precise:null, // timestamp in miliseconds
141
+ lastReadTimestamp: (t.last_read_receipt&&t.last_read_receipt.nodes.length>0)
142
+ ? (t.last_read_receipt.nodes[0]?t.last_read_receipt.nodes[0].timestamp_precise:null)
143
+ : null, // timestamp in miliseconds
133
144
  cannotReplyReason: t.cannot_reply_reason, // TODO: inspect possible values
134
145
  approvalMode: Boolean(t.approval_mode),
135
146
 
@@ -140,21 +151,28 @@ function formatThreadList(data) {
140
151
  });
141
152
  }
142
153
 
143
- module.exports = function (defaultFuncs, api, ctx) {
154
+ module.exports = function(defaultFuncs, api, ctx) {
144
155
  return function getThreadList(limit, timestamp, tags, callback) {
145
156
  if (!callback && (utils.getType(tags) === "Function" || utils.getType(tags) === "AsyncFunction")) {
146
157
  callback = tags;
147
158
  tags = [""];
148
159
  }
149
- if (utils.getType(limit) !== "Number" || !Number.isInteger(limit) || limit <= 0) throw { error: "getThreadList: limit must be a positive integer" };
150
-
151
- if (utils.getType(timestamp) !== "Null" && (utils.getType(timestamp) !== "Number" || !Number.isInteger(timestamp))) throw { error: "getThreadList: timestamp must be an integer or null" };
152
-
153
- if (utils.getType(tags) === "String") tags = [tags];
154
- if (utils.getType(tags) !== "Array") throw { error: "getThreadList: tags must be an array" };
160
+ if (utils.getType(limit) !== "Number" || !Number.isInteger(limit) || limit <= 0) {
161
+ throw {error: "getThreadList: limit must be a positive integer"};
162
+ }
163
+ if (utils.getType(timestamp) !== "Null" &&
164
+ (utils.getType(timestamp) !== "Number" || !Number.isInteger(timestamp))) {
165
+ throw {error: "getThreadList: timestamp must be an integer or null"};
166
+ }
167
+ if (utils.getType(tags) === "String") {
168
+ tags = [tags];
169
+ }
170
+ if (utils.getType(tags) !== "Array") {
171
+ throw {error: "getThreadList: tags must be an array"};
172
+ }
155
173
 
156
- var resolveFunc = function () { };
157
- var rejectFunc = function () { };
174
+ var resolveFunc = function(){};
175
+ var rejectFunc = function(){};
158
176
  var returnPromise = new Promise(function (resolve, reject) {
159
177
  resolveFunc = resolve;
160
178
  rejectFunc = reject;
@@ -162,7 +180,9 @@ module.exports = function (defaultFuncs, api, ctx) {
162
180
 
163
181
  if (utils.getType(callback) !== "Function" && utils.getType(callback) !== "AsyncFunction") {
164
182
  callback = function (err, data) {
165
- if (err) return rejectFunc(err);
183
+ if (err) {
184
+ return rejectFunc(err);
185
+ }
166
186
  resolveFunc(data);
167
187
  };
168
188
  }
@@ -174,7 +194,7 @@ module.exports = function (defaultFuncs, api, ctx) {
174
194
  // This doc_id was valid on 2020-07-20
175
195
  "doc_id": "3336396659757871",
176
196
  "query_params": {
177
- "limit": limit + (timestamp ? 1 : 0),
197
+ "limit": limit+(timestamp?1:0),
178
198
  "before": timestamp,
179
199
  "tags": tags,
180
200
  "includeDeliveryReceipts": true,
@@ -189,9 +209,13 @@ module.exports = function (defaultFuncs, api, ctx) {
189
209
  .post("https://www.facebook.com/api/graphqlbatch/", ctx.jar, form)
190
210
  .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
191
211
  .then((resData) => {
192
- if (resData[resData.length - 1].error_results > 0) throw resData[0].o0.errors;
212
+ if (resData[resData.length - 1].error_results > 0) {
213
+ throw resData[0].o0.errors;
214
+ }
193
215
 
194
- if (resData[resData.length - 1].successful_results === 0) throw { error: "getThreadList: there was no successful_results", res: resData };
216
+ if (resData[resData.length - 1].successful_results === 0) {
217
+ throw {error: "getThreadList: there was no successful_results", res: resData};
218
+ }
195
219
 
196
220
  // When we ask for threads using timestamp from the previous request,
197
221
  // we are getting the last thread repeated as the first thread in this response.
@@ -199,12 +223,13 @@ module.exports = function (defaultFuncs, api, ctx) {
199
223
  // It is also the reason for increasing limit by 1 when timestamp is set
200
224
  // this way user asks for 10 threads, we are asking for 11,
201
225
  // but after removing the duplicated one, it is again 10
202
- if (timestamp) resData[0].o0.data.viewer.message_threads.nodes.shift();
203
-
226
+ if (timestamp) {
227
+ resData[0].o0.data.viewer.message_threads.nodes.shift();
228
+ }
204
229
  callback(null, formatThreadList(resData[0].o0.data.viewer.message_threads.nodes));
205
230
  })
206
231
  .catch((err) => {
207
- log.error("getThreadList", "ParseAndCheckLogin got status code: 404. Bailing out of trying to parse response.");
232
+ log.error("getThreadList", err);
208
233
  return callback(err);
209
234
  });
210
235
 
@@ -3,21 +3,39 @@
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 getThreadList(start, end, type, callback) {
8
8
  if (utils.getType(callback) === "Undefined") {
9
- if (utils.getType(end) !== "Number") throw { error: "Please pass a number as a second argument." };
10
- else if (utils.getType(type) === "Function" || utils.getType(type) === "AsyncFunction") {
9
+ if (utils.getType(end) !== "Number") {
10
+ throw {
11
+ error: "Please pass a number as a second argument."
12
+ };
13
+ } else if (
14
+ utils.getType(type) === "Function" ||
15
+ utils.getType(type) === "AsyncFunction"
16
+ ) {
11
17
  callback = type;
12
18
  type = "inbox"; //default to inbox
19
+ } else if (utils.getType(type) !== "String") {
20
+ throw {
21
+ error:
22
+ "Please pass a String as a third argument. Your options are: inbox, pending, and archived"
23
+ };
24
+ } else {
25
+ throw {
26
+ error: "getThreadList: need callback"
27
+ };
13
28
  }
14
- else if (utils.getType(type) !== "String") throw { error: "Please pass a String as a third argument. Your options are: inbox, pending, and archived" };
15
- else throw { error: "getThreadList: need callback" };
16
29
  }
17
30
 
18
- if (type === "archived") type = "action:archived";
19
- else if (type !== "inbox" && type !== "pending" && type !== "other") throw { error: "type can only be one of the following: inbox, pending, archived, other" };
20
-
31
+ if (type === "archived") {
32
+ type = "action:archived";
33
+ } else if (type !== "inbox" && type !== "pending" && type !== "other") {
34
+ throw {
35
+ error:
36
+ "type can only be one of the following: inbox, pending, archived, other"
37
+ };
38
+ }
21
39
 
22
40
  if (end <= start) end = start + 20;
23
41
 
@@ -28,17 +46,28 @@ module.exports = function (defaultFuncs, api, ctx) {
28
46
  form[type + "[offset]"] = start;
29
47
  form[type + "[limit]"] = end - start;
30
48
 
31
- if (ctx.globalOptions.pageID) form.request_user_id = ctx.globalOptions.pageID;
49
+ if (ctx.globalOptions.pageID) {
50
+ form.request_user_id = ctx.globalOptions.pageID;
51
+ }
32
52
 
33
53
  defaultFuncs
34
- .post("https://www.facebook.com/ajax/mercury/threadlist_info.php", ctx.jar, form)
54
+ .post(
55
+ "https://www.facebook.com/ajax/mercury/threadlist_info.php",
56
+ ctx.jar,
57
+ form
58
+ )
35
59
  .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
36
- .then(function (resData) {
37
- if (resData.error) throw resData;
60
+ .then(function(resData) {
61
+ if (resData.error) {
62
+ throw resData;
63
+ }
38
64
  log.verbose("getThreadList", JSON.stringify(resData.payload.threads));
39
- return callback(null, (resData.payload.threads || []).map(utils.formatThread));
65
+ return callback(
66
+ null,
67
+ (resData.payload.threads || []).map(utils.formatThread)
68
+ );
40
69
  })
41
- .catch(function (err) {
70
+ .catch(function(err) {
42
71
  log.error("getThreadList", err);
43
72
  return callback(err);
44
73
  });
@@ -3,19 +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 getThreadPictures(threadID, offset, limit, callback) {
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, data) {
17
- if (err) return rejectFunc(err);
18
- resolveFunc(data);
16
+ callback = function (err, friendList) {
17
+ if (err) {
18
+ return rejectFunc(err);
19
+ }
20
+ resolveFunc(friendList);
19
21
  };
20
22
  }
21
23
 
@@ -26,31 +28,49 @@ module.exports = function (defaultFuncs, api, ctx) {
26
28
  };
27
29
 
28
30
  defaultFuncs
29
- .post("https://www.facebook.com/ajax/messaging/attachments/sharedphotos.php", ctx.jar, form)
31
+ .post(
32
+ "https://www.facebook.com/ajax/messaging/attachments/sharedphotos.php",
33
+ ctx.jar,
34
+ form
35
+ )
30
36
  .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
31
- .then(function (resData) {
32
- if (resData.error) throw resData;
37
+ .then(function(resData) {
38
+ if (resData.error) {
39
+ throw resData;
40
+ }
33
41
  return Promise.all(
34
- resData.payload.imagesData.map(function (image) {
42
+ resData.payload.imagesData.map(function(image) {
35
43
  form = {
36
44
  thread_id: threadID,
37
45
  image_id: image.fbid
38
46
  };
39
47
  return defaultFuncs
40
- .post("https://www.facebook.com/ajax/messaging/attachments/sharedphotos.php", ctx.jar, form)
48
+ .post(
49
+ "https://www.facebook.com/ajax/messaging/attachments/sharedphotos.php",
50
+ ctx.jar,
51
+ form
52
+ )
41
53
  .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
42
- .then(function (resData) {
43
- if (resData.error) throw resData;
54
+ .then(function(resData) {
55
+ if (resData.error) {
56
+ throw resData;
57
+ }
44
58
  // the response is pretty messy
45
- var queryThreadID = resData.jsmods.require[0][3][1].query_metadata.query_path[0].message_thread;
46
- var imageData = resData.jsmods.require[0][3][1].query_results[queryThreadID].message_images.edges[0].node.image2;
59
+ var queryThreadID =
60
+ resData.jsmods.require[0][3][1].query_metadata.query_path[0]
61
+ .message_thread;
62
+ var imageData =
63
+ resData.jsmods.require[0][3][1].query_results[queryThreadID]
64
+ .message_images.edges[0].node.image2;
47
65
  return imageData;
48
66
  });
49
67
  })
50
68
  );
51
69
  })
52
- .then(resData => callback(null, resData))
53
- .catch(function (err) {
70
+ .then(function(resData) {
71
+ callback(null, resData);
72
+ })
73
+ .catch(function(err) {
54
74
  log.error("Error in getThreadPictures", err);
55
75
  callback(err);
56
76
  });
@@ -17,19 +17,21 @@ function formatData(data) {
17
17
  };
18
18
  }
19
19
 
20
- module.exports = function (defaultFuncs, api, ctx) {
20
+ module.exports = function(defaultFuncs, api, ctx) {
21
21
  return function getUserID(name, callback) {
22
- var resolveFunc = function () { };
23
- var rejectFunc = function () { };
22
+ var resolveFunc = function(){};
23
+ var rejectFunc = function(){};
24
24
  var returnPromise = new Promise(function (resolve, reject) {
25
25
  resolveFunc = resolve;
26
26
  rejectFunc = reject;
27
27
  });
28
28
 
29
29
  if (!callback) {
30
- callback = function (err, data) {
31
- if (err) return rejectFunc(err);
32
- resolveFunc(data);
30
+ callback = function (err, friendList) {
31
+ if (err) {
32
+ return rejectFunc(err);
33
+ }
34
+ resolveFunc(friendList);
33
35
  };
34
36
  }
35
37
 
@@ -45,13 +47,16 @@ module.exports = function (defaultFuncs, api, ctx) {
45
47
  defaultFuncs
46
48
  .get("https://www.facebook.com/ajax/typeahead/search.php", ctx.jar, form)
47
49
  .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
48
- .then(function (resData) {
49
- if (resData.error) throw resData;
50
+ .then(function(resData) {
51
+ if (resData.error) {
52
+ throw resData;
53
+ }
50
54
 
51
55
  var data = resData.payload.entries;
56
+
52
57
  callback(null, data.map(formatData));
53
58
  })
54
- .catch(function (err) {
59
+ .catch(function(err) {
55
60
  log.error("getUserID", err);
56
61
  return callback(err);
57
62
  });
@@ -27,37 +27,43 @@ function formatData(data) {
27
27
  return retObj;
28
28
  }
29
29
 
30
- module.exports = function (defaultFuncs, api, ctx) {
30
+ module.exports = function(defaultFuncs, api, ctx) {
31
31
  return function getUserInfo(id, callback) {
32
- var resolveFunc = function () { };
33
- var rejectFunc = function () { };
32
+ var resolveFunc = function(){};
33
+ var rejectFunc = function(){};
34
34
  var returnPromise = new Promise(function (resolve, reject) {
35
35
  resolveFunc = resolve;
36
36
  rejectFunc = reject;
37
37
  });
38
38
 
39
39
  if (!callback) {
40
- callback = function (err, userInfo) {
41
- if (err) return rejectFunc(err);
42
- resolveFunc(userInfo);
40
+ callback = function (err, friendList) {
41
+ if (err) {
42
+ return rejectFunc(err);
43
+ }
44
+ resolveFunc(friendList);
43
45
  };
44
46
  }
45
47
 
46
- if (utils.getType(id) !== "Array") id = [id];
48
+ if (utils.getType(id) !== "Array") {
49
+ id = [id];
50
+ }
47
51
 
48
52
  var form = {};
49
- id.map(function (v, i) {
53
+ id.map(function(v, i) {
50
54
  form["ids[" + i + "]"] = v;
51
55
  });
52
56
  defaultFuncs
53
57
  .post("https://www.facebook.com/chat/user_info/", ctx.jar, form)
54
58
  .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
55
- .then(function (resData) {
56
- if (resData.error) throw resData;
59
+ .then(function(resData) {
60
+ if (resData.error) {
61
+ throw resData;
62
+ }
57
63
  return callback(null, formatData(resData.payload.profiles));
58
64
  })
59
- .catch(function (err) {
60
- log.error("getUserInfo", "Can't get user info");
65
+ .catch(function(err) {
66
+ log.error("getUserInfo", err);
61
67
  return callback(err);
62
68
  });
63
69