@cexy/hoonfca 1.0.0 → 1.0.2

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 (98) hide show
  1. package/.travis.yml +6 -0
  2. package/LICENSE-MIT +21 -0
  3. package/index.d.ts +620 -0
  4. package/index.js +745 -433
  5. package/package.json +45 -6
  6. package/src/addExternalModule.js +14 -16
  7. package/src/addUserToGroup.js +45 -30
  8. package/src/changeAdminStatus.js +39 -42
  9. package/src/changeApprovalMode.js +79 -0
  10. package/src/changeArchivedStatus.js +19 -15
  11. package/src/changeBio.js +18 -16
  12. package/src/changeBlockedStatus.js +14 -12
  13. package/src/changeBlockedStatusMqtt.js +38 -17
  14. package/src/changeGroupImage.js +100 -77
  15. package/src/changeNickname.js +12 -11
  16. package/src/changeThreadColor.js +25 -16
  17. package/src/changeThreadEmoji.js +11 -10
  18. package/src/createNewGroup.js +21 -14
  19. package/src/createPoll.js +87 -21
  20. package/src/deleteMessage.js +18 -17
  21. package/src/deleteThread.js +18 -17
  22. package/src/editMessage.js +28 -31
  23. package/src/forwardAttachment.js +22 -19
  24. package/src/forwardMessage.js +63 -0
  25. package/src/getCurrentUserID.js +4 -2
  26. package/src/getEmojiUrl.js +20 -9
  27. package/src/getFriendsList.js +21 -18
  28. package/src/getGroupsList.js +83 -0
  29. package/src/getMarketplace.js +84 -0
  30. package/src/getNotifications.js +86 -0
  31. package/src/getPagesList.js +83 -0
  32. package/src/getStories.js +88 -0
  33. package/src/getThreadHistory.js +277 -126
  34. package/src/getThreadInfo.js +143 -115
  35. package/src/getThreadList.js +216 -143
  36. package/src/getThreadPictures.js +26 -32
  37. package/src/getUserID.js +13 -14
  38. package/src/getUserInfo.js +107 -68
  39. package/src/handleFriendRequest.js +16 -15
  40. package/src/handleMessageRequest.js +15 -15
  41. package/src/httpGet.js +36 -31
  42. package/src/httpPost.js +36 -31
  43. package/src/listenMqtt.js +705 -370
  44. package/src/logout.js +26 -28
  45. package/src/markAsDelivered.js +22 -17
  46. package/src/markAsRead.js +63 -49
  47. package/src/markAsReadAll.js +17 -13
  48. package/src/markAsSeen.js +23 -19
  49. package/src/muteThread.js +17 -14
  50. package/src/pinMessage.js +23 -22
  51. package/src/removeUserFromGroup.js +42 -22
  52. package/src/resolvePhotoUrl.js +15 -17
  53. package/src/searchForThread.js +18 -20
  54. package/src/searchUsers.js +89 -0
  55. package/src/sendComment.js +161 -0
  56. package/src/sendMessage.js +65 -52
  57. package/src/sendTypingIndicator.js +173 -48
  58. package/src/setBio.js +86 -0
  59. package/src/setMessageReaction.js +76 -16
  60. package/src/setPostReaction.js +29 -61
  61. package/src/setTheme.js +313 -0
  62. package/src/setTitle.js +27 -37
  63. package/src/shareContact.js +34 -82
  64. package/src/shareLink.js +56 -99
  65. package/src/threadColors.js +35 -97
  66. package/src/unfriend.js +15 -20
  67. package/src/unsendMessage.js +71 -18
  68. package/utils.js +1000 -472
  69. package/README.md +0 -83
  70. package/replit.nix +0 -3
  71. package/src/changeAvatar.js +0 -89
  72. package/src/changeCover.js +0 -92
  73. package/src/changeName.js +0 -106
  74. package/src/changeUsername.js +0 -80
  75. package/src/createCommentPost.js +0 -196
  76. package/src/createPost.js +0 -285
  77. package/src/data/getThreadInfo.json +0 -1
  78. package/src/follow.js +0 -71
  79. package/src/getAccess.js +0 -130
  80. package/src/getAvatarUser.js +0 -88
  81. package/src/getBotInitialData.js +0 -59
  82. package/src/getCtx.js +0 -5
  83. package/src/getMessage.js +0 -827
  84. package/src/getOptions.js +0 -5
  85. package/src/getRegion.js +0 -7
  86. package/src/getThreadHistoryDeprecated.js +0 -95
  87. package/src/getThreadInfoDeprecated.js +0 -77
  88. package/src/getThreadListDeprecated.js +0 -86
  89. package/src/httpPostFormData.js +0 -58
  90. package/src/listenNotification.js +0 -96
  91. package/src/refreshFb_dtsg.js +0 -75
  92. package/src/searchStickers.js +0 -59
  93. package/src/sendMessageMqtt.js +0 -326
  94. package/src/setMessageReactionMqtt.js +0 -74
  95. package/src/setProfileGuard.js +0 -66
  96. package/src/setStoryReaction.js +0 -97
  97. package/src/stopListenMqtt.js +0 -47
  98. package/src/uploadAttachment.js +0 -98
package/src/createPoll.js CHANGED
@@ -1,64 +1,130 @@
1
1
  "use strict";
2
2
 
3
- const utils = require("../utils");
3
+ var utils = require("../utils");
4
+ var log = require("npmlog");
5
+ const { generateOfflineThreadingID } = require("../utils");
4
6
 
5
7
  module.exports = function (defaultFuncs, api, ctx) {
6
- return function createPoll(title, threadID, options, callback) {
7
- let resolveFunc = () => {};
8
- let rejectFunc = () => {};
9
- const returnPromise = new Promise((resolve, reject) => {
8
+ function createPollNoMqtt(title, threadID, options, callback) {
9
+ var resolveFunc = function () {};
10
+ var rejectFunc = function () {};
11
+ var returnPromise = new Promise(function (resolve, reject) {
10
12
  resolveFunc = resolve;
11
13
  rejectFunc = reject;
12
14
  });
13
15
 
14
- const optionsType = utils.getType(options);
15
-
16
- // কলব্যাক ও অপশন হ্যান্ডলিং
17
16
  if (!callback) {
18
- if (optionsType === "Function" || optionsType === "AsyncFunction") {
17
+ if (utils.getType(options) == "Function") {
19
18
  callback = options;
20
19
  options = null;
21
20
  } else {
22
21
  callback = function (err) {
23
- if (err) return rejectFunc(err);
22
+ if (err) {
23
+ return rejectFunc(err);
24
+ }
24
25
  resolveFunc();
25
26
  };
26
27
  }
27
28
  }
28
-
29
29
  if (!options) {
30
- options = {};
30
+ options = {}; // Initial poll options are optional
31
31
  }
32
32
 
33
- const form = {
33
+ var form = {
34
34
  target_id: threadID,
35
35
  question_text: title,
36
36
  };
37
37
 
38
- // Object.entries ব্যবহার করে দ্রুত এবং ক্লিন উপায়ে অপশন লোড করা হচ্ছে
39
- Object.entries(options).forEach(([opt, isSelected], ind) => {
40
- form[`option_text_array[${ind}]`] = opt;
41
- form[`option_is_selected_array[${ind}]`] = isSelected ? "1" : "0";
42
- });
38
+ // Set fields for options (and whether they are selected initially by the posting user)
39
+ var ind = 0;
40
+ for (var opt in options) {
41
+ // eslint-disable-next-line no-prototype-builtins
42
+ if (options.hasOwnProperty(opt)) {
43
+ form["option_text_array[" + ind + "]"] = opt;
44
+ form["option_is_selected_array[" + ind + "]"] = options[opt]
45
+ ? "1"
46
+ : "0";
47
+ ind++;
48
+ }
49
+ }
43
50
 
44
51
  defaultFuncs
45
52
  .post(
46
53
  "https://www.facebook.com/messaging/group_polling/create_poll/?dpr=1",
47
54
  ctx.jar,
48
- form
55
+ form,
49
56
  )
50
57
  .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
51
58
  .then(function (resData) {
52
- if (resData.payload?.status !== "success") {
59
+ if (resData.payload.status != "success") {
53
60
  throw resData;
54
61
  }
62
+
55
63
  return callback();
56
64
  })
57
65
  .catch(function (err) {
58
- utils.error("createPoll", err);
66
+ log.error("createPoll", err);
59
67
  return callback(err);
60
68
  });
61
69
 
62
70
  return returnPromise;
71
+ }
72
+
73
+ function createPollMqtt(title, options, threadID, callback) {
74
+ if (!ctx.mqttClient) {
75
+ throw new Error("Not connected to MQTT");
76
+ }
77
+
78
+ ctx.wsReqNumber += 1;
79
+ ctx.wsTaskNumber += 1;
80
+
81
+ const taskPayload = {
82
+ question_text: title,
83
+ thread_key: threadID,
84
+ options: options,
85
+ sync_group: 1,
86
+ };
87
+
88
+ const task = {
89
+ failure_count: null,
90
+ label: "163",
91
+ payload: JSON.stringify(taskPayload),
92
+ queue_name: "poll_creation",
93
+ task_id: ctx.wsTaskNumber,
94
+ };
95
+
96
+ const content = {
97
+ app_id: "2220391788200892",
98
+ payload: JSON.stringify({
99
+ data_trace_id: null,
100
+ epoch_id: parseInt(generateOfflineThreadingID()),
101
+ tasks: [task],
102
+ version_id: "7158486590867448",
103
+ }),
104
+ request_id: ctx.wsReqNumber,
105
+ type: 3,
106
+ };
107
+
108
+ // if (isCallable(callback)) {
109
+ // // to be implemented
110
+ // }
111
+
112
+ ctx.mqttClient.publish("/ls_req", JSON.stringify(content), {
113
+ qos: 1,
114
+ retain: false,
115
+ });
116
+ }
117
+
118
+ return function createPoll(title, threadID, options, callback) {
119
+ if (ctx.mqttClient) {
120
+ try {
121
+ createPollMqtt(reaction, messageID, threadID, callback);
122
+ callback();
123
+ } catch (e) {
124
+ createPollNoMqtt(title, threadID, options, callback);
125
+ }
126
+ } else {
127
+ return createPollNoMqtt(title, threadID, options, callback);
128
+ }
63
129
  };
64
130
  };
@@ -1,52 +1,53 @@
1
1
  "use strict";
2
2
 
3
- const utils = require("../utils");
3
+ var utils = require("../utils");
4
+ var log = require("npmlog");
4
5
 
5
6
  module.exports = function (defaultFuncs, api, ctx) {
6
7
  return function deleteMessage(messageOrMessages, callback) {
7
- let resolveFunc = () => {};
8
- let rejectFunc = () => {};
9
- const returnPromise = new Promise((resolve, reject) => {
8
+ var resolveFunc = function () {};
9
+ var rejectFunc = function () {};
10
+ var returnPromise = new Promise(function (resolve, reject) {
10
11
  resolveFunc = resolve;
11
12
  rejectFunc = reject;
12
13
  });
13
-
14
14
  if (!callback) {
15
15
  callback = function (err) {
16
- if (err) return rejectFunc(err);
16
+ if (err) {
17
+ return rejectFunc(err);
18
+ }
17
19
  resolveFunc();
18
20
  };
19
21
  }
20
22
 
21
- const form = {
23
+ var form = {
22
24
  client: "mercury",
23
25
  };
24
26
 
25
- // ইনপুট অ্যারে না হলে সেটিকে অ্যারেতে রূপান্তর করা হচ্ছে
26
- const messages = utils.getType(messageOrMessages) !== "Array"
27
- ? [messageOrMessages]
28
- : messageOrMessages;
27
+ if (utils.getType(messageOrMessages) !== "Array") {
28
+ messageOrMessages = [messageOrMessages];
29
+ }
29
30
 
30
- // মডার্ন লুপ ব্যবহার করে ফর্ম অবজেক্টে আইডিগুলো সেট করা হচ্ছে
31
- messages.forEach((msgID, index) => {
32
- form[`message_ids[${index}]`] = msgID;
33
- });
31
+ for (var i = 0; i < messageOrMessages.length; i++) {
32
+ form["message_ids[" + i + "]"] = messageOrMessages[i];
33
+ }
34
34
 
35
35
  defaultFuncs
36
36
  .post(
37
37
  "https://www.facebook.com/ajax/mercury/delete_messages.php",
38
38
  ctx.jar,
39
- form
39
+ form,
40
40
  )
41
41
  .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
42
42
  .then(function (resData) {
43
43
  if (resData.error) {
44
44
  throw resData;
45
45
  }
46
+
46
47
  return callback();
47
48
  })
48
49
  .catch(function (err) {
49
- utils.error("deleteMessage", err);
50
+ log.error("deleteMessage", err);
50
51
  return callback(err);
51
52
  });
52
53
 
@@ -1,52 +1,53 @@
1
1
  "use strict";
2
2
 
3
- const utils = require("../utils");
3
+ var utils = require("../utils");
4
+ var log = require("npmlog");
4
5
 
5
6
  module.exports = function (defaultFuncs, api, ctx) {
6
7
  return function deleteThread(threadOrThreads, callback) {
7
- let resolveFunc = () => {};
8
- let rejectFunc = () => {};
9
- const returnPromise = new Promise((resolve, reject) => {
8
+ var resolveFunc = function () {};
9
+ var rejectFunc = function () {};
10
+ var returnPromise = new Promise(function (resolve, reject) {
10
11
  resolveFunc = resolve;
11
12
  rejectFunc = reject;
12
13
  });
13
-
14
14
  if (!callback) {
15
15
  callback = function (err) {
16
- if (err) return rejectFunc(err);
16
+ if (err) {
17
+ return rejectFunc(err);
18
+ }
17
19
  resolveFunc();
18
20
  };
19
21
  }
20
22
 
21
- const form = {
23
+ var form = {
22
24
  client: "mercury",
23
25
  };
24
26
 
25
- // ইনপুট অ্যারে না হলে সেটিকে সিঙ্গেলেটন অ্যারেতে রূপান্তর করা হচ্ছে
26
- const threads = utils.getType(threadOrThreads) !== "Array"
27
- ? [threadOrThreads]
28
- : threadOrThreads;
27
+ if (utils.getType(threadOrThreads) !== "Array") {
28
+ threadOrThreads = [threadOrThreads];
29
+ }
29
30
 
30
- // মডার্ন লুপ ব্যবহার করে ফর্ম অবজেক্টে থ্রেড আইডিগুলো সেট করা হচ্ছে
31
- threads.forEach((threadID, index) => {
32
- form[`ids[${index}]`] = threadID;
33
- });
31
+ for (var i = 0; i < threadOrThreads.length; i++) {
32
+ form["ids[" + i + "]"] = threadOrThreads[i];
33
+ }
34
34
 
35
35
  defaultFuncs
36
36
  .post(
37
37
  "https://www.facebook.com/ajax/mercury/delete_thread.php",
38
38
  ctx.jar,
39
- form
39
+ form,
40
40
  )
41
41
  .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
42
42
  .then(function (resData) {
43
43
  if (resData.error) {
44
44
  throw resData;
45
45
  }
46
+
46
47
  return callback();
47
48
  })
48
49
  .catch(function (err) {
49
- utils.error("deleteThread", err);
50
+ log.error("deleteThread", err);
50
51
  return callback(err);
51
52
  });
52
53
 
@@ -1,19 +1,16 @@
1
- "use strict";
1
+ "use_strict";
2
2
 
3
+ const { generateOfflineThreadingID } = require("../utils");
3
4
 
4
- const utils = require("../utils.js");
5
-
6
- // নিরাপদ ফাংশন চেকিং (Reflect.apply বাগ ফিক্স করা হয়েছে)
7
- function canBeCalled(func) {
8
- return typeof func === "function";
5
+ function isCallable(func) {
6
+ try {
7
+ Reflect.apply(func, null, []);
8
+ return true;
9
+ } catch (error) {
10
+ return false;
11
+ }
9
12
  }
10
13
 
11
- /**
12
- * A function for editing bot's messages.
13
- * @param {string} text - The text with which the bot will edit its messages.
14
- * @param {string} messageID - The message ID of the message the bot will edit.
15
- * @param {Object} callback - Callback for the function.
16
- */
17
14
  module.exports = function (defaultFuncs, api, ctx) {
18
15
  return function editMessage(text, messageID, callback) {
19
16
  if (!ctx.mqttClient) {
@@ -21,44 +18,44 @@ module.exports = function (defaultFuncs, api, ctx) {
21
18
  }
22
19
 
23
20
  ctx.wsReqNumber += 1;
24
- ctx.wsTaskNumber += 1;
21
+ let taskNumber = ++ctx.wsTaskNumber;
25
22
 
26
- const queryPayload = {
23
+ const taskPayload = {
27
24
  message_id: messageID,
28
25
  text: text,
29
26
  };
30
27
 
31
- const query = {
28
+ const task = {
32
29
  failure_count: null,
33
30
  label: "742",
34
- payload: JSON.stringify(queryPayload),
31
+ payload: JSON.stringify(taskPayload),
35
32
  queue_name: "edit_message",
36
- task_id: ctx.wsTaskNumber,
33
+ task_id: taskNumber,
37
34
  };
38
35
 
39
- // utils অবজেক্ট থেকে সঠিক ফাংশনটি কল করা হচ্ছে এবং Radix 10 ব্যবহার করা হয়েছে
40
- const offlineThreadingID = utils.generateOfflineThreadingID
41
- ? utils.generateOfflineThreadingID()
42
- : utils.generateOfflineThreadingId();
43
-
44
- const context = {
36
+ const content = {
45
37
  app_id: "2220391788200892",
46
- payload: JSON.stringify({
38
+ payload: {
47
39
  data_trace_id: null,
48
- epoch_id: parseInt(offlineThreadingID, 10), // বাগ ফিক্স করা হয়েছে
49
- tasks: [query],
40
+ epoch_id: parseInt(generateOfflineThreadingID()),
41
+ tasks: [],
50
42
  version_id: "6903494529735864",
51
- }),
43
+ },
52
44
  request_id: ctx.wsReqNumber,
53
45
  type: 3,
54
46
  };
55
47
 
56
- if (canBeCalled(callback)) {
57
- ctx.reqCallbacks[ctx.wsReqNumber] = callback;
48
+ content.payload.tasks.push(task);
49
+ content.payload = JSON.stringify(content.payload);
50
+
51
+ if (isCallable(callback)) {
52
+ ctx["tasks"].set(taskNumber, {
53
+ type: "edit_message",
54
+ callback: callback,
55
+ });
58
56
  }
59
57
 
60
- // MQTT ব্রোকারে লাইটস্পিড রিকোয়েস্ট পাঠানো হচ্ছে
61
- ctx.mqttClient.publish("/ls_req", JSON.stringify(context), {
58
+ ctx.mqttClient.publish("/ls_req", JSON.stringify(content), {
62
59
  qos: 1,
63
60
  retain: false,
64
61
  });
@@ -1,54 +1,57 @@
1
1
  "use strict";
2
2
 
3
- const utils = require("../utils");
3
+ var utils = require("../utils");
4
+ var log = require("npmlog");
4
5
 
5
6
  module.exports = function (defaultFuncs, api, ctx) {
6
7
  return function forwardAttachment(attachmentID, userOrUsers, callback) {
7
- let resolveFunc = () => {};
8
- let rejectFunc = () => {};
9
- const returnPromise = new Promise((resolve, reject) => {
8
+ var resolveFunc = function () {};
9
+ var rejectFunc = function () {};
10
+ var returnPromise = new Promise(function (resolve, reject) {
10
11
  resolveFunc = resolve;
11
12
  rejectFunc = reject;
12
13
  });
13
-
14
14
  if (!callback) {
15
15
  callback = function (err) {
16
- if (err) return rejectFunc(err);
16
+ if (err) {
17
+ return rejectFunc(err);
18
+ }
17
19
  resolveFunc();
18
20
  };
19
21
  }
20
22
 
21
- const form = {
23
+ var form = {
22
24
  attachment_id: attachmentID,
23
25
  };
24
26
 
25
- // ইনপুট অ্যারে না হলে সেটিকে অ্যারেতে রূপান্তর করা হচ্ছে
26
- const recipients = utils.getType(userOrUsers) !== "Array"
27
- ? [userOrUsers]
28
- : userOrUsers;
27
+ if (utils.getType(userOrUsers) !== "Array") {
28
+ userOrUsers = [userOrUsers];
29
+ }
29
30
 
30
- const timestamp = Math.floor(Date.now() / 1000);
31
+ var timestamp = Math.floor(Date.now() / 1000);
31
32
 
32
- // মডার্ন লুপ ব্যবহার করে রিসিপিয়েন্ট ম্যাপ অবজেক্ট জেনারেট করা হচ্ছে
33
- recipients.forEach((userID, index) => {
34
- form[`recipient_map[${timestamp + index}]`] = userID;
35
- });
33
+ for (var i = 0; i < userOrUsers.length; i++) {
34
+ //That's good, the key of the array is really timestmap in seconds + index
35
+ //Probably time when the attachment will be sent?
36
+ form["recipient_map[" + (timestamp + i) + "]"] = userOrUsers[i];
37
+ }
36
38
 
37
39
  defaultFuncs
38
40
  .post(
39
41
  "https://www.facebook.com/mercury/attachments/forward/",
40
42
  ctx.jar,
41
- form
43
+ form,
42
44
  )
43
- .then(utils.parseAndCheckLogin(ctx, defaultFuncs)) // ক্র্যাশ বাগটি এখানে ফিক্স করা হয়েছে (ctx.jar -> ctx)
45
+ .then(utils.parseAndCheckLogin(ctx.jar, defaultFuncs))
44
46
  .then(function (resData) {
45
47
  if (resData.error) {
46
48
  throw resData;
47
49
  }
50
+
48
51
  return callback();
49
52
  })
50
53
  .catch(function (err) {
51
- utils.error("forwardAttachment", err);
54
+ log.error("forwardAttachment", err);
52
55
  return callback(err);
53
56
  });
54
57
 
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+
3
+ const { generateOfflineThreadingID, getCurrentTimestamp } = require("../utils");
4
+
5
+ function isCallable(func) {
6
+ try {
7
+ Reflect.apply(func, null, []);
8
+ return true;
9
+ } catch (error) {
10
+ return false;
11
+ }
12
+ }
13
+
14
+ module.exports = function (defaultFuncs, api, ctx) {
15
+ return function forwardMessage(messageID, threadID, callback) {
16
+ if (!ctx.mqttClient) {
17
+ throw new Error("Not connected to MQTT");
18
+ }
19
+
20
+ ctx.wsReqNumber += 1;
21
+ ctx.wsTaskNumber += 1;
22
+
23
+ const taskPayload = {
24
+ thread_id: threadID,
25
+ otid: parseInt(generateOfflineThreadingID()),
26
+ source: 65544,
27
+ send_type: 5,
28
+ sync_group: 1,
29
+ forwarded_msg_id: messageID,
30
+ strip_forwarded_msg_caption: 0,
31
+ initiating_source: 1,
32
+ };
33
+
34
+ const task = {
35
+ failure_count: null,
36
+ label: "46",
37
+ payload: JSON.stringify(taskPayload),
38
+ queue_name: `${threadID}`,
39
+ task_id: ctx.wsTaskNumber,
40
+ };
41
+
42
+ const content = {
43
+ app_id: "2220391788200892",
44
+ payload: JSON.stringify({
45
+ data_trace_id: null,
46
+ epoch_id: parseInt(generateOfflineThreadingID()),
47
+ tasks: [task],
48
+ version_id: "25095469420099952",
49
+ }),
50
+ request_id: ctx.wsReqNumber,
51
+ type: 3,
52
+ };
53
+
54
+ if (isCallable(callback)) {
55
+ // to be implemented
56
+ }
57
+
58
+ ctx.mqttClient.publish("/ls_req", JSON.stringify(content), {
59
+ qos: 1,
60
+ retain: false,
61
+ });
62
+ };
63
+ };
@@ -1,5 +1,7 @@
1
1
  "use strict";
2
2
 
3
- module.exports = (defaultFuncs, api, ctx) => {
4
- return () => ctx?.userID;
3
+ module.exports = function (defaultFuncs, api, ctx) {
4
+ return function getCurrentUserID() {
5
+ return ctx.userID;
6
+ };
5
7
  };
@@ -1,18 +1,29 @@
1
1
  "use strict";
2
2
 
3
+ const util = require("util");
4
+
3
5
  module.exports = function () {
4
- return function getEmojiUrl(c, size, pixelRatio = "1.0") {
5
- const codePointHex = c.codePointAt(0).toString(16);
6
-
7
- const ending = `${pixelRatio}/${size}/${codePointHex}.png`;
8
-
6
+ return function getEmojiUrl(c, size, pixelRatio) {
7
+ /*
8
+ Resolves Facebook Messenger emoji image asset URL for an emoji character.
9
+ Supported sizes are 32, 64, and 128.
10
+ Supported pixel ratios are '1.0' and '1.5' (possibly more; haven't tested)
11
+ */
12
+ const baseUrl = "https://static.xx.fbcdn.net/images/emoji.php/v8/z%s/%s";
13
+ pixelRatio = pixelRatio || "1.0";
14
+
15
+ let ending = util.format(
16
+ "%s/%s/%s.png",
17
+ pixelRatio,
18
+ size,
19
+ c.codePointAt(0).toString(16),
20
+ );
9
21
  let base = 317426846;
10
22
  for (let i = 0; i < ending.length; i++) {
11
- base = (((base << 5) - base) + ending.charCodeAt(i)) | 0;
23
+ base = (base << 5) - base + ending.charCodeAt(i);
12
24
  }
13
25
 
14
- const hashed = ((base & 255) >>> 0).toString(16);
15
-
16
- return `https://static.xx.fbcdn.net/images/emoji.php/v8/z${hashed}/${ending}`;
26
+ let hashed = (base & 255).toString(16);
27
+ return util.format(baseUrl, hashed, ending);
17
28
  };
18
29
  };
@@ -1,9 +1,11 @@
1
1
  "use strict";
2
2
 
3
- const utils = require("../utils");
3
+ //var cheerio = require("cheerio");
4
+ var utils = require("../utils");
5
+ var log = require("npmlog");
4
6
 
5
- // ফেসবুকের জেন্ডার কনস্ট্যান্টস ম্যাপিং
6
- const GENDERS = {
7
+ // [almost] copy pasted from one of FB's minified file (GenderConst)
8
+ var GENDERS = {
7
9
  0: "unknown",
8
10
  1: "female_singular",
9
11
  2: "male_singular",
@@ -18,16 +20,15 @@ const GENDERS = {
18
20
  11: "unknown_plural",
19
21
  };
20
22
 
21
- // ফ্রেন্ড লিস্টের ডেটা ফরম্যাট করার হেল্পার ফাংশন
22
23
  function formatData(obj) {
23
- return Object.keys(obj).map(key => {
24
- const user = obj[key];
24
+ return Object.keys(obj).map(function (key) {
25
+ var user = obj[key];
25
26
  return {
26
27
  alternateName: user.alternateName,
27
28
  firstName: user.firstName,
28
- gender: GENDERS[user.gender] || "unknown",
29
+ gender: GENDERS[user.gender],
29
30
  userID: utils.formatID(user.id.toString()),
30
- isFriend: !!user.is_friend, // ডাবল নেগেশন ব্যবহার করে ক্লিন ট্রু/ফলস কনভার্সন
31
+ isFriend: user.is_friend != null && user.is_friend ? true : false,
31
32
  fullName: user.name,
32
33
  profilePicture: user.thumbSrc,
33
34
  type: user.type,
@@ -40,16 +41,18 @@ function formatData(obj) {
40
41
 
41
42
  module.exports = function (defaultFuncs, api, ctx) {
42
43
  return function getFriendsList(callback) {
43
- let resolveFunc = () => {};
44
- let rejectFunc = () => {};
45
- const returnPromise = new Promise((resolve, reject) => {
44
+ var resolveFunc = function () {};
45
+ var rejectFunc = function () {};
46
+ var returnPromise = new Promise(function (resolve, reject) {
46
47
  resolveFunc = resolve;
47
48
  rejectFunc = reject;
48
49
  });
49
50
 
50
51
  if (!callback) {
51
- callback = (err, friendList) => {
52
- if (err) return rejectFunc(err);
52
+ callback = function (err, friendList) {
53
+ if (err) {
54
+ return rejectFunc(err);
55
+ }
53
56
  resolveFunc(friendList);
54
57
  };
55
58
  }
@@ -59,20 +62,20 @@ module.exports = function (defaultFuncs, api, ctx) {
59
62
  "https://www.facebook.com/chat/user_info_all",
60
63
  ctx.jar,
61
64
  {},
62
- { viewer: ctx.userID }
65
+ { viewer: ctx.userID },
63
66
  )
64
67
  .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
65
- .then(resData => {
68
+ .then(function (resData) {
66
69
  if (!resData) {
67
70
  throw { error: "getFriendsList returned empty object." };
68
71
  }
69
72
  if (resData.error) {
70
73
  throw resData;
71
74
  }
72
- return callback(null, formatData(resData.payload));
75
+ callback(null, formatData(resData.payload));
73
76
  })
74
- .catch(err => {
75
- utils.error("getFriendsList", err);
77
+ .catch(function (err) {
78
+ log.error("getFriendsList", err);
76
79
  return callback(err);
77
80
  });
78
81