@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,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const utils = require("../utils");
|
|
4
|
+
|
|
5
|
+
module.exports = function (defaultFuncs, api, ctx) {
|
|
6
|
+
return function createPoll(title, threadID, options, callback) {
|
|
7
|
+
let resolveFunc = () => {};
|
|
8
|
+
let rejectFunc = () => {};
|
|
9
|
+
const returnPromise = new Promise((resolve, reject) => {
|
|
10
|
+
resolveFunc = resolve;
|
|
11
|
+
rejectFunc = reject;
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
const optionsType = utils.getType(options);
|
|
15
|
+
|
|
16
|
+
// কলব্যাক ও অপশন হ্যান্ডলিং
|
|
17
|
+
if (!callback) {
|
|
18
|
+
if (optionsType === "Function" || optionsType === "AsyncFunction") {
|
|
19
|
+
callback = options;
|
|
20
|
+
options = null;
|
|
21
|
+
} else {
|
|
22
|
+
callback = function (err) {
|
|
23
|
+
if (err) return rejectFunc(err);
|
|
24
|
+
resolveFunc();
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
if (!options) {
|
|
30
|
+
options = {};
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const form = {
|
|
34
|
+
target_id: threadID,
|
|
35
|
+
question_text: title,
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
// Object.entries ব্যবহার করে দ্রুত এবং ক্লিন উপায়ে অপশন লোড করা হচ্ছে
|
|
39
|
+
Object.entries(options).forEach(([opt, isSelected], ind) => {
|
|
40
|
+
form[`option_text_array[${ind}]`] = opt;
|
|
41
|
+
form[`option_is_selected_array[${ind}]`] = isSelected ? "1" : "0";
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
defaultFuncs
|
|
45
|
+
.post(
|
|
46
|
+
"https://www.facebook.com/messaging/group_polling/create_poll/?dpr=1",
|
|
47
|
+
ctx.jar,
|
|
48
|
+
form
|
|
49
|
+
)
|
|
50
|
+
.then(utils.parseAndCheckLogin(ctx, defaultFuncs))
|
|
51
|
+
.then(function (resData) {
|
|
52
|
+
if (resData.payload?.status !== "success") {
|
|
53
|
+
throw resData;
|
|
54
|
+
}
|
|
55
|
+
return callback();
|
|
56
|
+
})
|
|
57
|
+
.catch(function (err) {
|
|
58
|
+
utils.error("createPoll", err);
|
|
59
|
+
return callback(err);
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
return returnPromise;
|
|
63
|
+
};
|
|
64
|
+
};
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const utils = require("../utils");
|
|
4
|
+
|
|
5
|
+
module.exports = function (defaultFuncs, api, ctx) {
|
|
6
|
+
|
|
7
|
+
// মিডিয়া বা ইমেজ আপলোড হ্যান্ডেল করার ফাংশন
|
|
8
|
+
function handleUpload(msg, form) {
|
|
9
|
+
let cb;
|
|
10
|
+
const rt = new Promise((resolve, reject) => {
|
|
11
|
+
cb = error => error ? reject(error) : resolve();
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
if (!msg.attachment) {
|
|
15
|
+
cb();
|
|
16
|
+
} else {
|
|
17
|
+
msg.attachment = Array.isArray(msg.attachment) ? msg.attachment : [msg.attachment];
|
|
18
|
+
const uploads = [];
|
|
19
|
+
|
|
20
|
+
for (const attachment of msg.attachment) {
|
|
21
|
+
if (!utils.isReadableStream(attachment)) {
|
|
22
|
+
cb("Attachment should be a readable stream, not " + utils.getType(attachment)); // বাগ ফিক্স
|
|
23
|
+
return rt;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const vari = {
|
|
27
|
+
source: 8,
|
|
28
|
+
profile_id: ctx.userID,
|
|
29
|
+
waterfallxapp: "comet",
|
|
30
|
+
farr: attachment,
|
|
31
|
+
upload_id: "jsc_c_6"
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
const main = defaultFuncs
|
|
35
|
+
.postFormData("https://upload.facebook.com/ajax/react_composer/attachments/photo/upload", ctx.jar, vari)
|
|
36
|
+
.then(utils.parseAndCheckLogin(ctx, defaultFuncs))
|
|
37
|
+
.then(res => {
|
|
38
|
+
if (res.error || res.errors) throw res;
|
|
39
|
+
return res.payload;
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
uploads.push(main);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
Promise.all(uploads)
|
|
46
|
+
.then(res => {
|
|
47
|
+
for (const payload of res) {
|
|
48
|
+
if (!payload) break;
|
|
49
|
+
form.input.attachments.push({
|
|
50
|
+
photo: { id: payload.photoID }
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
return cb();
|
|
54
|
+
})
|
|
55
|
+
.catch(cb);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return rt;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// URL লিংক প্রিভিউ হ্যান্ডেল করার ফাংশน
|
|
62
|
+
function handleUrl(msg, form) {
|
|
63
|
+
let cb;
|
|
64
|
+
const rt = new Promise((resolve, reject) => {
|
|
65
|
+
cb = error => error ? reject(error) : resolve();
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
if (!msg.url) {
|
|
69
|
+
cb();
|
|
70
|
+
} else {
|
|
71
|
+
const vari = {
|
|
72
|
+
feedLocation: "FEED_COMPOSER",
|
|
73
|
+
focusCommentID: null,
|
|
74
|
+
goodwillCampaignId: "",
|
|
75
|
+
goodwillCampaignMediaIds: [],
|
|
76
|
+
goodwillContentType: null,
|
|
77
|
+
params: { url: msg.url },
|
|
78
|
+
privacySelectorRenderLocation: "COMET_COMPOSER",
|
|
79
|
+
renderLocation: "composer_preview",
|
|
80
|
+
parentStoryID: null,
|
|
81
|
+
scale: 1,
|
|
82
|
+
useDefaultActor: false,
|
|
83
|
+
shouldIncludeStoryAttachment: false,
|
|
84
|
+
__relay_internal__pv__IsWorkUserrelayprovider: false,
|
|
85
|
+
__relay_internal__pv__IsMergQAPollsrelayprovider: false
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
defaultFuncs
|
|
89
|
+
.post("https://www.facebook.com/api/graphql/", ctx.jar, {
|
|
90
|
+
fb_api_req_friendly_name: "ComposerLinkAttachmentPreviewQuery",
|
|
91
|
+
variables: JSON.stringify(vari),
|
|
92
|
+
server_timestamps: true,
|
|
93
|
+
doc_id: 6549975235094234
|
|
94
|
+
})
|
|
95
|
+
.then(utils.parseAndCheckLogin(ctx, defaultFuncs))
|
|
96
|
+
.then(res => {
|
|
97
|
+
const resData = (res[0] || res).data.link_preview;
|
|
98
|
+
if (JSON.parse(resData.share_scrape_data).share_type === 400) {
|
|
99
|
+
throw { error: "url is not accepted" };
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
form.input.attachments.push({
|
|
103
|
+
link: { share_scrape_data: resData.share_scrape_data }
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
return cb();
|
|
107
|
+
})
|
|
108
|
+
.catch(cb);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
return rt;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// মেনশন হ্যান্ডেল করার ফাংশন (বাগ ফিক্স করা হয়েছে)
|
|
115
|
+
function handleMention(msg, form) {
|
|
116
|
+
if (!msg.mentions) return Promise.resolve();
|
|
117
|
+
|
|
118
|
+
msg.mentions = Array.isArray(msg.mentions) ? msg.mentions : [msg.mentions];
|
|
119
|
+
|
|
120
|
+
try {
|
|
121
|
+
for (const mention of msg.mentions) {
|
|
122
|
+
const { id, tag, fromIndex } = mention;
|
|
123
|
+
|
|
124
|
+
if (typeof tag !== "string") throw new Error("Mention tag must be string");
|
|
125
|
+
if (!id) throw new Error("id must be string");
|
|
126
|
+
|
|
127
|
+
const offset = msg.body.indexOf(tag, fromIndex || 0);
|
|
128
|
+
if (offset < 0) throw new Error(`Mention for "${tag}" not found in message string.`);
|
|
129
|
+
|
|
130
|
+
form.input.message.ranges.push({
|
|
131
|
+
entity: { id },
|
|
132
|
+
length: tag.length,
|
|
133
|
+
offset
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
return Promise.resolve();
|
|
137
|
+
} catch (err) {
|
|
138
|
+
return Promise.reject(err);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// পোস্ট সাবমিট করার গ্রাফকিউএল ফাংশন
|
|
143
|
+
function createContent(vari) {
|
|
144
|
+
let cb;
|
|
145
|
+
const rt = new Promise((resolve, reject) => {
|
|
146
|
+
cb = (error, postData) => error ? reject(error) : resolve(postData);
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
const form = {
|
|
150
|
+
fb_api_req_friendly_name: "ComposerStoryCreateMutation",
|
|
151
|
+
variables: JSON.stringify(vari),
|
|
152
|
+
server_timestamps: true,
|
|
153
|
+
doc_id: 6255089511280268
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
defaultFuncs
|
|
157
|
+
.post("https://www.facebook.com/api/graphql/", ctx.jar, form)
|
|
158
|
+
.then(utils.parseAndCheckLogin(ctx, defaultFuncs))
|
|
159
|
+
.then(res => cb(null, res))
|
|
160
|
+
.catch(cb);
|
|
161
|
+
|
|
162
|
+
return rt;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
return function createPost(msg, callback) {
|
|
166
|
+
let cb;
|
|
167
|
+
const rt = new Promise((resolve, reject) => {
|
|
168
|
+
cb = (error, url) => url ? resolve(url) : reject(error);
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
if (typeof msg === "function") {
|
|
172
|
+
const error = "Msg must be a string or object and not function";
|
|
173
|
+
utils.error("createPost", error);
|
|
174
|
+
msg(error);
|
|
175
|
+
return rt;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
if (typeof callback === "function") {
|
|
179
|
+
cb = callback;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
const typeMsg = utils.getType(msg);
|
|
183
|
+
if (!["Object", "String"].includes(typeMsg)) {
|
|
184
|
+
const error = "Msg must be a string or object and not " + typeMsg;
|
|
185
|
+
utils.error("createPost", error);
|
|
186
|
+
cb(error);
|
|
187
|
+
return rt;
|
|
188
|
+
} else if (typeMsg === "String") {
|
|
189
|
+
msg = { body: msg };
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
msg.allowUserID = msg.allowUserID ? (!Array.isArray(msg.allowUserID) ? [msg.allowUserID] : msg.allowUserID) : null;
|
|
193
|
+
|
|
194
|
+
const sessionID = utils.getGUID();
|
|
195
|
+
const base = ["EVERYONE", "FRIENDS", "SELF"];
|
|
196
|
+
|
|
197
|
+
// মেইন ফর্ম কনফিগারেশন
|
|
198
|
+
const form = {
|
|
199
|
+
input: {
|
|
200
|
+
composer_entry_point: !msg.groupID && msg.url ? "share_modal" : "inline_composer",
|
|
201
|
+
composer_source_surface: !msg.groupID && msg.url ? "feed_story" : msg.groupID ? "group" : "timeline",
|
|
202
|
+
composer_type: !msg.groupID && msg.url ? "share" : msg.groupID ? "group" : "timeline",
|
|
203
|
+
idempotence_token: sessionID + "_FEED",
|
|
204
|
+
source: "WWW",
|
|
205
|
+
attachments: [],
|
|
206
|
+
audience: msg.groupID ? { to_id: msg.groupID } : {
|
|
207
|
+
privacy: {
|
|
208
|
+
allow: msg.allowUserID ? msg.allowUserID : [],
|
|
209
|
+
base_state: msg.allowUserID && msg.allowUserID.length > 0 ? base[2] : (base[msg.baseState - 1] || base[0]),
|
|
210
|
+
deny: [],
|
|
211
|
+
tag_expansion_state: "UNSPECIFIED"
|
|
212
|
+
}
|
|
213
|
+
},
|
|
214
|
+
message: {
|
|
215
|
+
ranges: [],
|
|
216
|
+
text: msg.body ? (typeof msg.body === "object" ? JSON.stringify(msg.body, null, 2) : msg.body) : ""
|
|
217
|
+
},
|
|
218
|
+
with_tags_ids: [],
|
|
219
|
+
inline_activities: [],
|
|
220
|
+
explicit_place_id: 0,
|
|
221
|
+
text_format_preset_id: 0,
|
|
222
|
+
logging: { composer_session_id: sessionID },
|
|
223
|
+
navigation_data: {
|
|
224
|
+
attribution_id_v2: msg.groupID
|
|
225
|
+
? "CometGroupDiscussionRoot.react,comet.group,tap_search_bar," + Date.now() + ",909538,2361831622,"
|
|
226
|
+
: "ProfileCometTimelineListViewRoot.react,comet.profile.timeline.list,via_cold_start," + Date.now() + ",796829,190055527696468,"
|
|
227
|
+
},
|
|
228
|
+
is_tracking_encrypted: !!msg.url,
|
|
229
|
+
tracking: [],
|
|
230
|
+
event_share_metadata: { surface: "newsfeed" },
|
|
231
|
+
actor_id: ctx.globalOptions.pageID || ctx.userID,
|
|
232
|
+
client_mutation_id: Math.round(Math.random() * 19).toString()
|
|
233
|
+
},
|
|
234
|
+
displayCommentsFeedbackContext: null,
|
|
235
|
+
displayCommentsContextEnableComment: null,
|
|
236
|
+
displayCommentsContextIsAdPreview: null,
|
|
237
|
+
displayCommentsContextIsAggregatedShare: null,
|
|
238
|
+
displayCommentsContextIsStorySet: null,
|
|
239
|
+
feedLocation: msg.groupID ? "GROUP" : "TIMELINE",
|
|
240
|
+
feedbackSource: 0,
|
|
241
|
+
focusCommentID: null,
|
|
242
|
+
gridMediaWidth: 230,
|
|
243
|
+
groupID: null,
|
|
244
|
+
scale: 1,
|
|
245
|
+
privacySelectorRenderLocation: "COMET_STREAM",
|
|
246
|
+
renderLocation: msg.groupID ? "group" : "timeline",
|
|
247
|
+
useDefaultActor: false,
|
|
248
|
+
inviteShortLinkKey: null,
|
|
249
|
+
isFeed: false,
|
|
250
|
+
isFundraiser: false,
|
|
251
|
+
isFunFactPost: false,
|
|
252
|
+
isGroup: !!msg.groupID,
|
|
253
|
+
isEvent: false,
|
|
254
|
+
isTimeline: !msg.groupID,
|
|
255
|
+
isSocialLearning: false,
|
|
256
|
+
isPageNewsFeed: !!ctx.globalOptions.pageID,
|
|
257
|
+
isProfileReviews: false,
|
|
258
|
+
isWorkSharedDraft: false,
|
|
259
|
+
UFI2CommentsProvider_commentsKey: msg.groupID ? "CometGroupDiscussionRootSuccessQuery" : "ProfileCometTimelineRoute",
|
|
260
|
+
hashtag: null,
|
|
261
|
+
canUserManageOffers: false,
|
|
262
|
+
__relay_internal__pv__CometUFIIsRTAEnabledrelayprovider: false,
|
|
263
|
+
__relay_internal__pv__IsWorkUserrelayprovider: false,
|
|
264
|
+
__relay_internal__pv__IsMergQAPollsrelayprovider: false,
|
|
265
|
+
__relay_internal__pv__StoriesArmadilloReplyEnabledrelayprovider: false,
|
|
266
|
+
__relay_internal__pv__StoriesRingrelayprovider: false
|
|
267
|
+
};
|
|
268
|
+
|
|
269
|
+
// প্রমিজ চেইনিংয়ের মাধ্যমে পোস্ট প্রসেস সম্পন্ন করা হচ্ছে
|
|
270
|
+
handleUpload(msg, form)
|
|
271
|
+
.then(() => handleUrl(msg, form))
|
|
272
|
+
.then(() => handleMention(msg, form))
|
|
273
|
+
.then(() => createContent(form))
|
|
274
|
+
.then(res => {
|
|
275
|
+
if (res.error || res.errors) throw res;
|
|
276
|
+
return cb(null, (res[0] || res).data.story_create.story.url);
|
|
277
|
+
})
|
|
278
|
+
.catch(err => {
|
|
279
|
+
utils.error("createPost", err);
|
|
280
|
+
return cb(err);
|
|
281
|
+
});
|
|
282
|
+
|
|
283
|
+
return rt;
|
|
284
|
+
};
|
|
285
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
[]
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const utils = require("../utils");
|
|
4
|
+
|
|
5
|
+
module.exports = function (defaultFuncs, api, ctx) {
|
|
6
|
+
return function deleteMessage(messageOrMessages, callback) {
|
|
7
|
+
let resolveFunc = () => {};
|
|
8
|
+
let rejectFunc = () => {};
|
|
9
|
+
const returnPromise = new Promise((resolve, reject) => {
|
|
10
|
+
resolveFunc = resolve;
|
|
11
|
+
rejectFunc = reject;
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
if (!callback) {
|
|
15
|
+
callback = function (err) {
|
|
16
|
+
if (err) return rejectFunc(err);
|
|
17
|
+
resolveFunc();
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const form = {
|
|
22
|
+
client: "mercury",
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
// ইনপুট অ্যারে না হলে সেটিকে অ্যারেতে রূপান্তর করা হচ্ছে
|
|
26
|
+
const messages = utils.getType(messageOrMessages) !== "Array"
|
|
27
|
+
? [messageOrMessages]
|
|
28
|
+
: messageOrMessages;
|
|
29
|
+
|
|
30
|
+
// মডার্ন লুপ ব্যবহার করে ফর্ম অবজেক্টে আইডিগুলো সেট করা হচ্ছে
|
|
31
|
+
messages.forEach((msgID, index) => {
|
|
32
|
+
form[`message_ids[${index}]`] = msgID;
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
defaultFuncs
|
|
36
|
+
.post(
|
|
37
|
+
"https://www.facebook.com/ajax/mercury/delete_messages.php",
|
|
38
|
+
ctx.jar,
|
|
39
|
+
form
|
|
40
|
+
)
|
|
41
|
+
.then(utils.parseAndCheckLogin(ctx, defaultFuncs))
|
|
42
|
+
.then(function (resData) {
|
|
43
|
+
if (resData.error) {
|
|
44
|
+
throw resData;
|
|
45
|
+
}
|
|
46
|
+
return callback();
|
|
47
|
+
})
|
|
48
|
+
.catch(function (err) {
|
|
49
|
+
utils.error("deleteMessage", err);
|
|
50
|
+
return callback(err);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
return returnPromise;
|
|
54
|
+
};
|
|
55
|
+
};
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const utils = require("../utils");
|
|
4
|
+
|
|
5
|
+
module.exports = function (defaultFuncs, api, ctx) {
|
|
6
|
+
return function deleteThread(threadOrThreads, callback) {
|
|
7
|
+
let resolveFunc = () => {};
|
|
8
|
+
let rejectFunc = () => {};
|
|
9
|
+
const returnPromise = new Promise((resolve, reject) => {
|
|
10
|
+
resolveFunc = resolve;
|
|
11
|
+
rejectFunc = reject;
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
if (!callback) {
|
|
15
|
+
callback = function (err) {
|
|
16
|
+
if (err) return rejectFunc(err);
|
|
17
|
+
resolveFunc();
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const form = {
|
|
22
|
+
client: "mercury",
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
// ইনপুট অ্যারে না হলে সেটিকে সিঙ্গেলেটন অ্যারেতে রূপান্তর করা হচ্ছে
|
|
26
|
+
const threads = utils.getType(threadOrThreads) !== "Array"
|
|
27
|
+
? [threadOrThreads]
|
|
28
|
+
: threadOrThreads;
|
|
29
|
+
|
|
30
|
+
// মডার্ন লুপ ব্যবহার করে ফর্ম অবজেক্টে থ্রেড আইডিগুলো সেট করা হচ্ছে
|
|
31
|
+
threads.forEach((threadID, index) => {
|
|
32
|
+
form[`ids[${index}]`] = threadID;
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
defaultFuncs
|
|
36
|
+
.post(
|
|
37
|
+
"https://www.facebook.com/ajax/mercury/delete_thread.php",
|
|
38
|
+
ctx.jar,
|
|
39
|
+
form
|
|
40
|
+
)
|
|
41
|
+
.then(utils.parseAndCheckLogin(ctx, defaultFuncs))
|
|
42
|
+
.then(function (resData) {
|
|
43
|
+
if (resData.error) {
|
|
44
|
+
throw resData;
|
|
45
|
+
}
|
|
46
|
+
return callback();
|
|
47
|
+
})
|
|
48
|
+
.catch(function (err) {
|
|
49
|
+
utils.error("deleteThread", err);
|
|
50
|
+
return callback(err);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
return returnPromise;
|
|
54
|
+
};
|
|
55
|
+
};
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
const utils = require("../utils.js");
|
|
5
|
+
|
|
6
|
+
// নিরাপদ ফাংশন চেকিং (Reflect.apply বাগ ফিক্স করা হয়েছে)
|
|
7
|
+
function canBeCalled(func) {
|
|
8
|
+
return typeof func === "function";
|
|
9
|
+
}
|
|
10
|
+
|
|
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
|
+
module.exports = function (defaultFuncs, api, ctx) {
|
|
18
|
+
return function editMessage(text, messageID, callback) {
|
|
19
|
+
if (!ctx.mqttClient) {
|
|
20
|
+
throw new Error("Not connected to MQTT");
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
ctx.wsReqNumber += 1;
|
|
24
|
+
ctx.wsTaskNumber += 1;
|
|
25
|
+
|
|
26
|
+
const queryPayload = {
|
|
27
|
+
message_id: messageID,
|
|
28
|
+
text: text,
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
const query = {
|
|
32
|
+
failure_count: null,
|
|
33
|
+
label: "742",
|
|
34
|
+
payload: JSON.stringify(queryPayload),
|
|
35
|
+
queue_name: "edit_message",
|
|
36
|
+
task_id: ctx.wsTaskNumber,
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
// utils অবজেক্ট থেকে সঠিক ফাংশনটি কল করা হচ্ছে এবং Radix 10 ব্যবহার করা হয়েছে
|
|
40
|
+
const offlineThreadingID = utils.generateOfflineThreadingID
|
|
41
|
+
? utils.generateOfflineThreadingID()
|
|
42
|
+
: utils.generateOfflineThreadingId();
|
|
43
|
+
|
|
44
|
+
const context = {
|
|
45
|
+
app_id: "2220391788200892",
|
|
46
|
+
payload: JSON.stringify({
|
|
47
|
+
data_trace_id: null,
|
|
48
|
+
epoch_id: parseInt(offlineThreadingID, 10), // বাগ ফিক্স করা হয়েছে
|
|
49
|
+
tasks: [query],
|
|
50
|
+
version_id: "6903494529735864",
|
|
51
|
+
}),
|
|
52
|
+
request_id: ctx.wsReqNumber,
|
|
53
|
+
type: 3,
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
if (canBeCalled(callback)) {
|
|
57
|
+
ctx.reqCallbacks[ctx.wsReqNumber] = callback;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// MQTT ব্রোকারে লাইটস্পিড রিকোয়েস্ট পাঠানো হচ্ছে
|
|
61
|
+
ctx.mqttClient.publish("/ls_req", JSON.stringify(context), {
|
|
62
|
+
qos: 1,
|
|
63
|
+
retain: false,
|
|
64
|
+
});
|
|
65
|
+
};
|
|
66
|
+
};
|
package/src/follow.js
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const utils = require("../utils");
|
|
4
|
+
|
|
5
|
+
module.exports = function (defaultFuncs, api, ctx) {
|
|
6
|
+
return function follow(senderID, boolean, callback) {
|
|
7
|
+
let resolveFunc = () => {};
|
|
8
|
+
let rejectFunc = () => {};
|
|
9
|
+
const returnPromise = new Promise((resolve, reject) => {
|
|
10
|
+
resolveFunc = resolve;
|
|
11
|
+
rejectFunc = reject;
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
// কলব্যাক না থাকলে প্রমিজ রিজেক্ট/রিসলভ সেট করা
|
|
15
|
+
if (typeof callback !== "function") {
|
|
16
|
+
callback = (err, data) => {
|
|
17
|
+
if (err) return rejectFunc(err);
|
|
18
|
+
resolveFunc(data);
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// ভেরিয়েবল নির্ধারণ (ফলো বনাম আনফলো লজিক)
|
|
23
|
+
const friendlyName = boolean ? "CometUserFollowMutation" : "CometUserUnfollowMutation";
|
|
24
|
+
const inputPayload = boolean
|
|
25
|
+
? {
|
|
26
|
+
attribution_id_v2: "ProfileCometTimelineListViewRoot.react,comet.profile.timeline.list,via_cold_start,1717249218695,723451,250100865708545,,",
|
|
27
|
+
is_tracking_encrypted: true,
|
|
28
|
+
subscribe_location: "PROFILE",
|
|
29
|
+
subscribee_id: senderID,
|
|
30
|
+
tracking: null,
|
|
31
|
+
actor_id: ctx.userID,
|
|
32
|
+
client_mutation_id: "1",
|
|
33
|
+
}
|
|
34
|
+
: {
|
|
35
|
+
attribution_id_v2: "ProfileCometTimelineListViewRoot.react,comet.profile.timeline.list,tap_search_bar,1717294006136,602597,250100865708545,,",
|
|
36
|
+
is_tracking_encrypted: true,
|
|
37
|
+
subscribe_location: "PROFILE",
|
|
38
|
+
tracking: null,
|
|
39
|
+
unsubscribee_id: senderID,
|
|
40
|
+
actor_id: ctx.userID,
|
|
41
|
+
client_mutation_id: "10",
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
const variablesPayload = boolean
|
|
45
|
+
? { input: inputPayload, scale: 1 }
|
|
46
|
+
: { action_render_location: "WWW_COMET_FRIEND_MENU", input: inputPayload, scale: 1 };
|
|
47
|
+
|
|
48
|
+
const form = {
|
|
49
|
+
av: ctx.userID,
|
|
50
|
+
fb_api_req_friendly_name: friendlyName,
|
|
51
|
+
fb_api_caller_class: "RelayModern",
|
|
52
|
+
doc_id: "25472099855769847",
|
|
53
|
+
variables: JSON.stringify(variablesPayload),
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
// প্রপার সেশন জারের সাথে ফেসবুক গ্রাফকিউএল-এ রিকোয়েস্ট পাঠানো হচ্ছে
|
|
57
|
+
defaultFuncs
|
|
58
|
+
.post("https://www.facebook.com/api/graphql/", ctx.jar, form)
|
|
59
|
+
.then(utils.parseAndCheckLogin(ctx, defaultFuncs))
|
|
60
|
+
.then((resData) => {
|
|
61
|
+
if (resData.errors) throw resData;
|
|
62
|
+
return callback(null, resData);
|
|
63
|
+
})
|
|
64
|
+
.catch((err) => {
|
|
65
|
+
utils.error("follow", err);
|
|
66
|
+
return callback(err);
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
return returnPromise;
|
|
70
|
+
};
|
|
71
|
+
};
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const utils = require("../utils");
|
|
4
|
+
|
|
5
|
+
module.exports = function (defaultFuncs, api, ctx) {
|
|
6
|
+
return function forwardAttachment(attachmentID, userOrUsers, callback) {
|
|
7
|
+
let resolveFunc = () => {};
|
|
8
|
+
let rejectFunc = () => {};
|
|
9
|
+
const returnPromise = new Promise((resolve, reject) => {
|
|
10
|
+
resolveFunc = resolve;
|
|
11
|
+
rejectFunc = reject;
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
if (!callback) {
|
|
15
|
+
callback = function (err) {
|
|
16
|
+
if (err) return rejectFunc(err);
|
|
17
|
+
resolveFunc();
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const form = {
|
|
22
|
+
attachment_id: attachmentID,
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
// ইনপুট অ্যারে না হলে সেটিকে অ্যারেতে রূপান্তর করা হচ্ছে
|
|
26
|
+
const recipients = utils.getType(userOrUsers) !== "Array"
|
|
27
|
+
? [userOrUsers]
|
|
28
|
+
: userOrUsers;
|
|
29
|
+
|
|
30
|
+
const timestamp = Math.floor(Date.now() / 1000);
|
|
31
|
+
|
|
32
|
+
// মডার্ন লুপ ব্যবহার করে রিসিপিয়েন্ট ম্যাপ অবজেক্ট জেনারেট করা হচ্ছে
|
|
33
|
+
recipients.forEach((userID, index) => {
|
|
34
|
+
form[`recipient_map[${timestamp + index}]`] = userID;
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
defaultFuncs
|
|
38
|
+
.post(
|
|
39
|
+
"https://www.facebook.com/mercury/attachments/forward/",
|
|
40
|
+
ctx.jar,
|
|
41
|
+
form
|
|
42
|
+
)
|
|
43
|
+
.then(utils.parseAndCheckLogin(ctx, defaultFuncs)) // ক্র্যাশ বাগটি এখানে ফিক্স করা হয়েছে (ctx.jar -> ctx)
|
|
44
|
+
.then(function (resData) {
|
|
45
|
+
if (resData.error) {
|
|
46
|
+
throw resData;
|
|
47
|
+
}
|
|
48
|
+
return callback();
|
|
49
|
+
})
|
|
50
|
+
.catch(function (err) {
|
|
51
|
+
utils.error("forwardAttachment", err);
|
|
52
|
+
return callback(err);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
return returnPromise;
|
|
56
|
+
};
|
|
57
|
+
};
|