bb-fca 2.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/LICENSE-MIT +21 -0
- package/README.md +0 -0
- package/dist/core/client.js +50 -0
- package/dist/core/client.js.map +1 -0
- package/dist/core/models/buildAPI.js +103 -0
- package/dist/core/models/buildAPI.js.map +1 -0
- package/dist/core/models/loginHelper.js +209 -0
- package/dist/core/models/loginHelper.js.map +1 -0
- package/dist/core/models/setOptions.js +47 -0
- package/dist/core/models/setOptions.js.map +1 -0
- package/dist/deltas/apis/create.js +30 -0
- package/dist/deltas/apis/create.js.map +1 -0
- package/dist/deltas/apis/extra/addExternalModule.js +23 -0
- package/dist/deltas/apis/extra/addExternalModule.js.map +1 -0
- package/dist/deltas/apis/extra/getAccess.js +110 -0
- package/dist/deltas/apis/extra/getAccess.js.map +1 -0
- package/dist/deltas/apis/http/httpGet.js +57 -0
- package/dist/deltas/apis/http/httpGet.js.map +1 -0
- package/dist/deltas/apis/http/httpPost.js +57 -0
- package/dist/deltas/apis/http/httpPost.js.map +1 -0
- package/dist/deltas/apis/http/httpPostFormData.js +61 -0
- package/dist/deltas/apis/http/httpPostFormData.js.map +1 -0
- package/dist/deltas/apis/login/GetBotInfo.js +83 -0
- package/dist/deltas/apis/login/GetBotInfo.js.map +1 -0
- package/dist/deltas/apis/login/getBotInitialData.js +46 -0
- package/dist/deltas/apis/login/getBotInitialData.js.map +1 -0
- package/dist/deltas/apis/login/logout.js +54 -0
- package/dist/deltas/apis/login/logout.js.map +1 -0
- package/dist/deltas/apis/messaging/editMessage.js +64 -0
- package/dist/deltas/apis/messaging/editMessage.js.map +1 -0
- package/dist/deltas/apis/messaging/emoji.js +120 -0
- package/dist/deltas/apis/messaging/emoji.js.map +1 -0
- package/dist/deltas/apis/messaging/gcmember.js +164 -0
- package/dist/deltas/apis/messaging/gcmember.js.map +1 -0
- package/dist/deltas/apis/messaging/gcname.js +119 -0
- package/dist/deltas/apis/messaging/gcname.js.map +1 -0
- package/dist/deltas/apis/messaging/gcrule.js +144 -0
- package/dist/deltas/apis/messaging/gcrule.js.map +1 -0
- package/dist/deltas/apis/messaging/markAsDelivered.js +44 -0
- package/dist/deltas/apis/messaging/markAsDelivered.js.map +1 -0
- package/dist/deltas/apis/messaging/markAsRead.js +84 -0
- package/dist/deltas/apis/messaging/markAsRead.js.map +1 -0
- package/dist/deltas/apis/messaging/markAsReadAll.js +34 -0
- package/dist/deltas/apis/messaging/markAsReadAll.js.map +1 -0
- package/dist/deltas/apis/messaging/markAsSeen.js +64 -0
- package/dist/deltas/apis/messaging/markAsSeen.js.map +1 -0
- package/dist/deltas/apis/messaging/nickname.js +129 -0
- package/dist/deltas/apis/messaging/nickname.js.map +1 -0
- package/dist/deltas/apis/messaging/notes.js +156 -0
- package/dist/deltas/apis/messaging/notes.js.map +1 -0
- package/dist/deltas/apis/messaging/resolvePhotoUrl.js +55 -0
- package/dist/deltas/apis/messaging/resolvePhotoUrl.js.map +1 -0
- package/dist/deltas/apis/messaging/sendMessage.js +239 -0
- package/dist/deltas/apis/messaging/sendMessage.js.map +1 -0
- package/dist/deltas/apis/messaging/sendTypingIndicator.js +41 -0
- package/dist/deltas/apis/messaging/sendTypingIndicator.js.map +1 -0
- package/dist/deltas/apis/messaging/setMessageReaction.js +30 -0
- package/dist/deltas/apis/messaging/setMessageReaction.js.map +1 -0
- package/dist/deltas/apis/messaging/shareContact.js +59 -0
- package/dist/deltas/apis/messaging/shareContact.js.map +1 -0
- package/dist/deltas/apis/messaging/stickers.js +246 -0
- package/dist/deltas/apis/messaging/stickers.js.map +1 -0
- package/dist/deltas/apis/messaging/theme.js +227 -0
- package/dist/deltas/apis/messaging/theme.js.map +1 -0
- package/dist/deltas/apis/messaging/unsendMessage.js +19 -0
- package/dist/deltas/apis/messaging/unsendMessage.js.map +1 -0
- package/dist/deltas/apis/mqtt/deltas/value.js +193 -0
- package/dist/deltas/apis/mqtt/deltas/value.js.map +1 -0
- package/dist/deltas/apis/mqtt/listenMqtt.js +306 -0
- package/dist/deltas/apis/mqtt/listenMqtt.js.map +1 -0
- package/dist/deltas/apis/mqtt/listenSpeed.js +166 -0
- package/dist/deltas/apis/mqtt/listenSpeed.js.map +1 -0
- package/dist/deltas/apis/mqtt/pinMessage.js +166 -0
- package/dist/deltas/apis/mqtt/pinMessage.js.map +1 -0
- package/dist/deltas/apis/mqtt/realtime.js +160 -0
- package/dist/deltas/apis/mqtt/realtime.js.map +1 -0
- package/dist/deltas/apis/mqtt/sendMessageMqtt.js +184 -0
- package/dist/deltas/apis/mqtt/sendMessageMqtt.js.map +1 -0
- package/dist/deltas/apis/mqtt/setMessageReactionMqtt.js +57 -0
- package/dist/deltas/apis/mqtt/setMessageReactionMqtt.js.map +1 -0
- package/dist/deltas/apis/posting/comment.js +195 -0
- package/dist/deltas/apis/posting/comment.js.map +1 -0
- package/dist/deltas/apis/posting/follow.js +82 -0
- package/dist/deltas/apis/posting/follow.js.map +1 -0
- package/dist/deltas/apis/posting/friend.js +253 -0
- package/dist/deltas/apis/posting/friend.js.map +1 -0
- package/dist/deltas/apis/posting/post.js +551 -0
- package/dist/deltas/apis/posting/post.js.map +1 -0
- package/dist/deltas/apis/posting/share.js +59 -0
- package/dist/deltas/apis/posting/share.js.map +1 -0
- package/dist/deltas/apis/posting/story.js +176 -0
- package/dist/deltas/apis/posting/story.js.map +1 -0
- package/dist/deltas/apis/threads/getThreadHistory.js +233 -0
- package/dist/deltas/apis/threads/getThreadHistory.js.map +1 -0
- package/dist/deltas/apis/threads/getThreadInfo.js +197 -0
- package/dist/deltas/apis/threads/getThreadInfo.js.map +1 -0
- package/dist/deltas/apis/threads/getThreadList.js +201 -0
- package/dist/deltas/apis/threads/getThreadList.js.map +1 -0
- package/dist/deltas/apis/users/getUserInfo.js +254 -0
- package/dist/deltas/apis/users/getUserInfo.js.map +1 -0
- package/dist/index.d.ts +696 -0
- package/dist/types/core/client.d.ts +2 -0
- package/dist/types/core/models/buildAPI.d.ts +13 -0
- package/dist/types/core/models/loginHelper.d.ts +15 -0
- package/dist/types/core/models/setOptions.d.ts +2 -0
- package/dist/types/deltas/apis/create.d.ts +23 -0
- package/dist/types/deltas/apis/extra/addExternalModule.d.ts +1 -0
- package/dist/types/deltas/apis/extra/getAccess.d.ts +1 -0
- package/dist/types/deltas/apis/http/httpGet.d.ts +1 -0
- package/dist/types/deltas/apis/http/httpPost.d.ts +1 -0
- package/dist/types/deltas/apis/http/httpPostFormData.d.ts +1 -0
- package/dist/types/deltas/apis/login/GetBotInfo.d.ts +32 -0
- package/dist/types/deltas/apis/login/getBotInitialData.d.ts +1 -0
- package/dist/types/deltas/apis/login/logout.d.ts +7 -0
- package/dist/types/deltas/apis/messaging/editMessage.d.ts +7 -0
- package/dist/types/deltas/apis/messaging/emoji.d.ts +1 -0
- package/dist/types/deltas/apis/messaging/gcmember.d.ts +1 -0
- package/dist/types/deltas/apis/messaging/gcname.d.ts +1 -0
- package/dist/types/deltas/apis/messaging/gcrule.d.ts +1 -0
- package/dist/types/deltas/apis/messaging/markAsDelivered.d.ts +7 -0
- package/dist/types/deltas/apis/messaging/markAsRead.d.ts +6 -0
- package/dist/types/deltas/apis/messaging/markAsReadAll.d.ts +7 -0
- package/dist/types/deltas/apis/messaging/markAsSeen.d.ts +6 -0
- package/dist/types/deltas/apis/messaging/nickname.d.ts +1 -0
- package/dist/types/deltas/apis/messaging/notes.d.ts +14 -0
- package/dist/types/deltas/apis/messaging/resolvePhotoUrl.d.ts +9 -0
- package/dist/types/deltas/apis/messaging/sendMessage.d.ts +1 -0
- package/dist/types/deltas/apis/messaging/sendTypingIndicator.d.ts +6 -0
- package/dist/types/deltas/apis/messaging/setMessageReaction.d.ts +1 -0
- package/dist/types/deltas/apis/messaging/shareContact.d.ts +8 -0
- package/dist/types/deltas/apis/messaging/stickers.d.ts +48 -0
- package/dist/types/deltas/apis/messaging/theme.d.ts +1 -0
- package/dist/types/deltas/apis/messaging/unsendMessage.d.ts +1 -0
- package/dist/types/deltas/apis/mqtt/deltas/value.d.ts +2 -0
- package/dist/types/deltas/apis/mqtt/listenMqtt.d.ts +20 -0
- package/dist/types/deltas/apis/mqtt/listenSpeed.d.ts +21 -0
- package/dist/types/deltas/apis/mqtt/pinMessage.d.ts +1 -0
- package/dist/types/deltas/apis/mqtt/realtime.d.ts +1 -0
- package/dist/types/deltas/apis/mqtt/sendMessageMqtt.d.ts +1 -0
- package/dist/types/deltas/apis/mqtt/setMessageReactionMqtt.d.ts +1 -0
- package/dist/types/deltas/apis/posting/comment.d.ts +9 -0
- package/dist/types/deltas/apis/posting/follow.d.ts +14 -0
- package/dist/types/deltas/apis/posting/friend.d.ts +61 -0
- package/dist/types/deltas/apis/posting/post.d.ts +20 -0
- package/dist/types/deltas/apis/posting/share.d.ts +1 -0
- package/dist/types/deltas/apis/posting/story.d.ts +39 -0
- package/dist/types/deltas/apis/threads/getThreadHistory.d.ts +7 -0
- package/dist/types/deltas/apis/threads/getThreadInfo.d.ts +7 -0
- package/dist/types/deltas/apis/threads/getThreadList.d.ts +7 -0
- package/dist/types/deltas/apis/users/getUserInfo.d.ts +1 -0
- package/dist/types/utils/axios.d.ts +7 -0
- package/dist/types/utils/clients.d.ts +4 -0
- package/dist/types/utils/constants.d.ts +24 -0
- package/dist/types/utils/formatters/data/formatAttachment.d.ts +2 -0
- package/dist/types/utils/formatters/data/formatDelta.d.ts +4 -0
- package/dist/types/utils/formatters/index.d.ts +17 -0
- package/dist/types/utils/formatters/value/formatCookie.d.ts +8 -0
- package/dist/types/utils/formatters/value/formatDate.d.ts +6 -0
- package/dist/types/utils/formatters/value/formatID.d.ts +7 -0
- package/dist/types/utils/headers.d.ts +2 -0
- package/dist/types/utils/index.d.ts +75 -0
- package/dist/types/utils/user-agents.d.ts +9 -0
- package/dist/utils/axios.js +148 -0
- package/dist/utils/axios.js.map +1 -0
- package/dist/utils/clients.js +120 -0
- package/dist/utils/clients.js.map +1 -0
- package/dist/utils/constants.js +249 -0
- package/dist/utils/constants.js.map +1 -0
- package/dist/utils/formatters/data/formatAttachment.js +61 -0
- package/dist/utils/formatters/data/formatAttachment.js.map +1 -0
- package/dist/utils/formatters/data/formatDelta.js +67 -0
- package/dist/utils/formatters/data/formatDelta.js.map +1 -0
- package/dist/utils/formatters/index.js +132 -0
- package/dist/utils/formatters/index.js.map +1 -0
- package/dist/utils/formatters/value/formatCookie.js +13 -0
- package/dist/utils/formatters/value/formatCookie.js.map +1 -0
- package/dist/utils/formatters/value/formatDate.js +33 -0
- package/dist/utils/formatters/value/formatDate.js.map +1 -0
- package/dist/utils/formatters/value/formatID.js +17 -0
- package/dist/utils/formatters/value/formatID.js.map +1 -0
- package/dist/utils/headers.js +61 -0
- package/dist/utils/headers.js.map +1 -0
- package/dist/utils/index.js +105 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/user-agents.js +41 -0
- package/dist/utils/user-agents.js.map +1 -0
- package/examples/post.example.js +149 -0
- package/module/index.js +5 -0
- package/package.json +56 -0
- package/src/core/client.ts +66 -0
- package/src/core/models/buildAPI.ts +131 -0
- package/src/core/models/loginHelper.ts +226 -0
- package/src/core/models/setOptions.ts +48 -0
- package/src/deltas/apis/create.ts +28 -0
- package/src/deltas/apis/extra/addExternalModule.ts +23 -0
- package/src/deltas/apis/extra/getAccess.ts +141 -0
- package/src/deltas/apis/http/httpGet.ts +61 -0
- package/src/deltas/apis/http/httpPost.ts +61 -0
- package/src/deltas/apis/http/httpPostFormData.ts +67 -0
- package/src/deltas/apis/login/GetBotInfo.ts +88 -0
- package/src/deltas/apis/login/getBotInitialData.ts +42 -0
- package/src/deltas/apis/login/logout.ts +62 -0
- package/src/deltas/apis/messaging/editMessage.ts +69 -0
- package/src/deltas/apis/messaging/emoji.ts +135 -0
- package/src/deltas/apis/messaging/gcmember.ts +175 -0
- package/src/deltas/apis/messaging/gcname.ts +136 -0
- package/src/deltas/apis/messaging/gcrule.ts +152 -0
- package/src/deltas/apis/messaging/markAsDelivered.ts +47 -0
- package/src/deltas/apis/messaging/markAsRead.ts +94 -0
- package/src/deltas/apis/messaging/markAsReadAll.ts +38 -0
- package/src/deltas/apis/messaging/markAsSeen.ts +69 -0
- package/src/deltas/apis/messaging/nickname.ts +153 -0
- package/src/deltas/apis/messaging/notes.ts +165 -0
- package/src/deltas/apis/messaging/resolvePhotoUrl.ts +56 -0
- package/src/deltas/apis/messaging/sendMessage.ts +286 -0
- package/src/deltas/apis/messaging/sendTypingIndicator.ts +48 -0
- package/src/deltas/apis/messaging/setMessageReaction.ts +25 -0
- package/src/deltas/apis/messaging/shareContact.ts +63 -0
- package/src/deltas/apis/messaging/stickers.ts +255 -0
- package/src/deltas/apis/messaging/theme.ts +280 -0
- package/src/deltas/apis/messaging/unsendMessage.ts +15 -0
- package/src/deltas/apis/mqtt/deltas/value.ts +224 -0
- package/src/deltas/apis/mqtt/listenMqtt.ts +332 -0
- package/src/deltas/apis/mqtt/listenSpeed.ts +179 -0
- package/src/deltas/apis/mqtt/pinMessage.ts +135 -0
- package/src/deltas/apis/mqtt/realtime.ts +169 -0
- package/src/deltas/apis/mqtt/sendMessageMqtt.ts +206 -0
- package/src/deltas/apis/mqtt/setMessageReactionMqtt.ts +61 -0
- package/src/deltas/apis/posting/comment.ts +205 -0
- package/src/deltas/apis/posting/follow.ts +79 -0
- package/src/deltas/apis/posting/friend.ts +241 -0
- package/src/deltas/apis/posting/post.ts +599 -0
- package/src/deltas/apis/posting/share.ts +60 -0
- package/src/deltas/apis/posting/story.ts +207 -0
- package/src/deltas/apis/threads/getThreadHistory.ts +237 -0
- package/src/deltas/apis/threads/getThreadInfo.ts +210 -0
- package/src/deltas/apis/threads/getThreadList.ts +224 -0
- package/src/deltas/apis/users/getUserInfo.ts +244 -0
- package/src/types/index.d.ts +696 -0
- package/src/utils/axios.ts +178 -0
- package/src/utils/clients.ts +125 -0
- package/src/utils/constants.ts +281 -0
- package/src/utils/formatters/data/formatAttachment.ts +58 -0
- package/src/utils/formatters/data/formatDelta.ts +45 -0
- package/src/utils/formatters/index.ts +82 -0
- package/src/utils/formatters/value/formatCookie.ts +13 -0
- package/src/utils/formatters/value/formatDate.ts +34 -0
- package/src/utils/formatters/value/formatID.ts +14 -0
- package/src/utils/formatters.old.ts +1049 -0
- package/src/utils/headers.ts +65 -0
- package/src/utils/index.ts +65 -0
- package/src/utils/user-agents.ts +49 -0
- package/tsconfig.json +37 -0
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
import utils = require('../../../utils');
|
|
2
|
+
// @NethWs3Dev
|
|
3
|
+
|
|
4
|
+
const allowedProperties = {
|
|
5
|
+
attachment: true,
|
|
6
|
+
url: true,
|
|
7
|
+
sticker: true,
|
|
8
|
+
emoji: true,
|
|
9
|
+
emojiSize: true,
|
|
10
|
+
body: true,
|
|
11
|
+
mentions: true,
|
|
12
|
+
location: true,
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export default function(defaultFuncs: any, api: any, ctx: any) {
|
|
16
|
+
async function uploadAttachment(attachments) {
|
|
17
|
+
var uploads = [];
|
|
18
|
+
for (var i = 0; i < attachments.length; i++) {
|
|
19
|
+
if (!utils.isReadableStream(attachments[i])) {
|
|
20
|
+
throw new Error(
|
|
21
|
+
'Attachment should be a readable stream and not ' +
|
|
22
|
+
utils.getType(attachments[i]) +
|
|
23
|
+
'.',
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
const oksir = await defaultFuncs
|
|
27
|
+
.postFormData(
|
|
28
|
+
'https://upload.facebook.com/ajax/mercury/upload.php',
|
|
29
|
+
ctx.jar,
|
|
30
|
+
{
|
|
31
|
+
upload_1024: attachments[i],
|
|
32
|
+
voice_clip: 'true',
|
|
33
|
+
},
|
|
34
|
+
{},
|
|
35
|
+
)
|
|
36
|
+
.then(utils.parseAndCheckLogin(ctx, defaultFuncs));
|
|
37
|
+
if (oksir.error) {
|
|
38
|
+
throw new Error(oksir.error);
|
|
39
|
+
}
|
|
40
|
+
uploads.push(oksir.payload.metadata[0]);
|
|
41
|
+
}
|
|
42
|
+
return uploads;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
async function getUrl(url) {
|
|
46
|
+
const resData = await defaultFuncs
|
|
47
|
+
.post(
|
|
48
|
+
'https://www.facebook.com/message_share_attachment/fromURI/',
|
|
49
|
+
ctx.jar,
|
|
50
|
+
{
|
|
51
|
+
image_height: 960,
|
|
52
|
+
image_width: 960,
|
|
53
|
+
uri: url,
|
|
54
|
+
},
|
|
55
|
+
)
|
|
56
|
+
.then(utils.parseAndCheckLogin(ctx, defaultFuncs));
|
|
57
|
+
if (!resData || resData.error || !resData.payload) {
|
|
58
|
+
throw new Error(resData);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
async function sendContent(
|
|
63
|
+
form,
|
|
64
|
+
threadID,
|
|
65
|
+
isSingleUser,
|
|
66
|
+
messageAndOTID,
|
|
67
|
+
callback?,
|
|
68
|
+
) {
|
|
69
|
+
// There are three cases here:
|
|
70
|
+
// 1. threadID is of type array, where we're starting a new group chat with users
|
|
71
|
+
// specified in the array.
|
|
72
|
+
// 2. User is sending a message to a specific user.
|
|
73
|
+
// 3. No additional form params and the message goes to an existing group chat.
|
|
74
|
+
if (utils.getType(threadID) === 'Array') {
|
|
75
|
+
for (var i = 0; i < threadID.length; i++) {
|
|
76
|
+
form['specific_to_list[' + i + ']'] = 'fbid:' + threadID[i];
|
|
77
|
+
}
|
|
78
|
+
form['specific_to_list[' + threadID.length + ']'] = 'fbid:' + ctx.userID;
|
|
79
|
+
form['client_thread_id'] = 'root:' + messageAndOTID;
|
|
80
|
+
utils.log(
|
|
81
|
+
'sendMessage',
|
|
82
|
+
'Sending message to multiple users: ' + threadID,
|
|
83
|
+
);
|
|
84
|
+
} else {
|
|
85
|
+
// This means that threadID is the id of a user, and the chat
|
|
86
|
+
// is a single person chat
|
|
87
|
+
if (isSingleUser) {
|
|
88
|
+
form['specific_to_list[0]'] = 'fbid:' + threadID;
|
|
89
|
+
form['specific_to_list[1]'] = 'fbid:' + ctx.userID;
|
|
90
|
+
form['other_user_fbid'] = threadID;
|
|
91
|
+
} else {
|
|
92
|
+
form['thread_fbid'] = threadID;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
if (ctx.globalOptions.pageID) {
|
|
97
|
+
form['author'] = 'fbid:' + ctx.globalOptions.pageID;
|
|
98
|
+
form['specific_to_list[1]'] = 'fbid:' + ctx.globalOptions.pageID;
|
|
99
|
+
form['creator_info[creatorID]'] = ctx.userID;
|
|
100
|
+
form['creator_info[creatorType]'] = 'direct_admin';
|
|
101
|
+
form['creator_info[labelType]'] = 'sent_message';
|
|
102
|
+
form['creator_info[pageID]'] = ctx.globalOptions.pageID;
|
|
103
|
+
form['request_user_id'] = ctx.globalOptions.pageID;
|
|
104
|
+
form['creator_info[profileURI]'] =
|
|
105
|
+
'https://www.facebook.com/profile.php?id=' + ctx.userID;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const resData = await defaultFuncs
|
|
109
|
+
.post('https://www.facebook.com/messaging/send/', ctx.jar, form)
|
|
110
|
+
.then(utils.parseAndCheckLogin(ctx, defaultFuncs));
|
|
111
|
+
if (!resData) {
|
|
112
|
+
throw new Error('Send message failed.');
|
|
113
|
+
}
|
|
114
|
+
if (resData.error) {
|
|
115
|
+
if (resData.error === 1545012) {
|
|
116
|
+
utils.warn(
|
|
117
|
+
'sendMessage',
|
|
118
|
+
"Got error 1545012. This might mean that you're not part of the conversation " +
|
|
119
|
+
threadID,
|
|
120
|
+
);
|
|
121
|
+
}
|
|
122
|
+
throw new Error(resData);
|
|
123
|
+
}
|
|
124
|
+
const messageInfo = resData.payload.actions.reduce((p, v) => {
|
|
125
|
+
return {
|
|
126
|
+
threadID: v.thread_fbid,
|
|
127
|
+
messageID: v.message_id,
|
|
128
|
+
timestamp: v.timestamp,
|
|
129
|
+
};
|
|
130
|
+
}, null);
|
|
131
|
+
return messageInfo;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
return async (msg, threadID, replyToMessage, isSingleUser = false) => {
|
|
135
|
+
let msgType = utils.getType(msg);
|
|
136
|
+
let threadIDType = utils.getType(threadID);
|
|
137
|
+
let messageIDType = utils.getType(replyToMessage);
|
|
138
|
+
if (msgType !== 'String' && msgType !== 'Object')
|
|
139
|
+
throw new Error(
|
|
140
|
+
'Message should be of type string or object and not ' + msgType + '.',
|
|
141
|
+
);
|
|
142
|
+
if (
|
|
143
|
+
threadIDType !== 'Array' &&
|
|
144
|
+
threadIDType !== 'Number' &&
|
|
145
|
+
threadIDType !== 'String'
|
|
146
|
+
)
|
|
147
|
+
throw new Error(
|
|
148
|
+
'ThreadID should be of type number, string, or array and not ' +
|
|
149
|
+
threadIDType +
|
|
150
|
+
'.',
|
|
151
|
+
);
|
|
152
|
+
if (replyToMessage && messageIDType !== 'String')
|
|
153
|
+
throw new Error(
|
|
154
|
+
'MessageID should be of type string and not ' + threadIDType + '.',
|
|
155
|
+
);
|
|
156
|
+
if (msgType === 'String') {
|
|
157
|
+
msg = { body: msg };
|
|
158
|
+
}
|
|
159
|
+
let disallowedProperties = Object.keys(msg).filter(
|
|
160
|
+
(prop) => !allowedProperties[prop],
|
|
161
|
+
);
|
|
162
|
+
if (disallowedProperties.length > 0) {
|
|
163
|
+
throw new Error(
|
|
164
|
+
'Dissallowed props: `' + disallowedProperties.join(', ') + '`',
|
|
165
|
+
);
|
|
166
|
+
}
|
|
167
|
+
let messageAndOTID = utils.generateOfflineThreadingID();
|
|
168
|
+
let form: Record<string, any> = {
|
|
169
|
+
client: 'mercury',
|
|
170
|
+
action_type: 'ma-type:user-generated-message',
|
|
171
|
+
author: 'fbid:' + ctx.userID,
|
|
172
|
+
timestamp: Date.now(),
|
|
173
|
+
timestamp_absolute: 'Today',
|
|
174
|
+
timestamp_relative: utils.generateTimestampRelative(),
|
|
175
|
+
timestamp_time_passed: '0',
|
|
176
|
+
is_unread: false,
|
|
177
|
+
is_cleared: false,
|
|
178
|
+
is_forward: false,
|
|
179
|
+
is_filtered_content: false,
|
|
180
|
+
is_filtered_content_bh: false,
|
|
181
|
+
is_filtered_content_account: false,
|
|
182
|
+
is_filtered_content_quasar: false,
|
|
183
|
+
is_filtered_content_invalid_app: false,
|
|
184
|
+
is_spoof_warning: false,
|
|
185
|
+
source: 'source:chat:web',
|
|
186
|
+
'source_tags[0]': 'source:chat',
|
|
187
|
+
...(msg.body && {
|
|
188
|
+
body: msg.body,
|
|
189
|
+
}),
|
|
190
|
+
html_body: false,
|
|
191
|
+
ui_push_phase: 'V3',
|
|
192
|
+
status: '0',
|
|
193
|
+
offline_threading_id: messageAndOTID,
|
|
194
|
+
message_id: messageAndOTID,
|
|
195
|
+
threading_id: utils.generateThreadingID(ctx.clientID),
|
|
196
|
+
'ephemeral_ttl_mode:': '0',
|
|
197
|
+
manual_retry_cnt: '0',
|
|
198
|
+
has_attachment: !!(msg.attachment || msg.url || msg.sticker),
|
|
199
|
+
signatureID: utils.getSignatureID(),
|
|
200
|
+
...(replyToMessage && {
|
|
201
|
+
replied_to_message_id: replyToMessage,
|
|
202
|
+
}),
|
|
203
|
+
};
|
|
204
|
+
|
|
205
|
+
if (msg.location) {
|
|
206
|
+
if (!msg.location.latitude || !msg.location.longitude)
|
|
207
|
+
throw new Error('location property needs both latitude and longitude');
|
|
208
|
+
form['location_attachment[coordinates][latitude]'] =
|
|
209
|
+
msg.location.latitude;
|
|
210
|
+
form['location_attachment[coordinates][longitude]'] =
|
|
211
|
+
msg.location.longitude;
|
|
212
|
+
form['location_attachment[is_current_location]'] = !!msg.location.current;
|
|
213
|
+
}
|
|
214
|
+
if (msg.sticker) {
|
|
215
|
+
form['sticker_id'] = msg.sticker;
|
|
216
|
+
}
|
|
217
|
+
if (msg.attachment) {
|
|
218
|
+
form.image_ids = [];
|
|
219
|
+
form.gif_ids = [];
|
|
220
|
+
form.file_ids = [];
|
|
221
|
+
form.video_ids = [];
|
|
222
|
+
form.audio_ids = [];
|
|
223
|
+
if (utils.getType(msg.attachment) !== 'Array') {
|
|
224
|
+
msg.attachment = [msg.attachment];
|
|
225
|
+
}
|
|
226
|
+
const files = await uploadAttachment(msg.attachment);
|
|
227
|
+
files.forEach((file) => {
|
|
228
|
+
const type = Object.keys(file)[0];
|
|
229
|
+
form['' + type + 's'].push(file[type]);
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
if (msg.url) {
|
|
233
|
+
form['shareable_attachment[share_type]'] = '100';
|
|
234
|
+
const params = await getUrl(msg.url);
|
|
235
|
+
form['shareable_attachment[share_params]'] = params;
|
|
236
|
+
}
|
|
237
|
+
if (msg.emoji) {
|
|
238
|
+
if (!msg.emojiSize) {
|
|
239
|
+
msg.emojiSize = 'medium';
|
|
240
|
+
}
|
|
241
|
+
if (
|
|
242
|
+
msg.emojiSize !== 'small' &&
|
|
243
|
+
msg.emojiSize !== 'medium' &&
|
|
244
|
+
msg.emojiSize !== 'large'
|
|
245
|
+
) {
|
|
246
|
+
throw new Error('emojiSize property is invalid');
|
|
247
|
+
}
|
|
248
|
+
if (!form.body) {
|
|
249
|
+
throw new Error('body is not empty');
|
|
250
|
+
}
|
|
251
|
+
form.body = msg.emoji;
|
|
252
|
+
form['tags[0]'] = 'hot_emoji_size:' + msg.emojiSize;
|
|
253
|
+
}
|
|
254
|
+
if (msg.mentions) {
|
|
255
|
+
for (let i = 0; i < msg.mentions.length; i++) {
|
|
256
|
+
const mention = msg.mentions[i];
|
|
257
|
+
const tag = mention.tag;
|
|
258
|
+
if (typeof tag !== 'string') {
|
|
259
|
+
throw new Error('Mention tags must be strings.');
|
|
260
|
+
}
|
|
261
|
+
const offset = msg.body.indexOf(tag, mention.fromIndex || 0);
|
|
262
|
+
if (offset < 0)
|
|
263
|
+
utils.warn(
|
|
264
|
+
'handleMention',
|
|
265
|
+
'Mention for "' + tag + '" not found in message string.',
|
|
266
|
+
);
|
|
267
|
+
if (!mention.id)
|
|
268
|
+
utils.warn('handleMention', 'Mention id should be non-null.');
|
|
269
|
+
const id = mention.id || 0;
|
|
270
|
+
const emptyChar = '\u200E';
|
|
271
|
+
form['body'] = emptyChar + msg.body;
|
|
272
|
+
form['profile_xmd[' + i + '][offset]'] = offset + 1;
|
|
273
|
+
form['profile_xmd[' + i + '][length]'] = tag.length;
|
|
274
|
+
form['profile_xmd[' + i + '][id]'] = id;
|
|
275
|
+
form['profile_xmd[' + i + '][type]'] = 'p';
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
const result = await sendContent(
|
|
279
|
+
form,
|
|
280
|
+
threadID,
|
|
281
|
+
isSingleUser,
|
|
282
|
+
messageAndOTID,
|
|
283
|
+
);
|
|
284
|
+
return result;
|
|
285
|
+
};
|
|
286
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
// @ChoruOfficial
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
import utils = require('../../../utils');
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* @param {Object} defaultFuncs
|
|
8
|
+
* @param {Object} api
|
|
9
|
+
* @param {Object} ctx
|
|
10
|
+
*/
|
|
11
|
+
export default function(defaultFuncs: any, api: any, ctx: any) {
|
|
12
|
+
/**
|
|
13
|
+
* Sends a typing indicator to a specific thread.
|
|
14
|
+
* @param {boolean} sendTyping - True to show typing indicator, false to hide.
|
|
15
|
+
* @param {string} threadID - The ID of the thread to send the typing indicator to.
|
|
16
|
+
* @param {Function} [callback] - An optional callback function.
|
|
17
|
+
* @returns {Promise<void>}
|
|
18
|
+
*/
|
|
19
|
+
return async function sendTypingIndicatorV2(sendTyping, threadID, callback) {
|
|
20
|
+
let count_req = 0;
|
|
21
|
+
const wsContent = {
|
|
22
|
+
app_id: 2220391788200892,
|
|
23
|
+
payload: JSON.stringify({
|
|
24
|
+
label: 3,
|
|
25
|
+
payload: JSON.stringify({
|
|
26
|
+
thread_key: threadID.toString(),
|
|
27
|
+
is_group_thread: +(threadID.toString().length >= 16),
|
|
28
|
+
is_typing: +sendTyping,
|
|
29
|
+
attribution: 0,
|
|
30
|
+
}),
|
|
31
|
+
version: 5849951561777440,
|
|
32
|
+
}),
|
|
33
|
+
request_id: ++count_req,
|
|
34
|
+
type: 4,
|
|
35
|
+
};
|
|
36
|
+
await new Promise<void>((resolve, reject) =>
|
|
37
|
+
ctx.mqttClient.publish(
|
|
38
|
+
'/ls_req',
|
|
39
|
+
JSON.stringify(wsContent),
|
|
40
|
+
{},
|
|
41
|
+
(err, _packet) => (err ? reject(err) : resolve()),
|
|
42
|
+
),
|
|
43
|
+
);
|
|
44
|
+
if (callback) {
|
|
45
|
+
callback();
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import utils = require("../../../utils");
|
|
2
|
+
// @NethWs3Dev
|
|
3
|
+
|
|
4
|
+
export default function(defaultFuncs: any, api: any, ctx: any) {
|
|
5
|
+
return async (reaction, messageID) => {
|
|
6
|
+
if (!reaction) throw new Error("Please enter a valid emoji.");
|
|
7
|
+
const defData = await defaultFuncs.postFormData("https://www.facebook.com/webgraphql/mutation/", ctx.jar, {}, {
|
|
8
|
+
doc_id: "1491398900900362",
|
|
9
|
+
variables: JSON.stringify({
|
|
10
|
+
data: {
|
|
11
|
+
client_mutation_id: ctx.clientMutationId++,
|
|
12
|
+
actor_id: ctx.userID,
|
|
13
|
+
action: reaction == "" ? "REMOVE_REACTION" : "ADD_REACTION",
|
|
14
|
+
message_id: messageID,
|
|
15
|
+
reaction
|
|
16
|
+
}
|
|
17
|
+
}),
|
|
18
|
+
dpr: 1
|
|
19
|
+
});
|
|
20
|
+
const resData = await utils.parseAndCheckLogin(ctx.jar, defaultFuncs)(defData);
|
|
21
|
+
if (!resData) {
|
|
22
|
+
throw new Error("setMessageReactionLegacy returned empty object.");
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
};
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import utils = require("../../../utils");
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @module shareContact
|
|
5
|
+
* @param {Object} defaultFuncs - The default functions provided by the API.
|
|
6
|
+
* @param {Object} api - The full API object.
|
|
7
|
+
* @param {Object} ctx - The context object.
|
|
8
|
+
* @returns {function(text: string, senderID: string, threadID: string, callback: Function): void} - A function to share a contact.
|
|
9
|
+
*/
|
|
10
|
+
export default function(defaultFuncs: any, api: any, ctx: any) {
|
|
11
|
+
/**
|
|
12
|
+
* Shares a user's contact information into a specific thread via MQTT.
|
|
13
|
+
* @param {string} [text] - An optional message to send along with the contact card.
|
|
14
|
+
* @param {string} senderID - The Facebook user ID of the contact you want to share.
|
|
15
|
+
* @param {string} threadID - The ID of the thread where the contact will be shared.
|
|
16
|
+
* @param {Function} [callback] - An optional callback function to be executed.
|
|
17
|
+
*/
|
|
18
|
+
return function shareContact(text, senderID, threadID, callback) {
|
|
19
|
+
if (!ctx.mqttClient) {
|
|
20
|
+
throw new Error('Not connected to MQTT');
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
ctx.wsReqNumber ??= 0;
|
|
24
|
+
ctx.wsTaskNumber ??= 0;
|
|
25
|
+
|
|
26
|
+
ctx.wsReqNumber += 1;
|
|
27
|
+
ctx.wsTaskNumber += 1;
|
|
28
|
+
|
|
29
|
+
const queryPayload = {
|
|
30
|
+
contact_id: senderID,
|
|
31
|
+
sync_group: 1,
|
|
32
|
+
text: text || "",
|
|
33
|
+
thread_id: threadID
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
const query = {
|
|
37
|
+
failure_count: null,
|
|
38
|
+
label: '359',
|
|
39
|
+
payload: JSON.stringify(queryPayload),
|
|
40
|
+
queue_name: 'messenger_contact_sharing',
|
|
41
|
+
task_id: Math.random() * 1001 << 0,
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
const context: any = {
|
|
45
|
+
app_id: '2220391788200892',
|
|
46
|
+
payload: {
|
|
47
|
+
tasks: [query],
|
|
48
|
+
epoch_id: utils.generateOfflineThreadingID(),
|
|
49
|
+
version_id: '7214102258676893',
|
|
50
|
+
},
|
|
51
|
+
request_id: ctx.wsReqNumber,
|
|
52
|
+
type: 3,
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
context.payload = JSON.stringify(context.payload);
|
|
56
|
+
|
|
57
|
+
if (typeof callback === 'function') {
|
|
58
|
+
ctx.callback_Task[ctx.wsReqNumber] = { callback, type: "shareContact" };
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
ctx.mqttClient.publish('/ls_req', JSON.stringify(context), { qos: 1, retain: false });
|
|
62
|
+
};
|
|
63
|
+
};
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sticker API Module
|
|
3
|
+
* Provides access to Facebook's GraphQL-based sticker endpoints.
|
|
4
|
+
* Made by @ChoruOfficial
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import utils = require("../../../utils");
|
|
8
|
+
/**
|
|
9
|
+
* Format the sticker pack list (store or tray)
|
|
10
|
+
* @param {object} data - Raw GraphQL response
|
|
11
|
+
* @returns {{ packs: Array<{id: string, name: string, thumbnail: string}>, page_info: object, store_id?: string }}
|
|
12
|
+
*/
|
|
13
|
+
function formatPackList(data) {
|
|
14
|
+
const trayPacks = data?.data?.picker_plugins?.sticker_picker?.sticker_store?.tray_packs?.edges;
|
|
15
|
+
const storePacks = data?.data?.viewer?.sticker_store?.available_packs?.edges;
|
|
16
|
+
|
|
17
|
+
const packData = storePacks || trayPacks;
|
|
18
|
+
if (!packData || !packData.edges) return { packs: [], page_info: { has_next_page: false } };
|
|
19
|
+
|
|
20
|
+
const formattedPacks = packData.edges.map(edge => edge.node ? ({
|
|
21
|
+
id: edge.node.id,
|
|
22
|
+
name: edge.node.name,
|
|
23
|
+
thumbnail: edge.node.thumbnail_image?.uri
|
|
24
|
+
}) : null).filter(Boolean);
|
|
25
|
+
|
|
26
|
+
return {
|
|
27
|
+
packs: formattedPacks,
|
|
28
|
+
page_info: packData.page_info,
|
|
29
|
+
store_id: data?.data?.viewer?.sticker_store?.id
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Format search result stickers
|
|
35
|
+
* @param {object} data - Raw GraphQL response
|
|
36
|
+
* @returns {Array<Object>}
|
|
37
|
+
*/
|
|
38
|
+
function formatStickerSearchResults(data) {
|
|
39
|
+
const stickers = data?.data?.sticker_search?.sticker_results?.edges;
|
|
40
|
+
if (!stickers) return [];
|
|
41
|
+
return stickers.map(edge => edge.node ? ({
|
|
42
|
+
type: "sticker",
|
|
43
|
+
ID: edge.node.id,
|
|
44
|
+
url: edge.node.image?.uri,
|
|
45
|
+
animatedUrl: edge.node.animated_image?.uri,
|
|
46
|
+
packID: edge.node.pack?.id,
|
|
47
|
+
label: edge.node.label || edge.node.accessibility_label,
|
|
48
|
+
stickerID: edge.node.id
|
|
49
|
+
}) : null).filter(Boolean);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Format sticker pack content
|
|
54
|
+
* @param {object} data - Raw GraphQL response
|
|
55
|
+
* @returns {Array<Object>}
|
|
56
|
+
*/
|
|
57
|
+
function formatStickerPackResults(data) {
|
|
58
|
+
const stickers = data?.data?.sticker_pack?.stickers?.edges;
|
|
59
|
+
if (!stickers) return [];
|
|
60
|
+
return stickers.map(edge => edge.node ? ({
|
|
61
|
+
type: "sticker",
|
|
62
|
+
ID: edge.node.id,
|
|
63
|
+
url: edge.node.image?.uri,
|
|
64
|
+
animatedUrl: edge.node.animated_image?.uri,
|
|
65
|
+
packID: edge.node.pack?.id,
|
|
66
|
+
label: edge.node.label || edge.node.accessibility_label,
|
|
67
|
+
stickerID: edge.node.id
|
|
68
|
+
}) : null).filter(Boolean);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Format AI-generated stickers
|
|
73
|
+
* @param {object} data - Raw GraphQL response
|
|
74
|
+
* @returns {Array<Object>}
|
|
75
|
+
*/
|
|
76
|
+
function formatAiStickers(data) {
|
|
77
|
+
const stickers = data?.data?.xfb_trending_generated_ai_stickers?.nodes;
|
|
78
|
+
if (!stickers) return [];
|
|
79
|
+
return stickers.map(node => ({
|
|
80
|
+
type: "sticker",
|
|
81
|
+
ID: node.id,
|
|
82
|
+
url: node.url,
|
|
83
|
+
label: node.label,
|
|
84
|
+
stickerID: node.id
|
|
85
|
+
})).filter(Boolean);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export default function(defaultFuncs: any, api: any, ctx: any) {
|
|
89
|
+
/**
|
|
90
|
+
* Make a GraphQL request and handle login and error checking
|
|
91
|
+
* @param {object} form - Form data for the request
|
|
92
|
+
* @returns {Promise<object>}
|
|
93
|
+
*/
|
|
94
|
+
async function makeRequest(form) {
|
|
95
|
+
const resData = await defaultFuncs.post("https://www.facebook.com/api/graphql/", ctx.jar, form)
|
|
96
|
+
.then(utils.parseAndCheckLogin(ctx, defaultFuncs));
|
|
97
|
+
if (!resData) throw new Error("GraphQL request returned no data.");
|
|
98
|
+
if (resData.errors) {
|
|
99
|
+
utils.error("StickerAPI GraphQL Error", resData.errors[0].message);
|
|
100
|
+
throw resData.errors[0];
|
|
101
|
+
}
|
|
102
|
+
return resData;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
return {
|
|
106
|
+
/**
|
|
107
|
+
* Search for stickers by keyword
|
|
108
|
+
* @param {string} query - Search term
|
|
109
|
+
* @returns {Promise<Array<Object>>}
|
|
110
|
+
*/
|
|
111
|
+
search: async function(query) {
|
|
112
|
+
const form = {
|
|
113
|
+
fb_api_caller_class: 'RelayModern',
|
|
114
|
+
fb_api_req_friendly_name: 'CometStickerPickerSearchResultsRootQuery',
|
|
115
|
+
variables: JSON.stringify({
|
|
116
|
+
scale: 3,
|
|
117
|
+
search_query: query,
|
|
118
|
+
sticker_height: 128,
|
|
119
|
+
sticker_width: 128,
|
|
120
|
+
stickerInterface: "MESSAGES"
|
|
121
|
+
}),
|
|
122
|
+
doc_id: '24004987559125954'
|
|
123
|
+
};
|
|
124
|
+
const res = await makeRequest(form);
|
|
125
|
+
return formatStickerSearchResults(res);
|
|
126
|
+
},
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* List user's sticker packs
|
|
130
|
+
* @returns {Promise<Array<Object>>}
|
|
131
|
+
*/
|
|
132
|
+
listPacks: async function() {
|
|
133
|
+
const form = {
|
|
134
|
+
fb_api_caller_class: 'RelayModern',
|
|
135
|
+
fb_api_req_friendly_name: 'CometStickerPickerCardQuery',
|
|
136
|
+
variables: JSON.stringify({ scale: 3, stickerInterface: "MESSAGES" }),
|
|
137
|
+
doc_id: '10095807770482952'
|
|
138
|
+
};
|
|
139
|
+
const res = await makeRequest(form);
|
|
140
|
+
return formatPackList(res).packs;
|
|
141
|
+
},
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Get all available sticker packs from the store (with pagination)
|
|
145
|
+
* @returns {Promise<Array<Object>>}
|
|
146
|
+
*/
|
|
147
|
+
getStorePacks: async function() {
|
|
148
|
+
utils.log("Starting to fetch all sticker packs from store...");
|
|
149
|
+
let allPacks = [];
|
|
150
|
+
|
|
151
|
+
const initialForm = {
|
|
152
|
+
fb_api_caller_class: 'RelayModern',
|
|
153
|
+
fb_api_req_friendly_name: 'CometStickersStoreDialogQuery',
|
|
154
|
+
variables: JSON.stringify({}),
|
|
155
|
+
doc_id: '29237828849196584'
|
|
156
|
+
};
|
|
157
|
+
let res = await makeRequest(initialForm);
|
|
158
|
+
let { packs, page_info, store_id } = formatPackList(res);
|
|
159
|
+
allPacks.push(...packs);
|
|
160
|
+
utils.log(`Fetched first page with ${packs.length} packs.`);
|
|
161
|
+
|
|
162
|
+
while (page_info && page_info.has_next_page) {
|
|
163
|
+
utils.log("Fetching next page with cursor:", page_info.end_cursor);
|
|
164
|
+
|
|
165
|
+
const paginatedForm = {
|
|
166
|
+
fb_api_caller_class: 'RelayModern',
|
|
167
|
+
fb_api_req_friendly_name: 'CometStickersStorePackListPaginationQuery',
|
|
168
|
+
variables: JSON.stringify({
|
|
169
|
+
count: 20,
|
|
170
|
+
cursor: page_info.end_cursor,
|
|
171
|
+
id: store_id
|
|
172
|
+
}),
|
|
173
|
+
doc_id: '9898634630218439'
|
|
174
|
+
};
|
|
175
|
+
res = await makeRequest(paginatedForm);
|
|
176
|
+
let paginatedResult = formatPackList(res);
|
|
177
|
+
allPacks.push(...paginatedResult.packs);
|
|
178
|
+
page_info = paginatedResult.page_info;
|
|
179
|
+
utils.log(`Fetched ${paginatedResult.packs.length} more packs. Total now: ${allPacks.length}`);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
utils.log(`Finished fetching. Total unique packs found: ${allPacks.length}`);
|
|
183
|
+
return allPacks;
|
|
184
|
+
},
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Merge user's and store sticker packs into one list
|
|
188
|
+
* @returns {Promise<Array<Object>>}
|
|
189
|
+
*/
|
|
190
|
+
listAllPacks: async function() {
|
|
191
|
+
const [myPacks, storePacks] = await Promise.all([
|
|
192
|
+
this.listPacks(),
|
|
193
|
+
this.getStorePacks()
|
|
194
|
+
]);
|
|
195
|
+
const allPacksMap = new Map();
|
|
196
|
+
myPacks.forEach(pack => allPacksMap.set(pack.id, pack));
|
|
197
|
+
storePacks.forEach(pack => allPacksMap.set(pack.id, pack));
|
|
198
|
+
return Array.from(allPacksMap.values());
|
|
199
|
+
},
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* Add a sticker pack by ID
|
|
203
|
+
* @param {string} packID - The ID of the sticker pack
|
|
204
|
+
* @returns {Promise<Object>}
|
|
205
|
+
*/
|
|
206
|
+
addPack: async function(packID) {
|
|
207
|
+
const form = {
|
|
208
|
+
fb_api_caller_class: 'RelayModern',
|
|
209
|
+
fb_api_req_friendly_name: 'CometStickersStorePackMutationAddMutation',
|
|
210
|
+
variables: JSON.stringify({
|
|
211
|
+
input: {
|
|
212
|
+
pack_id: packID,
|
|
213
|
+
actor_id: ctx.userID,
|
|
214
|
+
client_mutation_id: Math.round(Math.random() * 10).toString()
|
|
215
|
+
}
|
|
216
|
+
}),
|
|
217
|
+
doc_id: '9877489362345320'
|
|
218
|
+
};
|
|
219
|
+
const res = await makeRequest(form);
|
|
220
|
+
return res.data.sticker_pack_add.sticker_pack;
|
|
221
|
+
},
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Get all stickers in a pack
|
|
225
|
+
* @param {string} packID - Sticker pack ID
|
|
226
|
+
* @returns {Promise<Array<Object>>}
|
|
227
|
+
*/
|
|
228
|
+
getStickersInPack: async function(packID) {
|
|
229
|
+
const form = {
|
|
230
|
+
fb_api_caller_class: 'RelayModern',
|
|
231
|
+
fb_api_req_friendly_name: 'CometStickerPickerPackContentRootQuery',
|
|
232
|
+
variables: JSON.stringify({ packID, stickerWidth: 128, stickerHeight: 128, scale: 3 }),
|
|
233
|
+
doc_id: '23982341384707469'
|
|
234
|
+
};
|
|
235
|
+
const res = await makeRequest(form);
|
|
236
|
+
return formatStickerPackResults(res);
|
|
237
|
+
},
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* Get trending AI-generated stickers
|
|
241
|
+
* @param {{ limit?: number }} options - Options object
|
|
242
|
+
* @returns {Promise<Array<Object>>}
|
|
243
|
+
*/
|
|
244
|
+
getAiStickers: async function({ limit = 10 } = {}) {
|
|
245
|
+
const form = {
|
|
246
|
+
fb_api_caller_class: 'RelayModern',
|
|
247
|
+
fb_api_req_friendly_name: 'CometStickerPickerStickerGeneratedCardQuery',
|
|
248
|
+
variables: JSON.stringify({ limit }),
|
|
249
|
+
doc_id: '24151467751156443'
|
|
250
|
+
};
|
|
251
|
+
const res = await makeRequest(form);
|
|
252
|
+
return formatAiStickers(res);
|
|
253
|
+
}
|
|
254
|
+
};
|
|
255
|
+
};
|