@cexy/hoonfca 1.0.1 → 1.0.3

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 (170) 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 +778 -1
  5. package/package.json +31 -84
  6. package/src/{apis/addExternalModule.js → addExternalModule.js} +4 -5
  7. package/src/addUserToGroup.js +113 -0
  8. package/src/changeAdminStatus.js +95 -0
  9. package/src/changeApprovalMode.js +79 -0
  10. package/src/changeArchivedStatus.js +55 -0
  11. package/src/changeBio.js +76 -0
  12. package/src/changeBlockedStatus.js +47 -0
  13. package/src/changeBlockedStatusMqtt.js +86 -0
  14. package/src/changeGroupImage.js +133 -0
  15. package/src/changeNickname.js +59 -0
  16. package/src/changeThreadColor.js +71 -0
  17. package/src/{apis/changeThreadEmoji.js → changeThreadEmoji.js} +8 -6
  18. package/src/createNewGroup.js +88 -0
  19. package/src/createPoll.js +130 -0
  20. package/src/deleteMessage.js +56 -0
  21. package/src/deleteThread.js +56 -0
  22. package/src/editMessage.js +63 -0
  23. package/src/forwardAttachment.js +60 -0
  24. package/src/forwardMessage.js +63 -0
  25. package/src/getCurrentUserID.js +7 -0
  26. package/src/getEmojiUrl.js +29 -0
  27. package/src/getFriendsList.js +84 -0
  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 +647 -0
  34. package/src/getThreadInfo.js +222 -0
  35. package/src/getThreadList.js +292 -0
  36. package/src/getThreadPictures.js +79 -0
  37. package/src/getUserID.js +66 -0
  38. package/src/getUserInfo.js +128 -0
  39. package/src/handleFriendRequest.js +57 -0
  40. package/src/handleMessageRequest.js +65 -0
  41. package/src/{apis/httpGet.js → httpGet.js} +15 -20
  42. package/src/httpPost.js +58 -0
  43. package/src/listenMqtt.js +1018 -0
  44. package/src/logout.js +75 -0
  45. package/src/markAsDelivered.js +58 -0
  46. package/src/{apis/markAsRead.js → markAsRead.js} +19 -30
  47. package/src/markAsReadAll.js +50 -0
  48. package/src/markAsSeen.js +61 -0
  49. package/src/muteThread.js +52 -0
  50. package/src/pinMessage.js +61 -0
  51. package/src/removeUserFromGroup.js +79 -0
  52. package/src/resolvePhotoUrl.js +45 -0
  53. package/src/searchForThread.js +53 -0
  54. package/src/searchUsers.js +89 -0
  55. package/src/sendComment.js +161 -0
  56. package/src/sendMessage.js +457 -0
  57. package/src/sendTypingIndicator.js +179 -0
  58. package/src/setBio.js +86 -0
  59. package/src/setMessageReaction.js +186 -0
  60. package/src/setPostReaction.js +71 -0
  61. package/src/setTheme.js +313 -0
  62. package/src/setTitle.js +90 -0
  63. package/src/shareContact.js +53 -0
  64. package/src/shareLink.js +62 -0
  65. package/src/threadColors.js +57 -0
  66. package/src/unfriend.js +53 -0
  67. package/src/unsendMessage.js +104 -0
  68. package/utils.js +1447 -0
  69. package/LICENSE +0 -3
  70. package/README.md +0 -491
  71. package/examples/login-with-cookies.js +0 -102
  72. package/examples/verify.js +0 -70
  73. package/src/apis/addUserToGroup.js +0 -108
  74. package/src/apis/changeAdminStatus.js +0 -148
  75. package/src/apis/changeArchivedStatus.js +0 -61
  76. package/src/apis/changeAvatar.js +0 -103
  77. package/src/apis/changeBio.js +0 -69
  78. package/src/apis/changeBlockedStatus.js +0 -54
  79. package/src/apis/changeGroupImage.js +0 -136
  80. package/src/apis/changeThreadColor.js +0 -116
  81. package/src/apis/comment.js +0 -207
  82. package/src/apis/createAITheme.js +0 -129
  83. package/src/apis/createNewGroup.js +0 -79
  84. package/src/apis/createPoll.js +0 -73
  85. package/src/apis/deleteMessage.js +0 -44
  86. package/src/apis/deleteThread.js +0 -52
  87. package/src/apis/e2ee.js +0 -17
  88. package/src/apis/editMessage.js +0 -70
  89. package/src/apis/emoji.js +0 -124
  90. package/src/apis/fetchThemeData.js +0 -82
  91. package/src/apis/follow.js +0 -81
  92. package/src/apis/forwardMessage.js +0 -52
  93. package/src/apis/friend.js +0 -243
  94. package/src/apis/gcmember.js +0 -122
  95. package/src/apis/gcname.js +0 -123
  96. package/src/apis/gcrule.js +0 -119
  97. package/src/apis/getAccess.js +0 -111
  98. package/src/apis/getBotInfo.js +0 -88
  99. package/src/apis/getBotInitialData.js +0 -43
  100. package/src/apis/getFriendsList.js +0 -79
  101. package/src/apis/getMessage.js +0 -423
  102. package/src/apis/getTheme.js +0 -95
  103. package/src/apis/getThemeInfo.js +0 -116
  104. package/src/apis/getThreadHistory.js +0 -239
  105. package/src/apis/getThreadInfo.js +0 -267
  106. package/src/apis/getThreadList.js +0 -232
  107. package/src/apis/getThreadPictures.js +0 -58
  108. package/src/apis/getUserID.js +0 -117
  109. package/src/apis/getUserInfo.js +0 -513
  110. package/src/apis/getUserInfoV2.js +0 -146
  111. package/src/apis/handleMessageRequest.js +0 -50
  112. package/src/apis/httpPost.js +0 -89
  113. package/src/apis/httpPostFormData.js +0 -69
  114. package/src/apis/listenMqtt.js +0 -1236
  115. package/src/apis/listenSpeed.js +0 -179
  116. package/src/apis/logout.js +0 -87
  117. package/src/apis/markAsDelivered.js +0 -47
  118. package/src/apis/markAsReadAll.js +0 -40
  119. package/src/apis/markAsSeen.js +0 -70
  120. package/src/apis/mqttDeltaValue.js +0 -278
  121. package/src/apis/muteThread.js +0 -45
  122. package/src/apis/nickname.js +0 -132
  123. package/src/apis/notes.js +0 -163
  124. package/src/apis/pinMessage.js +0 -150
  125. package/src/apis/produceMetaTheme.js +0 -180
  126. package/src/apis/realtime.js +0 -182
  127. package/src/apis/removeUserFromGroup.js +0 -117
  128. package/src/apis/resolvePhotoUrl.js +0 -58
  129. package/src/apis/searchForThread.js +0 -154
  130. package/src/apis/sendMessage.js +0 -354
  131. package/src/apis/sendMessageMqtt.js +0 -249
  132. package/src/apis/sendTypingIndicator.js +0 -91
  133. package/src/apis/setMessageReaction.js +0 -27
  134. package/src/apis/setMessageReactionMqtt.js +0 -61
  135. package/src/apis/setThreadTheme.js +0 -260
  136. package/src/apis/setThreadThemeMqtt.js +0 -94
  137. package/src/apis/share.js +0 -107
  138. package/src/apis/shareContact.js +0 -66
  139. package/src/apis/stickers.js +0 -257
  140. package/src/apis/story.js +0 -181
  141. package/src/apis/theme.js +0 -233
  142. package/src/apis/unfriend.js +0 -47
  143. package/src/apis/unsendMessage.js +0 -17
  144. package/src/engine/client.js +0 -92
  145. package/src/engine/models/buildAPI.js +0 -152
  146. package/src/engine/models/loginHelper.js +0 -519
  147. package/src/engine/models/setOptions.js +0 -88
  148. package/src/security/e2ee.js +0 -109
  149. package/src/types/index.d.ts +0 -498
  150. package/src/utils/antiSuspension.js +0 -506
  151. package/src/utils/auth-helpers.js +0 -149
  152. package/src/utils/autoReLogin.js +0 -336
  153. package/src/utils/axios.js +0 -436
  154. package/src/utils/cache.js +0 -54
  155. package/src/utils/clients.js +0 -282
  156. package/src/utils/constants.js +0 -410
  157. package/src/utils/formatters/data/formatAttachment.js +0 -370
  158. package/src/utils/formatters/data/formatDelta.js +0 -109
  159. package/src/utils/formatters/index.js +0 -159
  160. package/src/utils/formatters/value/formatCookie.js +0 -91
  161. package/src/utils/formatters/value/formatDate.js +0 -36
  162. package/src/utils/formatters/value/formatID.js +0 -16
  163. package/src/utils/formatters.js +0 -1373
  164. package/src/utils/headers.js +0 -230
  165. package/src/utils/index.js +0 -153
  166. package/src/utils/monitoring.js +0 -333
  167. package/src/utils/rateLimiter.js +0 -319
  168. package/src/utils/tokenRefresh.js +0 -657
  169. package/src/utils/user-agents.js +0 -238
  170. package/src/utils/validation.js +0 -157
@@ -1,108 +0,0 @@
1
- "use strict";
2
-
3
- const utils = require('../utils');
4
-
5
- module.exports = (defaultFuncs, api, ctx) => {
6
- return async function addUserToGroup(userID, threadID, callback) {
7
- let resolveFunc = () => {};
8
- let rejectFunc = () => {};
9
- const returnPromise = new Promise((resolve, reject) => {
10
- resolveFunc = resolve;
11
- rejectFunc = reject;
12
- });
13
-
14
- if (!callback) {
15
- callback = (err, result) => {
16
- if (err) return rejectFunc(err);
17
- resolveFunc(result);
18
- };
19
- }
20
-
21
- try {
22
- if (!ctx.mqttClient) {
23
- throw new Error("Not connected to MQTT. Please use listenMqtt first.");
24
- }
25
-
26
- if (utils.getType(threadID) !== "Number" && utils.getType(threadID) !== "String") {
27
- throw new Error("ThreadID should be of type Number or String");
28
- }
29
-
30
- if (utils.getType(userID) !== "Array") {
31
- userID = [userID];
32
- }
33
-
34
- const reqID = ++ctx.wsReqNumber;
35
- const taskID = ++ctx.wsTaskNumber;
36
-
37
- const payload = {
38
- epoch_id: utils.generateOfflineThreadingID(),
39
- tasks: [
40
- {
41
- failure_count: null,
42
- label: "23",
43
- payload: JSON.stringify({
44
- thread_key: threadID,
45
- contact_ids: userID,
46
- sync_group: 1
47
- }),
48
- queue_name: threadID.toString(),
49
- task_id: taskID
50
- }
51
- ],
52
- version_id: "24502707779384158"
53
- };
54
-
55
- const form = JSON.stringify({
56
- app_id: "772021112871879",
57
- payload: JSON.stringify(payload),
58
- request_id: reqID,
59
- type: 3
60
- });
61
-
62
- let responseHandled = false;
63
- const handleRes = (topic, message) => {
64
- if (topic !== "/ls_resp" || responseHandled) return;
65
- let jsonMsg;
66
- try {
67
- jsonMsg = JSON.parse(message.toString());
68
- jsonMsg.payload = JSON.parse(jsonMsg.payload);
69
- } catch {
70
- return;
71
- }
72
- if (jsonMsg.request_id !== reqID) return;
73
- responseHandled = true;
74
- clearTimeout(timeout);
75
- ctx.mqttClient.removeListener("message", handleRes);
76
- callback(null, { success: true, response: jsonMsg.payload });
77
- resolveFunc({ success: true, response: jsonMsg.payload });
78
- };
79
-
80
- const timeout = setTimeout(() => {
81
- if (!responseHandled) {
82
- responseHandled = true;
83
- ctx.mqttClient.removeListener("message", handleRes);
84
- const err = new Error("MQTT request timeout");
85
- callback(err);
86
- rejectFunc(err);
87
- }
88
- }, 30000);
89
-
90
- ctx.mqttClient.on("message", handleRes);
91
- ctx.mqttClient.publish("/ls_req", form, { qos: 1, retain: false }, (err) => {
92
- if (err && !responseHandled) {
93
- responseHandled = true;
94
- clearTimeout(timeout);
95
- ctx.mqttClient.removeListener("message", handleRes);
96
- callback(err);
97
- rejectFunc(err);
98
- }
99
- });
100
- } catch (err) {
101
- utils.error("addUserToGroup", err);
102
- callback(err);
103
- rejectFunc(err);
104
- }
105
-
106
- return returnPromise;
107
- };
108
- };
@@ -1,148 +0,0 @@
1
- "use strict";
2
-
3
- const utils = require('../utils');
4
-
5
- function generateOfflineThreadingID() {
6
- return Date.now().toString() + Math.floor(Math.random() * 1000000).toString();
7
- }
8
-
9
- function getType(obj) {
10
- return Object.prototype.toString.call(obj).slice(8, -1);
11
- }
12
-
13
- module.exports = function (defaultFuncs, api, ctx) {
14
- return function changeAdminStatus(threadID, adminID, adminStatus, callback) {
15
- let resolveFunc = function() {};
16
- let rejectFunc = function() {};
17
- const returnPromise = new Promise(function(resolve, reject) {
18
- resolveFunc = resolve;
19
- rejectFunc = reject;
20
- });
21
-
22
- if (!callback) {
23
- callback = function(err, data) {
24
- if (err) return rejectFunc(err);
25
- resolveFunc(data);
26
- };
27
- }
28
-
29
- if (getType(threadID) !== "String") {
30
- return callback({ error: "changeAdminStatus: threadID must be a string" });
31
- }
32
- if (getType(adminID) !== "String" && getType(adminID) !== "Array") {
33
- return callback({ error: "changeAdminStatus: adminID must be a string or an array" });
34
- }
35
- if (getType(adminStatus) !== "Boolean") {
36
- return callback({ error: "changeAdminStatus: adminStatus must be true or false" });
37
- }
38
-
39
- if (ctx.mqttClient) {
40
- const tasks = [];
41
- const isAdmin = adminStatus ? 1 : 0;
42
- const epochID = generateOfflineThreadingID();
43
-
44
- if (getType(adminID) === "Array") {
45
- adminID.forEach((id, index) => {
46
- tasks.push({
47
- failure_count: null,
48
- label: "25",
49
- payload: JSON.stringify({
50
- thread_key: threadID,
51
- contact_id: id,
52
- is_admin: isAdmin
53
- }),
54
- queue_name: "admin_status",
55
- task_id: index + 1
56
- });
57
- });
58
- } else {
59
- tasks.push({
60
- failure_count: null,
61
- label: "25",
62
- payload: JSON.stringify({
63
- thread_key: threadID,
64
- contact_id: adminID,
65
- is_admin: isAdmin
66
- }),
67
- queue_name: "admin_status",
68
- task_id: 1
69
- });
70
- }
71
-
72
- let count_req = 0;
73
- const form = JSON.stringify({
74
- app_id: "2220391788200892",
75
- payload: JSON.stringify({
76
- epoch_id: epochID,
77
- tasks: tasks,
78
- version_id: "8798795233522156"
79
- }),
80
- request_id: ++count_req,
81
- type: 3
82
- });
83
-
84
- ctx.mqttClient.publish("/ls_req", form, {}, (err, _packet) => {
85
- if (err) {
86
- utils.error("changeAdminStatus (MQTT)", err);
87
- return callback(err);
88
- } else {
89
- utils.log("Admin status changed successfully via MQTT");
90
- return callback(null, { success: true });
91
- }
92
- });
93
- } else {
94
- utils.warn("MQTT client not available, using HTTP fallback for changeAdminStatus");
95
- const tasks = [];
96
- const epochID = generateOfflineThreadingID();
97
-
98
- if (getType(adminID) === "Array") {
99
- adminID.forEach((id, index) => {
100
- tasks.push({
101
- label: '25',
102
- payload: JSON.stringify({ thread_key: threadID, contact_id: id, is_admin: adminStatus }),
103
- queue_name: 'admin_status',
104
- task_id: index + 1,
105
- failure_count: null
106
- });
107
- });
108
- } else {
109
- tasks.push({
110
- label: '25',
111
- payload: JSON.stringify({ thread_key: threadID, contact_id: adminID, is_admin: adminStatus }),
112
- queue_name: 'admin_status',
113
- task_id: 1,
114
- failure_count: null
115
- });
116
- }
117
-
118
- const form = {
119
- fb_dtsg: ctx.fb_dtsg,
120
- request_id: 1,
121
- type: 3,
122
- payload: {
123
- version_id: '3816854585040595',
124
- tasks: tasks,
125
- epoch_id: epochID,
126
- data_trace_id: null
127
- },
128
- app_id: '772021112871879'
129
- };
130
-
131
- form.payload = JSON.stringify(form.payload);
132
-
133
- defaultFuncs
134
- .post("https://www.facebook.com/api/graphqlbatch/", ctx.jar, form)
135
- .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
136
- .then(() => {
137
- utils.log("Admin status changed successfully via HTTP");
138
- callback(null, { success: true });
139
- })
140
- .catch(err => {
141
- utils.error("changeAdminStatus (HTTP)", err);
142
- callback(err);
143
- });
144
- }
145
-
146
- return returnPromise;
147
- };
148
- };
@@ -1,61 +0,0 @@
1
- "use strict";
2
-
3
- const utils = require('../utils');
4
-
5
- module.exports = (defaultFuncs, api, ctx) => {
6
- return async function changeArchivedStatus(threadIDs, archive, callback) {
7
- let resolveFunc = () => {};
8
- let rejectFunc = () => {};
9
- const returnPromise = new Promise((resolve, reject) => {
10
- resolveFunc = resolve;
11
- rejectFunc = reject;
12
- });
13
-
14
- if (!callback) {
15
- callback = (err, result) => {
16
- if (err) return rejectFunc(err);
17
- resolveFunc(result);
18
- };
19
- }
20
-
21
- try {
22
- if (utils.getType(archive) === "Function") {
23
- callback = archive;
24
- archive = true;
25
- }
26
-
27
- if (utils.getType(archive) !== "Boolean") {
28
- throw new Error("archive parameter must be a boolean");
29
- }
30
-
31
- if (!Array.isArray(threadIDs)) {
32
- threadIDs = [threadIDs];
33
- }
34
-
35
- const form = {
36
- should_archive: archive
37
- };
38
-
39
- threadIDs.forEach(id => {
40
- form[`thread_fbids[${id}]`] = true;
41
- });
42
-
43
- const res = await defaultFuncs.post(
44
- "https://www.facebook.com/ajax/mercury/change_archived_status.php",
45
- ctx.jar,
46
- form
47
- ).then(utils.parseAndCheckLogin(ctx, defaultFuncs));
48
-
49
- if (res && res.error) {
50
- throw res;
51
- }
52
-
53
- callback(null, { success: true });
54
- } catch (err) {
55
- utils.error("changeArchivedStatus", err);
56
- callback(err);
57
- }
58
-
59
- return returnPromise;
60
- };
61
- };
@@ -1,103 +0,0 @@
1
- "use strict";
2
-
3
- const utils = require('../utils');
4
-
5
- module.exports = (defaultFuncs, api, ctx) => {
6
- async function handleUpload(image) {
7
- const form = {
8
- profile_id: ctx.userID,
9
- photo_source: 57,
10
- av: ctx.userID,
11
- file: image
12
- };
13
-
14
- return defaultFuncs.postFormData(
15
- "https://www.facebook.com/profile/picture/upload/",
16
- ctx.jar,
17
- form,
18
- {}
19
- ).then(utils.parseAndCheckLogin(ctx, defaultFuncs))
20
- .then(resData => {
21
- if (resData.error) throw resData;
22
- return resData;
23
- });
24
- }
25
-
26
- return async function changeAvatar(image, caption, timestamp, callback) {
27
- let resolveFunc = () => {};
28
- let rejectFunc = () => {};
29
- const returnPromise = new Promise((resolve, reject) => {
30
- resolveFunc = resolve;
31
- rejectFunc = reject;
32
- });
33
-
34
- if (!timestamp && utils.getType(caption) === "Number") {
35
- timestamp = caption;
36
- caption = "";
37
- }
38
-
39
- if (!timestamp && !callback && (utils.getType(caption) === "Function")) {
40
- callback = caption;
41
- caption = "";
42
- timestamp = null;
43
- }
44
-
45
- if (!callback) {
46
- callback = (err, data) => {
47
- if (err) return rejectFunc(err);
48
- resolveFunc(data);
49
- };
50
- }
51
-
52
- try {
53
- if (!utils.isReadableStream(image)) {
54
- throw new Error("Image is not a readable stream");
55
- }
56
-
57
- const payload = await handleUpload(image);
58
-
59
- const form = {
60
- av: ctx.i_userID || ctx.userID,
61
- fb_api_req_friendly_name: "ProfileCometProfilePictureSetMutation",
62
- fb_api_caller_class: "RelayModern",
63
- doc_id: "5066134240065849",
64
- variables: JSON.stringify({
65
- input: {
66
- caption: caption || "",
67
- existing_photo_id: payload.payload.fbid,
68
- expiration_time: timestamp,
69
- profile_id: ctx.i_userID || ctx.userID,
70
- profile_pic_method: "EXISTING",
71
- profile_pic_source: "TIMELINE",
72
- scaled_crop_rect: {
73
- height: 1,
74
- width: 1,
75
- x: 0,
76
- y: 0
77
- },
78
- skip_cropping: true,
79
- actor_id: ctx.i_userID || ctx.userID,
80
- client_mutation_id: Math.round(Math.random() * 19).toString()
81
- },
82
- isPage: false,
83
- isProfile: true,
84
- scale: 3
85
- })
86
- };
87
-
88
- const res = await defaultFuncs.post("https://www.facebook.com/api/graphql/", ctx.jar, form)
89
- .then(utils.parseAndCheckLogin(ctx, defaultFuncs));
90
-
91
- if (res.errors) {
92
- throw res;
93
- }
94
-
95
- callback(null, res[0].data.profile_picture_set);
96
- } catch (err) {
97
- utils.error("changeAvatar", err);
98
- callback(err);
99
- }
100
-
101
- return returnPromise;
102
- };
103
- };
@@ -1,69 +0,0 @@
1
- "use strict";
2
-
3
- const utils = require('../utils');
4
-
5
- module.exports = (defaultFuncs, api, ctx) => {
6
- return async function changeBio(bio, publish, callback) {
7
- let resolveFunc = () => {};
8
- let rejectFunc = () => {};
9
- const returnPromise = new Promise((resolve, reject) => {
10
- resolveFunc = resolve;
11
- rejectFunc = reject;
12
- });
13
-
14
- if (!callback) {
15
- if (utils.getType(publish) === "Function") {
16
- callback = publish;
17
- publish = false;
18
- } else {
19
- callback = (err) => {
20
- if (err) return rejectFunc(err);
21
- resolveFunc();
22
- };
23
- }
24
- }
25
-
26
- if (utils.getType(publish) !== "Boolean") {
27
- publish = false;
28
- }
29
-
30
- if (utils.getType(bio) !== "String") {
31
- bio = "";
32
- publish = false;
33
- }
34
-
35
- try {
36
- const form = {
37
- fb_api_caller_class: "RelayModern",
38
- fb_api_req_friendly_name: "ProfileCometSetBioMutation",
39
- doc_id: "2725043627607610",
40
- variables: JSON.stringify({
41
- input: {
42
- bio: bio,
43
- publish_bio_feed_story: publish,
44
- actor_id: ctx.i_userID || ctx.userID,
45
- client_mutation_id: Math.round(Math.random() * 1024).toString()
46
- },
47
- hasProfileTileViewID: false,
48
- profileTileViewID: null,
49
- scale: 1
50
- }),
51
- av: ctx.i_userID || ctx.userID
52
- };
53
-
54
- const res = await defaultFuncs.post("https://www.facebook.com/api/graphql/", ctx.jar, form)
55
- .then(utils.parseAndCheckLogin(ctx, defaultFuncs));
56
-
57
- if (res.errors) {
58
- throw res;
59
- }
60
-
61
- callback(null, { success: true });
62
- } catch (err) {
63
- utils.error("changeBio", err);
64
- callback(err);
65
- }
66
-
67
- return returnPromise;
68
- };
69
- };
@@ -1,54 +0,0 @@
1
- "use strict";
2
-
3
- const utils = require('../utils');
4
-
5
- module.exports = (defaultFuncs, api, ctx) => {
6
- return async function changeBlockedStatus(userID, block, callback) {
7
- let resolveFunc = () => {};
8
- let rejectFunc = () => {};
9
- const returnPromise = new Promise((resolve, reject) => {
10
- resolveFunc = resolve;
11
- rejectFunc = reject;
12
- });
13
-
14
- if (!callback) {
15
- callback = (err, result) => {
16
- if (err) return rejectFunc(err);
17
- resolveFunc(result);
18
- };
19
- }
20
-
21
- try {
22
- if (utils.getType(block) === "Function") {
23
- callback = block;
24
- block = true;
25
- }
26
-
27
- if (utils.getType(block) !== "Boolean") {
28
- throw new Error("block parameter must be a boolean");
29
- }
30
-
31
- const form = {
32
- fbid: userID,
33
- block: block
34
- };
35
-
36
- const res = await defaultFuncs.post(
37
- "https://www.facebook.com/ajax/profile/manage_blocking.php",
38
- ctx.jar,
39
- form
40
- ).then(utils.parseAndCheckLogin(ctx, defaultFuncs));
41
-
42
- if (res && res.error) {
43
- throw res;
44
- }
45
-
46
- return callback(null, { success: true, blocked: block });
47
- } catch (err) {
48
- utils.error("changeBlockedStatus", err);
49
- callback(err);
50
- }
51
-
52
- return returnPromise;
53
- };
54
- };
@@ -1,136 +0,0 @@
1
- "use strict";
2
-
3
- const utils = require('../utils');
4
-
5
- module.exports = (defaultFuncs, api, ctx) => {
6
- async function handleUpload(image) {
7
- const form = {
8
- images_only: "true",
9
- "attachment[]": image
10
- };
11
- return defaultFuncs
12
- .postFormData("https://upload.facebook.com/ajax/mercury/upload.php", ctx.jar, form, {})
13
- .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
14
- .then(resData => {
15
- if (resData.error) throw resData;
16
- return resData.payload.metadata[0];
17
- });
18
- }
19
-
20
- return async function changeGroupImage(image, threadID, callback) {
21
- let resolveFunc = () => {};
22
- let rejectFunc = () => {};
23
- const returnPromise = new Promise((resolve, reject) => {
24
- resolveFunc = resolve;
25
- rejectFunc = reject;
26
- });
27
-
28
- if (!callback) {
29
- callback = (err, result) => {
30
- if (err) return rejectFunc(err);
31
- resolveFunc(result);
32
- };
33
- }
34
-
35
- try {
36
- if (!ctx.mqttClient) {
37
- throw new Error("Not connected to MQTT. Please use listenMqtt first.");
38
- }
39
-
40
- if (!threadID || typeof threadID !== "string") {
41
- throw new Error("Invalid threadID");
42
- }
43
-
44
- if (!utils.isReadableStream(image)) {
45
- throw new Error("image must be a readable stream");
46
- }
47
-
48
- const reqID = ++ctx.wsReqNumber;
49
- const taskID = ++ctx.wsTaskNumber;
50
-
51
- let responseHandled = false;
52
- const onResponse = (topic, message) => {
53
- if (topic !== "/ls_resp" || responseHandled) return;
54
- let jsonMsg;
55
- try {
56
- jsonMsg = JSON.parse(message.toString());
57
- jsonMsg.payload = JSON.parse(jsonMsg.payload);
58
- } catch (err) {
59
- return;
60
- }
61
- if (jsonMsg.request_id !== reqID) return;
62
- responseHandled = true;
63
- clearTimeout(timeout);
64
- ctx.mqttClient.removeListener("message", onResponse);
65
- callback(null, { success: true, response: jsonMsg.payload });
66
- resolveFunc({ success: true, response: jsonMsg.payload });
67
- };
68
-
69
- const timeout = setTimeout(() => {
70
- if (!responseHandled) {
71
- responseHandled = true;
72
- ctx.mqttClient.removeListener("message", onResponse);
73
- const err = new Error("MQTT request timeout");
74
- callback(err);
75
- rejectFunc(err);
76
- }
77
- }, 30000);
78
-
79
- ctx.mqttClient.on("message", onResponse);
80
-
81
- const payload = await handleUpload(image);
82
- const imageID = payload.image_id;
83
-
84
- const taskPayload = {
85
- thread_key: threadID,
86
- image_id: imageID,
87
- sync_group: 1
88
- };
89
-
90
- const mqttPayload = {
91
- epoch_id: utils.generateOfflineThreadingID(),
92
- tasks: [
93
- {
94
- failure_count: null,
95
- label: "37",
96
- payload: JSON.stringify(taskPayload),
97
- queue_name: "thread_image",
98
- task_id: taskID
99
- }
100
- ],
101
- version_id: "8798795233522156"
102
- };
103
-
104
- const request = {
105
- app_id: "2220391788200892",
106
- payload: JSON.stringify(mqttPayload),
107
- request_id: reqID,
108
- type: 3
109
- };
110
-
111
- ctx.mqttClient.publish("/ls_req", JSON.stringify(request), {
112
- qos: 1,
113
- retain: false
114
- }, (err) => {
115
- if (err && !responseHandled) {
116
- responseHandled = true;
117
- clearTimeout(timeout);
118
- ctx.mqttClient.removeListener("message", onResponse);
119
- callback(err);
120
- rejectFunc(err);
121
- }
122
- });
123
- } catch (err) {
124
- if (!responseHandled) {
125
- responseHandled = true;
126
- clearTimeout(timeout);
127
- ctx.mqttClient.removeListener("message", onResponse);
128
- utils.error("changeGroupImage", err);
129
- callback(err);
130
- rejectFunc(err);
131
- }
132
- }
133
-
134
- return returnPromise;
135
- };
136
- };