@cexy/hoonfca 1.0.0 → 1.0.1
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 +3 -0
- package/README.md +451 -43
- package/examples/login-with-cookies.js +102 -0
- package/examples/verify.js +70 -0
- package/index.js +1 -466
- package/package.json +98 -6
- package/src/apis/addExternalModule.js +24 -0
- package/src/apis/addUserToGroup.js +108 -0
- package/src/apis/changeAdminStatus.js +148 -0
- package/src/apis/changeArchivedStatus.js +61 -0
- package/src/apis/changeAvatar.js +103 -0
- package/src/apis/changeBio.js +69 -0
- package/src/apis/changeBlockedStatus.js +54 -0
- package/src/apis/changeGroupImage.js +136 -0
- package/src/apis/changeThreadColor.js +116 -0
- package/src/{changeThreadEmoji.js → apis/changeThreadEmoji.js} +7 -8
- package/src/apis/comment.js +207 -0
- package/src/apis/createAITheme.js +129 -0
- package/src/apis/createNewGroup.js +79 -0
- package/src/apis/createPoll.js +73 -0
- package/src/apis/deleteMessage.js +44 -0
- package/src/apis/deleteThread.js +52 -0
- package/src/apis/e2ee.js +17 -0
- package/src/apis/editMessage.js +70 -0
- package/src/apis/emoji.js +124 -0
- package/src/apis/fetchThemeData.js +82 -0
- package/src/apis/follow.js +81 -0
- package/src/apis/forwardMessage.js +52 -0
- package/src/apis/friend.js +243 -0
- package/src/apis/gcmember.js +122 -0
- package/src/apis/gcname.js +123 -0
- package/src/apis/gcrule.js +119 -0
- package/src/apis/getAccess.js +111 -0
- package/src/apis/getBotInfo.js +88 -0
- package/src/apis/getBotInitialData.js +43 -0
- package/src/apis/getFriendsList.js +79 -0
- package/src/apis/getMessage.js +423 -0
- package/src/apis/getTheme.js +95 -0
- package/src/apis/getThemeInfo.js +116 -0
- package/src/apis/getThreadHistory.js +239 -0
- package/src/apis/getThreadInfo.js +267 -0
- package/src/apis/getThreadList.js +232 -0
- package/src/apis/getThreadPictures.js +58 -0
- package/src/apis/getUserID.js +117 -0
- package/src/apis/getUserInfo.js +513 -0
- package/src/apis/getUserInfoV2.js +146 -0
- package/src/apis/handleMessageRequest.js +50 -0
- package/src/apis/httpGet.js +63 -0
- package/src/apis/httpPost.js +89 -0
- package/src/apis/httpPostFormData.js +69 -0
- package/src/apis/listenMqtt.js +1236 -0
- package/src/apis/listenSpeed.js +179 -0
- package/src/apis/logout.js +87 -0
- package/src/apis/markAsDelivered.js +47 -0
- package/src/apis/markAsRead.js +99 -0
- package/src/apis/markAsReadAll.js +40 -0
- package/src/apis/markAsSeen.js +70 -0
- package/src/apis/mqttDeltaValue.js +278 -0
- package/src/apis/muteThread.js +45 -0
- package/src/apis/nickname.js +132 -0
- package/src/apis/notes.js +163 -0
- package/src/apis/pinMessage.js +150 -0
- package/src/apis/produceMetaTheme.js +180 -0
- package/src/apis/realtime.js +182 -0
- package/src/apis/removeUserFromGroup.js +117 -0
- package/src/apis/resolvePhotoUrl.js +58 -0
- package/src/apis/searchForThread.js +154 -0
- package/src/apis/sendMessage.js +354 -0
- package/src/apis/sendMessageMqtt.js +249 -0
- package/src/apis/sendTypingIndicator.js +91 -0
- package/src/apis/setMessageReaction.js +27 -0
- package/src/apis/setMessageReactionMqtt.js +61 -0
- package/src/apis/setThreadTheme.js +260 -0
- package/src/apis/setThreadThemeMqtt.js +94 -0
- package/src/apis/share.js +107 -0
- package/src/apis/shareContact.js +66 -0
- package/src/apis/stickers.js +257 -0
- package/src/apis/story.js +181 -0
- package/src/apis/theme.js +233 -0
- package/src/apis/unfriend.js +47 -0
- package/src/apis/unsendMessage.js +17 -0
- package/src/engine/client.js +92 -0
- package/src/engine/models/buildAPI.js +152 -0
- package/src/engine/models/loginHelper.js +519 -0
- package/src/engine/models/setOptions.js +88 -0
- package/src/security/e2ee.js +109 -0
- package/src/types/index.d.ts +498 -0
- package/src/utils/antiSuspension.js +506 -0
- package/src/utils/auth-helpers.js +149 -0
- package/src/utils/autoReLogin.js +336 -0
- package/src/utils/axios.js +436 -0
- package/src/utils/cache.js +54 -0
- package/src/utils/clients.js +282 -0
- package/src/utils/constants.js +410 -0
- package/src/utils/formatters/data/formatAttachment.js +370 -0
- package/src/utils/formatters/data/formatDelta.js +109 -0
- package/src/utils/formatters/index.js +159 -0
- package/src/utils/formatters/value/formatCookie.js +91 -0
- package/src/utils/formatters/value/formatDate.js +36 -0
- package/src/utils/formatters/value/formatID.js +16 -0
- package/src/utils/formatters.js +1373 -0
- package/src/utils/headers.js +230 -0
- package/src/utils/index.js +153 -0
- package/src/utils/monitoring.js +333 -0
- package/src/utils/rateLimiter.js +319 -0
- package/src/utils/tokenRefresh.js +657 -0
- package/src/utils/user-agents.js +238 -0
- package/src/utils/validation.js +157 -0
- package/replit.nix +0 -3
- package/src/addExternalModule.js +0 -25
- package/src/addUserToGroup.js +0 -98
- package/src/changeAdminStatus.js +0 -98
- package/src/changeArchivedStatus.js +0 -51
- package/src/changeAvatar.js +0 -89
- package/src/changeBio.js +0 -74
- package/src/changeBlockedStatus.js +0 -45
- package/src/changeBlockedStatusMqtt.js +0 -65
- package/src/changeCover.js +0 -92
- package/src/changeGroupImage.js +0 -110
- package/src/changeName.js +0 -106
- package/src/changeNickname.js +0 -58
- package/src/changeThreadColor.js +0 -62
- package/src/changeUsername.js +0 -80
- package/src/createCommentPost.js +0 -196
- package/src/createNewGroup.js +0 -81
- package/src/createPoll.js +0 -64
- package/src/createPost.js +0 -285
- package/src/data/getThreadInfo.json +0 -1
- package/src/deleteMessage.js +0 -55
- package/src/deleteThread.js +0 -55
- package/src/editMessage.js +0 -66
- package/src/follow.js +0 -71
- package/src/forwardAttachment.js +0 -57
- 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/getCurrentUserID.js +0 -5
- package/src/getEmojiUrl.js +0 -18
- package/src/getFriendsList.js +0 -81
- package/src/getMessage.js +0 -827
- package/src/getOptions.js +0 -5
- package/src/getRegion.js +0 -7
- package/src/getThreadHistory.js +0 -496
- package/src/getThreadHistoryDeprecated.js +0 -95
- package/src/getThreadInfo.js +0 -194
- package/src/getThreadInfoDeprecated.js +0 -77
- package/src/getThreadList.js +0 -219
- package/src/getThreadListDeprecated.js +0 -86
- package/src/getThreadPictures.js +0 -85
- package/src/getUserID.js +0 -67
- package/src/getUserInfo.js +0 -89
- package/src/handleFriendRequest.js +0 -56
- package/src/handleMessageRequest.js +0 -65
- package/src/httpGet.js +0 -53
- package/src/httpPost.js +0 -53
- package/src/httpPostFormData.js +0 -58
- package/src/listenMqtt.js +0 -683
- package/src/listenNotification.js +0 -96
- package/src/logout.js +0 -77
- package/src/markAsDelivered.js +0 -53
- package/src/markAsRead.js +0 -74
- package/src/markAsReadAll.js +0 -46
- package/src/markAsSeen.js +0 -57
- package/src/muteThread.js +0 -49
- package/src/pinMessage.js +0 -60
- package/src/refreshFb_dtsg.js +0 -75
- package/src/removeUserFromGroup.js +0 -59
- package/src/resolvePhotoUrl.js +0 -47
- package/src/searchForThread.js +0 -55
- package/src/searchStickers.js +0 -59
- package/src/sendMessage.js +0 -444
- package/src/sendMessageMqtt.js +0 -326
- package/src/sendTypingIndicator.js +0 -54
- package/src/setMessageReaction.js +0 -126
- package/src/setMessageReactionMqtt.js +0 -74
- package/src/setPostReaction.js +0 -103
- package/src/setProfileGuard.js +0 -66
- package/src/setStoryReaction.js +0 -97
- package/src/setTitle.js +0 -100
- package/src/shareContact.js +0 -101
- package/src/shareLink.js +0 -105
- package/src/stopListenMqtt.js +0 -47
- package/src/threadColors.js +0 -119
- package/src/unfriend.js +0 -58
- package/src/unsendMessage.js +0 -51
- package/src/uploadAttachment.js +0 -98
- package/utils.js +0 -919
package/src/getAccess.js
DELETED
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
const utils = require("../utils");
|
|
4
|
-
|
|
5
|
-
module.exports = function (defaultFuncs, api, ctx) {
|
|
6
|
-
return function getAccess(authCode = "", callback) {
|
|
7
|
-
let cb;
|
|
8
|
-
const url = "https://business.facebook.com/";
|
|
9
|
-
const Referer = url + "security/twofactor/reauth/?twofac_next=" + encodeURIComponent(url + "content_management") + "&type=avoid_bypass&app_id=0&save_device=0";
|
|
10
|
-
|
|
11
|
-
const rt = new Promise((resolve, reject) => {
|
|
12
|
-
cb = (error, token) => (token ? resolve(token) : reject(error));
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
// ইনপুট ওভারলোড হ্যান্ডেল করা হচ্ছে
|
|
16
|
-
if (typeof authCode === "function") {
|
|
17
|
-
callback = authCode;
|
|
18
|
-
authCode = "";
|
|
19
|
-
}
|
|
20
|
-
if (typeof callback === "function") {
|
|
21
|
-
cb = callback;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
// অলরেডি টোকেন থাকলে নতুন করে রিকোয়েস্ট না পাঠিয়ে সরাসরি রিটার্ন করা হচ্ছে
|
|
25
|
-
if (ctx.access_token) {
|
|
26
|
-
cb(null, ctx.access_token);
|
|
27
|
-
return rt;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
utils
|
|
31
|
-
.get(url + "content_management", ctx.jar, null, ctx.globalOptions, null, {
|
|
32
|
-
noRef: true,
|
|
33
|
-
Origin: url,
|
|
34
|
-
})
|
|
35
|
-
.then((res) => {
|
|
36
|
-
const html = res.body;
|
|
37
|
-
return utils.getFrom(html, '["LSD",[],{"token":"', '"}');
|
|
38
|
-
})
|
|
39
|
-
.then((lsd) => {
|
|
40
|
-
|
|
41
|
-
// ২FA কোড সাবমিট করার ইন্টারনাল হেল্পার ফাংশন
|
|
42
|
-
function submitCode(code) {
|
|
43
|
-
let pCb;
|
|
44
|
-
const rtPromise = new Promise((resolve) => {
|
|
45
|
-
pCb = (error, token) => resolve(cb(error, token));
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
if (typeof code !== "string") {
|
|
49
|
-
pCb({
|
|
50
|
-
error: "submitCode",
|
|
51
|
-
lerror: "code must be string",
|
|
52
|
-
continue: submitCode,
|
|
53
|
-
});
|
|
54
|
-
return rtPromise;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
defaultFuncs
|
|
58
|
-
.post(
|
|
59
|
-
url + "security/twofactor/reauth/enter/",
|
|
60
|
-
ctx.jar,
|
|
61
|
-
{
|
|
62
|
-
approvals_code: code,
|
|
63
|
-
save_device: true,
|
|
64
|
-
lsd,
|
|
65
|
-
},
|
|
66
|
-
ctx.globalOptions,
|
|
67
|
-
null,
|
|
68
|
-
{ Referer, Origin: url }
|
|
69
|
-
)
|
|
70
|
-
.then((res) => {
|
|
71
|
-
const responseText = res.body.split(";").pop() || "{}";
|
|
72
|
-
const { payload } = JSON.parse(responseText);
|
|
73
|
-
|
|
74
|
-
if (payload && !payload.codeConfirmed) {
|
|
75
|
-
throw {
|
|
76
|
-
error: "submitCode",
|
|
77
|
-
lerror: payload.message,
|
|
78
|
-
continue: submitCode,
|
|
79
|
-
};
|
|
80
|
-
}
|
|
81
|
-
return;
|
|
82
|
-
})
|
|
83
|
-
.then(() => {
|
|
84
|
-
return utils.get(url + "content_management", ctx.jar, null, ctx.globalOptions, null, { noRef: true });
|
|
85
|
-
})
|
|
86
|
-
.then((res) => {
|
|
87
|
-
const html = res.body;
|
|
88
|
-
const tokenExec = /"accessToken":"(\S+)","clientID":/g.exec(html);
|
|
89
|
-
return [html, tokenExec];
|
|
90
|
-
})
|
|
91
|
-
.then((res) => {
|
|
92
|
-
if (!res[1]) {
|
|
93
|
-
throw {
|
|
94
|
-
error: "token-undefined",
|
|
95
|
-
htmlData: res[0],
|
|
96
|
-
};
|
|
97
|
-
}
|
|
98
|
-
ctx.access_token = res[1][1];
|
|
99
|
-
return pCb(null, res[1][1]);
|
|
100
|
-
})
|
|
101
|
-
.catch((err) => {
|
|
102
|
-
utils.error("getAccess", err.error || err);
|
|
103
|
-
return pCb(err);
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
return rtPromise;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
const codeStr = authCode.toString();
|
|
110
|
-
if (codeStr.length === 6 && !isNaN(codeStr)) {
|
|
111
|
-
submitCode(codeStr);
|
|
112
|
-
} else if (typeof callback === "function") {
|
|
113
|
-
throw {
|
|
114
|
-
error: "submitCode",
|
|
115
|
-
continue: submitCode,
|
|
116
|
-
};
|
|
117
|
-
} else {
|
|
118
|
-
throw {
|
|
119
|
-
error: "authentication code must be string or number or callback must be a function to continue",
|
|
120
|
-
};
|
|
121
|
-
}
|
|
122
|
-
})
|
|
123
|
-
.catch((err) => {
|
|
124
|
-
utils.error("getAccess", typeof callback === "function" ? err.error || err : err);
|
|
125
|
-
return cb(err);
|
|
126
|
-
});
|
|
127
|
-
|
|
128
|
-
return rt;
|
|
129
|
-
};
|
|
130
|
-
};
|
package/src/getAvatarUser.js
DELETED
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
const utils = require("../utils");
|
|
4
|
-
|
|
5
|
-
module.exports = function (defaultFuncs, api, ctx) {
|
|
6
|
-
|
|
7
|
-
// ইন্টারনাল হেল্পার ফাংশন: ইউজারের অ্যাভাটার ইউআরএল ফেচ করা
|
|
8
|
-
function handleAvatar(userIDs, height, width) {
|
|
9
|
-
let cb;
|
|
10
|
-
const rtPromise = new Promise((resolve, reject) => {
|
|
11
|
-
cb = (error, data) => (data ? resolve(data) : reject(error));
|
|
12
|
-
});
|
|
13
|
-
|
|
14
|
-
// map() ব্যবহার করে প্রতিটি ইউজারের জন্য গ্রাফ এপিআই রিকোয়েস্ট প্রমিজ তৈরি করা হচ্ছে
|
|
15
|
-
const uploads = userIDs.map((v) => {
|
|
16
|
-
return defaultFuncs
|
|
17
|
-
.get(`https://graph.facebook.com/${v}/picture?height=${height}&width=${width}&redirect=false&access_token=${ctx.access_token}`, ctx.jar)
|
|
18
|
-
.then(utils.parseAndCheckLogin(ctx, defaultFuncs))
|
|
19
|
-
.then((res) => ({
|
|
20
|
-
userID: v,
|
|
21
|
-
url: res?.data?.url || null
|
|
22
|
-
}))
|
|
23
|
-
.catch((err) => {
|
|
24
|
-
// বাগ ফিক্স: কোনো নির্দিষ্ট আইডি এরর খেলে সম্পূর্ণ চেইন ব্রেক না করে নাল রিটার্ন করবে
|
|
25
|
-
utils.error("getAvatarUser [Internal]", `Failed to fetch avatar for ${v}: ${err.message || err}`);
|
|
26
|
-
return { userID: v, url: null };
|
|
27
|
-
});
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
// Promise.all এর মাধ্যমে সব রিকোয়েস্ট একসাথে এক্সিকিউট করা হচ্ছে
|
|
31
|
-
Promise.all(uploads)
|
|
32
|
-
.then((res) => {
|
|
33
|
-
const resultObj = res.reduce((Obj, { userID, url }) => {
|
|
34
|
-
if (url) Obj[userID] = url; // শুধু ভ্যালিড ইউআরএলগুলো অবজেক্টে যোগ হবে
|
|
35
|
-
return Obj;
|
|
36
|
-
}, {});
|
|
37
|
-
return cb(null, resultObj);
|
|
38
|
-
})
|
|
39
|
-
.catch((err) => cb(err));
|
|
40
|
-
|
|
41
|
-
return rtPromise;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
return function getAvatarUser(userIDs, size = [1500, 1500], callback) {
|
|
45
|
-
let cb;
|
|
46
|
-
const rtPromise = new Promise((resolve, reject) => {
|
|
47
|
-
cb = (err, res) => (res ? resolve(res) : reject(err));
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
// সাইজ প্যারামিটার ফরম্যাটিং ও ভ্যালিডেশন
|
|
51
|
-
if (typeof size === "string" || typeof size === "number") {
|
|
52
|
-
size = [size, size];
|
|
53
|
-
} else if (Array.isArray(size) && size.length === 1) {
|
|
54
|
-
size = [size[0], size[0]];
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
if (typeof size === "function") {
|
|
58
|
-
callback = size;
|
|
59
|
-
size = [1500, 1500];
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
if (typeof callback === "function") {
|
|
63
|
-
cb = callback;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
if (!Array.isArray(userIDs)) {
|
|
67
|
-
userIDs = [userIDs];
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
const [height, width] = size;
|
|
71
|
-
|
|
72
|
-
// অ্যাক্সেস টোকেন চেক (EAAB টোকেন ছাড়া গ্রাফ এপিআই কাজ করবে না)
|
|
73
|
-
if (!ctx.access_token) {
|
|
74
|
-
utils.error("getAvatarUser", "Cant get access_token");
|
|
75
|
-
cb("Cant get access_token");
|
|
76
|
-
return rtPromise;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
handleAvatar(userIDs, height, width)
|
|
80
|
-
.then((res) => cb(null, res))
|
|
81
|
-
.catch((err) => {
|
|
82
|
-
utils.error("getAvatarUser", err);
|
|
83
|
-
return cb(err);
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
return rtPromise;
|
|
87
|
-
};
|
|
88
|
-
};
|
package/src/getBotInitialData.js
DELETED
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
const utils = require("../utils");
|
|
4
|
-
|
|
5
|
-
module.exports = (defaultFuncs, api, ctx) => {
|
|
6
|
-
return function getAccountInfo(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 = (err, data) => {
|
|
16
|
-
if (err) return rejectFunc(err);
|
|
17
|
-
resolveFunc(data);
|
|
18
|
-
};
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
utils.log("Fetching account info...");
|
|
22
|
-
|
|
23
|
-
// ফেসবুক প্রোফাইল পেজ থেকে সোর্স কোড নিয়ে আসা হচ্ছে
|
|
24
|
-
api.httpGet(`https://www.facebook.com/profile.php?id=${ctx.userID}`, null, {
|
|
25
|
-
customUserAgent: utils.windowsUserAgent
|
|
26
|
-
}, (err, data) => {
|
|
27
|
-
// বাগ ফিক্স: অ্যাসিনক্রোনাস ব্লকে সরাসরি throw করার বদলে কলব্যাকে এরর পাঠানো হচ্ছে
|
|
28
|
-
if (err) {
|
|
29
|
-
return callback(err);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
// সোর্স কোড থেকে CurrentUserInitialData ম্যাচ করা হচ্ছে
|
|
33
|
-
const profileMatch = data.match(/"CurrentUserInitialData",\[\],\{(.*?)\},(.*?)\]/);
|
|
34
|
-
|
|
35
|
-
if (profileMatch && profileMatch[1]) {
|
|
36
|
-
try {
|
|
37
|
-
const accountJson = JSON.parse(`{${profileMatch[1]}}`);
|
|
38
|
-
|
|
39
|
-
// প্রপার্টি ফরম্যাটিং
|
|
40
|
-
accountJson.name = accountJson.NAME;
|
|
41
|
-
accountJson.uid = accountJson.USER_ID;
|
|
42
|
-
|
|
43
|
-
delete accountJson.NAME;
|
|
44
|
-
delete accountJson.USER_ID;
|
|
45
|
-
|
|
46
|
-
return callback(null, { ...accountJson });
|
|
47
|
-
} catch (parseError) {
|
|
48
|
-
return callback(parseError);
|
|
49
|
-
}
|
|
50
|
-
} else {
|
|
51
|
-
return callback(null, {
|
|
52
|
-
error: "Something went wrong. Maybe its possible that it has a limitation due to spam requests. You can try again later."
|
|
53
|
-
});
|
|
54
|
-
}
|
|
55
|
-
}, true);
|
|
56
|
-
|
|
57
|
-
return returnPromise;
|
|
58
|
-
};
|
|
59
|
-
};
|
package/src/getCtx.js
DELETED
package/src/getCurrentUserID.js
DELETED
package/src/getEmojiUrl.js
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
module.exports = function () {
|
|
4
|
-
return function getEmojiUrl(c, size, pixelRatio = "1.0") {
|
|
5
|
-
const codePointHex = c.codePointAt(0).toString(16);
|
|
6
|
-
|
|
7
|
-
const ending = `${pixelRatio}/${size}/${codePointHex}.png`;
|
|
8
|
-
|
|
9
|
-
let base = 317426846;
|
|
10
|
-
for (let i = 0; i < ending.length; i++) {
|
|
11
|
-
base = (((base << 5) - base) + ending.charCodeAt(i)) | 0;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
const hashed = ((base & 255) >>> 0).toString(16);
|
|
15
|
-
|
|
16
|
-
return `https://static.xx.fbcdn.net/images/emoji.php/v8/z${hashed}/${ending}`;
|
|
17
|
-
};
|
|
18
|
-
};
|
package/src/getFriendsList.js
DELETED
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
const utils = require("../utils");
|
|
4
|
-
|
|
5
|
-
// ফেসবুকের জেন্ডার কনস্ট্যান্টস ম্যাপিং
|
|
6
|
-
const GENDERS = {
|
|
7
|
-
0: "unknown",
|
|
8
|
-
1: "female_singular",
|
|
9
|
-
2: "male_singular",
|
|
10
|
-
3: "female_singular_guess",
|
|
11
|
-
4: "male_singular_guess",
|
|
12
|
-
5: "mixed",
|
|
13
|
-
6: "neuter_singular",
|
|
14
|
-
7: "unknown_singular",
|
|
15
|
-
8: "female_plural",
|
|
16
|
-
9: "male_plural",
|
|
17
|
-
10: "neuter_plural",
|
|
18
|
-
11: "unknown_plural",
|
|
19
|
-
};
|
|
20
|
-
|
|
21
|
-
// ফ্রেন্ড লিস্টের ডেটা ফরম্যাট করার হেল্পার ফাংশন
|
|
22
|
-
function formatData(obj) {
|
|
23
|
-
return Object.keys(obj).map(key => {
|
|
24
|
-
const user = obj[key];
|
|
25
|
-
return {
|
|
26
|
-
alternateName: user.alternateName,
|
|
27
|
-
firstName: user.firstName,
|
|
28
|
-
gender: GENDERS[user.gender] || "unknown",
|
|
29
|
-
userID: utils.formatID(user.id.toString()),
|
|
30
|
-
isFriend: !!user.is_friend, // ডাবল নেগেশন ব্যবহার করে ক্লিন ট্রু/ফলস কনভার্সন
|
|
31
|
-
fullName: user.name,
|
|
32
|
-
profilePicture: user.thumbSrc,
|
|
33
|
-
type: user.type,
|
|
34
|
-
profileUrl: user.uri,
|
|
35
|
-
vanity: user.vanity,
|
|
36
|
-
isBirthday: !!user.is_birthday,
|
|
37
|
-
};
|
|
38
|
-
});
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
module.exports = function (defaultFuncs, api, ctx) {
|
|
42
|
-
return function getFriendsList(callback) {
|
|
43
|
-
let resolveFunc = () => {};
|
|
44
|
-
let rejectFunc = () => {};
|
|
45
|
-
const returnPromise = new Promise((resolve, reject) => {
|
|
46
|
-
resolveFunc = resolve;
|
|
47
|
-
rejectFunc = reject;
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
if (!callback) {
|
|
51
|
-
callback = (err, friendList) => {
|
|
52
|
-
if (err) return rejectFunc(err);
|
|
53
|
-
resolveFunc(friendList);
|
|
54
|
-
};
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
defaultFuncs
|
|
58
|
-
.postFormData(
|
|
59
|
-
"https://www.facebook.com/chat/user_info_all",
|
|
60
|
-
ctx.jar,
|
|
61
|
-
{},
|
|
62
|
-
{ viewer: ctx.userID }
|
|
63
|
-
)
|
|
64
|
-
.then(utils.parseAndCheckLogin(ctx, defaultFuncs))
|
|
65
|
-
.then(resData => {
|
|
66
|
-
if (!resData) {
|
|
67
|
-
throw { error: "getFriendsList returned empty object." };
|
|
68
|
-
}
|
|
69
|
-
if (resData.error) {
|
|
70
|
-
throw resData;
|
|
71
|
-
}
|
|
72
|
-
return callback(null, formatData(resData.payload));
|
|
73
|
-
})
|
|
74
|
-
.catch(err => {
|
|
75
|
-
utils.error("getFriendsList", err);
|
|
76
|
-
return callback(err);
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
return returnPromise;
|
|
80
|
-
};
|
|
81
|
-
};
|