fca-riyad 37.0.0

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 (242) hide show
  1. package/CHANGELOG.md +325 -0
  2. package/DOCS.md +2712 -0
  3. package/README.md +410 -0
  4. package/func/checkUpdate.js +7 -0
  5. package/func/logAdapter.js +33 -0
  6. package/func/logger.js +48 -0
  7. package/index.d.ts +751 -0
  8. package/index.js +22 -0
  9. package/module/config.js +40 -0
  10. package/module/login.js +133 -0
  11. package/module/loginHelper.js +1359 -0
  12. package/module/options.js +44 -0
  13. package/package.json +95 -0
  14. package/src/api/action/addExternalModule.js +25 -0
  15. package/src/api/action/changeAvatar.js +137 -0
  16. package/src/api/action/changeBio.js +75 -0
  17. package/src/api/action/enableAutoSaveAppState.js +73 -0
  18. package/src/api/action/getCurrentUserID.js +7 -0
  19. package/src/api/action/handleFriendRequest.js +57 -0
  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 +126 -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 +91 -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 +111 -0
  35. package/src/api/messaging/createNewGroup.js +88 -0
  36. package/src/api/messaging/createPoll.js +46 -0
  37. package/src/api/messaging/createThemeAI.js +98 -0
  38. package/src/api/messaging/deleteMessage.js +136 -0
  39. package/src/api/messaging/deleteThread.js +56 -0
  40. package/src/api/messaging/editMessage.js +90 -0
  41. package/src/api/messaging/forwardAttachment.js +57 -0
  42. package/src/api/messaging/forwardMessage.js +134 -0
  43. package/src/api/messaging/getEmojiUrl.js +29 -0
  44. package/src/api/messaging/getFriendsList.js +82 -0
  45. package/src/api/messaging/getMessage.js +829 -0
  46. package/src/api/messaging/getThemePictures.js +62 -0
  47. package/src/api/messaging/handleMessageRequest.js +65 -0
  48. package/src/api/messaging/markAsDelivered.js +57 -0
  49. package/src/api/messaging/markAsRead.js +88 -0
  50. package/src/api/messaging/markAsReadAll.js +49 -0
  51. package/src/api/messaging/markAsSeen.js +61 -0
  52. package/src/api/messaging/muteThread.js +50 -0
  53. package/src/api/messaging/pinMessage.js +115 -0
  54. package/src/api/messaging/removeUserFromGroup.js +62 -0
  55. package/src/api/messaging/resolvePhotoUrl.js +43 -0
  56. package/src/api/messaging/scheduler.js +264 -0
  57. package/src/api/messaging/searchForThread.js +53 -0
  58. package/src/api/messaging/sendBroadcast.js +93 -0
  59. package/src/api/messaging/sendMessage.js +269 -0
  60. package/src/api/messaging/sendTypingIndicator.js +74 -0
  61. package/src/api/messaging/sessionGuard.js +130 -0
  62. package/src/api/messaging/setMessageReaction.js +95 -0
  63. package/src/api/messaging/setTitle.js +124 -0
  64. package/src/api/messaging/shareContact.js +49 -0
  65. package/src/api/messaging/threadColors.js +128 -0
  66. package/src/api/messaging/unsendMessage.js +81 -0
  67. package/src/api/messaging/uploadAttachment.js +492 -0
  68. package/src/api/socket/OldMessage.js +186 -0
  69. package/src/api/socket/core/connectMqtt.js +269 -0
  70. package/src/api/socket/core/emitAuth.js +103 -0
  71. package/src/api/socket/core/getSeqID.js +321 -0
  72. package/src/api/socket/core/getTaskResponseData.js +25 -0
  73. package/src/api/socket/core/parseDelta.js +387 -0
  74. package/src/api/socket/detail/buildStream.js +215 -0
  75. package/src/api/socket/detail/constants.js +28 -0
  76. package/src/api/socket/e2ee/crypto.js +173 -0
  77. package/src/api/socket/e2ee/e2ee/crypto.js +173 -0
  78. package/src/api/socket/e2ee/e2ee/index.js +421 -0
  79. package/src/api/socket/e2ee/e2ee/proto/ArmadilloApplication.proto +281 -0
  80. package/src/api/socket/e2ee/e2ee/proto/ArmadilloICDC.proto +14 -0
  81. package/src/api/socket/e2ee/e2ee/proto/ConsumerApplication.proto +232 -0
  82. package/src/api/socket/e2ee/e2ee/proto/MessageApplication.proto +82 -0
  83. package/src/api/socket/e2ee/e2ee/proto/MessageTransport.proto +77 -0
  84. package/src/api/socket/e2ee/e2ee/proto/WACommon.proto +66 -0
  85. package/src/api/socket/e2ee/e2ee/proto/WAMediaTransport.proto +176 -0
  86. package/src/api/socket/e2ee/e2ee/proto/proto-writer.ts +76 -0
  87. package/src/api/socket/e2ee/e2ee/protocol.js +196 -0
  88. package/src/api/socket/e2ee/e2ee/ratchet.js +219 -0
  89. package/src/api/socket/e2ee/e2ee/store.js +182 -0
  90. package/src/api/socket/e2ee/e2ee/vendor/fb-e2ee.cjs +9162 -0
  91. package/src/api/socket/e2ee/e2ee/vendor/proto/ArmadilloApplication.proto +281 -0
  92. package/src/api/socket/e2ee/e2ee/vendor/proto/ArmadilloICDC.proto +14 -0
  93. package/src/api/socket/e2ee/e2ee/vendor/proto/ConsumerApplication.proto +232 -0
  94. package/src/api/socket/e2ee/e2ee/vendor/proto/MessageApplication.proto +82 -0
  95. package/src/api/socket/e2ee/e2ee/vendor/proto/MessageTransport.proto +77 -0
  96. package/src/api/socket/e2ee/e2ee/vendor/proto/WACommon.proto +66 -0
  97. package/src/api/socket/e2ee/e2ee/vendor/proto/WAMediaTransport.proto +176 -0
  98. package/src/api/socket/e2ee/e2ee/vendor/proto/proto-writer.ts +76 -0
  99. package/src/api/socket/e2ee/index.js +437 -0
  100. package/src/api/socket/e2ee/proto/ArmadilloApplication.proto +281 -0
  101. package/src/api/socket/e2ee/proto/ArmadilloICDC.proto +14 -0
  102. package/src/api/socket/e2ee/proto/ConsumerApplication.proto +232 -0
  103. package/src/api/socket/e2ee/proto/MessageApplication.proto +82 -0
  104. package/src/api/socket/e2ee/proto/MessageTransport.proto +77 -0
  105. package/src/api/socket/e2ee/proto/WACommon.proto +66 -0
  106. package/src/api/socket/e2ee/proto/WAMediaTransport.proto +176 -0
  107. package/src/api/socket/e2ee/proto/proto-writer.ts +76 -0
  108. package/src/api/socket/e2ee/protocol.js +196 -0
  109. package/src/api/socket/e2ee/ratchet.js +219 -0
  110. package/src/api/socket/e2ee/store.js +182 -0
  111. package/src/api/socket/e2ee/vendor/fb-e2ee.cjs +9162 -0
  112. package/src/api/socket/e2ee/vendor/proto/ArmadilloApplication.proto +281 -0
  113. package/src/api/socket/e2ee/vendor/proto/ArmadilloICDC.proto +14 -0
  114. package/src/api/socket/e2ee/vendor/proto/ConsumerApplication.proto +232 -0
  115. package/src/api/socket/e2ee/vendor/proto/MessageApplication.proto +82 -0
  116. package/src/api/socket/e2ee/vendor/proto/MessageTransport.proto +77 -0
  117. package/src/api/socket/e2ee/vendor/proto/WACommon.proto +66 -0
  118. package/src/api/socket/e2ee/vendor/proto/WAMediaTransport.proto +176 -0
  119. package/src/api/socket/e2ee/vendor/proto/proto-writer.ts +76 -0
  120. package/src/api/socket/listenE2EE.js +75 -0
  121. package/src/api/socket/listenMqtt.js +388 -0
  122. package/src/api/socket/middleware/index.js +216 -0
  123. package/src/api/socket/sendMessage.js +309 -0
  124. package/src/api/socket/sendMessageMqtt.js +69 -0
  125. package/src/api/threads/getThreadHistory.js +664 -0
  126. package/src/api/threads/getThreadInfo.js +296 -0
  127. package/src/api/threads/getThreadList.js +293 -0
  128. package/src/api/threads/getThreadPictures.js +78 -0
  129. package/src/api/users/getUserID.js +65 -0
  130. package/src/api/users/getUserInfo.js +402 -0
  131. package/src/api/users/getUserInfoV2.js +134 -0
  132. package/src/app/MessengerBot.js +209 -0
  133. package/src/app/MessengerContext.js +32 -0
  134. package/src/app/createFcaClient.js +136 -0
  135. package/src/app/threadInfoRealtimeSync.js +284 -0
  136. package/src/core/sendReqMqtt.js +96 -0
  137. package/src/database/helpers.js +53 -0
  138. package/src/database/models/index.js +88 -0
  139. package/src/database/models/thread.js +50 -0
  140. package/src/database/models/user.js +46 -0
  141. package/src/database/threadData.js +94 -0
  142. package/src/database/userData.js +98 -0
  143. package/src/remote/remoteClient.js +123 -0
  144. package/src/utils/broadcast.js +51 -0
  145. package/src/utils/client.js +10 -0
  146. package/src/utils/constants.js +23 -0
  147. package/src/utils/cookies.js +68 -0
  148. package/src/utils/format/attachment.js +357 -0
  149. package/src/utils/format/cookie.js +9 -0
  150. package/src/utils/format/date.js +50 -0
  151. package/src/utils/format/decode.js +44 -0
  152. package/src/utils/format/delta.js +194 -0
  153. package/src/utils/format/ids.js +64 -0
  154. package/src/utils/format/index.js +64 -0
  155. package/src/utils/format/message.js +88 -0
  156. package/src/utils/format/presence.js +132 -0
  157. package/src/utils/format/readTyp.js +44 -0
  158. package/src/utils/format/thread.js +42 -0
  159. package/src/utils/format/utils.js +141 -0
  160. package/src/utils/headers.js +115 -0
  161. package/src/utils/loginParser/autoLogin.js +125 -0
  162. package/src/utils/loginParser/helpers.js +43 -0
  163. package/src/utils/loginParser/index.js +10 -0
  164. package/src/utils/loginParser/parseAndCheckLogin.js +220 -0
  165. package/src/utils/loginParser/textUtils.js +28 -0
  166. package/src/utils/nexca-logger.js +144 -0
  167. package/src/utils/nexca-utils.js +686 -0
  168. package/src/utils/request/client.js +26 -0
  169. package/src/utils/request/config.js +23 -0
  170. package/src/utils/request/defaults.js +46 -0
  171. package/src/utils/request/helpers.js +46 -0
  172. package/src/utils/request/index.js +17 -0
  173. package/src/utils/request/methods.js +163 -0
  174. package/src/utils/request/proxy.js +21 -0
  175. package/src/utils/request/retry.js +77 -0
  176. package/src/utils/request/sanitize.js +49 -0
  177. package/src/utils/versionCheck.js +47 -0
  178. package/src/vendor/fca-unofficial/.github/workflows/nodejs.yml +26 -0
  179. package/src/vendor/fca-unofficial/.github/workflows/npmpublish.yml +30 -0
  180. package/src/vendor/fca-unofficial/.travis.yml +6 -0
  181. package/src/vendor/fca-unofficial/DOCS.md +1731 -0
  182. package/src/vendor/fca-unofficial/LICENSE-MIT +21 -0
  183. package/src/vendor/fca-unofficial/README.md +225 -0
  184. package/src/vendor/fca-unofficial/index.js +619 -0
  185. package/src/vendor/fca-unofficial/package.json +76 -0
  186. package/src/vendor/fca-unofficial/src/addExternalModule.js +19 -0
  187. package/src/vendor/fca-unofficial/src/addUserToGroup.js +113 -0
  188. package/src/vendor/fca-unofficial/src/changeAdminStatus.js +79 -0
  189. package/src/vendor/fca-unofficial/src/changeArchivedStatus.js +55 -0
  190. package/src/vendor/fca-unofficial/src/changeBio.js +77 -0
  191. package/src/vendor/fca-unofficial/src/changeBlockedStatus.js +47 -0
  192. package/src/vendor/fca-unofficial/src/changeGroupImage.js +129 -0
  193. package/src/vendor/fca-unofficial/src/changeNickname.js +59 -0
  194. package/src/vendor/fca-unofficial/src/changeThreadColor.js +71 -0
  195. package/src/vendor/fca-unofficial/src/changeThreadEmoji.js +55 -0
  196. package/src/vendor/fca-unofficial/src/createNewGroup.js +86 -0
  197. package/src/vendor/fca-unofficial/src/createPoll.js +71 -0
  198. package/src/vendor/fca-unofficial/src/deleteMessage.js +56 -0
  199. package/src/vendor/fca-unofficial/src/deleteThread.js +56 -0
  200. package/src/vendor/fca-unofficial/src/forwardAttachment.js +60 -0
  201. package/src/vendor/fca-unofficial/src/getCurrentUserID.js +7 -0
  202. package/src/vendor/fca-unofficial/src/getEmojiUrl.js +29 -0
  203. package/src/vendor/fca-unofficial/src/getFriendsList.js +84 -0
  204. package/src/vendor/fca-unofficial/src/getThreadHistory.js +645 -0
  205. package/src/vendor/fca-unofficial/src/getThreadHistoryDeprecated.js +93 -0
  206. package/src/vendor/fca-unofficial/src/getThreadInfo.js +201 -0
  207. package/src/vendor/fca-unofficial/src/getThreadInfoDeprecated.js +80 -0
  208. package/src/vendor/fca-unofficial/src/getThreadList.js +238 -0
  209. package/src/vendor/fca-unofficial/src/getThreadListDeprecated.js +75 -0
  210. package/src/vendor/fca-unofficial/src/getThreadPictures.js +79 -0
  211. package/src/vendor/fca-unofficial/src/getUserID.js +66 -0
  212. package/src/vendor/fca-unofficial/src/getUserInfo.js +72 -0
  213. package/src/vendor/fca-unofficial/src/handleFriendRequest.js +61 -0
  214. package/src/vendor/fca-unofficial/src/handleMessageRequest.js +65 -0
  215. package/src/vendor/fca-unofficial/src/httpGet.js +52 -0
  216. package/src/vendor/fca-unofficial/src/httpPost.js +52 -0
  217. package/src/vendor/fca-unofficial/src/listenMqtt.js +788 -0
  218. package/src/vendor/fca-unofficial/src/logout.js +75 -0
  219. package/src/vendor/fca-unofficial/src/markAsDelivered.js +58 -0
  220. package/src/vendor/fca-unofficial/src/markAsRead.js +80 -0
  221. package/src/vendor/fca-unofficial/src/markAsReadAll.js +50 -0
  222. package/src/vendor/fca-unofficial/src/markAsSeen.js +59 -0
  223. package/src/vendor/fca-unofficial/src/muteThread.js +52 -0
  224. package/src/vendor/fca-unofficial/src/removeUserFromGroup.js +79 -0
  225. package/src/vendor/fca-unofficial/src/resolvePhotoUrl.js +45 -0
  226. package/src/vendor/fca-unofficial/src/searchForThread.js +53 -0
  227. package/src/vendor/fca-unofficial/src/sendMessage.js +459 -0
  228. package/src/vendor/fca-unofficial/src/sendTypingIndicator.js +103 -0
  229. package/src/vendor/fca-unofficial/src/setMessageReaction.js +117 -0
  230. package/src/vendor/fca-unofficial/src/setPostReaction.js +76 -0
  231. package/src/vendor/fca-unofficial/src/setTitle.js +86 -0
  232. package/src/vendor/fca-unofficial/src/threadColors.js +57 -0
  233. package/src/vendor/fca-unofficial/src/unfriend.js +52 -0
  234. package/src/vendor/fca-unofficial/src/unsendMessage.js +49 -0
  235. package/src/vendor/fca-unofficial/test/data/shareAttach.js +146 -0
  236. package/src/vendor/fca-unofficial/test/data/something.mov +0 -0
  237. package/src/vendor/fca-unofficial/test/data/test.png +0 -0
  238. package/src/vendor/fca-unofficial/test/data/test.txt +7 -0
  239. package/src/vendor/fca-unofficial/test/example-config.json +18 -0
  240. package/src/vendor/fca-unofficial/test/test-page.js +140 -0
  241. package/src/vendor/fca-unofficial/test/test.js +385 -0
  242. package/src/vendor/fca-unofficial/utils.js +1358 -0
@@ -0,0 +1,106 @@
1
+ "use strict";
2
+
3
+ const log = require("../../../func/logAdapter");
4
+ const { parseAndCheckLogin } = require("../../utils/client");
5
+ const { getType } = require("../../utils/format");
6
+ function formatData(resData) {
7
+ return {
8
+ viewer_feedback_reaction_info:
9
+ resData.feedback_react.feedback.viewer_feedback_reaction_info,
10
+ supported_reactions: resData.feedback_react.feedback.supported_reactions,
11
+ top_reactions: resData.feedback_react.feedback.top_reactions.edges,
12
+ reaction_count: resData.feedback_react.feedback.reaction_count
13
+ };
14
+ }
15
+
16
+ module.exports = function(defaultFuncs, api, ctx) {
17
+ return function setPostReaction(postID, type, callback) {
18
+ let resolveFunc = function() {};
19
+ let rejectFunc = function() {};
20
+ const returnPromise = new Promise(function(resolve, reject) {
21
+ resolveFunc = resolve;
22
+ rejectFunc = reject;
23
+ });
24
+
25
+ if (!callback) {
26
+ if (
27
+ getType(type) === "Function" ||
28
+ getType(type) === "AsyncFunction"
29
+ ) {
30
+ callback = type;
31
+ type = 0;
32
+ } else {
33
+ callback = function(err, data) {
34
+ if (err) {
35
+ return rejectFunc(err);
36
+ }
37
+ resolveFunc(data);
38
+ };
39
+ }
40
+ }
41
+
42
+ const map = {
43
+ unlike: 0,
44
+ like: 1,
45
+ heart: 2,
46
+ love: 16,
47
+ haha: 4,
48
+ wow: 3,
49
+ sad: 7,
50
+ angry: 8
51
+ };
52
+
53
+ if (getType(type) !== "Number" && getType(type) === "String") {
54
+ type = map[type.toLowerCase()];
55
+ }
56
+
57
+ if (getType(type) !== "Number" && getType(type) !== "String") {
58
+ throw {
59
+ error: "setPostReaction: Invalid reaction type"
60
+ };
61
+ }
62
+
63
+ if (type != 0 && !type) {
64
+ throw {
65
+ error: "setPostReaction: Invalid reaction type"
66
+ };
67
+ }
68
+
69
+ const form = {
70
+ av: ctx.userID,
71
+ fb_api_caller_class: "RelayModern",
72
+ fb_api_req_friendly_name: "CometUFIFeedbackReactMutation",
73
+ doc_id: "4769042373179384",
74
+ variables: JSON.stringify({
75
+ input: {
76
+ actor_id: ctx.userID,
77
+ feedback_id: Buffer.from("feedback:" + postID).toString("base64"),
78
+ feedback_reaction: type,
79
+ feedback_source: "OBJECT",
80
+ is_tracking_encrypted: true,
81
+ tracking: [],
82
+ session_id: "f7dd50dd-db6e-4598-8cd9-561d5002b423",
83
+ client_mutation_id: Math.round(Math.random() * 19).toString()
84
+ },
85
+ useDefaultActor: false,
86
+ scale: 3
87
+ })
88
+ };
89
+
90
+ defaultFuncs
91
+ .post("https://www.facebook.com/api/graphql/", ctx.jar, form)
92
+ .then(parseAndCheckLogin(ctx, defaultFuncs))
93
+ .then(function(resData) {
94
+ if (resData.errors) {
95
+ throw resData;
96
+ }
97
+ return callback(null, formatData(resData.data));
98
+ })
99
+ .catch(function(err) {
100
+ log.error("setPostReaction", err);
101
+ return callback(err);
102
+ });
103
+
104
+ return returnPromise;
105
+ };
106
+ };
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+
3
+ const log = require("../../../func/logAdapter");
4
+ const { parseAndCheckLogin } = require("../../utils/client");
5
+ module.exports = function(defaultFuncs, api, ctx) {
6
+ return function unfriend(userID, callback) {
7
+ let resolveFunc = function() {};
8
+ let rejectFunc = function() {};
9
+ const returnPromise = new Promise(function(resolve, reject) {
10
+ resolveFunc = resolve;
11
+ rejectFunc = reject;
12
+ });
13
+
14
+ if (!callback) {
15
+ callback = function(err, friendList) {
16
+ if (err) {
17
+ return rejectFunc(err);
18
+ }
19
+ resolveFunc(friendList);
20
+ };
21
+ }
22
+
23
+ const form = {
24
+ uid: userID,
25
+ unref: "bd_friends_tab",
26
+ floc: "friends_tab",
27
+ "nctr[_mod]":
28
+ "pagelet_timeline_app_collection_" +
29
+ ctx.userID +
30
+ ":2356318349:2"
31
+ };
32
+
33
+ defaultFuncs
34
+ .post(
35
+ "https://www.facebook.com/ajax/profile/removefriendconfirm.php",
36
+ ctx.jar,
37
+ form
38
+ )
39
+ .then(parseAndCheckLogin(ctx, defaultFuncs))
40
+ .then(function(resData) {
41
+ if (resData.error) {
42
+ throw resData;
43
+ }
44
+
45
+ return callback(null, true);
46
+ })
47
+ .catch(function(err) {
48
+ log.error("unfriend", err);
49
+ return callback(err);
50
+ });
51
+
52
+ return returnPromise;
53
+ };
54
+ };
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+
3
+ const { getType } = require("../../utils/format");
4
+ const { get } = require("../../utils/request");
5
+
6
+ const httpGetFactory = function (defaultFuncs, api, ctx) {
7
+ return function httpGet(url, form, callback, notAPI) {
8
+ let resolveFunc = () => { };
9
+ let rejectFunc = () => { };
10
+
11
+ const returnPromise = new Promise((resolve, reject) => {
12
+ resolveFunc = resolve;
13
+ rejectFunc = reject;
14
+ });
15
+
16
+ if (
17
+ !callback &&
18
+ (getType(form) === "Function" || getType(form) === "AsyncFunction")
19
+ ) {
20
+ callback = form;
21
+ form = {};
22
+ }
23
+
24
+ form = form || {};
25
+
26
+ callback =
27
+ callback ||
28
+ function (err, data) {
29
+ if (err) return rejectFunc(err);
30
+ resolveFunc(data);
31
+ };
32
+
33
+ const executor = notAPI ? get : defaultFuncs.get;
34
+
35
+ executor(url, ctx.jar, form)
36
+ .then((resData) => callback(null, resData.data))
37
+ .catch(function (err) {
38
+ console.error("httpGet", err);
39
+ return callback(err);
40
+ });
41
+
42
+ return returnPromise;
43
+ };
44
+ };
45
+
46
+ module.exports = httpGetFactory;
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+
3
+ const { post } = require("../../utils/request");
4
+ const { getType } = require("../../utils/format");
5
+
6
+ const httpPostFactory = function (defaultFuncs, api, ctx) {
7
+ return function httpPost(url, form, callback, notAPI) {
8
+ let resolveFunc = () => { };
9
+ let rejectFunc = () => { };
10
+
11
+ const returnPromise = new Promise((resolve, reject) => {
12
+ resolveFunc = resolve;
13
+ rejectFunc = reject;
14
+ });
15
+
16
+ if (
17
+ !callback &&
18
+ (getType(form) === "Function" || getType(form) === "AsyncFunction")
19
+ ) {
20
+ callback = form;
21
+ form = {};
22
+ }
23
+
24
+ form = form || {};
25
+
26
+ callback =
27
+ callback ||
28
+ function (err, data) {
29
+ if (err) return rejectFunc(err);
30
+ resolveFunc(data);
31
+ };
32
+
33
+ const executor = notAPI ? post : defaultFuncs.post;
34
+
35
+ executor(url, ctx.jar, form, ctx.globalOptions)
36
+ .then((resData) => {
37
+ let data = resData.data;
38
+ if (typeof data === "object") {
39
+ data = JSON.stringify(data, null, 2);
40
+ }
41
+ callback(null, data);
42
+ })
43
+ .catch((err) => {
44
+ console.error("httpPost", err);
45
+ return callback(err);
46
+ });
47
+
48
+ return returnPromise;
49
+ };
50
+ };
51
+
52
+ module.exports = httpPostFactory;
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+
3
+ var log = require("../../../func/logAdapter");
4
+ const { getType } = require("../../utils/format");
5
+ const { parseAndCheckLogin } = require("../../utils/client");
6
+ module.exports = function(defaultFuncs, api, ctx) {
7
+ return function postFormData(url, form, callback) {
8
+ var resolveFunc = function() {};
9
+ var rejectFunc = function() {};
10
+
11
+ var returnPromise = new Promise(function(resolve, reject) {
12
+ resolveFunc = resolve;
13
+ rejectFunc = reject;
14
+ });
15
+
16
+ if (
17
+ !callback &&
18
+ (getType(form) == "Function" ||
19
+ getType(form) == "AsyncFunction")
20
+ ) {
21
+ callback = form;
22
+ form = {};
23
+ }
24
+
25
+ form = form || {};
26
+
27
+ callback =
28
+ callback ||
29
+ function(err, data) {
30
+ if (err) return rejectFunc(err);
31
+ resolveFunc(data);
32
+ };
33
+
34
+ defaultFuncs
35
+ .postFormData(url, ctx.jar, form, {})
36
+ .then(parseAndCheckLogin(ctx, defaultFuncs))
37
+ .then(function(resData) {
38
+ callback(null, resData);
39
+ })
40
+ .catch(function(err) {
41
+ log.error("postFormData", err);
42
+ return callback(err);
43
+ });
44
+
45
+ return returnPromise;
46
+ };
47
+ };
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+
3
+ const { generateOfflineThreadingID, getType } = require("../../utils/format");
4
+ module.exports = function (defaultFuncs, api, ctx) {
5
+ return function addUserToGroup(userID, threadID, callback) {
6
+ return new Promise((resolve, reject) => {
7
+ if (!ctx.mqttClient) {
8
+ const err = new Error("Not connected to MQTT");
9
+ callback?.(err);
10
+ return reject(err);
11
+ }
12
+ if (getType(threadID) !== "Number" && getType(threadID) !== "String") {
13
+ const err = new Error("ThreadID should be of type Number or String.");
14
+ callback?.(err);
15
+ return reject(err);
16
+ }
17
+ if (getType(userID) !== "Array") userID = [userID];
18
+ const reqID = ++ctx.wsReqNumber;
19
+ const taskID = ++ctx.wsTaskNumber;
20
+
21
+ const payload = {
22
+ epoch_id: generateOfflineThreadingID(),
23
+ tasks: [
24
+ {
25
+ failure_count: null,
26
+ label: "23",
27
+ payload: JSON.stringify({
28
+ thread_key: threadID,
29
+ contact_ids: userID,
30
+ sync_group: 1
31
+ }),
32
+ queue_name: threadID.toString(),
33
+ task_id: taskID
34
+ }
35
+ ],
36
+ version_id: "24502707779384158"
37
+ };
38
+ const form = JSON.stringify({
39
+ app_id: "772021112871879",
40
+ payload: JSON.stringify(payload),
41
+ request_id: reqID,
42
+ type: 3
43
+ });
44
+ const handleRes = (topic, message) => {
45
+ if (topic !== "/ls_resp") return;
46
+ let jsonMsg;
47
+ try {
48
+ jsonMsg = JSON.parse(message.toString());
49
+ jsonMsg.payload = JSON.parse(jsonMsg.payload);
50
+ } catch {
51
+ return;
52
+ }
53
+ if (jsonMsg.request_id !== reqID) return;
54
+ ctx.mqttClient.removeListener("message", handleRes);
55
+ callback?.(null, { success: true, response: jsonMsg.payload });
56
+ resolve({ success: true, response: jsonMsg.payload });
57
+ };
58
+ ctx.mqttClient.on("message", handleRes);
59
+ ctx.mqttClient.publish("/ls_req", form, { qos: 1, retain: false }, (err) => {
60
+ if (err) {
61
+ ctx.mqttClient.removeListener("message", handleRes);
62
+ callback?.(err);
63
+ reject(err);
64
+ }
65
+ });
66
+ });
67
+ };
68
+ };
@@ -0,0 +1,126 @@
1
+ "use strict";
2
+
3
+ const { generateOfflineThreadingID, getType } = require("../../utils/format");
4
+
5
+ module.exports = function (defaultFuncs, api, ctx) {
6
+ function changeAdminStatusNoMqtt(threadID, adminID, adminStatus) {
7
+ if (getType(threadID) !== "String") throw { error: "changeAdminStatus: threadID must be a string" };
8
+ if (getType(adminID) !== "String" && getType(adminID) !== "Array") throw { error: "changeAdminStatus: adminID must be a string or an array" };
9
+ if (getType(adminStatus) !== "Boolean") throw { error: "changeAdminStatus: adminStatus must be true or false" };
10
+ if (typeof ctx.wsReqNumber !== "number") ctx.wsReqNumber = 0;
11
+ const reqID = ++ctx.wsReqNumber;
12
+ let wsContent = {
13
+ request_id: reqID,
14
+ type: 3,
15
+ payload: {
16
+ version_id: '3816854585040595',
17
+ tasks: [],
18
+ epoch_id: generateOfflineThreadingID(),
19
+ data_trace_id: null
20
+ },
21
+ app_id: '772021112871879'
22
+ }
23
+ if (getType(adminID) === "Array") {
24
+ for (let i = 0; i < adminID.length; i++) {
25
+ wsContent.payload.tasks.push({
26
+ label: '25',
27
+ payload: JSON.stringify({ thread_key: threadID, contact_id: adminID[i], is_admin: adminStatus }),
28
+ queue_name: 'admin_status',
29
+ task_id: i + 1,
30
+ failure_count: null
31
+ });
32
+ }
33
+ } else {
34
+ wsContent.payload.tasks.push({
35
+ label: '25',
36
+ payload: JSON.stringify({ thread_key: threadID, contact_id: adminID, is_admin: adminStatus }),
37
+ queue_name: 'admin_status',
38
+ task_id: 1,
39
+ failure_count: null
40
+ });
41
+ }
42
+ wsContent.payload = JSON.stringify(wsContent.payload);
43
+ return new Promise((resolve, reject) => {
44
+ if (!ctx.mqttClient) {
45
+ return reject(new Error("Not connected to MQTT"));
46
+ }
47
+ ctx.mqttClient.publish("/ls_req", JSON.stringify(wsContent), {}, (err) => {
48
+ if (err) return reject(err);
49
+ resolve();
50
+ });
51
+ });
52
+ };
53
+ function changeAdminStatusMqtt(threadID, adminID, adminStatus) {
54
+ if (!ctx.mqttClient) {
55
+ throw new Error("Not connected to MQTT");
56
+ }
57
+ if (getType(threadID) !== "String") {
58
+ throw { error: "changeAdminStatus: threadID must be a string" };
59
+ }
60
+ if (getType(adminID) !== "String" && getType(adminID) !== "Array") {
61
+ throw { error: "changeAdminStatus: adminID must be a string or an array" };
62
+ }
63
+ if (getType(adminStatus) !== "Boolean") {
64
+ throw { error: "changeAdminStatus: adminStatus must be true or false" };
65
+ }
66
+ const tasks = [];
67
+ const isAdmin = adminStatus ? 1 : 0;
68
+ const epochID = generateOfflineThreadingID();
69
+ if (getType(adminID) === "Array") {
70
+ adminID.forEach((id, index) => {
71
+ tasks.push({
72
+ failure_count: null,
73
+ label: "25",
74
+ payload: JSON.stringify({
75
+ thread_key: threadID,
76
+ contact_id: id,
77
+ is_admin: isAdmin
78
+ }),
79
+ queue_name: "admin_status",
80
+ task_id: index + 1
81
+ });
82
+ });
83
+ } else {
84
+ tasks.push({
85
+ failure_count: null,
86
+ label: "25",
87
+ payload: JSON.stringify({
88
+ thread_key: threadID,
89
+ contact_id: adminID,
90
+ is_admin: isAdmin
91
+ }),
92
+ queue_name: "admin_status",
93
+ task_id: 1
94
+ });
95
+ }
96
+ if (typeof ctx.wsReqNumber !== "number") ctx.wsReqNumber = 0;
97
+ const reqID = ++ctx.wsReqNumber;
98
+ const form = JSON.stringify({
99
+ app_id: "2220391788200892",
100
+ payload: JSON.stringify({
101
+ epoch_id: epochID,
102
+ tasks: tasks,
103
+ version_id: "8798795233522156"
104
+ }),
105
+ request_id: reqID,
106
+ type: 3
107
+ });
108
+ return new Promise((resolve, reject) => {
109
+ ctx.mqttClient.publish("/ls_req", form, {}, (err) => {
110
+ if (err) return reject(err);
111
+ resolve();
112
+ });
113
+ });
114
+ };
115
+ return function changeAdminStatus(threadID, adminID, adminStatus) {
116
+ if (ctx.mqttClient) {
117
+ try {
118
+ return changeAdminStatusMqtt(threadID, adminID, adminStatus);
119
+ } catch (e) {
120
+ return changeAdminStatusNoMqtt(threadID, adminID, adminStatus);
121
+ }
122
+ } else {
123
+ return changeAdminStatusNoMqtt(threadID, adminID, adminStatus);
124
+ }
125
+ };
126
+ };
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+
3
+ const log = require("../../../func/logAdapter");
4
+ const { formatID } = require("../../utils/format");
5
+ const { parseAndCheckLogin } = require("../../utils/client");
6
+ module.exports = function(defaultFuncs, api, ctx) {
7
+ return function changeArchivedStatus(threadOrThreads, archive, 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
+
15
+ if (!callback) {
16
+ callback = function(err) {
17
+ if (err) {
18
+ return rejectFunc(err);
19
+ }
20
+ resolveFunc();
21
+ };
22
+ }
23
+
24
+ const form = {};
25
+
26
+ if (Array.isArray(threadOrThreads)) {
27
+ for (let i = 0; i < threadOrThreads.length; i++) {
28
+ form["ids[" + formatID(threadOrThreads[i]) + "]"] = archive;
29
+ }
30
+ } else {
31
+ form["ids[" + formatID(threadOrThreads) + "]"] = archive;
32
+ }
33
+
34
+ defaultFuncs
35
+ .post(
36
+ "https://www.facebook.com/ajax/mercury/change_archived_status.php",
37
+ ctx.jar,
38
+ form
39
+ )
40
+ .then(parseAndCheckLogin(ctx, defaultFuncs))
41
+ .then(function(resData) {
42
+ if (resData.error) {
43
+ throw resData;
44
+ }
45
+
46
+ return callback();
47
+ })
48
+ .catch(function(err) {
49
+ log.error("changeArchivedStatus", err);
50
+ return callback(err);
51
+ });
52
+
53
+ return returnPromise;
54
+ };
55
+ };
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+
3
+ const log = require("../../../func/logAdapter");
4
+ const { parseAndCheckLogin, saveCookies } = require("../../utils/client");
5
+ module.exports = function(defaultFuncs, api, ctx) {
6
+ return function changeBlockedStatus(userID, block, callback) {
7
+ let resolveFunc = function() {};
8
+ let rejectFunc = function() {};
9
+ const returnPromise = new Promise(function(resolve, reject) {
10
+ resolveFunc = resolve;
11
+ rejectFunc = reject;
12
+ });
13
+
14
+ if (!callback) {
15
+ callback = function(err) {
16
+ if (err) {
17
+ return rejectFunc(err);
18
+ }
19
+ resolveFunc();
20
+ };
21
+ }
22
+
23
+ defaultFuncs
24
+ .post(
25
+ `https://www.facebook.com/messaging/${
26
+ block ? "" : "un"
27
+ }block_messages/`,
28
+ ctx.jar,
29
+ {
30
+ fbid: userID
31
+ }
32
+ )
33
+ .then(saveCookies(ctx.jar))
34
+ .then(parseAndCheckLogin(ctx, defaultFuncs))
35
+ .then(function(resData) {
36
+ if (resData.error) {
37
+ throw resData;
38
+ }
39
+
40
+ return callback();
41
+ })
42
+ .catch(function(err) {
43
+ log.error("changeBlockedStatus", err);
44
+ return callback(err);
45
+ });
46
+ return returnPromise;
47
+ };
48
+ };
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+
3
+ const { generateOfflineThreadingID } = require("../../utils/format");
4
+ const log = require("../../../func/logAdapter");
5
+
6
+ module.exports = function (defaultFuncs, api, ctx) {
7
+ function handleUpload(image) {
8
+ const form = {
9
+ images_only: "true",
10
+ fb_dtsg: ctx.fb_dtsg,
11
+ "attachment[]": image
12
+ };
13
+ return defaultFuncs
14
+ .postFormData("https://www.facebook.com/ajax/mercury/upload.php", ctx.jar, form, {})
15
+ .then(parseAndCheckLogin(ctx, defaultFuncs))
16
+ .then(resData => {
17
+ if (resData.error) throw resData;
18
+ return resData.payload.metadata[0];
19
+ });
20
+ }
21
+ return function changeGroupImage(image, threadID, callback) {
22
+ return new Promise((resolve, reject) => {
23
+ if (!ctx.mqttClient) {
24
+ const err = new Error("Not connected to MQTT");
25
+ callback?.(err);
26
+ return reject(err);
27
+ }
28
+ if (!threadID || typeof threadID !== "string") {
29
+ const err = new Error("Invalid threadID");
30
+ callback?.(err);
31
+ return reject(err);
32
+ }
33
+ const reqID = ++ctx.wsReqNumber;
34
+ const taskID = ++ctx.wsTaskNumber;
35
+ const onResponse = (topic, message) => {
36
+ if (topic !== "/ls_resp") return;
37
+ let jsonMsg;
38
+ try {
39
+ jsonMsg = JSON.parse(message.toString());
40
+ jsonMsg.payload = JSON.parse(jsonMsg.payload);
41
+ } catch (err) {
42
+ return;
43
+ }
44
+ if (jsonMsg.request_id !== reqID) return;
45
+ ctx.mqttClient.removeListener("message", onResponse);
46
+ callback?.(null, { success: true, response: jsonMsg.payload });
47
+ return resolve({ success: true, response: jsonMsg.payload });
48
+ };
49
+ ctx.mqttClient.on("message", onResponse);
50
+ handleUpload(image)
51
+ .then(payload => {
52
+ const imageID = payload.image_id;
53
+ const taskPayload = {
54
+ thread_key: threadID,
55
+ image_id: imageID,
56
+ sync_group: 1
57
+ };
58
+
59
+ const mqttPayload = {
60
+ epoch_id: generateOfflineThreadingID(),
61
+ tasks: [
62
+ {
63
+ failure_count: null,
64
+ label: "37",
65
+ payload: JSON.stringify(taskPayload),
66
+ queue_name: "thread_image",
67
+ task_id: taskID
68
+ }
69
+ ],
70
+ version_id: "8798795233522156"
71
+ };
72
+ const request = {
73
+ app_id: "2220391788200892",
74
+ payload: JSON.stringify(mqttPayload),
75
+ request_id: reqID,
76
+ type: 3
77
+ };
78
+ ctx.mqttClient.publish("/ls_req", JSON.stringify(request), {
79
+ qos: 1,
80
+ retain: false
81
+ });
82
+ })
83
+ .catch(err => {
84
+ ctx.mqttClient.removeListener("message", onResponse);
85
+ log.error("changeGroupImageMqtt", err);
86
+ callback?.(err);
87
+ reject(err);
88
+ });
89
+ });
90
+ };
91
+ };