@cexy/hoonfca 1.0.3 → 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 -777
  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 +53 -22
  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
package/src/logout.js DELETED
@@ -1,75 +0,0 @@
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 logout(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
-
15
- if (!callback) {
16
- callback = function (err, friendList) {
17
- if (err) {
18
- return rejectFunc(err);
19
- }
20
- resolveFunc(friendList);
21
- };
22
- }
23
-
24
- var form = {
25
- pmid: "0",
26
- };
27
-
28
- defaultFuncs
29
- .post(
30
- "https://www.facebook.com/bluebar/modern_settings_menu/?help_type=364455653583099&show_contextual_help=1",
31
- ctx.jar,
32
- form,
33
- )
34
- .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
35
- .then(function (resData) {
36
- var elem = resData.jsmods.instances[0][2][0].filter(function (v) {
37
- return v.value === "logout";
38
- })[0];
39
-
40
- var html = resData.jsmods.markup.filter(function (v) {
41
- return v[0] === elem.markup.__m;
42
- })[0][1].__html;
43
-
44
- var form = {
45
- fb_dtsg: utils.getFrom(html, '"fb_dtsg" value="', '"'),
46
- ref: utils.getFrom(html, '"ref" value="', '"'),
47
- h: utils.getFrom(html, '"h" value="', '"'),
48
- };
49
-
50
- return defaultFuncs
51
- .post("https://www.facebook.com/logout.php", ctx.jar, form)
52
- .then(utils.saveCookies(ctx.jar));
53
- })
54
- .then(function (res) {
55
- if (!res.headers) {
56
- throw { error: "An error occurred when logging out." };
57
- }
58
-
59
- return defaultFuncs
60
- .get(res.headers.location, ctx.jar)
61
- .then(utils.saveCookies(ctx.jar));
62
- })
63
- .then(function () {
64
- ctx.loggedIn = false;
65
- log.info("logout", "Logged out successfully.");
66
- callback();
67
- })
68
- .catch(function (err) {
69
- log.error("logout", err);
70
- return callback(err);
71
- });
72
-
73
- return returnPromise;
74
- };
75
- };
package/src/markAsSeen.js DELETED
@@ -1,61 +0,0 @@
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 markAsRead(seen_timestamp, callback) {
8
- if (
9
- utils.getType(seen_timestamp) == "Function" ||
10
- utils.getType(seen_timestamp) == "AsyncFunction"
11
- ) {
12
- callback = seen_timestamp;
13
- seen_timestamp = Date.now();
14
- }
15
-
16
- var resolveFunc = function () {};
17
- var rejectFunc = function () {};
18
- var returnPromise = new Promise(function (resolve, reject) {
19
- resolveFunc = resolve;
20
- rejectFunc = reject;
21
- });
22
-
23
- if (!callback) {
24
- callback = function (err, friendList) {
25
- if (err) {
26
- return rejectFunc(err);
27
- }
28
- resolveFunc(friendList);
29
- };
30
- }
31
-
32
- var form = {
33
- seen_timestamp: seen_timestamp,
34
- };
35
-
36
- defaultFuncs
37
- .post(
38
- "https://www.facebook.com/ajax/mercury/mark_seen.php",
39
- ctx.jar,
40
- form,
41
- )
42
- .then(utils.saveCookies(ctx.jar))
43
- .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
44
- .then(function (resData) {
45
- if (resData.error) {
46
- throw resData;
47
- }
48
-
49
- return callback();
50
- })
51
- .catch(function (err) {
52
- log.error("markAsSeen", err);
53
- if (utils.getType(err) == "Object" && err.error === "Not logged in.") {
54
- ctx.loggedIn = false;
55
- }
56
- return callback(err);
57
- });
58
-
59
- return returnPromise;
60
- };
61
- };
package/src/pinMessage.js DELETED
@@ -1,61 +0,0 @@
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 pinMessage(pinMode, 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 taskLabel = pinMode ? "430" : "431";
24
- const queueNamePrefix = pinMode ? "pin_msg_v2_" : "unpin_msg_v2_";
25
-
26
- const taskPayload = {
27
- thread_key: threadID,
28
- message_id: messageID,
29
- timestamp_ms: getCurrentTimestamp(),
30
- };
31
-
32
- const task = {
33
- failure_count: null,
34
- label: taskLabel,
35
- payload: JSON.stringify(taskPayload),
36
- queue_name: `${queueNamePrefix}${threadID}`,
37
- task_id: ctx.wsTaskNumber,
38
- };
39
-
40
- const content = {
41
- app_id: "2220391788200892",
42
- payload: JSON.stringify({
43
- data_trace_id: null,
44
- epoch_id: parseInt(generateOfflineThreadingID()),
45
- tasks: [task],
46
- version_id: "25095469420099952",
47
- }),
48
- request_id: ctx.wsReqNumber,
49
- type: 3,
50
- };
51
-
52
- if (isCallable(callback)) {
53
- // to be implemented
54
- }
55
-
56
- ctx.mqttClient.publish("/ls_req", JSON.stringify(content), {
57
- qos: 1,
58
- retain: false,
59
- });
60
- };
61
- };
@@ -1,79 +0,0 @@
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 removeUserFromGroup(userID, threadID, callback) {
8
- if (
9
- !callback &&
10
- (utils.getType(threadID) === "Function" ||
11
- utils.getType(threadID) === "AsyncFunction")
12
- ) {
13
- throw { error: "please pass a threadID as a second argument." };
14
- }
15
- if (
16
- utils.getType(threadID) !== "Number" &&
17
- utils.getType(threadID) !== "String"
18
- ) {
19
- throw {
20
- error:
21
- "threadID should be of type Number or String and not " +
22
- utils.getType(threadID) +
23
- ".",
24
- };
25
- }
26
- if (
27
- utils.getType(userID) !== "Number" &&
28
- utils.getType(userID) !== "String"
29
- ) {
30
- throw {
31
- error:
32
- "userID should be of type Number or String and not " +
33
- utils.getType(userID) +
34
- ".",
35
- };
36
- }
37
-
38
- var resolveFunc = function () {};
39
- var rejectFunc = function () {};
40
- var returnPromise = new Promise(function (resolve, reject) {
41
- resolveFunc = resolve;
42
- rejectFunc = reject;
43
- });
44
-
45
- if (!callback) {
46
- callback = function (err, friendList) {
47
- if (err) {
48
- return rejectFunc(err);
49
- }
50
- resolveFunc(friendList);
51
- };
52
- }
53
-
54
- var form = {
55
- uid: userID,
56
- tid: threadID,
57
- };
58
-
59
- defaultFuncs
60
- .post("https://www.facebook.com/chat/remove_participants", ctx.jar, form)
61
- .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
62
- .then(function (resData) {
63
- if (!resData) {
64
- throw { error: "Remove from group failed." };
65
- }
66
- if (resData.error) {
67
- throw resData;
68
- }
69
-
70
- return callback();
71
- })
72
- .catch(function (err) {
73
- log.error("removeUserFromGroup", err);
74
- return callback(err);
75
- });
76
-
77
- return returnPromise;
78
- };
79
- };
@@ -1,89 +0,0 @@
1
- "use strict";
2
-
3
- var utils = require("../utils");
4
- var log = require("npmlog");
5
-
6
- module.exports = function (defaultFuncs, api, ctx) {
7
- /**
8
- * Search for users by name
9
- * @param {string} query - Search query
10
- * @param {number} limit - Number of results to return
11
- * @param {function} callback - Callback function
12
- */
13
- return function searchUsers(query, limit, callback) {
14
- var resolveFunc = function () {};
15
- var rejectFunc = function () {};
16
- var returnPromise = new Promise(function (resolve, reject) {
17
- resolveFunc = resolve;
18
- rejectFunc = reject;
19
- });
20
-
21
- if (!callback) {
22
- if (utils.getType(limit) == "Function") {
23
- callback = limit;
24
- limit = 10;
25
- } else {
26
- callback = function (err, data) {
27
- if (err) {
28
- return rejectFunc(err);
29
- }
30
- resolveFunc(data);
31
- };
32
- }
33
- }
34
-
35
- if (utils.getType(limit) != "Number") {
36
- limit = 10;
37
- }
38
-
39
- if (utils.getType(query) != "String") {
40
- return callback({ error: "Query must be a string" });
41
- }
42
-
43
- var form = {
44
- av: ctx.userID,
45
- fb_api_caller_class: "RelayModern",
46
- fb_api_req_friendly_name: "SearchTypeaheadQuery",
47
- doc_id: "24585299697835063",
48
- variables: JSON.stringify({
49
- query: query,
50
- first: limit,
51
- }),
52
- };
53
-
54
- defaultFuncs
55
- .post("https://www.facebook.com/api/graphql/", ctx.jar, form)
56
- .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
57
- .then(function (resData) {
58
- if (resData.errors) {
59
- throw resData;
60
- }
61
-
62
- var users = [];
63
- if (
64
- resData.data &&
65
- resData.data.users &&
66
- resData.data.users.edges
67
- ) {
68
- users = resData.data.users.edges.map(function (edge) {
69
- return {
70
- id: edge.node.id,
71
- name: edge.node.name,
72
- profileUrl: edge.node.profile_url,
73
- thumbSrc: edge.node.thumb_src,
74
- isFriend: edge.node.is_friend,
75
- };
76
- });
77
- }
78
-
79
- log.info("searchUsers", "Found " + users.length + " users");
80
- return callback(null, users);
81
- })
82
- .catch(function (err) {
83
- log.error("searchUsers", err);
84
- return callback(err);
85
- });
86
-
87
- return returnPromise;
88
- };
89
- };
@@ -1,161 +0,0 @@
1
- "use strict";
2
-
3
- var utils = require("../utils");
4
- var log = require("npmlog");
5
- var bluebird = require("bluebird");
6
-
7
- module.exports = function (defaultFuncs, api, ctx) {
8
- function getGUID() {
9
- let _0x161e32 = Date.now(),
10
- _0x4ec135 = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(
11
- /[xy]/g,
12
- function (_0x32f946) {
13
- let _0x141041 = Math.floor((_0x161e32 + Math.random() * 16) % 16);
14
- _0x161e32 = Math.floor(_0x161e32 / 16);
15
- let _0x31fcdd = (
16
- _0x32f946 == "x" ? _0x141041 : (_0x141041 & 0x3) | 0x8
17
- ).toString(16);
18
- return _0x31fcdd;
19
- },
20
- );
21
- return _0x4ec135;
22
- }
23
-
24
- function uploadAttachment(attachment, callback) {
25
- var uploads = [];
26
-
27
- // create an array of promises
28
- if (!utils.isReadableStream(attachment)) {
29
- throw {
30
- error:
31
- "Attachment should be a readable stream and not " +
32
- utils.getType(attachment) +
33
- ".",
34
- };
35
- }
36
-
37
- var form = {
38
- file: attachment,
39
- av: api.getCurrentUserID(),
40
- profile_id: api.getCurrentUserID(),
41
- source: "19",
42
- target_id: api.getCurrentUserID(),
43
- __user: api.getCurrentUserID(),
44
- __a: "1",
45
- };
46
-
47
- uploads.push(
48
- defaultFuncs
49
- .postFormData(
50
- "https://www.facebook.com/ajax/ufi/upload",
51
- ctx.jar,
52
- form,
53
- {},
54
- )
55
- .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
56
- .then(function (resData) {
57
- if (resData.error) {
58
- throw resData;
59
- }
60
-
61
- // We have to return the data unformatted unless we want to change it
62
- // back in sendMessage.
63
- return resData.payload;
64
- }),
65
- );
66
-
67
- // resolve all promises
68
- bluebird
69
- .all(uploads)
70
- .then(function (resData) {
71
- callback(null, resData);
72
- })
73
- .catch(function (err) {
74
- log.error("uploadAttachment", err);
75
- return callback(err);
76
- });
77
- }
78
-
79
- async function sendCommentToFb(postId, text, fileID) {
80
- const feedback_id = Buffer.from("feedback:" + postId).toString("base64");
81
-
82
- const ss1 = getGUID();
83
- const ss2 = getGUID();
84
-
85
- const form = {
86
- av: api.getCurrentUserID(),
87
- fb_api_req_friendly_name: "CometUFICreateCommentMutation",
88
- fb_api_caller_class: "RelayModern",
89
- doc_id: "4744517358977326",
90
- variables: JSON.stringify({
91
- displayCommentsFeedbackContext: null,
92
- displayCommentsContextEnableComment: null,
93
- displayCommentsContextIsAdPreview: null,
94
- displayCommentsContextIsAggregatedShare: null,
95
- displayCommentsContextIsStorySet: null,
96
- feedLocation: "TIMELINE",
97
- feedbackSource: 0,
98
- focusCommentID: null,
99
- includeNestedComments: false,
100
- input: {
101
- attachments: fileID ? [{ media: { id: fileID } }] : null,
102
- feedback_id: feedback_id,
103
- formatting_style: null,
104
- message: {
105
- ranges: [],
106
- text: text,
107
- },
108
- is_tracking_encrypted: true,
109
- tracking: [],
110
- feedback_source: "PROFILE",
111
- idempotence_token: "client:" + ss1,
112
- session_id: ss2,
113
- actor_id: api.getCurrentUserID(),
114
- client_mutation_id: Math.round(Math.random() * 19),
115
- },
116
- scale: 3,
117
- useDefaultActor: false,
118
- UFI2CommentsProvider_commentsKey: "ProfileCometTimelineRoute",
119
- }),
120
- };
121
-
122
- const res = JSON.parse(
123
- await api.httpPost("https://www.facebook.com/api/graphql/", form),
124
- );
125
- return res;
126
- }
127
-
128
- return async function sendComment(content, postId, callback) {
129
- if (typeof content === "object") {
130
- var text = content.body || "";
131
- if (content.attachment) {
132
- if (!utils.isReadableStream(content.attachment)) {
133
- throw new Error("Attachment must be a ReadableStream");
134
- }
135
-
136
- uploadAttachment(content.attachment, async function (err, files) {
137
- if (err) {
138
- return callback(err);
139
- }
140
-
141
- await sendCommentToFb(postId, text, files[0].fbid)
142
- .then((res) => {
143
- return callback(null, res);
144
- })
145
- .catch((err) => {
146
- return callback(err);
147
- });
148
- });
149
- }
150
- } else if (typeof content === "string") {
151
- var text = content;
152
- await sendCommentToFb(postId, text, null)
153
- .then((res) => {
154
- return callback(null, res);
155
- })
156
- .catch((err) => {
157
- return callback(err);
158
- });
159
- } else throw new Error("Invalid content");
160
- };
161
- };