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.
- package/index.js +552 -0
- package/package.json +61 -0
- package/src/OldMessage.js +357 -0
- package/src/addExternalModule.js +25 -0
- package/src/addUserToGroup.js +115 -0
- package/src/changeAdminStatus.js +103 -0
- package/src/changeArchivedStatus.js +55 -0
- package/src/changeAvatar.js +136 -0
- package/src/changeAvatarV2.js +86 -0
- package/src/changeAvt.js +85 -0
- package/src/changeBio.js +76 -0
- package/src/changeBlockedStatus.js +49 -0
- package/src/changeBlockedStatusMqtt.js +80 -0
- package/src/changeCover.js +72 -0
- package/src/changeGroupImage.js +135 -0
- package/src/changeName.js +79 -0
- package/src/changeNickname.js +59 -0
- package/src/changeThreadColor.js +65 -0
- package/src/changeThreadEmoji.js +55 -0
- package/src/changeUsername.js +59 -0
- package/src/createCommentPost.js +230 -0
- package/src/createNewGroup.js +88 -0
- package/src/createPoll.js +71 -0
- package/src/createPost.js +276 -0
- package/src/deleteMessage.js +56 -0
- package/src/deleteThread.js +56 -0
- package/src/editMessage.js +68 -0
- package/src/editMessageOld.js +67 -0
- package/src/follow.js +74 -0
- package/src/forwardAttachment.js +60 -0
- package/src/friendList.js +103 -0
- package/src/getAccess.js +112 -0
- package/src/getAvatarUser.js +78 -0
- package/src/getCurrentUserID.js +7 -0
- package/src/getEmojiUrl.js +29 -0
- package/src/getFriendsList.js +83 -0
- package/src/getMessage.js +847 -0
- package/src/getRegion.js +7 -0
- package/src/getThreadHistory.js +680 -0
- package/src/getThreadHistoryDeprecated.js +71 -0
- package/src/getThreadInfo.js +232 -0
- package/src/getThreadInfoDeprecated.js +56 -0
- package/src/getThreadList.js +213 -0
- package/src/getThreadListDeprecated.js +46 -0
- package/src/getThreadPictures.js +59 -0
- package/src/getThreadTheme.js +82 -0
- package/src/getUID.js +119 -0
- package/src/getUserID.js +61 -0
- package/src/getUserInfo.js +66 -0
- package/src/handleFriendRequest.js +46 -0
- package/src/handleMessageRequest.js +47 -0
- package/src/httpGet.js +49 -0
- package/src/httpPost.js +48 -0
- package/src/listenMqtt.js +719 -0
- package/src/logout.js +75 -0
- package/src/markAsDelivered.js +47 -0
- package/src/markAsRead.js +70 -0
- package/src/markAsReadAll.js +40 -0
- package/src/markAsSeen.js +48 -0
- package/src/metaTheme.js +190 -0
- package/src/muteThread.js +45 -0
- package/src/note.js +228 -0
- package/src/refreshFb_dtsg.js +89 -0
- package/src/removeSuspiciousAccount.js +79 -0
- package/src/removeUserFromGroup.js +79 -0
- package/src/resolvePhotoUrl.js +45 -0
- package/src/searchForThread.js +53 -0
- package/src/searchFriends.js +139 -0
- package/src/searchStickers.js +53 -0
- package/src/sendFriendRequest.js +113 -0
- package/src/sendMessage.js +258 -0
- package/src/sendMessageMqtt.js +322 -0
- package/src/sendTypingIndicator.js +45 -0
- package/src/setActiveStatus.js +93 -0
- package/src/setMessageReaction.js +122 -0
- package/src/setMessageReactionMqtt.js +62 -0
- package/src/setPostReaction.js +112 -0
- package/src/setProfileLock.js +98 -0
- package/src/setStoryReaction.js +134 -0
- package/src/setStorySeen.js +109 -0
- package/src/setThreadTheme.js +103 -0
- package/src/setTitle.js +90 -0
- package/src/shareContact.js +110 -0
- package/src/shareLink.js +59 -0
- package/src/stopListenMqtt.js +23 -0
- package/src/storyManager.js +358 -0
- package/src/suggestFriend.js +133 -0
- package/src/threadColors.js +131 -0
- package/src/unfriend.js +52 -0
- package/src/unsendMessage.js +45 -0
- package/src/uploadAttachment.js +93 -0
- 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
|
+
};
|
package/src/metaTheme.js
ADDED
|
@@ -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
|
+
};
|