@cexy/hoonfca 1.0.4 → 1.0.5

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 (135) hide show
  1. package/CHANGELOG.md +181 -0
  2. package/DOCS.md +2636 -0
  3. package/LICENSE-MIT +21 -21
  4. package/README.md +632 -0
  5. package/func/checkUpdate.js +222 -0
  6. package/func/logger.js +48 -0
  7. package/index.d.ts +731 -605
  8. package/index.js +6 -774
  9. package/module/config.js +34 -0
  10. package/module/login.js +136 -0
  11. package/module/loginHelper.js +1034 -0
  12. package/module/options.js +45 -0
  13. package/package.json +54 -19
  14. package/src/api/action/addExternalModule.js +25 -0
  15. package/src/api/action/changeAvatar.js +137 -0
  16. package/src/{changeBio.js → api/action/changeBio.js} +75 -76
  17. package/src/api/action/enableAutoSaveAppState.js +73 -0
  18. package/src/{getCurrentUserID.js → api/action/getCurrentUserID.js} +7 -7
  19. package/src/{handleFriendRequest.js → api/action/handleFriendRequest.js} +57 -57
  20. package/src/api/action/logout.js +76 -0
  21. package/src/api/action/refreshFb_dtsg.js +48 -0
  22. package/src/api/action/setPostReaction.js +106 -0
  23. package/src/api/action/unfriend.js +54 -0
  24. package/src/api/http/httpGet.js +46 -0
  25. package/src/api/http/httpPost.js +52 -0
  26. package/src/api/http/postFormData.js +47 -0
  27. package/src/api/messaging/addUserToGroup.js +68 -0
  28. package/src/api/messaging/changeAdminStatus.js +122 -0
  29. package/src/api/messaging/changeArchivedStatus.js +55 -0
  30. package/src/api/messaging/changeBlockedStatus.js +48 -0
  31. package/src/api/messaging/changeGroupImage.js +90 -0
  32. package/src/api/messaging/changeNickname.js +70 -0
  33. package/src/api/messaging/changeThreadColor.js +79 -0
  34. package/src/api/messaging/changeThreadEmoji.js +106 -0
  35. package/src/{createNewGroup.js → api/messaging/createNewGroup.js} +88 -88
  36. package/src/api/messaging/createPoll.js +43 -0
  37. package/src/api/messaging/createThemeAI.js +98 -0
  38. package/src/{deleteMessage.js → api/messaging/deleteMessage.js} +56 -56
  39. package/src/{deleteThread.js → api/messaging/deleteThread.js} +56 -56
  40. package/src/api/messaging/editMessage.js +68 -0
  41. package/src/api/messaging/forwardAttachment.js +51 -0
  42. package/src/{getEmojiUrl.js → api/messaging/getEmojiUrl.js} +8 -8
  43. package/src/{getFriendsList.js → api/messaging/getFriendsList.js} +82 -84
  44. package/src/api/messaging/getMessage.js +829 -0
  45. package/src/api/messaging/getThemePictures.js +62 -0
  46. package/src/api/messaging/handleMessageRequest.js +65 -0
  47. package/src/{markAsDelivered.js → api/messaging/markAsDelivered.js} +57 -58
  48. package/src/{markAsRead.js → api/messaging/markAsRead.js} +88 -88
  49. package/src/{markAsReadAll.js → api/messaging/markAsReadAll.js} +49 -50
  50. package/src/api/messaging/markAsSeen.js +61 -0
  51. package/src/{muteThread.js → api/messaging/muteThread.js} +50 -52
  52. package/src/api/messaging/removeUserFromGroup.js +106 -0
  53. package/src/{resolvePhotoUrl.js → api/messaging/resolvePhotoUrl.js} +43 -45
  54. package/src/api/messaging/scheduler.js +264 -0
  55. package/src/{searchForThread.js → api/messaging/searchForThread.js} +52 -53
  56. package/src/api/messaging/sendMessage.js +272 -0
  57. package/src/api/messaging/sendTypingIndicator.js +67 -0
  58. package/src/api/messaging/setMessageReaction.js +76 -0
  59. package/src/api/messaging/setTitle.js +119 -0
  60. package/src/{shareContact.js → api/messaging/shareContact.js} +49 -53
  61. package/src/api/messaging/threadColors.js +128 -0
  62. package/src/api/messaging/unsendMessage.js +81 -0
  63. package/src/api/messaging/uploadAttachment.js +94 -0
  64. package/src/api/socket/core/connectMqtt.js +255 -0
  65. package/src/api/socket/core/emitAuth.js +106 -0
  66. package/src/api/socket/core/getSeqID.js +40 -0
  67. package/src/api/socket/core/getTaskResponseData.js +22 -0
  68. package/src/api/socket/core/markDelivery.js +12 -0
  69. package/src/api/socket/core/parseDelta.js +391 -0
  70. package/src/api/socket/detail/buildStream.js +208 -0
  71. package/src/api/socket/detail/constants.js +24 -0
  72. package/src/api/socket/listenMqtt.js +364 -0
  73. package/src/api/socket/middleware/index.js +216 -0
  74. package/src/{getThreadHistory.js → api/threads/getThreadHistory.js} +664 -647
  75. package/src/api/threads/getThreadInfo.js +438 -0
  76. package/src/{getThreadList.js → api/threads/getThreadList.js} +293 -292
  77. package/src/{getThreadPictures.js → api/threads/getThreadPictures.js} +78 -79
  78. package/src/{getUserID.js → api/users/getUserID.js} +65 -66
  79. package/src/api/users/getUserInfo.js +327 -0
  80. package/src/api/users/getUserInfoV2.js +134 -0
  81. package/src/core/sendReqMqtt.js +96 -0
  82. package/src/database/models/index.js +87 -0
  83. package/src/database/models/thread.js +45 -0
  84. package/src/database/models/user.js +46 -0
  85. package/src/database/threadData.js +98 -0
  86. package/src/database/userData.js +89 -0
  87. package/src/utils/client.js +320 -0
  88. package/src/utils/constants.js +23 -0
  89. package/{utils.js → src/utils/format.js} +1115 -1447
  90. package/src/utils/headers.js +115 -0
  91. package/src/utils/request.js +305 -0
  92. package/.travis.yml +0 -6
  93. package/src/addExternalModule.js +0 -23
  94. package/src/addUserToGroup.js +0 -113
  95. package/src/changeAdminStatus.js +0 -95
  96. package/src/changeApprovalMode.js +0 -79
  97. package/src/changeArchivedStatus.js +0 -55
  98. package/src/changeBlockedStatus.js +0 -47
  99. package/src/changeBlockedStatusMqtt.js +0 -86
  100. package/src/changeGroupImage.js +0 -133
  101. package/src/changeNickname.js +0 -59
  102. package/src/changeThreadColor.js +0 -71
  103. package/src/changeThreadEmoji.js +0 -55
  104. package/src/createPoll.js +0 -130
  105. package/src/editMessage.js +0 -63
  106. package/src/forwardAttachment.js +0 -60
  107. package/src/forwardMessage.js +0 -63
  108. package/src/getGroupsList.js +0 -83
  109. package/src/getMarketplace.js +0 -84
  110. package/src/getNotifications.js +0 -86
  111. package/src/getPagesList.js +0 -83
  112. package/src/getStories.js +0 -88
  113. package/src/getThreadInfo.js +0 -222
  114. package/src/getUserInfo.js +0 -128
  115. package/src/handleMessageRequest.js +0 -65
  116. package/src/httpGet.js +0 -58
  117. package/src/httpPost.js +0 -58
  118. package/src/listenMqtt.js +0 -1018
  119. package/src/logout.js +0 -75
  120. package/src/markAsSeen.js +0 -61
  121. package/src/pinMessage.js +0 -61
  122. package/src/removeUserFromGroup.js +0 -79
  123. package/src/searchUsers.js +0 -89
  124. package/src/sendComment.js +0 -161
  125. package/src/sendMessage.js +0 -457
  126. package/src/sendTypingIndicator.js +0 -179
  127. package/src/setBio.js +0 -86
  128. package/src/setMessageReaction.js +0 -186
  129. package/src/setPostReaction.js +0 -71
  130. package/src/setTheme.js +0 -313
  131. package/src/setTitle.js +0 -90
  132. package/src/shareLink.js +0 -62
  133. package/src/threadColors.js +0 -57
  134. package/src/unfriend.js +0 -53
  135. package/src/unsendMessage.js +0 -104
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+
3
+ const log = require("npmlog");
4
+ const { getType } = require("../../utils/format");
5
+ const { parseAndCheckLogin } = require("../../utils/client");
6
+
7
+ module.exports = function (defaultFuncs, api, ctx) {
8
+ return function createThemeAI(prompt, callback) {
9
+ let resolveFunc = function () { };
10
+ let rejectFunc = function () { };
11
+ const returnPromise = new Promise(function (resolve, reject) {
12
+ resolveFunc = resolve;
13
+ rejectFunc = reject;
14
+ });
15
+
16
+ if (!callback) {
17
+ callback = function (err, data) {
18
+ if (err) return rejectFunc(err);
19
+ resolveFunc(data);
20
+ };
21
+ }
22
+
23
+ if (getType(prompt) !== "String") {
24
+ return callback({ error: "Invalid prompt. Please provide a string." });
25
+ }
26
+
27
+ if (!prompt || prompt.trim().length === 0) {
28
+ return callback({ error: "Prompt cannot be empty." });
29
+ }
30
+
31
+ const form = {
32
+ av: ctx.userID,
33
+ fb_api_caller_class: "RelayModern",
34
+ fb_api_req_friendly_name: "useGenerateAIThemeMutation",
35
+ doc_id: "23873748445608673",
36
+ variables: JSON.stringify({
37
+ input: {
38
+ client_mutation_id: Math.round(Math.random() * 19).toString(),
39
+ actor_id: ctx.userID,
40
+ bypass_cache: true,
41
+ caller: "MESSENGER",
42
+ num_themes: 1,
43
+ prompt: prompt.trim()
44
+ }
45
+ }),
46
+ server_timestamps: true
47
+ };
48
+
49
+ defaultFuncs
50
+ .post("https://www.facebook.com/api/graphql/", ctx.jar, form)
51
+ .then(parseAndCheckLogin(ctx, defaultFuncs))
52
+ .then(function (resData) {
53
+ if (resData.errors) {
54
+ throw resData;
55
+ }
56
+
57
+ if (!resData.data || !resData.data.xfb_generate_ai_themes_from_prompt) {
58
+ throw {
59
+ error: "Invalid response from Facebook API",
60
+ res: resData
61
+ };
62
+ }
63
+
64
+ const themes = resData.data.xfb_generate_ai_themes_from_prompt.themes;
65
+ if (!themes || !Array.isArray(themes) || themes.length === 0) {
66
+ throw {
67
+ error: "No themes generated",
68
+ res: resData
69
+ };
70
+ }
71
+
72
+ const theme = themes[0];
73
+ if (!theme || !theme.id || !theme.background_asset) {
74
+ throw {
75
+ error: "Invalid theme data",
76
+ res: resData
77
+ };
78
+ }
79
+
80
+ callback(null, {
81
+ id: theme.id,
82
+ accessibility_label: theme.accessibility_label || null,
83
+ background_asset: {
84
+ id: theme.background_asset.id,
85
+ image: {
86
+ url: theme.background_asset.image?.uri || null
87
+ }
88
+ }
89
+ });
90
+ })
91
+ .catch(function (err) {
92
+ log.error("createThemeAI", err);
93
+ return callback(err);
94
+ });
95
+
96
+ return returnPromise;
97
+ };
98
+ };
@@ -1,56 +1,56 @@
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 deleteMessage(messageOrMessages, callback) {
8
- var resolveFunc = function () {};
9
- var rejectFunc = function () {};
10
- var returnPromise = new Promise(function (resolve, reject) {
11
- resolveFunc = resolve;
12
- rejectFunc = reject;
13
- });
14
- if (!callback) {
15
- callback = function (err) {
16
- if (err) {
17
- return rejectFunc(err);
18
- }
19
- resolveFunc();
20
- };
21
- }
22
-
23
- var form = {
24
- client: "mercury",
25
- };
26
-
27
- if (utils.getType(messageOrMessages) !== "Array") {
28
- messageOrMessages = [messageOrMessages];
29
- }
30
-
31
- for (var i = 0; i < messageOrMessages.length; i++) {
32
- form["message_ids[" + i + "]"] = messageOrMessages[i];
33
- }
34
-
35
- defaultFuncs
36
- .post(
37
- "https://www.facebook.com/ajax/mercury/delete_messages.php",
38
- ctx.jar,
39
- form,
40
- )
41
- .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
42
- .then(function (resData) {
43
- if (resData.error) {
44
- throw resData;
45
- }
46
-
47
- return callback();
48
- })
49
- .catch(function (err) {
50
- log.error("deleteMessage", err);
51
- return callback(err);
52
- });
53
-
54
- return returnPromise;
55
- };
56
- };
1
+ "use strict";
2
+
3
+ const log = require("npmlog");
4
+ const { parseAndCheckLogin } = require("../../utils/client");
5
+ const { getType } = require("../../utils/format");
6
+ module.exports = function(defaultFuncs, api, ctx) {
7
+ return function deleteMessage(messageOrMessages, callback) {
8
+ let resolveFunc = function() {};
9
+ let rejectFunc = function() {};
10
+ const returnPromise = new Promise(function(resolve, reject) {
11
+ resolveFunc = resolve;
12
+ rejectFunc = reject;
13
+ });
14
+ if (!callback) {
15
+ callback = function(err) {
16
+ if (err) {
17
+ return rejectFunc(err);
18
+ }
19
+ resolveFunc();
20
+ };
21
+ }
22
+
23
+ const form = {
24
+ client: "mercury"
25
+ };
26
+
27
+ if (getType(messageOrMessages) !== "Array") {
28
+ messageOrMessages = [messageOrMessages];
29
+ }
30
+
31
+ for (let i = 0; i < messageOrMessages.length; i++) {
32
+ form["message_ids[" + i + "]"] = messageOrMessages[i];
33
+ }
34
+
35
+ defaultFuncs
36
+ .post(
37
+ "https://www.facebook.com/ajax/mercury/delete_messages.php",
38
+ ctx.jar,
39
+ form
40
+ )
41
+ .then(parseAndCheckLogin(ctx, defaultFuncs))
42
+ .then(function(resData) {
43
+ if (resData.error) {
44
+ throw resData;
45
+ }
46
+
47
+ return callback();
48
+ })
49
+ .catch(function(err) {
50
+ log.error("deleteMessage", err);
51
+ return callback(err);
52
+ });
53
+
54
+ return returnPromise;
55
+ };
56
+ };
@@ -1,56 +1,56 @@
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 deleteThread(threadOrThreads, callback) {
8
- var resolveFunc = function () {};
9
- var rejectFunc = function () {};
10
- var returnPromise = new Promise(function (resolve, reject) {
11
- resolveFunc = resolve;
12
- rejectFunc = reject;
13
- });
14
- if (!callback) {
15
- callback = function (err) {
16
- if (err) {
17
- return rejectFunc(err);
18
- }
19
- resolveFunc();
20
- };
21
- }
22
-
23
- var form = {
24
- client: "mercury",
25
- };
26
-
27
- if (utils.getType(threadOrThreads) !== "Array") {
28
- threadOrThreads = [threadOrThreads];
29
- }
30
-
31
- for (var i = 0; i < threadOrThreads.length; i++) {
32
- form["ids[" + i + "]"] = threadOrThreads[i];
33
- }
34
-
35
- defaultFuncs
36
- .post(
37
- "https://www.facebook.com/ajax/mercury/delete_thread.php",
38
- ctx.jar,
39
- form,
40
- )
41
- .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
42
- .then(function (resData) {
43
- if (resData.error) {
44
- throw resData;
45
- }
46
-
47
- return callback();
48
- })
49
- .catch(function (err) {
50
- log.error("deleteThread", err);
51
- return callback(err);
52
- });
53
-
54
- return returnPromise;
55
- };
56
- };
1
+ "use strict";
2
+
3
+ const log = require("npmlog");
4
+ const { parseAndCheckLogin } = require("../../utils/client");
5
+ const { getType } = require("../../utils/format");
6
+ module.exports = function(defaultFuncs, api, ctx) {
7
+ return function deleteThread(threadOrThreads, callback) {
8
+ let resolveFunc = function() {};
9
+ let rejectFunc = function() {};
10
+ const returnPromise = new Promise(function(resolve, reject) {
11
+ resolveFunc = resolve;
12
+ rejectFunc = reject;
13
+ });
14
+ if (!callback) {
15
+ callback = function(err) {
16
+ if (err) {
17
+ return rejectFunc(err);
18
+ }
19
+ resolveFunc();
20
+ };
21
+ }
22
+
23
+ const form = {
24
+ client: "mercury"
25
+ };
26
+
27
+ if (getType(threadOrThreads) !== "Array") {
28
+ threadOrThreads = [threadOrThreads];
29
+ }
30
+
31
+ for (let i = 0; i < threadOrThreads.length; i++) {
32
+ form["ids[" + i + "]"] = threadOrThreads[i];
33
+ }
34
+
35
+ defaultFuncs
36
+ .post(
37
+ "https://www.facebook.com/ajax/mercury/delete_thread.php",
38
+ ctx.jar,
39
+ form
40
+ )
41
+ .then(parseAndCheckLogin(ctx, defaultFuncs))
42
+ .then(function(resData) {
43
+ if (resData.error) {
44
+ throw resData;
45
+ }
46
+
47
+ return callback();
48
+ })
49
+ .catch(function(err) {
50
+ log.error("deleteThread", err);
51
+ return callback(err);
52
+ });
53
+
54
+ return returnPromise;
55
+ };
56
+ };
@@ -0,0 +1,68 @@
1
+ "use_strict";
2
+
3
+ const { generateOfflineThreadingID } = require("../../utils/format.js");
4
+ module.exports = (defaultFuncs, api, ctx) => {
5
+ return (text, messageID, callback) => {
6
+ let reqID = ctx.wsReqNumber + 1;
7
+ var resolveFunc = () => { };
8
+ var rejectFunc = () => { };
9
+ var returnPromise = new Promise((resolve, reject) => {
10
+ resolveFunc = resolve;
11
+ rejectFunc = reject;
12
+ });
13
+ if (!callback) {
14
+ callback = (err, data) => {
15
+ if (err) {
16
+ return rejectFunc(err);
17
+ }
18
+ resolveFunc(data);
19
+ };
20
+ }
21
+ const content = {
22
+ app_id: '2220391788200892',
23
+ payload: JSON.stringify({
24
+ data_trace_id: null,
25
+ epoch_id: parseInt(generateOfflineThreadingID()),
26
+ tasks: [{
27
+ failure_count: null,
28
+ label: '742',
29
+ payload: JSON.stringify({
30
+ message_id: messageID,
31
+ text: text,
32
+ }),
33
+ queue_name: 'edit_message',
34
+ task_id: ++ctx.wsTaskNumber,
35
+ }],
36
+ version_id: '6903494529735864',
37
+ }),
38
+ request_id: ++ctx.wsReqNumber,
39
+ type: 3
40
+ }
41
+ ctx.mqttClient.publish('/ls_req', JSON.stringify(content), {
42
+ qos: 1,
43
+ retain: false
44
+ });
45
+ const handleRes = (topic, message) => {
46
+ if (topic === "/ls_resp") {
47
+ let jsonMsg = JSON.parse(message.toString());
48
+ jsonMsg.payload = JSON.parse(jsonMsg.payload);
49
+ if (jsonMsg.request_id != reqID) return;
50
+ ctx.mqttClient.removeListener('message', handleRes);
51
+ let msgID = jsonMsg.payload.step[1][2][2][1][2];
52
+ let msgReplace = jsonMsg.payload.step[1][2][2][1][4];
53
+ const bodies = {
54
+ body: msgReplace,
55
+ messageID: msgID
56
+ };
57
+ if (msgReplace != text) {
58
+ return callback({
59
+ error: "The message is too old or not from you!"
60
+ }, bodies);
61
+ }
62
+ return callback(undefined, bodies);
63
+ }
64
+ }
65
+ ctx.mqttClient.on('message', handleRes);
66
+ return returnPromise;
67
+ };
68
+ }
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+
3
+ const { generateOfflineThreadingID } = require("../../utils/format");
4
+
5
+ module.exports = function (defaultFuncs, api, ctx) {
6
+ return async function forwardMessage(threadID, forwardedMsgID, callback) {
7
+ let resolveFunc, rejectFunc;
8
+ const returnPromise = new Promise((resolve, reject) => {
9
+ resolveFunc = resolve;
10
+ rejectFunc = reject;
11
+ });
12
+ if (!callback) {
13
+ callback = (err, data) => {
14
+ if (err) return rejectFunc(err);
15
+ resolveFunc(data);
16
+ };
17
+ }
18
+ let count_req = 0
19
+ const payload = {
20
+ epoch_id: generateOfflineThreadingID(),
21
+ tasks: [
22
+ {
23
+ failure_count: null,
24
+ label: "46",
25
+ payload: JSON.stringify({
26
+ thread_id: threadID,
27
+ otid: generateOfflineThreadingID(),
28
+ source: 65544,
29
+ send_type: 5,
30
+ sync_group: 1,
31
+ mark_thread_read: 0,
32
+ forwarded_msg_id: forwardedMsgID,
33
+ strip_forwarded_msg_caption: 0,
34
+ initiating_source: 1
35
+ }),
36
+ queue_name: threadID,
37
+ task_id: Math.floor(Math.random() * 1001)
38
+ }
39
+ ],
40
+ version_id: "8768858626531631"
41
+ };
42
+ const form = JSON.stringify({
43
+ app_id: "772021112871879",
44
+ payload: JSON.stringify(payload),
45
+ "request_id": ++count_req,
46
+ "type": 3
47
+ });
48
+ mqttClient.publish("/ls_req", form);
49
+ return returnPromise;
50
+ };
51
+ };
@@ -2,28 +2,28 @@
2
2
 
3
3
  const util = require("util");
4
4
 
5
- module.exports = function () {
5
+ module.exports = function() {
6
6
  return function getEmojiUrl(c, size, pixelRatio) {
7
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
- */
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
12
  const baseUrl = "https://static.xx.fbcdn.net/images/emoji.php/v8/z%s/%s";
13
13
  pixelRatio = pixelRatio || "1.0";
14
14
 
15
- let ending = util.format(
15
+ const ending = util.format(
16
16
  "%s/%s/%s.png",
17
17
  pixelRatio,
18
18
  size,
19
- c.codePointAt(0).toString(16),
19
+ c.codePointAt(0).toString(16)
20
20
  );
21
21
  let base = 317426846;
22
22
  for (let i = 0; i < ending.length; i++) {
23
23
  base = (base << 5) - base + ending.charCodeAt(i);
24
24
  }
25
25
 
26
- let hashed = (base & 255).toString(16);
26
+ const hashed = (base & 255).toString(16);
27
27
  return util.format(baseUrl, hashed, ending);
28
28
  };
29
29
  };
@@ -1,84 +1,82 @@
1
- "use strict";
2
-
3
- //var cheerio = require("cheerio");
4
- var utils = require("../utils");
5
- var log = require("npmlog");
6
-
7
- // [almost] copy pasted from one of FB's minified file (GenderConst)
8
- var GENDERS = {
9
- 0: "unknown",
10
- 1: "female_singular",
11
- 2: "male_singular",
12
- 3: "female_singular_guess",
13
- 4: "male_singular_guess",
14
- 5: "mixed",
15
- 6: "neuter_singular",
16
- 7: "unknown_singular",
17
- 8: "female_plural",
18
- 9: "male_plural",
19
- 10: "neuter_plural",
20
- 11: "unknown_plural",
21
- };
22
-
23
- function formatData(obj) {
24
- return Object.keys(obj).map(function (key) {
25
- var user = obj[key];
26
- return {
27
- alternateName: user.alternateName,
28
- firstName: user.firstName,
29
- gender: GENDERS[user.gender],
30
- userID: utils.formatID(user.id.toString()),
31
- isFriend: user.is_friend != null && user.is_friend ? true : false,
32
- fullName: user.name,
33
- profilePicture: user.thumbSrc,
34
- type: user.type,
35
- profileUrl: user.uri,
36
- vanity: user.vanity,
37
- isBirthday: !!user.is_birthday,
38
- };
39
- });
40
- }
41
-
42
- module.exports = function (defaultFuncs, api, ctx) {
43
- return function getFriendsList(callback) {
44
- var resolveFunc = function () {};
45
- var rejectFunc = function () {};
46
- var returnPromise = new Promise(function (resolve, reject) {
47
- resolveFunc = resolve;
48
- rejectFunc = reject;
49
- });
50
-
51
- if (!callback) {
52
- callback = function (err, friendList) {
53
- if (err) {
54
- return rejectFunc(err);
55
- }
56
- resolveFunc(friendList);
57
- };
58
- }
59
-
60
- defaultFuncs
61
- .postFormData(
62
- "https://www.facebook.com/chat/user_info_all",
63
- ctx.jar,
64
- {},
65
- { viewer: ctx.userID },
66
- )
67
- .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
68
- .then(function (resData) {
69
- if (!resData) {
70
- throw { error: "getFriendsList returned empty object." };
71
- }
72
- if (resData.error) {
73
- throw resData;
74
- }
75
- callback(null, formatData(resData.payload));
76
- })
77
- .catch(function (err) {
78
- log.error("getFriendsList", err);
79
- return callback(err);
80
- });
81
-
82
- return returnPromise;
83
- };
84
- };
1
+ "use strict";
2
+
3
+ const { formatID } = require("../../utils/format");
4
+ const log = require("npmlog");
5
+ const { parseAndCheckLogin } = require("../../utils/client");
6
+ const GENDERS = {
7
+ 0: "unknown",
8
+ 1: "female_singular",
9
+ 2: "male_singular",
10
+ 3: "female_singular_guess",
11
+ 4: "male_singular_guess",
12
+ 5: "mixed",
13
+ 6: "neuter_singular",
14
+ 7: "unknown_singular",
15
+ 8: "female_plural",
16
+ 9: "male_plural",
17
+ 10: "neuter_plural",
18
+ 11: "unknown_plural"
19
+ };
20
+
21
+ function formatData(obj) {
22
+ return Object.keys(obj).map(function(key) {
23
+ const user = obj[key];
24
+ return {
25
+ alternateName: user.alternateName,
26
+ firstName: user.firstName,
27
+ gender: GENDERS[user.gender],
28
+ userID: formatID(user.id.toString()),
29
+ isFriend: user.is_friend != null && user.is_friend ? true : false,
30
+ fullName: user.name,
31
+ profilePicture: user.thumbSrc,
32
+ type: user.type,
33
+ profileUrl: user.uri,
34
+ vanity: user.vanity,
35
+ isBirthday: !!user.is_birthday
36
+ };
37
+ });
38
+ }
39
+
40
+ module.exports = function(defaultFuncs, api, ctx) {
41
+ return function getFriendsList(callback) {
42
+ let resolveFunc = function() {};
43
+ let rejectFunc = function() {};
44
+ const returnPromise = new Promise(function(resolve, reject) {
45
+ resolveFunc = resolve;
46
+ rejectFunc = reject;
47
+ });
48
+
49
+ if (!callback) {
50
+ callback = function(err, friendList) {
51
+ if (err) {
52
+ return rejectFunc(err);
53
+ }
54
+ resolveFunc(friendList);
55
+ };
56
+ }
57
+
58
+ defaultFuncs
59
+ .postFormData(
60
+ "https://www.facebook.com/chat/user_info_all",
61
+ ctx.jar,
62
+ {},
63
+ { viewer: ctx.userID }
64
+ )
65
+ .then(parseAndCheckLogin(ctx, defaultFuncs))
66
+ .then(function(resData) {
67
+ if (!resData) {
68
+ throw { error: "getFriendsList returned empty object." };
69
+ }
70
+ if (resData.error) {
71
+ throw resData;
72
+ }
73
+ callback(null, formatData(resData.payload));
74
+ })
75
+ .catch(function(err) {
76
+ log.error("getFriendsList", err);
77
+ return callback(err);
78
+ });
79
+
80
+ return returnPromise;
81
+ };
82
+ };