alicezetion 1.7.0 → 1.7.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (78) hide show
  1. package/.cache/replit/__replit_disk_meta.json +1 -1
  2. package/.cache/replit/nix/env.json +1 -1
  3. package/Extra/Database/index.js +399 -0
  4. package/Extra/Database/methods.js +286 -0
  5. package/Extra/ExtraAddons.js +213 -0
  6. package/Extra/ExtraGetThread.js +1 -0
  7. package/Extra/ExtraUptimeRobot.js +59 -0
  8. package/Extra/PM2/ecosystem.config.js +23 -0
  9. package/Extra/Src/Last-Run.js +48 -0
  10. package/Language/index.json +151 -0
  11. package/StateCrypt.js +22 -0
  12. package/broadcast.js +42 -0
  13. package/index.js +755 -533
  14. package/logger.js +21 -0
  15. package/package.json +35 -21
  16. package/replit.nix +0 -3
  17. package/src/addExternalModule.js +23 -0
  18. package/{leiamnash → src}/addUserToGroup.js +11 -23
  19. package/{leiamnash → src}/changeAdminStatus.js +32 -16
  20. package/{leiamnash → src}/changeArchivedStatus.js +9 -17
  21. package/src/changeAvt.js +91 -0
  22. package/{leiamnash → src}/changeBio.js +16 -24
  23. package/{leiamnash → src}/changeBlockedStatus.js +13 -18
  24. package/{leiamnash → src}/changeGroupImage.js +14 -23
  25. package/{leiamnash → src}/changeNickname.js +9 -14
  26. package/{leiamnash → src}/changeThreadColor.js +6 -10
  27. package/{leiamnash → src}/changeThreadEmoji.js +6 -11
  28. package/{leiamnash → src}/chat.js +116 -127
  29. package/{leiamnash → src}/createNewGroup.js +19 -27
  30. package/{leiamnash → src}/createPoll.js +6 -12
  31. package/{leiamnash → src}/deleteMessage.js +8 -13
  32. package/{leiamnash → src}/deleteThread.js +7 -14
  33. package/{leiamnash → src}/forwardAttachment.js +9 -16
  34. package/src/getAccessToken.js +32 -0
  35. package/{leiamnash → src}/getCurrentUserID.js +0 -0
  36. package/{leiamnash → src}/getEmojiUrl.js +1 -2
  37. package/{leiamnash → src}/getFriendsList.js +11 -14
  38. package/src/getMessage.js +84 -0
  39. package/{leiamnash → src}/getThreadHistory.js +27 -38
  40. package/{leiamnash → src}/getThreadHistoryDeprecated.js +14 -25
  41. package/src/getThreadInfo.js +197 -0
  42. package/{leiamnash → src}/getThreadInfoDeprecated.js +12 -24
  43. package/{leiamnash → src}/getThreadList.js +122 -88
  44. package/{leiamnash → src}/getThreadListDeprecated.js +9 -20
  45. package/{leiamnash → src}/getThreadPictures.js +9 -17
  46. package/{leiamnash → src}/getUserID.js +8 -11
  47. package/{leiamnash → src}/getUserInfo.js +12 -16
  48. package/src/getUserInfoV2.js +35 -0
  49. package/src/handleFriendRequest.js +47 -0
  50. package/{leiamnash → src}/handleMessageRequest.js +12 -22
  51. package/{leiamnash → src}/httpGet.js +15 -13
  52. package/{leiamnash → src}/httpPost.js +14 -13
  53. package/src/httpPostFormData.js +46 -0
  54. package/src/listenMqtt.js +1280 -0
  55. package/{leiamnash → src}/logout.js +7 -9
  56. package/{leiamnash → src}/markAsDelivered.js +14 -18
  57. package/{leiamnash → src}/markAsRead.js +30 -28
  58. package/{leiamnash → src}/markAsSeen.js +18 -19
  59. package/{leiamnash → src}/muteThread.js +7 -8
  60. package/{leiamnash/setMessageReaction.js → src/react.js} +15 -18
  61. package/{leiamnash → src}/removeUserFromGroup.js +13 -20
  62. package/{leiamnash → src}/resolvePhotoUrl.js +7 -13
  63. package/{leiamnash → src}/searchForThread.js +8 -13
  64. package/{leiamnash/markAsReadAll.js → src/seen.js} +10 -13
  65. package/{leiamnash → src}/sendTypingIndicator.js +23 -31
  66. package/src/setPostReaction.js +104 -0
  67. package/{leiamnash → src}/setTitle.js +15 -21
  68. package/src/threadColors.js +39 -0
  69. package/{leiamnash → src}/unfriend.js +9 -13
  70. package/{leiamnash/unsendMessage.js → src/unsend.js} +7 -16
  71. package/utils.js +1112 -1236
  72. package/leiamnash/addExternalModule.js +0 -19
  73. package/leiamnash/changeApprovalMode.js +0 -80
  74. package/leiamnash/getThreadInfo.js +0 -212
  75. package/leiamnash/handleFriendRequest.js +0 -61
  76. package/leiamnash/listenMqtt.js +0 -1129
  77. package/leiamnash/setPostReaction.js +0 -76
  78. package/leiamnash/threadColors.js +0 -57
@@ -5,11 +5,13 @@ const log = require("npmlog");
5
5
 
6
6
  function createProfileUrl(url, username, id) {
7
7
  if (url) return url;
8
- return "https://www.facebook.com/" + (username || utils.formatID(id.toString()));
8
+ return (
9
+ "https://www.facebook.com/" + (username || utils.formatID(id.toString()))
10
+ );
9
11
  }
10
12
 
11
13
  function formatParticipants(participants) {
12
- return participants.edges.map((p)=>{
14
+ return participants.edges.map(p => {
13
15
  p = p.node.messaging_actor;
14
16
  switch (p["__typename"]) {
15
17
  case "User":
@@ -21,7 +23,7 @@ function formatParticipants(participants) {
21
23
  gender: p.gender,
22
24
  url: p.url, // how about making it profileURL
23
25
  profilePicture: p.big_image_src.uri,
24
- username: (p.username||null),
26
+ username: p.username || null,
25
27
  // TODO: maybe better names for these?
26
28
  isViewerFriend: p.is_viewer_friend, // true/false
27
29
  isMessengerUser: p.is_messenger_user, // true/false
@@ -37,40 +39,35 @@ function formatParticipants(participants) {
37
39
  name: p.name,
38
40
  url: p.url,
39
41
  profilePicture: p.big_image_src.uri,
40
- username: (p.username||null),
42
+ username: p.username || null,
41
43
  // uhm... better names maybe?
42
44
  acceptsMessengerUserFeedback: p.accepts_messenger_user_feedback, // true/false
43
45
  isMessengerUser: p.is_messenger_user, // true/false
44
46
  isVerified: p.is_verified, // true/false
45
47
  isMessengerPlatformBot: p.is_messenger_platform_bot, // true/false
46
- isMessageBlockedByViewer: p.is_message_blocked_by_viewer, // true/false
48
+ isMessageBlockedByViewer: p.is_message_blocked_by_viewer // true/false
47
49
  };
48
50
  case "ReducedMessagingActor":
51
+ case "UnavailableMessagingActor":
49
52
  return {
50
53
  accountType: p["__typename"],
51
54
  userID: utils.formatID(p.id.toString()),
52
55
  name: p.name,
53
56
  url: createProfileUrl(p.url, p.username, p.id), // in this case p.url is null all the time
54
57
  profilePicture: p.big_image_src.uri, // in this case it is default facebook photo, we could determine gender using it
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?
66
- isMessageBlockedByViewer: p.is_message_blocked_by_viewer, // true/false
58
+ username: p.username || null, // maybe we could use it to generate profile URL?
59
+ isMessageBlockedByViewer: p.is_message_blocked_by_viewer // true/false
67
60
  };
68
61
  default:
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));
62
+ log.warn(
63
+ "getThreadList",
64
+ "Found participant with unsupported typename. Please open an issue at https://github.com/Schmavery/facebook-chat-api/issues\n" +
65
+ JSON.stringify(p, null, 2)
66
+ );
70
67
  return {
71
68
  accountType: p["__typename"],
72
69
  userID: utils.formatID(p.id.toString()),
73
- name: p.name || `[unknown ${p["__typename"]}]`, // probably it will always be something... but fallback to [unknown], just in case
70
+ name: p.name || `[unknown ${p["__typename"]}]` // probably it will always be something... but fallback to [unknown], just in case
74
71
  };
75
72
  }
76
73
  });
@@ -78,9 +75,7 @@ function formatParticipants(participants) {
78
75
 
79
76
  // "FF8C0077" -> "8C0077"
80
77
  function formatColor(color) {
81
- if (color && color.match(/^(?:[0-9a-fA-F]{8})$/g)) {
82
- return color.slice(2);
83
- }
78
+ if (color && color.match(/^(?:[0-9a-fA-F]{8})$/g)) return color.slice(2);
84
79
  return color;
85
80
  }
86
81
 
@@ -89,30 +84,40 @@ function getThreadName(t) {
89
84
 
90
85
  for (let po of t.all_participants.edges) {
91
86
  let p = po.node;
92
- if (p.messaging_actor.id === t.thread_key.other_user_id) return p.messaging_actor.name;
87
+ if (p.messaging_actor.id === t.thread_key.other_user_id)
88
+ return p.messaging_actor.name;
93
89
  }
94
90
  }
95
91
 
96
92
  function mapNicknames(customizationInfo) {
97
- return (customizationInfo && customizationInfo.participant_customizations) ? customizationInfo.participant_customizations.map(u => {
98
- return {
99
- "userID": u.participant_id,
100
- "nickname": u.nickname
101
- };
102
- }):[];
93
+ return customizationInfo && customizationInfo.participant_customizations
94
+ ? customizationInfo.participant_customizations.map(u => {
95
+ return {
96
+ userID: u.participant_id,
97
+ nickname: u.nickname
98
+ };
99
+ })
100
+ : [];
103
101
  }
104
102
 
105
103
  function formatThreadList(data) {
106
104
  return data.map(t => {
107
- let lastMessageNode = (t.last_message&&t.last_message.nodes&&t.last_message.nodes.length>0)?t.last_message.nodes[0]:null;
105
+ let lastMessageNode =
106
+ t.last_message && t.last_message.nodes && t.last_message.nodes.length > 0
107
+ ? t.last_message.nodes[0]
108
+ : null;
108
109
  return {
109
- threadID: t.thread_key?utils.formatID(t.thread_key.thread_fbid || t.thread_key.other_user_id):null, // shall never be null
110
+ threadID: t.thread_key
111
+ ? utils.formatID(t.thread_key.thread_fbid || t.thread_key.other_user_id)
112
+ : null, // shall never be null
110
113
  name: getThreadName(t),
111
114
  unreadCount: t.unread_count,
112
115
  messageCount: t.messages_count,
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),
116
+ imageSrc: t.image ? t.image.uri : null,
117
+ emoji: t.customization_info ? t.customization_info.emoji : null,
118
+ color: formatColor(
119
+ t.customization_info ? t.customization_info.outgoing_bubble_color : null
120
+ ),
116
121
  nicknames: mapNicknames(t.customization_info),
117
122
  muteUntil: t.mute_until,
118
123
  participants: formatParticipants(t.all_participants),
@@ -123,7 +128,9 @@ function formatThreadList(data) {
123
128
  // isPinProtected: t.is_pin_protected, // feature from future? always false (2018-04-04)
124
129
  customizationEnabled: t.customization_enabled, // false for ONE_TO_ONE with Page or ReducedMessagingActor
125
130
  participantAddMode: t.participant_add_mode_as_string, // "ADD" if "GROUP" and null if "ONE_TO_ONE"
126
- montageThread: t.montage_thread?Buffer.from(t.montage_thread.id,"base64").toString():null, // base64 encoded string "message_thread:0000000000000000"
131
+ montageThread: t.montage_thread
132
+ ? Buffer.from(t.montage_thread.id, "base64").toString()
133
+ : null, // base64 encoded string "message_thread:0000000000000000"
127
134
  // it is not userID nor any other ID known to me...
128
135
  // can somebody inspect it? where is it used?
129
136
  // probably Messenger Day uses it
@@ -134,18 +141,31 @@ function formatThreadList(data) {
134
141
  timestamp: t.updated_time_precise, // in miliseconds
135
142
  // isCanonicalUser: t.is_canonical_neo_user, // is it always false?
136
143
  // TODO: how about putting snippet in another object? current implementation does not handle every possibile message type etc.
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
144
+ snippet: lastMessageNode ? lastMessageNode.snippet : null,
145
+ snippetAttachments: lastMessageNode
146
+ ? lastMessageNode.extensible_attachment
147
+ : null, // TODO: not sure if it works
148
+ snippetSender: lastMessageNode
149
+ ? utils.formatID(
150
+ (lastMessageNode.message_sender.messaging_actor.id || "").toString()
151
+ )
152
+ : null,
153
+ lastMessageTimestamp: lastMessageNode
154
+ ? lastMessageNode.timestamp_precise
155
+ : null, // timestamp in miliseconds
156
+ lastReadTimestamp:
157
+ t.last_read_receipt && t.last_read_receipt.nodes.length > 0
158
+ ? t.last_read_receipt.nodes[0]
159
+ ? t.last_read_receipt.nodes[0].timestamp_precise
160
+ : null
161
+ : null, // timestamp in miliseconds
144
162
  cannotReplyReason: t.cannot_reply_reason, // TODO: inspect possible values
145
163
  approvalMode: Boolean(t.approval_mode),
146
164
 
147
165
  // @Legacy
148
- participantIDs: formatParticipants(t.all_participants).map(participant => participant.userID),
166
+ participantIDs: formatParticipants(t.all_participants).map(
167
+ participant => participant.userID
168
+ ),
149
169
  threadType: t.thread_type === "GROUP" ? 2 : 1 // "GROUP" or "ONE_TO_ONE"
150
170
  };
151
171
  });
@@ -153,69 +173,78 @@ function formatThreadList(data) {
153
173
 
154
174
  module.exports = function(defaultFuncs, api, ctx) {
155
175
  return function getThreadList(limit, timestamp, tags, callback) {
156
- if (!callback && (utils.getType(tags) === "Function" || utils.getType(tags) === "AsyncFunction")) {
176
+ if (
177
+ !callback &&
178
+ (utils.getType(tags) === "Function" ||
179
+ utils.getType(tags) === "AsyncFunction")
180
+ ) {
157
181
  callback = tags;
158
182
  tags = [""];
159
183
  }
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
- }
184
+ if (
185
+ utils.getType(limit) !== "Number" ||
186
+ !Number.isInteger(limit) ||
187
+ limit <= 0
188
+ )
189
+ throw { error: "getThreadList: limit must be a positive integer" };
190
+
191
+ if (
192
+ utils.getType(timestamp) !== "Null" &&
193
+ (utils.getType(timestamp) !== "Number" || !Number.isInteger(timestamp))
194
+ )
195
+ throw { error: "getThreadList: timestamp must be an integer or null" };
173
196
 
174
- var resolveFunc = function(){};
175
- var rejectFunc = function(){};
176
- var returnPromise = new Promise(function (resolve, reject) {
197
+ if (utils.getType(tags) === "String") tags = [tags];
198
+ if (utils.getType(tags) !== "Array")
199
+ throw { error: "getThreadList: tags must be an array" };
200
+
201
+ var resolveFunc = function() {};
202
+ var rejectFunc = function() {};
203
+ var returnPromise = new Promise(function(resolve, reject) {
177
204
  resolveFunc = resolve;
178
205
  rejectFunc = reject;
179
206
  });
180
207
 
181
- if (utils.getType(callback) !== "Function" && utils.getType(callback) !== "AsyncFunction") {
182
- callback = function (err, data) {
183
- if (err) {
184
- return rejectFunc(err);
185
- }
208
+ if (
209
+ utils.getType(callback) !== "Function" &&
210
+ utils.getType(callback) !== "AsyncFunction"
211
+ ) {
212
+ callback = function(err, data) {
213
+ if (err) return rejectFunc(err);
186
214
  resolveFunc(data);
187
215
  };
188
216
  }
189
217
 
190
218
  const form = {
191
- "av": ctx.globalOptions.pageID,
192
- "queries": JSON.stringify({
193
- "o0": {
219
+ av: ctx.globalOptions.pageID,
220
+ queries: JSON.stringify({
221
+ o0: {
194
222
  // This doc_id was valid on 2020-07-20
195
- "doc_id": "3336396659757871",
196
- "query_params": {
197
- "limit": limit+(timestamp?1:0),
198
- "before": timestamp,
199
- "tags": tags,
200
- "includeDeliveryReceipts": true,
201
- "includeSeqID": false
223
+ doc_id: "3336396659757871",
224
+ query_params: {
225
+ limit: limit + (timestamp ? 1 : 0),
226
+ before: timestamp,
227
+ tags: tags,
228
+ includeDeliveryReceipts: true,
229
+ includeSeqID: false
202
230
  }
203
231
  }
204
232
  }),
205
- "batch_name": "MessengerGraphQLThreadlistFetcher"
233
+ batch_name: "MessengerGraphQLThreadlistFetcher"
206
234
  };
207
235
 
208
236
  defaultFuncs
209
237
  .post("https://www.facebook.com/api/graphqlbatch/", ctx.jar, form)
210
238
  .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
211
- .then((resData) => {
212
- if (resData[resData.length - 1].error_results > 0) {
239
+ .then(resData => {
240
+ if (resData[resData.length - 1].error_results > 0)
213
241
  throw resData[0].o0.errors;
214
- }
215
242
 
216
- if (resData[resData.length - 1].successful_results === 0) {
217
- throw {error: "getThreadList: there was no successful_results", res: resData};
218
- }
243
+ if (resData[resData.length - 1].successful_results === 0)
244
+ throw {
245
+ error: "getThreadList: there was no successful_results",
246
+ res: resData
247
+ };
219
248
 
220
249
  // When we ask for threads using timestamp from the previous request,
221
250
  // we are getting the last thread repeated as the first thread in this response.
@@ -223,13 +252,18 @@ module.exports = function(defaultFuncs, api, ctx) {
223
252
  // It is also the reason for increasing limit by 1 when timestamp is set
224
253
  // this way user asks for 10 threads, we are asking for 11,
225
254
  // but after removing the duplicated one, it is again 10
226
- if (timestamp) {
227
- resData[0].o0.data.viewer.message_threads.nodes.shift();
228
- }
229
- callback(null, formatThreadList(resData[0].o0.data.viewer.message_threads.nodes));
255
+ if (timestamp) resData[0].o0.data.viewer.message_threads.nodes.shift();
256
+
257
+ callback(
258
+ null,
259
+ formatThreadList(resData[0].o0.data.viewer.message_threads.nodes)
260
+ );
230
261
  })
231
- .catch((err) => {
232
- log.error("getThreadList", err);
262
+ .catch(err => {
263
+ log.error(
264
+ "getThreadList",
265
+ "Lỗi: getThreadList Có Thể Do Bạn Spam Quá Nhiều, Hãy Thử Lại !"
266
+ );
233
267
  return callback(err);
234
268
  });
235
269
 
@@ -6,36 +6,28 @@ var log = require("npmlog");
6
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") {
10
- throw {
11
- error: "Please pass a number as a second argument."
12
- };
13
- } else if (
9
+ if (utils.getType(end) !== "Number")
10
+ throw { error: "Please pass a number as a second argument." };
11
+ else if (
14
12
  utils.getType(type) === "Function" ||
15
13
  utils.getType(type) === "AsyncFunction"
16
14
  ) {
17
15
  callback = type;
18
16
  type = "inbox"; //default to inbox
19
- } else if (utils.getType(type) !== "String") {
17
+ } else if (utils.getType(type) !== "String")
20
18
  throw {
21
19
  error:
22
20
  "Please pass a String as a third argument. Your options are: inbox, pending, and archived"
23
21
  };
24
- } else {
25
- throw {
26
- error: "getThreadList: need callback"
27
- };
28
- }
22
+ else throw { error: "getThreadList: need callback" };
29
23
  }
30
24
 
31
- if (type === "archived") {
32
- type = "action:archived";
33
- } else if (type !== "inbox" && type !== "pending" && type !== "other") {
25
+ if (type === "archived") type = "action:archived";
26
+ else if (type !== "inbox" && type !== "pending" && type !== "other")
34
27
  throw {
35
28
  error:
36
29
  "type can only be one of the following: inbox, pending, archived, other"
37
30
  };
38
- }
39
31
 
40
32
  if (end <= start) end = start + 20;
41
33
 
@@ -46,9 +38,8 @@ module.exports = function(defaultFuncs, api, ctx) {
46
38
  form[type + "[offset]"] = start;
47
39
  form[type + "[limit]"] = end - start;
48
40
 
49
- if (ctx.globalOptions.pageID) {
41
+ if (ctx.globalOptions.pageID)
50
42
  form.request_user_id = ctx.globalOptions.pageID;
51
- }
52
43
 
53
44
  defaultFuncs
54
45
  .post(
@@ -58,9 +49,7 @@ module.exports = function(defaultFuncs, api, ctx) {
58
49
  )
59
50
  .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
60
51
  .then(function(resData) {
61
- if (resData.error) {
62
- throw resData;
63
- }
52
+ if (resData.error) throw resData;
64
53
  log.verbose("getThreadList", JSON.stringify(resData.payload.threads));
65
54
  return callback(
66
55
  null,
@@ -5,19 +5,17 @@ var log = require("npmlog");
5
5
 
6
6
  module.exports = function(defaultFuncs, api, ctx) {
7
7
  return function getThreadPictures(threadID, offset, limit, callback) {
8
- var resolveFunc = function(){};
9
- var rejectFunc = function(){};
10
- var returnPromise = new Promise(function (resolve, reject) {
8
+ var resolveFunc = function() {};
9
+ var rejectFunc = function() {};
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
 
@@ -35,9 +33,7 @@ module.exports = function(defaultFuncs, api, ctx) {
35
33
  )
36
34
  .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
37
35
  .then(function(resData) {
38
- if (resData.error) {
39
- throw resData;
40
- }
36
+ if (resData.error) throw resData;
41
37
  return Promise.all(
42
38
  resData.payload.imagesData.map(function(image) {
43
39
  form = {
@@ -52,9 +48,7 @@ module.exports = function(defaultFuncs, api, ctx) {
52
48
  )
53
49
  .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
54
50
  .then(function(resData) {
55
- if (resData.error) {
56
- throw resData;
57
- }
51
+ if (resData.error) throw resData;
58
52
  // the response is pretty messy
59
53
  var queryThreadID =
60
54
  resData.jsmods.require[0][3][1].query_metadata.query_path[0]
@@ -67,9 +61,7 @@ module.exports = function(defaultFuncs, api, ctx) {
67
61
  })
68
62
  );
69
63
  })
70
- .then(function(resData) {
71
- callback(null, resData);
72
- })
64
+ .then(resData => callback(null, resData))
73
65
  .catch(function(err) {
74
66
  log.error("Error in getThreadPictures", err);
75
67
  callback(err);
@@ -19,19 +19,17 @@ function formatData(data) {
19
19
 
20
20
  module.exports = function(defaultFuncs, api, ctx) {
21
21
  return function getUserID(name, callback) {
22
- var resolveFunc = function(){};
23
- var rejectFunc = function(){};
24
- var returnPromise = new Promise(function (resolve, reject) {
22
+ var resolveFunc = function() {};
23
+ var rejectFunc = function() {};
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, friendList) {
31
- if (err) {
32
- return rejectFunc(err);
33
- }
34
- resolveFunc(friendList);
30
+ callback = function(err, data) {
31
+ if (err) return rejectFunc(err);
32
+ resolveFunc(data);
35
33
  };
36
34
  }
37
35
 
@@ -48,9 +46,7 @@ module.exports = function(defaultFuncs, api, ctx) {
48
46
  .get("https://www.facebook.com/ajax/typeahead/search.php", ctx.jar, form)
49
47
  .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
50
48
  .then(function(resData) {
51
- if (resData.error) {
52
- throw resData;
53
- }
49
+ if (resData.error) throw resData;
54
50
 
55
51
  var data = resData.payload.entries;
56
52
 
@@ -58,6 +54,7 @@ module.exports = function(defaultFuncs, api, ctx) {
58
54
  })
59
55
  .catch(function(err) {
60
56
  log.error("getUserID", err);
57
+ console.log(err);
61
58
  return callback(err);
62
59
  });
63
60
 
@@ -29,25 +29,21 @@ function formatData(data) {
29
29
 
30
30
  module.exports = function(defaultFuncs, api, ctx) {
31
31
  return function getUserInfo(id, callback) {
32
- var resolveFunc = function(){};
33
- var rejectFunc = function(){};
34
- var returnPromise = new Promise(function (resolve, reject) {
32
+ var resolveFunc = function() {};
33
+ var rejectFunc = function() {};
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, friendList) {
41
- if (err) {
42
- return rejectFunc(err);
43
- }
44
- resolveFunc(friendList);
40
+ callback = function(err, userInfo) {
41
+ if (err) return rejectFunc(err);
42
+ resolveFunc(userInfo);
45
43
  };
46
44
  }
47
45
 
48
- if (utils.getType(id) !== "Array") {
49
- id = [id];
50
- }
46
+ if (utils.getType(id) !== "Array") id = [id];
51
47
 
52
48
  var form = {};
53
49
  id.map(function(v, i) {
@@ -57,16 +53,16 @@ module.exports = function(defaultFuncs, api, ctx) {
57
53
  .post("https://www.facebook.com/chat/user_info/", ctx.jar, form)
58
54
  .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
59
55
  .then(function(resData) {
60
- if (resData.error) {
61
- throw resData;
62
- }
56
+ if (resData.error) throw resData;
63
57
  return callback(null, formatData(resData.payload.profiles));
64
58
  })
65
59
  .catch(function(err) {
66
- log.error("getUserInfo", err);
60
+ log.error(
61
+ "getUserInfo",
62
+ "Lỗi: getUserInfo Có Thể Do Bạn Spam Quá Nhiều !,Hãy Thử Lại !"
63
+ );
67
64
  return callback(err);
68
65
  });
69
-
70
66
  return returnPromise;
71
67
  };
72
68
  };
@@ -0,0 +1,35 @@
1
+ /* eslint-disable linebreak-style */
2
+ "use strict";
3
+
4
+ var utils = require("../utils");
5
+ var log = require("npmlog");
6
+
7
+
8
+ module.exports = function (defaultFuncs, api, ctx) {
9
+ return function getUserInfoV2(id, callback) {
10
+ var resolveFunc = function () { };
11
+ var rejectFunc = function () { };
12
+ var returnPromise = new Promise(function (resolve, reject) {
13
+ resolveFunc = resolve;
14
+ rejectFunc = reject;
15
+ });
16
+
17
+ if (!callback) {
18
+ callback = function (err, userInfo) {
19
+ if (err) return rejectFunc(err);
20
+ resolveFunc(userInfo);
21
+ };
22
+ }
23
+ try {
24
+ var { getInfo } = require('../Extra/ExtraAddons');
25
+ getInfo(id)
26
+ .then(data => {
27
+ return callback(null, data);
28
+ });
29
+ }
30
+ catch (e) {
31
+ return callback(null, e);
32
+ }
33
+ return returnPromise;
34
+ };
35
+ };
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+
3
+ var utils = require("../utils");
4
+ var log = require("npmlog");
5
+
6
+ module.exports = function(defaultFuncs, api, ctx) {
7
+ return function handleFriendRequest(userID, accept, callback) {
8
+ if (utils.getType(accept) !== "Boolean")
9
+ throw { error: "Please pass a boolean as a second argument." };
10
+
11
+ var resolveFunc = function() {};
12
+ var rejectFunc = function() {};
13
+ var returnPromise = new Promise(function(resolve, reject) {
14
+ resolveFunc = resolve;
15
+ rejectFunc = reject;
16
+ });
17
+
18
+ if (!callback) {
19
+ callback = function(err, data) {
20
+ if (err) return rejectFunc(err);
21
+ resolveFunc(data);
22
+ };
23
+ }
24
+
25
+ var form = {
26
+ viewer_id: userID,
27
+ "frefs[0]": "jwl",
28
+ floc: "friend_center_requests",
29
+ ref: "/reqs.php",
30
+ action: accept ? "confirm" : "reject"
31
+ };
32
+
33
+ defaultFuncs
34
+ .post("https://www.facebook.com/requests/friends/ajax/", ctx.jar, form)
35
+ .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
36
+ .then(function(resData) {
37
+ if (resData.payload.err) throw { err: resData.payload.err };
38
+ return callback();
39
+ })
40
+ .catch(function(err) {
41
+ log.error("handleFriendRequest", err);
42
+ return callback(err);
43
+ });
44
+
45
+ return returnPromise;
46
+ };
47
+ };