@cexy/hoonfca 1.0.0 → 1.0.2
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/.travis.yml +6 -0
- package/LICENSE-MIT +21 -0
- package/index.d.ts +620 -0
- package/index.js +745 -433
- package/package.json +45 -6
- package/src/addExternalModule.js +14 -16
- package/src/addUserToGroup.js +45 -30
- package/src/changeAdminStatus.js +39 -42
- package/src/changeApprovalMode.js +79 -0
- package/src/changeArchivedStatus.js +19 -15
- package/src/changeBio.js +18 -16
- package/src/changeBlockedStatus.js +14 -12
- package/src/changeBlockedStatusMqtt.js +38 -17
- package/src/changeGroupImage.js +100 -77
- package/src/changeNickname.js +12 -11
- package/src/changeThreadColor.js +25 -16
- package/src/changeThreadEmoji.js +11 -10
- package/src/createNewGroup.js +21 -14
- package/src/createPoll.js +87 -21
- package/src/deleteMessage.js +18 -17
- package/src/deleteThread.js +18 -17
- package/src/editMessage.js +28 -31
- package/src/forwardAttachment.js +22 -19
- package/src/forwardMessage.js +63 -0
- package/src/getCurrentUserID.js +4 -2
- package/src/getEmojiUrl.js +20 -9
- package/src/getFriendsList.js +21 -18
- package/src/getGroupsList.js +83 -0
- package/src/getMarketplace.js +84 -0
- package/src/getNotifications.js +86 -0
- package/src/getPagesList.js +83 -0
- package/src/getStories.js +88 -0
- package/src/getThreadHistory.js +277 -126
- package/src/getThreadInfo.js +143 -115
- package/src/getThreadList.js +216 -143
- package/src/getThreadPictures.js +26 -32
- package/src/getUserID.js +13 -14
- package/src/getUserInfo.js +107 -68
- package/src/handleFriendRequest.js +16 -15
- package/src/handleMessageRequest.js +15 -15
- package/src/httpGet.js +36 -31
- package/src/httpPost.js +36 -31
- package/src/listenMqtt.js +705 -370
- package/src/logout.js +26 -28
- package/src/markAsDelivered.js +22 -17
- package/src/markAsRead.js +63 -49
- package/src/markAsReadAll.js +17 -13
- package/src/markAsSeen.js +23 -19
- package/src/muteThread.js +17 -14
- package/src/pinMessage.js +23 -22
- package/src/removeUserFromGroup.js +42 -22
- package/src/resolvePhotoUrl.js +15 -17
- package/src/searchForThread.js +18 -20
- package/src/searchUsers.js +89 -0
- package/src/sendComment.js +161 -0
- package/src/sendMessage.js +65 -52
- package/src/sendTypingIndicator.js +173 -48
- package/src/setBio.js +86 -0
- package/src/setMessageReaction.js +76 -16
- package/src/setPostReaction.js +29 -61
- package/src/setTheme.js +313 -0
- package/src/setTitle.js +27 -37
- package/src/shareContact.js +34 -82
- package/src/shareLink.js +56 -99
- package/src/threadColors.js +35 -97
- package/src/unfriend.js +15 -20
- package/src/unsendMessage.js +71 -18
- package/utils.js +1000 -472
- package/README.md +0 -83
- package/replit.nix +0 -3
- package/src/changeAvatar.js +0 -89
- package/src/changeCover.js +0 -92
- package/src/changeName.js +0 -106
- package/src/changeUsername.js +0 -80
- package/src/createCommentPost.js +0 -196
- package/src/createPost.js +0 -285
- package/src/data/getThreadInfo.json +0 -1
- package/src/follow.js +0 -71
- package/src/getAccess.js +0 -130
- package/src/getAvatarUser.js +0 -88
- package/src/getBotInitialData.js +0 -59
- package/src/getCtx.js +0 -5
- package/src/getMessage.js +0 -827
- package/src/getOptions.js +0 -5
- package/src/getRegion.js +0 -7
- package/src/getThreadHistoryDeprecated.js +0 -95
- package/src/getThreadInfoDeprecated.js +0 -77
- package/src/getThreadListDeprecated.js +0 -86
- package/src/httpPostFormData.js +0 -58
- package/src/listenNotification.js +0 -96
- package/src/refreshFb_dtsg.js +0 -75
- package/src/searchStickers.js +0 -59
- package/src/sendMessageMqtt.js +0 -326
- package/src/setMessageReactionMqtt.js +0 -74
- package/src/setProfileGuard.js +0 -66
- package/src/setStoryReaction.js +0 -97
- package/src/stopListenMqtt.js +0 -47
- package/src/uploadAttachment.js +0 -98
package/src/createPoll.js
CHANGED
|
@@ -1,64 +1,130 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
var utils = require("../utils");
|
|
4
|
+
var log = require("npmlog");
|
|
5
|
+
const { generateOfflineThreadingID } = require("../utils");
|
|
4
6
|
|
|
5
7
|
module.exports = function (defaultFuncs, api, ctx) {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
function createPollNoMqtt(title, threadID, options, callback) {
|
|
9
|
+
var resolveFunc = function () {};
|
|
10
|
+
var rejectFunc = function () {};
|
|
11
|
+
var returnPromise = new Promise(function (resolve, reject) {
|
|
10
12
|
resolveFunc = resolve;
|
|
11
13
|
rejectFunc = reject;
|
|
12
14
|
});
|
|
13
15
|
|
|
14
|
-
const optionsType = utils.getType(options);
|
|
15
|
-
|
|
16
|
-
// কলব্যাক ও অপশন হ্যান্ডলিং
|
|
17
16
|
if (!callback) {
|
|
18
|
-
if (
|
|
17
|
+
if (utils.getType(options) == "Function") {
|
|
19
18
|
callback = options;
|
|
20
19
|
options = null;
|
|
21
20
|
} else {
|
|
22
21
|
callback = function (err) {
|
|
23
|
-
if (err)
|
|
22
|
+
if (err) {
|
|
23
|
+
return rejectFunc(err);
|
|
24
|
+
}
|
|
24
25
|
resolveFunc();
|
|
25
26
|
};
|
|
26
27
|
}
|
|
27
28
|
}
|
|
28
|
-
|
|
29
29
|
if (!options) {
|
|
30
|
-
options = {};
|
|
30
|
+
options = {}; // Initial poll options are optional
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
-
|
|
33
|
+
var form = {
|
|
34
34
|
target_id: threadID,
|
|
35
35
|
question_text: title,
|
|
36
36
|
};
|
|
37
37
|
|
|
38
|
-
//
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
38
|
+
// Set fields for options (and whether they are selected initially by the posting user)
|
|
39
|
+
var ind = 0;
|
|
40
|
+
for (var opt in options) {
|
|
41
|
+
// eslint-disable-next-line no-prototype-builtins
|
|
42
|
+
if (options.hasOwnProperty(opt)) {
|
|
43
|
+
form["option_text_array[" + ind + "]"] = opt;
|
|
44
|
+
form["option_is_selected_array[" + ind + "]"] = options[opt]
|
|
45
|
+
? "1"
|
|
46
|
+
: "0";
|
|
47
|
+
ind++;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
43
50
|
|
|
44
51
|
defaultFuncs
|
|
45
52
|
.post(
|
|
46
53
|
"https://www.facebook.com/messaging/group_polling/create_poll/?dpr=1",
|
|
47
54
|
ctx.jar,
|
|
48
|
-
form
|
|
55
|
+
form,
|
|
49
56
|
)
|
|
50
57
|
.then(utils.parseAndCheckLogin(ctx, defaultFuncs))
|
|
51
58
|
.then(function (resData) {
|
|
52
|
-
if (resData.payload
|
|
59
|
+
if (resData.payload.status != "success") {
|
|
53
60
|
throw resData;
|
|
54
61
|
}
|
|
62
|
+
|
|
55
63
|
return callback();
|
|
56
64
|
})
|
|
57
65
|
.catch(function (err) {
|
|
58
|
-
|
|
66
|
+
log.error("createPoll", err);
|
|
59
67
|
return callback(err);
|
|
60
68
|
});
|
|
61
69
|
|
|
62
70
|
return returnPromise;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function createPollMqtt(title, options, threadID, callback) {
|
|
74
|
+
if (!ctx.mqttClient) {
|
|
75
|
+
throw new Error("Not connected to MQTT");
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
ctx.wsReqNumber += 1;
|
|
79
|
+
ctx.wsTaskNumber += 1;
|
|
80
|
+
|
|
81
|
+
const taskPayload = {
|
|
82
|
+
question_text: title,
|
|
83
|
+
thread_key: threadID,
|
|
84
|
+
options: options,
|
|
85
|
+
sync_group: 1,
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
const task = {
|
|
89
|
+
failure_count: null,
|
|
90
|
+
label: "163",
|
|
91
|
+
payload: JSON.stringify(taskPayload),
|
|
92
|
+
queue_name: "poll_creation",
|
|
93
|
+
task_id: ctx.wsTaskNumber,
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
const content = {
|
|
97
|
+
app_id: "2220391788200892",
|
|
98
|
+
payload: JSON.stringify({
|
|
99
|
+
data_trace_id: null,
|
|
100
|
+
epoch_id: parseInt(generateOfflineThreadingID()),
|
|
101
|
+
tasks: [task],
|
|
102
|
+
version_id: "7158486590867448",
|
|
103
|
+
}),
|
|
104
|
+
request_id: ctx.wsReqNumber,
|
|
105
|
+
type: 3,
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
// if (isCallable(callback)) {
|
|
109
|
+
// // to be implemented
|
|
110
|
+
// }
|
|
111
|
+
|
|
112
|
+
ctx.mqttClient.publish("/ls_req", JSON.stringify(content), {
|
|
113
|
+
qos: 1,
|
|
114
|
+
retain: false,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
return function createPoll(title, threadID, options, callback) {
|
|
119
|
+
if (ctx.mqttClient) {
|
|
120
|
+
try {
|
|
121
|
+
createPollMqtt(reaction, messageID, threadID, callback);
|
|
122
|
+
callback();
|
|
123
|
+
} catch (e) {
|
|
124
|
+
createPollNoMqtt(title, threadID, options, callback);
|
|
125
|
+
}
|
|
126
|
+
} else {
|
|
127
|
+
return createPollNoMqtt(title, threadID, options, callback);
|
|
128
|
+
}
|
|
63
129
|
};
|
|
64
130
|
};
|
package/src/deleteMessage.js
CHANGED
|
@@ -1,52 +1,53 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
var utils = require("../utils");
|
|
4
|
+
var log = require("npmlog");
|
|
4
5
|
|
|
5
6
|
module.exports = function (defaultFuncs, api, ctx) {
|
|
6
7
|
return function deleteMessage(messageOrMessages, callback) {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
var resolveFunc = function () {};
|
|
9
|
+
var rejectFunc = function () {};
|
|
10
|
+
var returnPromise = new Promise(function (resolve, reject) {
|
|
10
11
|
resolveFunc = resolve;
|
|
11
12
|
rejectFunc = reject;
|
|
12
13
|
});
|
|
13
|
-
|
|
14
14
|
if (!callback) {
|
|
15
15
|
callback = function (err) {
|
|
16
|
-
if (err)
|
|
16
|
+
if (err) {
|
|
17
|
+
return rejectFunc(err);
|
|
18
|
+
}
|
|
17
19
|
resolveFunc();
|
|
18
20
|
};
|
|
19
21
|
}
|
|
20
22
|
|
|
21
|
-
|
|
23
|
+
var form = {
|
|
22
24
|
client: "mercury",
|
|
23
25
|
};
|
|
24
26
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
: messageOrMessages;
|
|
27
|
+
if (utils.getType(messageOrMessages) !== "Array") {
|
|
28
|
+
messageOrMessages = [messageOrMessages];
|
|
29
|
+
}
|
|
29
30
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
});
|
|
31
|
+
for (var i = 0; i < messageOrMessages.length; i++) {
|
|
32
|
+
form["message_ids[" + i + "]"] = messageOrMessages[i];
|
|
33
|
+
}
|
|
34
34
|
|
|
35
35
|
defaultFuncs
|
|
36
36
|
.post(
|
|
37
37
|
"https://www.facebook.com/ajax/mercury/delete_messages.php",
|
|
38
38
|
ctx.jar,
|
|
39
|
-
form
|
|
39
|
+
form,
|
|
40
40
|
)
|
|
41
41
|
.then(utils.parseAndCheckLogin(ctx, defaultFuncs))
|
|
42
42
|
.then(function (resData) {
|
|
43
43
|
if (resData.error) {
|
|
44
44
|
throw resData;
|
|
45
45
|
}
|
|
46
|
+
|
|
46
47
|
return callback();
|
|
47
48
|
})
|
|
48
49
|
.catch(function (err) {
|
|
49
|
-
|
|
50
|
+
log.error("deleteMessage", err);
|
|
50
51
|
return callback(err);
|
|
51
52
|
});
|
|
52
53
|
|
package/src/deleteThread.js
CHANGED
|
@@ -1,52 +1,53 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
var utils = require("../utils");
|
|
4
|
+
var log = require("npmlog");
|
|
4
5
|
|
|
5
6
|
module.exports = function (defaultFuncs, api, ctx) {
|
|
6
7
|
return function deleteThread(threadOrThreads, callback) {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
var resolveFunc = function () {};
|
|
9
|
+
var rejectFunc = function () {};
|
|
10
|
+
var returnPromise = new Promise(function (resolve, reject) {
|
|
10
11
|
resolveFunc = resolve;
|
|
11
12
|
rejectFunc = reject;
|
|
12
13
|
});
|
|
13
|
-
|
|
14
14
|
if (!callback) {
|
|
15
15
|
callback = function (err) {
|
|
16
|
-
if (err)
|
|
16
|
+
if (err) {
|
|
17
|
+
return rejectFunc(err);
|
|
18
|
+
}
|
|
17
19
|
resolveFunc();
|
|
18
20
|
};
|
|
19
21
|
}
|
|
20
22
|
|
|
21
|
-
|
|
23
|
+
var form = {
|
|
22
24
|
client: "mercury",
|
|
23
25
|
};
|
|
24
26
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
: threadOrThreads;
|
|
27
|
+
if (utils.getType(threadOrThreads) !== "Array") {
|
|
28
|
+
threadOrThreads = [threadOrThreads];
|
|
29
|
+
}
|
|
29
30
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
});
|
|
31
|
+
for (var i = 0; i < threadOrThreads.length; i++) {
|
|
32
|
+
form["ids[" + i + "]"] = threadOrThreads[i];
|
|
33
|
+
}
|
|
34
34
|
|
|
35
35
|
defaultFuncs
|
|
36
36
|
.post(
|
|
37
37
|
"https://www.facebook.com/ajax/mercury/delete_thread.php",
|
|
38
38
|
ctx.jar,
|
|
39
|
-
form
|
|
39
|
+
form,
|
|
40
40
|
)
|
|
41
41
|
.then(utils.parseAndCheckLogin(ctx, defaultFuncs))
|
|
42
42
|
.then(function (resData) {
|
|
43
43
|
if (resData.error) {
|
|
44
44
|
throw resData;
|
|
45
45
|
}
|
|
46
|
+
|
|
46
47
|
return callback();
|
|
47
48
|
})
|
|
48
49
|
.catch(function (err) {
|
|
49
|
-
|
|
50
|
+
log.error("deleteThread", err);
|
|
50
51
|
return callback(err);
|
|
51
52
|
});
|
|
52
53
|
|
package/src/editMessage.js
CHANGED
|
@@ -1,19 +1,16 @@
|
|
|
1
|
-
"
|
|
1
|
+
"use_strict";
|
|
2
2
|
|
|
3
|
+
const { generateOfflineThreadingID } = require("../utils");
|
|
3
4
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
5
|
+
function isCallable(func) {
|
|
6
|
+
try {
|
|
7
|
+
Reflect.apply(func, null, []);
|
|
8
|
+
return true;
|
|
9
|
+
} catch (error) {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
9
12
|
}
|
|
10
13
|
|
|
11
|
-
/**
|
|
12
|
-
* A function for editing bot's messages.
|
|
13
|
-
* @param {string} text - The text with which the bot will edit its messages.
|
|
14
|
-
* @param {string} messageID - The message ID of the message the bot will edit.
|
|
15
|
-
* @param {Object} callback - Callback for the function.
|
|
16
|
-
*/
|
|
17
14
|
module.exports = function (defaultFuncs, api, ctx) {
|
|
18
15
|
return function editMessage(text, messageID, callback) {
|
|
19
16
|
if (!ctx.mqttClient) {
|
|
@@ -21,44 +18,44 @@ module.exports = function (defaultFuncs, api, ctx) {
|
|
|
21
18
|
}
|
|
22
19
|
|
|
23
20
|
ctx.wsReqNumber += 1;
|
|
24
|
-
ctx.wsTaskNumber
|
|
21
|
+
let taskNumber = ++ctx.wsTaskNumber;
|
|
25
22
|
|
|
26
|
-
const
|
|
23
|
+
const taskPayload = {
|
|
27
24
|
message_id: messageID,
|
|
28
25
|
text: text,
|
|
29
26
|
};
|
|
30
27
|
|
|
31
|
-
const
|
|
28
|
+
const task = {
|
|
32
29
|
failure_count: null,
|
|
33
30
|
label: "742",
|
|
34
|
-
payload: JSON.stringify(
|
|
31
|
+
payload: JSON.stringify(taskPayload),
|
|
35
32
|
queue_name: "edit_message",
|
|
36
|
-
task_id:
|
|
33
|
+
task_id: taskNumber,
|
|
37
34
|
};
|
|
38
35
|
|
|
39
|
-
|
|
40
|
-
const offlineThreadingID = utils.generateOfflineThreadingID
|
|
41
|
-
? utils.generateOfflineThreadingID()
|
|
42
|
-
: utils.generateOfflineThreadingId();
|
|
43
|
-
|
|
44
|
-
const context = {
|
|
36
|
+
const content = {
|
|
45
37
|
app_id: "2220391788200892",
|
|
46
|
-
payload:
|
|
38
|
+
payload: {
|
|
47
39
|
data_trace_id: null,
|
|
48
|
-
epoch_id: parseInt(
|
|
49
|
-
tasks: [
|
|
40
|
+
epoch_id: parseInt(generateOfflineThreadingID()),
|
|
41
|
+
tasks: [],
|
|
50
42
|
version_id: "6903494529735864",
|
|
51
|
-
}
|
|
43
|
+
},
|
|
52
44
|
request_id: ctx.wsReqNumber,
|
|
53
45
|
type: 3,
|
|
54
46
|
};
|
|
55
47
|
|
|
56
|
-
|
|
57
|
-
|
|
48
|
+
content.payload.tasks.push(task);
|
|
49
|
+
content.payload = JSON.stringify(content.payload);
|
|
50
|
+
|
|
51
|
+
if (isCallable(callback)) {
|
|
52
|
+
ctx["tasks"].set(taskNumber, {
|
|
53
|
+
type: "edit_message",
|
|
54
|
+
callback: callback,
|
|
55
|
+
});
|
|
58
56
|
}
|
|
59
57
|
|
|
60
|
-
|
|
61
|
-
ctx.mqttClient.publish("/ls_req", JSON.stringify(context), {
|
|
58
|
+
ctx.mqttClient.publish("/ls_req", JSON.stringify(content), {
|
|
62
59
|
qos: 1,
|
|
63
60
|
retain: false,
|
|
64
61
|
});
|
package/src/forwardAttachment.js
CHANGED
|
@@ -1,54 +1,57 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
var utils = require("../utils");
|
|
4
|
+
var log = require("npmlog");
|
|
4
5
|
|
|
5
6
|
module.exports = function (defaultFuncs, api, ctx) {
|
|
6
7
|
return function forwardAttachment(attachmentID, userOrUsers, callback) {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
var resolveFunc = function () {};
|
|
9
|
+
var rejectFunc = function () {};
|
|
10
|
+
var returnPromise = new Promise(function (resolve, reject) {
|
|
10
11
|
resolveFunc = resolve;
|
|
11
12
|
rejectFunc = reject;
|
|
12
13
|
});
|
|
13
|
-
|
|
14
14
|
if (!callback) {
|
|
15
15
|
callback = function (err) {
|
|
16
|
-
if (err)
|
|
16
|
+
if (err) {
|
|
17
|
+
return rejectFunc(err);
|
|
18
|
+
}
|
|
17
19
|
resolveFunc();
|
|
18
20
|
};
|
|
19
21
|
}
|
|
20
22
|
|
|
21
|
-
|
|
23
|
+
var form = {
|
|
22
24
|
attachment_id: attachmentID,
|
|
23
25
|
};
|
|
24
26
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
: userOrUsers;
|
|
27
|
+
if (utils.getType(userOrUsers) !== "Array") {
|
|
28
|
+
userOrUsers = [userOrUsers];
|
|
29
|
+
}
|
|
29
30
|
|
|
30
|
-
|
|
31
|
+
var timestamp = Math.floor(Date.now() / 1000);
|
|
31
32
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
33
|
+
for (var i = 0; i < userOrUsers.length; i++) {
|
|
34
|
+
//That's good, the key of the array is really timestmap in seconds + index
|
|
35
|
+
//Probably time when the attachment will be sent?
|
|
36
|
+
form["recipient_map[" + (timestamp + i) + "]"] = userOrUsers[i];
|
|
37
|
+
}
|
|
36
38
|
|
|
37
39
|
defaultFuncs
|
|
38
40
|
.post(
|
|
39
41
|
"https://www.facebook.com/mercury/attachments/forward/",
|
|
40
42
|
ctx.jar,
|
|
41
|
-
form
|
|
43
|
+
form,
|
|
42
44
|
)
|
|
43
|
-
.then(utils.parseAndCheckLogin(ctx, defaultFuncs))
|
|
45
|
+
.then(utils.parseAndCheckLogin(ctx.jar, defaultFuncs))
|
|
44
46
|
.then(function (resData) {
|
|
45
47
|
if (resData.error) {
|
|
46
48
|
throw resData;
|
|
47
49
|
}
|
|
50
|
+
|
|
48
51
|
return callback();
|
|
49
52
|
})
|
|
50
53
|
.catch(function (err) {
|
|
51
|
-
|
|
54
|
+
log.error("forwardAttachment", err);
|
|
52
55
|
return callback(err);
|
|
53
56
|
});
|
|
54
57
|
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const { generateOfflineThreadingID, getCurrentTimestamp } = require("../utils");
|
|
4
|
+
|
|
5
|
+
function isCallable(func) {
|
|
6
|
+
try {
|
|
7
|
+
Reflect.apply(func, null, []);
|
|
8
|
+
return true;
|
|
9
|
+
} catch (error) {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
module.exports = function (defaultFuncs, api, ctx) {
|
|
15
|
+
return function forwardMessage(messageID, threadID, callback) {
|
|
16
|
+
if (!ctx.mqttClient) {
|
|
17
|
+
throw new Error("Not connected to MQTT");
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
ctx.wsReqNumber += 1;
|
|
21
|
+
ctx.wsTaskNumber += 1;
|
|
22
|
+
|
|
23
|
+
const taskPayload = {
|
|
24
|
+
thread_id: threadID,
|
|
25
|
+
otid: parseInt(generateOfflineThreadingID()),
|
|
26
|
+
source: 65544,
|
|
27
|
+
send_type: 5,
|
|
28
|
+
sync_group: 1,
|
|
29
|
+
forwarded_msg_id: messageID,
|
|
30
|
+
strip_forwarded_msg_caption: 0,
|
|
31
|
+
initiating_source: 1,
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
const task = {
|
|
35
|
+
failure_count: null,
|
|
36
|
+
label: "46",
|
|
37
|
+
payload: JSON.stringify(taskPayload),
|
|
38
|
+
queue_name: `${threadID}`,
|
|
39
|
+
task_id: ctx.wsTaskNumber,
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
const content = {
|
|
43
|
+
app_id: "2220391788200892",
|
|
44
|
+
payload: JSON.stringify({
|
|
45
|
+
data_trace_id: null,
|
|
46
|
+
epoch_id: parseInt(generateOfflineThreadingID()),
|
|
47
|
+
tasks: [task],
|
|
48
|
+
version_id: "25095469420099952",
|
|
49
|
+
}),
|
|
50
|
+
request_id: ctx.wsReqNumber,
|
|
51
|
+
type: 3,
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
if (isCallable(callback)) {
|
|
55
|
+
// to be implemented
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
ctx.mqttClient.publish("/ls_req", JSON.stringify(content), {
|
|
59
|
+
qos: 1,
|
|
60
|
+
retain: false,
|
|
61
|
+
});
|
|
62
|
+
};
|
|
63
|
+
};
|
package/src/getCurrentUserID.js
CHANGED
package/src/getEmojiUrl.js
CHANGED
|
@@ -1,18 +1,29 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
const util = require("util");
|
|
4
|
+
|
|
3
5
|
module.exports = function () {
|
|
4
|
-
return function getEmojiUrl(c, size, pixelRatio
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
return function getEmojiUrl(c, size, pixelRatio) {
|
|
7
|
+
/*
|
|
8
|
+
Resolves Facebook Messenger emoji image asset URL for an emoji character.
|
|
9
|
+
Supported sizes are 32, 64, and 128.
|
|
10
|
+
Supported pixel ratios are '1.0' and '1.5' (possibly more; haven't tested)
|
|
11
|
+
*/
|
|
12
|
+
const baseUrl = "https://static.xx.fbcdn.net/images/emoji.php/v8/z%s/%s";
|
|
13
|
+
pixelRatio = pixelRatio || "1.0";
|
|
14
|
+
|
|
15
|
+
let ending = util.format(
|
|
16
|
+
"%s/%s/%s.png",
|
|
17
|
+
pixelRatio,
|
|
18
|
+
size,
|
|
19
|
+
c.codePointAt(0).toString(16),
|
|
20
|
+
);
|
|
9
21
|
let base = 317426846;
|
|
10
22
|
for (let i = 0; i < ending.length; i++) {
|
|
11
|
-
base = (
|
|
23
|
+
base = (base << 5) - base + ending.charCodeAt(i);
|
|
12
24
|
}
|
|
13
25
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
return `https://static.xx.fbcdn.net/images/emoji.php/v8/z${hashed}/${ending}`;
|
|
26
|
+
let hashed = (base & 255).toString(16);
|
|
27
|
+
return util.format(baseUrl, hashed, ending);
|
|
17
28
|
};
|
|
18
29
|
};
|
package/src/getFriendsList.js
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
//var cheerio = require("cheerio");
|
|
4
|
+
var utils = require("../utils");
|
|
5
|
+
var log = require("npmlog");
|
|
4
6
|
|
|
5
|
-
//
|
|
6
|
-
|
|
7
|
+
// [almost] copy pasted from one of FB's minified file (GenderConst)
|
|
8
|
+
var GENDERS = {
|
|
7
9
|
0: "unknown",
|
|
8
10
|
1: "female_singular",
|
|
9
11
|
2: "male_singular",
|
|
@@ -18,16 +20,15 @@ const GENDERS = {
|
|
|
18
20
|
11: "unknown_plural",
|
|
19
21
|
};
|
|
20
22
|
|
|
21
|
-
// ফ্রেন্ড লিস্টের ডেটা ফরম্যাট করার হেল্পার ফাংশন
|
|
22
23
|
function formatData(obj) {
|
|
23
|
-
return Object.keys(obj).map(key
|
|
24
|
-
|
|
24
|
+
return Object.keys(obj).map(function (key) {
|
|
25
|
+
var user = obj[key];
|
|
25
26
|
return {
|
|
26
27
|
alternateName: user.alternateName,
|
|
27
28
|
firstName: user.firstName,
|
|
28
|
-
gender: GENDERS[user.gender]
|
|
29
|
+
gender: GENDERS[user.gender],
|
|
29
30
|
userID: utils.formatID(user.id.toString()),
|
|
30
|
-
isFriend:
|
|
31
|
+
isFriend: user.is_friend != null && user.is_friend ? true : false,
|
|
31
32
|
fullName: user.name,
|
|
32
33
|
profilePicture: user.thumbSrc,
|
|
33
34
|
type: user.type,
|
|
@@ -40,16 +41,18 @@ function formatData(obj) {
|
|
|
40
41
|
|
|
41
42
|
module.exports = function (defaultFuncs, api, ctx) {
|
|
42
43
|
return function getFriendsList(callback) {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
44
|
+
var resolveFunc = function () {};
|
|
45
|
+
var rejectFunc = function () {};
|
|
46
|
+
var returnPromise = new Promise(function (resolve, reject) {
|
|
46
47
|
resolveFunc = resolve;
|
|
47
48
|
rejectFunc = reject;
|
|
48
49
|
});
|
|
49
50
|
|
|
50
51
|
if (!callback) {
|
|
51
|
-
callback = (err, friendList)
|
|
52
|
-
if (err)
|
|
52
|
+
callback = function (err, friendList) {
|
|
53
|
+
if (err) {
|
|
54
|
+
return rejectFunc(err);
|
|
55
|
+
}
|
|
53
56
|
resolveFunc(friendList);
|
|
54
57
|
};
|
|
55
58
|
}
|
|
@@ -59,20 +62,20 @@ module.exports = function (defaultFuncs, api, ctx) {
|
|
|
59
62
|
"https://www.facebook.com/chat/user_info_all",
|
|
60
63
|
ctx.jar,
|
|
61
64
|
{},
|
|
62
|
-
{ viewer: ctx.userID }
|
|
65
|
+
{ viewer: ctx.userID },
|
|
63
66
|
)
|
|
64
67
|
.then(utils.parseAndCheckLogin(ctx, defaultFuncs))
|
|
65
|
-
.then(resData
|
|
68
|
+
.then(function (resData) {
|
|
66
69
|
if (!resData) {
|
|
67
70
|
throw { error: "getFriendsList returned empty object." };
|
|
68
71
|
}
|
|
69
72
|
if (resData.error) {
|
|
70
73
|
throw resData;
|
|
71
74
|
}
|
|
72
|
-
|
|
75
|
+
callback(null, formatData(resData.payload));
|
|
73
76
|
})
|
|
74
|
-
.catch(err
|
|
75
|
-
|
|
77
|
+
.catch(function (err) {
|
|
78
|
+
log.error("getFriendsList", err);
|
|
76
79
|
return callback(err);
|
|
77
80
|
});
|
|
78
81
|
|