fca-sahu 1.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 (92) hide show
  1. package/index.js +552 -0
  2. package/package.json +61 -0
  3. package/src/OldMessage.js +357 -0
  4. package/src/addExternalModule.js +25 -0
  5. package/src/addUserToGroup.js +115 -0
  6. package/src/changeAdminStatus.js +103 -0
  7. package/src/changeArchivedStatus.js +55 -0
  8. package/src/changeAvatar.js +136 -0
  9. package/src/changeAvatarV2.js +86 -0
  10. package/src/changeAvt.js +85 -0
  11. package/src/changeBio.js +76 -0
  12. package/src/changeBlockedStatus.js +49 -0
  13. package/src/changeBlockedStatusMqtt.js +80 -0
  14. package/src/changeCover.js +72 -0
  15. package/src/changeGroupImage.js +135 -0
  16. package/src/changeName.js +79 -0
  17. package/src/changeNickname.js +59 -0
  18. package/src/changeThreadColor.js +65 -0
  19. package/src/changeThreadEmoji.js +55 -0
  20. package/src/changeUsername.js +59 -0
  21. package/src/createCommentPost.js +230 -0
  22. package/src/createNewGroup.js +88 -0
  23. package/src/createPoll.js +71 -0
  24. package/src/createPost.js +276 -0
  25. package/src/deleteMessage.js +56 -0
  26. package/src/deleteThread.js +56 -0
  27. package/src/editMessage.js +68 -0
  28. package/src/editMessageOld.js +67 -0
  29. package/src/follow.js +74 -0
  30. package/src/forwardAttachment.js +60 -0
  31. package/src/friendList.js +103 -0
  32. package/src/getAccess.js +112 -0
  33. package/src/getAvatarUser.js +78 -0
  34. package/src/getCurrentUserID.js +7 -0
  35. package/src/getEmojiUrl.js +29 -0
  36. package/src/getFriendsList.js +83 -0
  37. package/src/getMessage.js +847 -0
  38. package/src/getRegion.js +7 -0
  39. package/src/getThreadHistory.js +680 -0
  40. package/src/getThreadHistoryDeprecated.js +71 -0
  41. package/src/getThreadInfo.js +232 -0
  42. package/src/getThreadInfoDeprecated.js +56 -0
  43. package/src/getThreadList.js +213 -0
  44. package/src/getThreadListDeprecated.js +46 -0
  45. package/src/getThreadPictures.js +59 -0
  46. package/src/getThreadTheme.js +82 -0
  47. package/src/getUID.js +119 -0
  48. package/src/getUserID.js +61 -0
  49. package/src/getUserInfo.js +66 -0
  50. package/src/handleFriendRequest.js +46 -0
  51. package/src/handleMessageRequest.js +47 -0
  52. package/src/httpGet.js +49 -0
  53. package/src/httpPost.js +48 -0
  54. package/src/listenMqtt.js +719 -0
  55. package/src/logout.js +75 -0
  56. package/src/markAsDelivered.js +47 -0
  57. package/src/markAsRead.js +70 -0
  58. package/src/markAsReadAll.js +40 -0
  59. package/src/markAsSeen.js +48 -0
  60. package/src/metaTheme.js +190 -0
  61. package/src/muteThread.js +45 -0
  62. package/src/note.js +228 -0
  63. package/src/refreshFb_dtsg.js +89 -0
  64. package/src/removeSuspiciousAccount.js +79 -0
  65. package/src/removeUserFromGroup.js +79 -0
  66. package/src/resolvePhotoUrl.js +45 -0
  67. package/src/searchForThread.js +53 -0
  68. package/src/searchFriends.js +139 -0
  69. package/src/searchStickers.js +53 -0
  70. package/src/sendFriendRequest.js +113 -0
  71. package/src/sendMessage.js +258 -0
  72. package/src/sendMessageMqtt.js +322 -0
  73. package/src/sendTypingIndicator.js +45 -0
  74. package/src/setActiveStatus.js +93 -0
  75. package/src/setMessageReaction.js +122 -0
  76. package/src/setMessageReactionMqtt.js +62 -0
  77. package/src/setPostReaction.js +112 -0
  78. package/src/setProfileLock.js +98 -0
  79. package/src/setStoryReaction.js +134 -0
  80. package/src/setStorySeen.js +109 -0
  81. package/src/setThreadTheme.js +103 -0
  82. package/src/setTitle.js +90 -0
  83. package/src/shareContact.js +110 -0
  84. package/src/shareLink.js +59 -0
  85. package/src/stopListenMqtt.js +23 -0
  86. package/src/storyManager.js +358 -0
  87. package/src/suggestFriend.js +133 -0
  88. package/src/threadColors.js +131 -0
  89. package/src/unfriend.js +52 -0
  90. package/src/unsendMessage.js +45 -0
  91. package/src/uploadAttachment.js +93 -0
  92. package/utils.js +2962 -0
package/src/logout.js ADDED
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+
3
+ const utils = require("../utils");
4
+ // @NethWs3Dev
5
+
6
+ module.exports = function (defaultFuncs, api, ctx) {
7
+ return function logout(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, friendList) {
17
+ if (err) {
18
+ return rejectFunc(err);
19
+ }
20
+ resolveFunc(friendList);
21
+ };
22
+ }
23
+
24
+ const 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
+ const elem = resData.jsmods.instances[0][2][0].filter(function (v) {
37
+ return v.value === "logout";
38
+ })[0];
39
+
40
+ const html = resData.jsmods.markup.filter(function (v) {
41
+ return v[0] === elem.markup.__m;
42
+ })[0][1].__html;
43
+
44
+ const 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
+ console.log("logout", "Logged out successfully.");
66
+ callback();
67
+ })
68
+ .catch(function (err) {
69
+ console.error("logout", err);
70
+ return callback(err);
71
+ });
72
+
73
+ return returnPromise;
74
+ };
75
+ };
@@ -0,0 +1,47 @@
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 markAsDelivered(threadID, messageID, 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, data) {
17
+ if (err) return rejectFunc(err);
18
+
19
+ resolveFunc(data);
20
+ };
21
+ }
22
+
23
+ if (!threadID || !messageID) return callback("Error: messageID or threadID is not defined");
24
+
25
+ var form = {};
26
+ form["message_ids[0]"] = messageID;
27
+ form["thread_ids[" + threadID + "][0]"] = messageID;
28
+
29
+ defaultFuncs
30
+ .post("https://www.facebook.com/ajax/mercury/delivery_receipts.php", ctx.jar, form)
31
+ .then(utils.saveCookies(ctx.jar))
32
+ .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
33
+ .then(function (resData) {
34
+ if (resData.error) throw resData;
35
+
36
+ return callback();
37
+ })
38
+ .catch(function (err) {
39
+ log.error("markAsDelivered", err);
40
+ if (utils.getType(err) == "Object" && err.error === "Not logged in.") ctx.loggedIn = false;
41
+
42
+ return callback(err);
43
+ });
44
+
45
+ return returnPromise;
46
+ };
47
+ };
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+
3
+ var utils = require("../utils");
4
+ var log = require("npmlog");
5
+
6
+ module.exports = function (defaultFuncs, api, ctx) {
7
+ return async function markAsRead(threadID, read, callback) {
8
+ if (utils.getType(read) === 'Function' || utils.getType(read) === 'AsyncFunction') {
9
+ callback = read;
10
+ read = true;
11
+ }
12
+ if (read == undefined) read = true;
13
+
14
+ if (!callback) callback = () => { };
15
+
16
+ var form = {};
17
+
18
+ if (typeof ctx.globalOptions.pageID !== 'undefined') {
19
+ form["source"] = "PagesManagerMessagesInterface";
20
+ form["request_user_id"] = ctx.globalOptions.pageID;
21
+ form["ids[" + threadID + "]"] = read;
22
+ form["watermarkTimestamp"] = new Date().getTime();
23
+ form["shouldSendReadReceipt"] = true;
24
+ form["commerce_last_message_type"] = "";
25
+ //form["titanOriginatedThreadId"] = utils.generateThreadingID(ctx.clientID);
26
+
27
+ let resData;
28
+ try {
29
+ resData = await (
30
+ defaultFuncs
31
+ .post("https://www.facebook.com/ajax/mercury/change_read_status.php", ctx.jar, form)
32
+ .then(utils.saveCookies(ctx.jar))
33
+ .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
34
+ );
35
+ }
36
+ catch (e) {
37
+ callback(e);
38
+ return e;
39
+ }
40
+
41
+ if (resData.error) {
42
+ let err = resData.error;
43
+ log.error("markAsRead", err);
44
+ if (utils.getType(err) == "Object" && err.error === "Not logged in.") ctx.loggedIn = false;
45
+ callback(err);
46
+ return err;
47
+ }
48
+
49
+ callback();
50
+ return null;
51
+ }
52
+ else {
53
+ try {
54
+ if (ctx.mqttClient) {
55
+ let err = await new Promise(r => ctx.mqttClient.publish("/mark_thread", JSON.stringify({
56
+ threadID,
57
+ mark: "read",
58
+ state: read
59
+ }), { qos: 1, retain: false }, r));
60
+ if (err) throw err;
61
+ }
62
+ else throw { error: "You can only use this function after you start listening." };
63
+ }
64
+ catch (e) {
65
+ callback(e);
66
+ return e;
67
+ }
68
+ }
69
+ };
70
+ };
@@ -0,0 +1,40 @@
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 markAsReadAll(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, data) {
17
+ if (err) return rejectFunc(err);
18
+ resolveFunc(data);
19
+ };
20
+ }
21
+
22
+ var form = {
23
+ folder: 'inbox'
24
+ };
25
+
26
+ defaultFuncs
27
+ .post("https://www.facebook.com/ajax/mercury/mark_folder_as_read.php", ctx.jar, form)
28
+ .then(utils.saveCookies(ctx.jar))
29
+ .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
30
+ .then(function (resData) {
31
+ if (resData.error) throw resData;
32
+ return callback();
33
+ })
34
+ .catch(function (err) {
35
+ log.error("markAsReadAll", err);
36
+ return callback(err);
37
+ });
38
+ return returnPromise;
39
+ };
40
+ };
@@ -0,0 +1,48 @@
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 (utils.getType(seen_timestamp) == "Function" ||
9
+ utils.getType(seen_timestamp) == "AsyncFunction") {
10
+ callback = seen_timestamp;
11
+ seen_timestamp = Date.now();
12
+ }
13
+
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
+ callback = function (err, data) {
23
+ if (err) return rejectFunc(err);
24
+
25
+ resolveFunc(data);
26
+ };
27
+ }
28
+
29
+ var form = {
30
+ seen_timestamp: seen_timestamp
31
+ };
32
+
33
+ defaultFuncs
34
+ .post("https://www.facebook.com/ajax/mercury/mark_seen.php", ctx.jar, form)
35
+ .then(utils.saveCookies(ctx.jar))
36
+ .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
37
+ .then(function (resData) {
38
+ if (resData.error) throw resData;
39
+ return callback();
40
+ })
41
+ .catch(function (err) {
42
+ log.error("markAsSeen", err);
43
+ if (utils.getType(err) == "Object" && err.error === "Not logged in.") ctx.loggedIn = false;
44
+ return callback(err);
45
+ });
46
+ return returnPromise;
47
+ };
48
+ };
@@ -0,0 +1,190 @@
1
+ /**
2
+ * ===========================================================
3
+ * 💫 META THEME GENERATOR MODULE 💫
4
+ * ===========================================================
5
+ * 🧑‍💻 Author: Sheikh Tamim (ST | Sheikh Tamim)
6
+ * 🔰 Owner & Developer
7
+ * 🌐 GitHub: https://github.com/sheikhtamimlover
8
+ * 📸 Instagram: https://instagram.com/sheikh.tamim_lover
9
+ * 🧠 Description:
10
+ * This module generates beautiful Messenger AI themes
11
+ * using Meta's hidden GraphQL endpoints. It allows you to
12
+ * create unique chat themes based on your custom prompt
13
+ * or optional image inspiration.
14
+ * -----------------------------------------------------------
15
+ * ⚙️ Features:
16
+ * • Generate AI-based Messenger chat themes.
17
+ * • Custom prompt & optional image URL input.
18
+ * • Returns structured theme data with full color mapping.
19
+ * -----------------------------------------------------------
20
+ * 🕊️ Respect the creator & give proper credits if reused.
21
+ * ===========================================================
22
+ */
23
+
24
+ "use strict";
25
+
26
+ const utils = require("../utils");
27
+ const log = require("npmlog");
28
+ /** © Sheikh Tamim - Please give proper credits if you copy or reuse this code. */
29
+ module.exports = function (defaultFuncs, api, ctx) {
30
+ return function metaTheme(prompt, options, callback) {
31
+ var resolveFunc = function () { };
32
+ var rejectFunc = function () { };
33
+ var returnPromise = new Promise(function (resolve, reject) {
34
+ resolveFunc = resolve;
35
+ rejectFunc = reject;
36
+ });
37
+
38
+ // Handle optional parameters
39
+ if (typeof options === 'function') {
40
+ callback = options;
41
+ options = {};
42
+ }
43
+
44
+ if (!callback) {
45
+ callback = function (err, data) {
46
+ if (err) return rejectFunc(err);
47
+ resolveFunc(data);
48
+ };
49
+ }
50
+
51
+ if (!prompt || typeof prompt !== 'string') {
52
+ return callback({ error: "Prompt is required and must be a string" });
53
+ }
54
+
55
+ // Parse options
56
+ const numThemes = options.numThemes || 1;
57
+ const imageUrl = options.imageUrl || null;
58
+
59
+ const inputData = {
60
+ client_mutation_id: Math.floor(Math.random() * 10).toString(),
61
+ actor_id: ctx.userID,
62
+ bypass_cache: true,
63
+ caller: "MESSENGER",
64
+ num_themes: Math.min(numThemes, 5), // Limit to max 5 themes
65
+ prompt: prompt
66
+ };
67
+
68
+ // Add image URL if provided
69
+ if (imageUrl) {
70
+ inputData.image_url = imageUrl;
71
+ }
72
+
73
+ const form = {
74
+ av: ctx.userID,
75
+ __aaid: 0,
76
+ __user: ctx.userID,
77
+ __a: 1,
78
+ __req: utils.getSignatureID(),
79
+ __hs: "20358.HYP:comet_pkg.2.1...0",
80
+ dpr: 1,
81
+ __ccg: "EXCELLENT",
82
+ __rev: "1027673511",
83
+ __s: utils.getSignatureID(),
84
+ __hsi: "7554561631547849479",
85
+ __comet_req: 15,
86
+ fb_dtsg: ctx.fb_dtsg,
87
+ jazoest: ctx.ttstamp,
88
+ lsd: ctx.fb_dtsg,
89
+ __spin_r: "1027673511",
90
+ __spin_b: "trunk",
91
+ __spin_t: Date.now(),
92
+ __crn: "comet.fbweb.MWInboxHomeRoute",
93
+ qpl_active_flow_ids: "25309433,521485406",
94
+ fb_api_caller_class: "RelayModern",
95
+ fb_api_req_friendly_name: "useGenerateAIThemeMutation",
96
+ variables: JSON.stringify({ input: inputData }),
97
+ server_timestamps: true,
98
+ doc_id: "23873748445608673",
99
+ fb_api_analytics_tags: JSON.stringify(["qpl_active_flow_ids=25309433,521485406"])
100
+ };
101
+
102
+ defaultFuncs
103
+ .post("https://www.facebook.com/api/graphql/", ctx.jar, form)
104
+ .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
105
+ .then(function (resData) {
106
+ if (resData.errors) {
107
+ throw resData.errors;
108
+ }
109
+
110
+ if (resData.data && resData.data.xfb_generate_ai_themes_from_prompt) {
111
+ const themeData = resData.data.xfb_generate_ai_themes_from_prompt;
112
+ if (themeData.success && themeData.themes && themeData.themes.length > 0) {
113
+ const themes = themeData.themes.map((theme, index) => ({
114
+ success: true,
115
+ themeId: theme.id,
116
+ name: theme.accessibility_label,
117
+ description: theme.description,
118
+ serialNumber: index + 1,
119
+ colors: {
120
+ composerBackground: theme.composer_background_color,
121
+ backgroundGradient: theme.background_gradient_colors,
122
+ titleBarButton: theme.title_bar_button_tint_color,
123
+ inboundMessageGradient: theme.inbound_message_gradient_colors,
124
+ titleBarText: theme.title_bar_text_color,
125
+ composerTint: theme.composer_tint_color,
126
+ messageText: theme.message_text_color,
127
+ primaryButton: theme.primary_button_background_color,
128
+ titleBarBackground: theme.title_bar_background_color,
129
+ fallback: theme.fallback_color,
130
+ gradient: theme.gradient_colors
131
+ },
132
+ backgroundImage: theme.background_asset ? theme.background_asset.image.uri : null,
133
+ iconImage: theme.icon_asset ? theme.icon_asset.image.uri : null,
134
+ images: {
135
+ background: theme.background_asset ? theme.background_asset.image.uri : null,
136
+ icon: theme.icon_asset ? theme.icon_asset.image.uri : null
137
+ },
138
+ alternativeThemes: theme.alternative_themes ? theme.alternative_themes.map(alt => ({
139
+ id: alt.id,
140
+ name: alt.accessibility_label,
141
+ backgroundImage: alt.background_asset ? alt.background_asset.image.uri : null,
142
+ iconImage: alt.icon_asset ? alt.icon_asset.image.uri : null
143
+ })) : []
144
+ }));
145
+
146
+ const result = {
147
+ success: true,
148
+ count: themes.length,
149
+ themes: themes,
150
+ // For backward compatibility, include first theme data at root level
151
+ ...themes[0]
152
+ };
153
+ return callback(null, result);
154
+ } else {
155
+ throw new Error("No themes generated for the given prompt");
156
+ }
157
+ } else {
158
+ throw new Error("Invalid response from AI theme generation");
159
+ }
160
+ })
161
+ .catch(function (err) {
162
+ log.error("metaTheme", err);
163
+
164
+ // Check for specific error conditions
165
+ let errorMessage = "An error occurred while generating themes";
166
+
167
+ if (err.message && err.message.includes("not authorized")) {
168
+ errorMessage = "Your account is not authorized to generate AI themes. This feature may not be available for your account type.";
169
+ } else if (err.message && err.message.includes("rate limit")) {
170
+ errorMessage = "Rate limit exceeded. Please wait a moment before trying again.";
171
+ } else if (err.message && err.message.includes("Invalid")) {
172
+ errorMessage = "Invalid request parameters. Please check your input.";
173
+ } else if (err.statusCode === 403) {
174
+ errorMessage = "Access denied. Your account may not support Meta AI theme generation.";
175
+ } else if (err.statusCode === 429) {
176
+ errorMessage = "Too many requests. Please wait before trying again.";
177
+ }
178
+
179
+ return callback({
180
+ error: errorMessage,
181
+ originalError: err.message || err,
182
+ statusCode: err.statusCode || null
183
+ });
184
+ });
185
+
186
+ return returnPromise;
187
+ };
188
+ };
189
+
190
+ /** © Sheikh Tamim - Please give proper credits if you copy or reuse this code. */
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+
3
+ var utils = require("../utils");
4
+ var log = require("npmlog");
5
+
6
+ module.exports = function (defaultFuncs, api, ctx) {
7
+ // muteSecond: -1=permanent mute, 0=unmute, 60=one minute, 3600=one hour, etc.
8
+ return function muteThread(threadID, muteSeconds, callback) {
9
+ var resolveFunc = function () { };
10
+ var rejectFunc = function () { };
11
+ var 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
+
20
+ resolveFunc(data);
21
+ };
22
+ }
23
+
24
+ var form = {
25
+ thread_fbid: threadID,
26
+ mute_settings: muteSeconds
27
+ };
28
+
29
+ defaultFuncs
30
+ .post("https://www.facebook.com/ajax/mercury/change_mute_thread.php", ctx.jar, form)
31
+ .then(utils.saveCookies(ctx.jar))
32
+ .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
33
+ .then(function (resData) {
34
+ if (resData.error) throw resData;
35
+
36
+ return callback();
37
+ })
38
+ .catch(function (err) {
39
+ log.error("muteThread", err);
40
+ return callback(err);
41
+ });
42
+
43
+ return returnPromise;
44
+ };
45
+ };