alicezetion 1.3.0 → 1.3.1

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 (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 +1 -8
  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