@cexy/hoonfca 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/README.md +83 -0
- package/index.js +467 -0
- package/package.json +12 -0
- package/replit.nix +3 -0
- package/src/addExternalModule.js +25 -0
- package/src/addUserToGroup.js +98 -0
- package/src/changeAdminStatus.js +98 -0
- package/src/changeArchivedStatus.js +51 -0
- package/src/changeAvatar.js +89 -0
- package/src/changeBio.js +74 -0
- package/src/changeBlockedStatus.js +45 -0
- package/src/changeBlockedStatusMqtt.js +65 -0
- package/src/changeCover.js +92 -0
- package/src/changeGroupImage.js +110 -0
- package/src/changeName.js +106 -0
- package/src/changeNickname.js +58 -0
- package/src/changeThreadColor.js +62 -0
- package/src/changeThreadEmoji.js +54 -0
- package/src/changeUsername.js +80 -0
- package/src/createCommentPost.js +196 -0
- package/src/createNewGroup.js +81 -0
- package/src/createPoll.js +64 -0
- package/src/createPost.js +285 -0
- package/src/data/getThreadInfo.json +1 -0
- package/src/deleteMessage.js +55 -0
- package/src/deleteThread.js +55 -0
- package/src/editMessage.js +66 -0
- package/src/follow.js +71 -0
- package/src/forwardAttachment.js +57 -0
- package/src/getAccess.js +130 -0
- package/src/getAvatarUser.js +88 -0
- package/src/getBotInitialData.js +59 -0
- package/src/getCtx.js +5 -0
- package/src/getCurrentUserID.js +5 -0
- package/src/getEmojiUrl.js +18 -0
- package/src/getFriendsList.js +81 -0
- package/src/getMessage.js +827 -0
- package/src/getOptions.js +5 -0
- package/src/getRegion.js +7 -0
- package/src/getThreadHistory.js +496 -0
- package/src/getThreadHistoryDeprecated.js +95 -0
- package/src/getThreadInfo.js +194 -0
- package/src/getThreadInfoDeprecated.js +77 -0
- package/src/getThreadList.js +219 -0
- package/src/getThreadListDeprecated.js +86 -0
- package/src/getThreadPictures.js +85 -0
- package/src/getUserID.js +67 -0
- package/src/getUserInfo.js +89 -0
- package/src/handleFriendRequest.js +56 -0
- package/src/handleMessageRequest.js +65 -0
- package/src/httpGet.js +53 -0
- package/src/httpPost.js +53 -0
- package/src/httpPostFormData.js +58 -0
- package/src/listenMqtt.js +683 -0
- package/src/listenNotification.js +96 -0
- package/src/logout.js +77 -0
- package/src/markAsDelivered.js +53 -0
- package/src/markAsRead.js +74 -0
- package/src/markAsReadAll.js +46 -0
- package/src/markAsSeen.js +57 -0
- package/src/muteThread.js +49 -0
- package/src/pinMessage.js +60 -0
- package/src/refreshFb_dtsg.js +75 -0
- package/src/removeUserFromGroup.js +59 -0
- package/src/resolvePhotoUrl.js +47 -0
- package/src/searchForThread.js +55 -0
- package/src/searchStickers.js +59 -0
- package/src/sendMessage.js +444 -0
- package/src/sendMessageMqtt.js +326 -0
- package/src/sendTypingIndicator.js +54 -0
- package/src/setMessageReaction.js +126 -0
- package/src/setMessageReactionMqtt.js +74 -0
- package/src/setPostReaction.js +103 -0
- package/src/setProfileGuard.js +66 -0
- package/src/setStoryReaction.js +97 -0
- package/src/setTitle.js +100 -0
- package/src/shareContact.js +101 -0
- package/src/shareLink.js +105 -0
- package/src/stopListenMqtt.js +47 -0
- package/src/threadColors.js +119 -0
- package/src/unfriend.js +58 -0
- package/src/unsendMessage.js +51 -0
- package/src/uploadAttachment.js +98 -0
- package/utils.js +919 -0
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const utils = require("../utils");
|
|
4
|
+
|
|
5
|
+
module.exports = (defaultFuncs, api, ctx) => {
|
|
6
|
+
return (guard, 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, data) {
|
|
16
|
+
if (err) {
|
|
17
|
+
return rejectFunc(err);
|
|
18
|
+
}
|
|
19
|
+
resolveFunc(data);
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
if (utils.getType(guard) !== "Boolean") {
|
|
24
|
+
return callback({
|
|
25
|
+
error: "Please pass a boolean as a second argument.",
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const uid = ctx.userID;
|
|
30
|
+
const form = {
|
|
31
|
+
av: uid,
|
|
32
|
+
variables: JSON.stringify({
|
|
33
|
+
input: {
|
|
34
|
+
is_shielded: guard ? true : false,
|
|
35
|
+
actor_id: uid,
|
|
36
|
+
client_mutation_id: "1"
|
|
37
|
+
},
|
|
38
|
+
scale: 1
|
|
39
|
+
}),
|
|
40
|
+
doc_id: "1477043292367183",
|
|
41
|
+
fb_api_req_friendly_name: "IsShieldedSetMutation",
|
|
42
|
+
fb_api_caller_class: "IsShieldedSetMutation"
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
defaultFuncs
|
|
46
|
+
.post("https://www.facebook.com/api/graphql", ctx.jar, form)
|
|
47
|
+
.then(utils.parseAndCheckLogin(ctx, defaultFuncs))
|
|
48
|
+
.then(function(resData) {
|
|
49
|
+
if (!resData) {
|
|
50
|
+
throw { error: "setProfileGuard returned empty response." };
|
|
51
|
+
}
|
|
52
|
+
if (resData.err || resData.errors || resData.error) {
|
|
53
|
+
throw {
|
|
54
|
+
error: resData.err || resData.errors || resData.error
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
return callback(null, resData);
|
|
58
|
+
})
|
|
59
|
+
.catch(err => {
|
|
60
|
+
utils.error("setProfileGuard", err);
|
|
61
|
+
return callback(err);
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
return returnPromise;
|
|
65
|
+
};
|
|
66
|
+
};
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const utils = require('../utils.js');
|
|
4
|
+
|
|
5
|
+
module.exports = function(defaultFuncs, api, ctx) {
|
|
6
|
+
return function setStoryReaction(storyID, react, callback) {
|
|
7
|
+
var cb;
|
|
8
|
+
var returnPromise = new Promise(function(resolve, reject) {
|
|
9
|
+
cb = error => error ? reject(error) : resolve();
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
if (typeof react == 'function') {
|
|
13
|
+
callback = react;
|
|
14
|
+
react = 1;
|
|
15
|
+
}
|
|
16
|
+
if (typeof callback == 'function') {
|
|
17
|
+
cb = callback;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
if (!storyID) {
|
|
21
|
+
return cb({ error: 'setStoryReaction: storyID is required.' });
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// সাপোর্ট করা রিঅ্যাকশন ও তাদের টেক্সট ফরম্যাট ম্যাপিং
|
|
25
|
+
var map = {
|
|
26
|
+
1: '👍',
|
|
27
|
+
2: '❤️',
|
|
28
|
+
3: '🤗',
|
|
29
|
+
4: '😆',
|
|
30
|
+
5: '😮',
|
|
31
|
+
6: '😢',
|
|
32
|
+
7: '😡'
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
var aliasMap = {
|
|
36
|
+
'like': 1, 'thumbsup': 1, '👍': 1,
|
|
37
|
+
'heart': 2, 'love': 2, '❤️': 2,
|
|
38
|
+
'care': 3, 'hug': 3, '🤗': 3,
|
|
39
|
+
'haha': 4, 'laugh': 4, '😆': 4,
|
|
40
|
+
'wow': 5, 'shock': 5, '😮': 5,
|
|
41
|
+
'sad': 6, 'cry': 6, '😢': 6,
|
|
42
|
+
'angry': 7, 'rage': 7, '😡': 7
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
// রিঅ্যাকশন ইনপুট পার্স করা
|
|
46
|
+
var targetReact = 1;
|
|
47
|
+
if (react !== undefined && react !== null) {
|
|
48
|
+
var reactStr = String(react).toLowerCase().trim();
|
|
49
|
+
if (aliasMap[reactStr] !== undefined) {
|
|
50
|
+
targetReact = aliasMap[reactStr];
|
|
51
|
+
} else {
|
|
52
|
+
var reactNum = Number(react);
|
|
53
|
+
if (!isNaN(reactNum) && map[reactNum] !== undefined) {
|
|
54
|
+
targetReact = reactNum;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
var form = {
|
|
60
|
+
fb_api_req_friendly_name: 'useStoriesSendReplyMutation',
|
|
61
|
+
variables: JSON.stringify({
|
|
62
|
+
input: {
|
|
63
|
+
attribution_id_v2: `StoriesCometSuspenseRoot.react,comet.stories.viewer,unexpected,${Date.now()},538296,,;CometHomeRoot.react,comet.home,via_cold_start,${Date.now()},850302,4748854339,`,
|
|
64
|
+
lightweight_reaction_actions: {
|
|
65
|
+
offsets: [0],
|
|
66
|
+
reaction: map[targetReact]
|
|
67
|
+
},
|
|
68
|
+
message: map[targetReact],
|
|
69
|
+
story_id: storyID.toString(),
|
|
70
|
+
story_reply_type: "LIGHT_WEIGHT",
|
|
71
|
+
actor_id: ctx.userID,
|
|
72
|
+
client_mutation_id: String(parseInt(Math.random() * 16))
|
|
73
|
+
}
|
|
74
|
+
}),
|
|
75
|
+
doc_id: '4826141330837571'
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
defaultFuncs
|
|
79
|
+
.post('https://www.facebook.com/api/graphql/', ctx.jar, form)
|
|
80
|
+
.then(utils.parseAndCheckLogin(ctx, defaultFuncs))
|
|
81
|
+
.then(function(res) {
|
|
82
|
+
if (!res) {
|
|
83
|
+
throw { error: "setStoryReaction returned empty response." };
|
|
84
|
+
}
|
|
85
|
+
if (res.errors) {
|
|
86
|
+
throw res;
|
|
87
|
+
}
|
|
88
|
+
return cb();
|
|
89
|
+
})
|
|
90
|
+
.catch(function(err) {
|
|
91
|
+
utils.error('setStoryReaction', err);
|
|
92
|
+
return cb(err);
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
return returnPromise;
|
|
96
|
+
}
|
|
97
|
+
}
|
package/src/setTitle.js
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const utils = require("../utils");
|
|
4
|
+
|
|
5
|
+
module.exports = function (defaultFuncs, api, ctx) {
|
|
6
|
+
return function setTitle(newTitle, threadID, 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
|
+
if (
|
|
16
|
+
utils.getType(threadID) === "Function" ||
|
|
17
|
+
utils.getType(threadID) === "AsyncFunction"
|
|
18
|
+
) {
|
|
19
|
+
callback = threadID;
|
|
20
|
+
threadID = undefined;
|
|
21
|
+
} else {
|
|
22
|
+
callback = function (err, data) {
|
|
23
|
+
if (err) {
|
|
24
|
+
return rejectFunc(err);
|
|
25
|
+
}
|
|
26
|
+
resolveFunc(data);
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
if (!threadID) {
|
|
32
|
+
return callback({ error: "Please pass a threadID as a second argument." });
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const titleStr = newTitle !== null && newTitle !== undefined ? newTitle.toString() : "";
|
|
36
|
+
const threadIDStr = threadID.toString();
|
|
37
|
+
const messageAndOTID = utils.generateOfflineThreadingID();
|
|
38
|
+
|
|
39
|
+
const form = {
|
|
40
|
+
client: "mercury",
|
|
41
|
+
action_type: "ma-type:log-message",
|
|
42
|
+
author: "fbid:" + (ctx.userID),
|
|
43
|
+
author_email: "",
|
|
44
|
+
coordinates: "",
|
|
45
|
+
timestamp: Date.now(),
|
|
46
|
+
timestamp_absolute: "Today",
|
|
47
|
+
timestamp_relative: utils.generateTimestampRelative(),
|
|
48
|
+
timestamp_time_passed: "0",
|
|
49
|
+
is_unread: false,
|
|
50
|
+
is_cleared: false,
|
|
51
|
+
is_forward: false,
|
|
52
|
+
is_filtered_content: false,
|
|
53
|
+
is_spoof_warning: false,
|
|
54
|
+
source: "source:chat:web",
|
|
55
|
+
"source_tags[0]": "source:chat",
|
|
56
|
+
status: "0",
|
|
57
|
+
offline_threading_id: messageAndOTID,
|
|
58
|
+
message_id: messageAndOTID,
|
|
59
|
+
threading_id: utils.generateThreadingID(ctx.clientID),
|
|
60
|
+
manual_retry_cnt: "0",
|
|
61
|
+
thread_fbid: threadIDStr,
|
|
62
|
+
thread_name: titleStr,
|
|
63
|
+
thread_id: threadIDStr,
|
|
64
|
+
log_message_type: "log:thread-name",
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
defaultFuncs
|
|
68
|
+
.post(
|
|
69
|
+
"https://www.facebook.com/messaging/set_thread_name/",
|
|
70
|
+
ctx.jar,
|
|
71
|
+
form,
|
|
72
|
+
)
|
|
73
|
+
.then(utils.parseAndCheckLogin(ctx, defaultFuncs))
|
|
74
|
+
.then(function (resData) {
|
|
75
|
+
if (!resData) {
|
|
76
|
+
throw { error: "setTitle returned empty response." };
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
if (resData.error && resData.error === 1545012) {
|
|
80
|
+
throw { error: "Cannot change chat title: Not member of chat." };
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
if (resData.error && resData.error === 1545003) {
|
|
84
|
+
throw { error: "Cannot set title of single-user chat." };
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
if (resData.error) {
|
|
88
|
+
throw resData;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
return callback(null);
|
|
92
|
+
})
|
|
93
|
+
.catch(function (err) {
|
|
94
|
+
utils.error("setTitle", err);
|
|
95
|
+
return callback(err);
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
return returnPromise;
|
|
99
|
+
};
|
|
100
|
+
};
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var utils = require("../utils");
|
|
4
|
+
|
|
5
|
+
module.exports = function(defaultFuncs, api, ctx) {
|
|
6
|
+
return function shareContact(text, senderID, threadID, callback) {
|
|
7
|
+
var resolveFunc = function () {};
|
|
8
|
+
var 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, data) {
|
|
16
|
+
if (err) {
|
|
17
|
+
return rejectFunc(err);
|
|
18
|
+
}
|
|
19
|
+
resolveFunc(data);
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
if (!ctx.mqttClient) {
|
|
24
|
+
return callback(new Error('Not connected to MQTT'));
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
if (!senderID || !threadID) {
|
|
28
|
+
return callback({ error: "senderID and threadID are required." });
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// safe initialization of request counters
|
|
32
|
+
if (ctx.wsReqNumber === undefined || ctx.wsReqNumber === null) {
|
|
33
|
+
ctx.wsReqNumber = 0;
|
|
34
|
+
}
|
|
35
|
+
if (ctx.wsTaskNumber === undefined || ctx.wsTaskNumber === null) {
|
|
36
|
+
ctx.wsTaskNumber = 0;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
ctx.wsReqNumber += 1;
|
|
40
|
+
ctx.wsTaskNumber += 1;
|
|
41
|
+
|
|
42
|
+
const queryPayload = {
|
|
43
|
+
contact_id: senderID.toString(),
|
|
44
|
+
sync_group: 1,
|
|
45
|
+
text: text || "",
|
|
46
|
+
thread_id: threadID.toString()
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
const query = {
|
|
50
|
+
failure_count: null,
|
|
51
|
+
label: '359',
|
|
52
|
+
payload: JSON.stringify(queryPayload),
|
|
53
|
+
queue_name: 'messenger_contact_sharing', // xma_open_contact_share
|
|
54
|
+
task_id: Math.floor(Math.random() * 1001),
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
const context = {
|
|
58
|
+
app_id: '2220391788200892',
|
|
59
|
+
payload: {
|
|
60
|
+
tasks: [query],
|
|
61
|
+
epoch_id: parseInt(utils.generateOfflineThreadingID()),
|
|
62
|
+
version_id: '7214102258676893',
|
|
63
|
+
},
|
|
64
|
+
request_id: ctx.wsReqNumber,
|
|
65
|
+
type: 3,
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
context.payload = JSON.stringify(context.payload);
|
|
69
|
+
|
|
70
|
+
// safe callback mapping to prevent crashes
|
|
71
|
+
if (typeof callback === 'function') {
|
|
72
|
+
if (!ctx.callback_Task) {
|
|
73
|
+
ctx.callback_Task = {};
|
|
74
|
+
}
|
|
75
|
+
ctx.callback_Task[ctx.wsReqNumber] = { callback, type: "shareContact" };
|
|
76
|
+
|
|
77
|
+
// also fallback to reqCallbacks if your bot utilizes it
|
|
78
|
+
if (ctx.reqCallbacks) {
|
|
79
|
+
ctx.reqCallbacks[ctx.wsReqNumber] = callback;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
ctx.mqttClient.publish(
|
|
84
|
+
'/ls_req',
|
|
85
|
+
JSON.stringify(context),
|
|
86
|
+
{ qos: 1, retain: false },
|
|
87
|
+
function (err, data) {
|
|
88
|
+
if (err) {
|
|
89
|
+
utils.error("shareContact", err);
|
|
90
|
+
return callback(err);
|
|
91
|
+
}
|
|
92
|
+
// If not using callback listeners in state, trigger immediately
|
|
93
|
+
if (!ctx.callback_Task && !ctx.reqCallbacks) {
|
|
94
|
+
callback(null, data);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
);
|
|
98
|
+
|
|
99
|
+
return returnPromise;
|
|
100
|
+
};
|
|
101
|
+
};
|
package/src/shareLink.js
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var utils = require("../utils");
|
|
4
|
+
|
|
5
|
+
module.exports = function (defaultFuncs, api, ctx) {
|
|
6
|
+
return async function shareLink(text, url, threadID, callback) {
|
|
7
|
+
var resolveFunc = function () {};
|
|
8
|
+
var rejectFunc = function () {};
|
|
9
|
+
var returnPromise = new Promise(function (resolve, reject) {
|
|
10
|
+
resolveFunc = resolve;
|
|
11
|
+
rejectFunc = reject;
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
if (!callback) {
|
|
15
|
+
callback = function (err, data) {
|
|
16
|
+
if (err) return rejectFunc(err);
|
|
17
|
+
resolveFunc(data);
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
if (!ctx.mqttClient) {
|
|
22
|
+
return callback({ error: "Not connected to MQTT" });
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
if (!threadID) {
|
|
26
|
+
return callback({ error: "ThreadID is required." });
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
if (!url) {
|
|
30
|
+
return callback({ error: "URL is required." });
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// safe initialization of request counters
|
|
34
|
+
if (ctx.req_ID === undefined || ctx.req_ID === null) {
|
|
35
|
+
ctx.req_ID = 0;
|
|
36
|
+
}
|
|
37
|
+
if (!ctx.callback_Task) {
|
|
38
|
+
ctx.callback_Task = {};
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const currentReqID = ++ctx.req_ID;
|
|
42
|
+
const threadIDStr = threadID.toString();
|
|
43
|
+
|
|
44
|
+
const payload = {
|
|
45
|
+
"app_id": "2220391788200892",
|
|
46
|
+
"payload": JSON.stringify({
|
|
47
|
+
tasks: [{
|
|
48
|
+
label: 46,
|
|
49
|
+
payload: JSON.stringify({
|
|
50
|
+
"otid": utils.generateOfflineThreadingID(),
|
|
51
|
+
"source": 524289,
|
|
52
|
+
"sync_group": 1,
|
|
53
|
+
"send_type": 6,
|
|
54
|
+
"mark_thread_read": 0,
|
|
55
|
+
"url": url,
|
|
56
|
+
"text": text || "",
|
|
57
|
+
"thread_id": threadIDStr,
|
|
58
|
+
"initiating_source": 0
|
|
59
|
+
}),
|
|
60
|
+
queue_name: threadIDStr,
|
|
61
|
+
task_id: Math.floor(Math.random() * 1001),
|
|
62
|
+
failure_count: null,
|
|
63
|
+
}],
|
|
64
|
+
epoch_id: parseInt(utils.generateOfflineThreadingID()),
|
|
65
|
+
version_id: '7191105584331330',
|
|
66
|
+
}),
|
|
67
|
+
"request_id": currentReqID,
|
|
68
|
+
"type": 3
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
ctx.callback_Task[currentReqID] = {
|
|
72
|
+
callback,
|
|
73
|
+
type: "shareLink"
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
// fallback trigger to reqCallbacks if used by the library
|
|
77
|
+
if (ctx.reqCallbacks) {
|
|
78
|
+
ctx.reqCallbacks[currentReqID] = callback;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
ctx.mqttClient.publish(
|
|
82
|
+
'/ls_req',
|
|
83
|
+
JSON.stringify(payload),
|
|
84
|
+
{
|
|
85
|
+
qos: 1,
|
|
86
|
+
retain: false,
|
|
87
|
+
},
|
|
88
|
+
function (err, data) {
|
|
89
|
+
if (err) {
|
|
90
|
+
utils.error("shareLink", err);
|
|
91
|
+
// clean up callback store on error
|
|
92
|
+
delete ctx.callback_Task[currentReqID];
|
|
93
|
+
if (ctx.reqCallbacks) delete ctx.reqCallbacks[currentReqID];
|
|
94
|
+
return callback(err);
|
|
95
|
+
}
|
|
96
|
+
// if there is no global listener, execute immediately on success
|
|
97
|
+
if (!ctx.reqCallbacks && ctx.callback_Task[currentReqID]) {
|
|
98
|
+
callback(null, data);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
);
|
|
102
|
+
|
|
103
|
+
return returnPromise;
|
|
104
|
+
};
|
|
105
|
+
};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var utils = require("../utils");
|
|
4
|
+
|
|
5
|
+
module.exports = function (defaultFuncs, api, ctx) {
|
|
6
|
+
return function stopListenMqtt(callback) {
|
|
7
|
+
var resolveFunc = function () {};
|
|
8
|
+
var 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, data) {
|
|
16
|
+
if (err) {
|
|
17
|
+
return rejectFunc(err);
|
|
18
|
+
}
|
|
19
|
+
resolveFunc(data);
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
if (!ctx.mqttClient) {
|
|
24
|
+
return callback(new Error("Not connected to MQTT"));
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
utils.log("stopListenMqtt", "Stopping...");
|
|
28
|
+
|
|
29
|
+
try {
|
|
30
|
+
ctx.mqttClient.unsubscribe("/webrtc");
|
|
31
|
+
ctx.mqttClient.unsubscribe("/rtc_multi");
|
|
32
|
+
ctx.mqttClient.unsubscribe("/onevc");
|
|
33
|
+
ctx.mqttClient.publish("/browser_close", "{}");
|
|
34
|
+
|
|
35
|
+
ctx.mqttClient.end(false, function (...data) {
|
|
36
|
+
utils.log("stopListenMqtt", "Stopped");
|
|
37
|
+
ctx.mqttClient = null;
|
|
38
|
+
return callback(null, data);
|
|
39
|
+
});
|
|
40
|
+
} catch (err) {
|
|
41
|
+
utils.error("stopListenMqtt", err);
|
|
42
|
+
return callback(err);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return returnPromise;
|
|
46
|
+
};
|
|
47
|
+
};
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
module.exports = function (_defaultFuncs, _api, _ctx) {
|
|
4
|
+
const themes = {
|
|
5
|
+
// #region Backward compatibility mapping
|
|
6
|
+
MessengerBlue: "196241301102133", // DefaultBlue
|
|
7
|
+
Viking: "1928399724138152", // TealBlue
|
|
8
|
+
GoldenPoppy: "174636906462322", // Yellow
|
|
9
|
+
RadicalRed: "2129984390566328", // Red
|
|
10
|
+
Shocking: "2058653964378557", // LavenderPurple
|
|
11
|
+
FreeSpeechGreen: "2136751179887052", // Green
|
|
12
|
+
Pumpkin: "175615189761153", // Orange
|
|
13
|
+
LightCoral: "980963458735625", // CoralPink
|
|
14
|
+
MediumSlateBlue: "234137870477637", // BrightPurple
|
|
15
|
+
DeepSkyBlue: "2442142322678320", // AquaBlue
|
|
16
|
+
BrilliantRose: "169463077092846", // HotPink
|
|
17
|
+
// #endregion
|
|
18
|
+
|
|
19
|
+
DefaultBlue: "196241301102133",
|
|
20
|
+
HotPink: "169463077092846",
|
|
21
|
+
AquaBlue: "2442142322678320",
|
|
22
|
+
BrightPurple: "234137870477637",
|
|
23
|
+
CoralPink: "980963458735625",
|
|
24
|
+
Orange: "175615189761153",
|
|
25
|
+
Green: "2136751179887052",
|
|
26
|
+
LavenderPurple: "2058653964378557",
|
|
27
|
+
Red: "2129984390566328",
|
|
28
|
+
Yellow: "174636906462322",
|
|
29
|
+
TealBlue: "1928399724138152",
|
|
30
|
+
Aqua: "417639218648241",
|
|
31
|
+
Mango: "930060997172551",
|
|
32
|
+
Berry: "164535220883264",
|
|
33
|
+
Citrus: "370940413392601",
|
|
34
|
+
Candy: "205488546921017",
|
|
35
|
+
|
|
36
|
+
Earth: "1833559466821043",
|
|
37
|
+
Support: "365557122117011",
|
|
38
|
+
Music: "339021464972092",
|
|
39
|
+
Pride: "1652456634878319",
|
|
40
|
+
DoctorStrange: "538280997628317",
|
|
41
|
+
LoFi: "1060619084701625",
|
|
42
|
+
Sky: "3190514984517598",
|
|
43
|
+
LunarNewYear: "357833546030778",
|
|
44
|
+
Celebration: "627144732056021",
|
|
45
|
+
Chill: "390127158985345",
|
|
46
|
+
StrangerThings: "1059859811490132",
|
|
47
|
+
Dune: "1455149831518874",
|
|
48
|
+
Care: "275041734441112",
|
|
49
|
+
Astrology: "3082966625307060",
|
|
50
|
+
JBalvin: "184305226956268",
|
|
51
|
+
Birthday: "621630955405500",
|
|
52
|
+
Cottagecore: "539927563794799",
|
|
53
|
+
Ocean: "736591620215564",
|
|
54
|
+
Love: "741311439775765",
|
|
55
|
+
TieDye: "230032715012014",
|
|
56
|
+
Monochrome: "788274591712841",
|
|
57
|
+
Default: "3259963564026002",
|
|
58
|
+
Rocket: "582065306070020",
|
|
59
|
+
Berry2: "724096885023603",
|
|
60
|
+
Candy2: "624266884847972",
|
|
61
|
+
Unicorn: "273728810607574",
|
|
62
|
+
Tropical: "262191918210707",
|
|
63
|
+
Maple: "2533652183614000",
|
|
64
|
+
Sushi: "909695489504566",
|
|
65
|
+
Citrus2: "557344741607350",
|
|
66
|
+
Lollipop: "280333826736184",
|
|
67
|
+
Shadow: "271607034185782",
|
|
68
|
+
Rose: "1257453361255152",
|
|
69
|
+
Lavender: "571193503540759",
|
|
70
|
+
Tulip: "2873642949430623",
|
|
71
|
+
Classic: "3273938616164733",
|
|
72
|
+
Peach: "3022526817824329",
|
|
73
|
+
Honey: "672058580051520",
|
|
74
|
+
Kiwi: "3151463484918004",
|
|
75
|
+
Grape: "193497045377796",
|
|
76
|
+
|
|
77
|
+
NonBinary: "737761000603635",
|
|
78
|
+
|
|
79
|
+
ThankfulForFriends: "1318983195536293",
|
|
80
|
+
Transgender: "504518465021637",
|
|
81
|
+
TaylorSwift: "769129927636836",
|
|
82
|
+
NationalComingOutDay: "788102625833584",
|
|
83
|
+
Autumn: "822549609168155",
|
|
84
|
+
Cyberpunk2077: "780962576430091",
|
|
85
|
+
|
|
86
|
+
MothersDay: "1288506208402340",
|
|
87
|
+
APAHM: "121771470870245",
|
|
88
|
+
Parenthood: "810978360551741",
|
|
89
|
+
StarWars: "1438011086532622",
|
|
90
|
+
GuardianOfTheGalaxy: "101275642962533",
|
|
91
|
+
Bloom: "158263147151440",
|
|
92
|
+
BubbleTea: "195296273246380",
|
|
93
|
+
Basketball: "6026716157422736",
|
|
94
|
+
ElephantsAndFlowers: "693996545771691"
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
// কেস-ইনসেনসিটিভ সার্চ বা ফলব্যাকের সুবিধাসহ অবজেক্টটি রিটার্ন করা হচ্ছে
|
|
98
|
+
const themeMap = { ...themes };
|
|
99
|
+
|
|
100
|
+
// ডাইনামিকালি আইডি বের করার একটি হেল্পার মেথড
|
|
101
|
+
themeMap.getThemeID = function (name) {
|
|
102
|
+
if (!name) return themes.DefaultBlue;
|
|
103
|
+
const searchName = name.toString().toLowerCase().replace(/\s+/g, "");
|
|
104
|
+
|
|
105
|
+
// থিমের অবজেক্ট থেকে মিলিয়ে দেখা হচ্ছে
|
|
106
|
+
for (const key of Object.keys(themes)) {
|
|
107
|
+
if (key.toLowerCase() === searchName) {
|
|
108
|
+
return themes[key];
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
// যদি আইডি সরাসরি পাস করা হয়, সেটিই ফেরত যাবে
|
|
112
|
+
if (/^\d+$/.test(name)) {
|
|
113
|
+
return name.toString();
|
|
114
|
+
}
|
|
115
|
+
return themes.DefaultBlue;
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
return themeMap;
|
|
119
|
+
};
|
package/src/unfriend.js
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var utils = require("../utils");
|
|
4
|
+
|
|
5
|
+
module.exports = function(defaultFuncs, api, ctx) {
|
|
6
|
+
return function unFriend(userID, callback) {
|
|
7
|
+
var resolveFunc = function(){};
|
|
8
|
+
var rejectFunc = function(){};
|
|
9
|
+
var returnPromise = new Promise(function (resolve, reject) {
|
|
10
|
+
resolveFunc = resolve;
|
|
11
|
+
rejectFunc = reject;
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
if (!callback) {
|
|
15
|
+
callback = function (err, data) {
|
|
16
|
+
if (err) {
|
|
17
|
+
return rejectFunc(err);
|
|
18
|
+
}
|
|
19
|
+
resolveFunc(data);
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
if (!userID) {
|
|
24
|
+
return callback({ error: "unFriend: userID is required." });
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
var form = {
|
|
28
|
+
uid: userID.toString(),
|
|
29
|
+
unref: "bd_friends_tab",
|
|
30
|
+
floc: "friends_tab",
|
|
31
|
+
"nctr[_mod]": "pagelet_timeline_app_collection_" + ctx.userID + ":2356318349:2"
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
defaultFuncs
|
|
35
|
+
.post(
|
|
36
|
+
"https://www.facebook.com/ajax/profile/removefriendconfirm.php",
|
|
37
|
+
ctx.jar,
|
|
38
|
+
form
|
|
39
|
+
)
|
|
40
|
+
.then(utils.parseAndCheckLogin(ctx, defaultFuncs))
|
|
41
|
+
.then(function(resData) {
|
|
42
|
+
if (!resData) {
|
|
43
|
+
throw { error: "unFriend returned empty response." };
|
|
44
|
+
}
|
|
45
|
+
if (resData.error) {
|
|
46
|
+
throw resData;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return callback(null, resData);
|
|
50
|
+
})
|
|
51
|
+
.catch(function(err) {
|
|
52
|
+
utils.error("unFriend", err);
|
|
53
|
+
return callback(err);
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
return returnPromise;
|
|
57
|
+
};
|
|
58
|
+
};
|