@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.
Files changed (98) hide show
  1. package/.travis.yml +6 -0
  2. package/LICENSE-MIT +21 -0
  3. package/index.d.ts +620 -0
  4. package/index.js +745 -433
  5. package/package.json +45 -6
  6. package/src/addExternalModule.js +14 -16
  7. package/src/addUserToGroup.js +45 -30
  8. package/src/changeAdminStatus.js +39 -42
  9. package/src/changeApprovalMode.js +79 -0
  10. package/src/changeArchivedStatus.js +19 -15
  11. package/src/changeBio.js +18 -16
  12. package/src/changeBlockedStatus.js +14 -12
  13. package/src/changeBlockedStatusMqtt.js +38 -17
  14. package/src/changeGroupImage.js +100 -77
  15. package/src/changeNickname.js +12 -11
  16. package/src/changeThreadColor.js +25 -16
  17. package/src/changeThreadEmoji.js +11 -10
  18. package/src/createNewGroup.js +21 -14
  19. package/src/createPoll.js +87 -21
  20. package/src/deleteMessage.js +18 -17
  21. package/src/deleteThread.js +18 -17
  22. package/src/editMessage.js +28 -31
  23. package/src/forwardAttachment.js +22 -19
  24. package/src/forwardMessage.js +63 -0
  25. package/src/getCurrentUserID.js +4 -2
  26. package/src/getEmojiUrl.js +20 -9
  27. package/src/getFriendsList.js +21 -18
  28. package/src/getGroupsList.js +83 -0
  29. package/src/getMarketplace.js +84 -0
  30. package/src/getNotifications.js +86 -0
  31. package/src/getPagesList.js +83 -0
  32. package/src/getStories.js +88 -0
  33. package/src/getThreadHistory.js +277 -126
  34. package/src/getThreadInfo.js +143 -115
  35. package/src/getThreadList.js +216 -143
  36. package/src/getThreadPictures.js +26 -32
  37. package/src/getUserID.js +13 -14
  38. package/src/getUserInfo.js +107 -68
  39. package/src/handleFriendRequest.js +16 -15
  40. package/src/handleMessageRequest.js +15 -15
  41. package/src/httpGet.js +36 -31
  42. package/src/httpPost.js +36 -31
  43. package/src/listenMqtt.js +705 -370
  44. package/src/logout.js +26 -28
  45. package/src/markAsDelivered.js +22 -17
  46. package/src/markAsRead.js +63 -49
  47. package/src/markAsReadAll.js +17 -13
  48. package/src/markAsSeen.js +23 -19
  49. package/src/muteThread.js +17 -14
  50. package/src/pinMessage.js +23 -22
  51. package/src/removeUserFromGroup.js +42 -22
  52. package/src/resolvePhotoUrl.js +15 -17
  53. package/src/searchForThread.js +18 -20
  54. package/src/searchUsers.js +89 -0
  55. package/src/sendComment.js +161 -0
  56. package/src/sendMessage.js +65 -52
  57. package/src/sendTypingIndicator.js +173 -48
  58. package/src/setBio.js +86 -0
  59. package/src/setMessageReaction.js +76 -16
  60. package/src/setPostReaction.js +29 -61
  61. package/src/setTheme.js +313 -0
  62. package/src/setTitle.js +27 -37
  63. package/src/shareContact.js +34 -82
  64. package/src/shareLink.js +56 -99
  65. package/src/threadColors.js +35 -97
  66. package/src/unfriend.js +15 -20
  67. package/src/unsendMessage.js +71 -18
  68. package/utils.js +1000 -472
  69. package/README.md +0 -83
  70. package/replit.nix +0 -3
  71. package/src/changeAvatar.js +0 -89
  72. package/src/changeCover.js +0 -92
  73. package/src/changeName.js +0 -106
  74. package/src/changeUsername.js +0 -80
  75. package/src/createCommentPost.js +0 -196
  76. package/src/createPost.js +0 -285
  77. package/src/data/getThreadInfo.json +0 -1
  78. package/src/follow.js +0 -71
  79. package/src/getAccess.js +0 -130
  80. package/src/getAvatarUser.js +0 -88
  81. package/src/getBotInitialData.js +0 -59
  82. package/src/getCtx.js +0 -5
  83. package/src/getMessage.js +0 -827
  84. package/src/getOptions.js +0 -5
  85. package/src/getRegion.js +0 -7
  86. package/src/getThreadHistoryDeprecated.js +0 -95
  87. package/src/getThreadInfoDeprecated.js +0 -77
  88. package/src/getThreadListDeprecated.js +0 -86
  89. package/src/httpPostFormData.js +0 -58
  90. package/src/listenNotification.js +0 -96
  91. package/src/refreshFb_dtsg.js +0 -75
  92. package/src/searchStickers.js +0 -59
  93. package/src/sendMessageMqtt.js +0 -326
  94. package/src/setMessageReactionMqtt.js +0 -74
  95. package/src/setProfileGuard.js +0 -66
  96. package/src/setStoryReaction.js +0 -97
  97. package/src/stopListenMqtt.js +0 -47
  98. package/src/uploadAttachment.js +0 -98
package/src/getOptions.js DELETED
@@ -1,5 +0,0 @@
1
- "use strict";
2
-
3
- module.exports = (defaultFuncs, api, ctx) => {
4
- return (str) => ctx?.globalOptions?.[str];
5
- };
package/src/getRegion.js DELETED
@@ -1,7 +0,0 @@
1
- "use strict";
2
-
3
- module.exports = (defaultFuncs, api, ctx) => {
4
- return function getRegion() {
5
- return ctx?.region;
6
- };
7
- };
@@ -1,95 +0,0 @@
1
- "use strict";
2
-
3
- const utils = require("../utils");
4
-
5
- module.exports = function (defaultFuncs, api, ctx) {
6
- return function getThreadHistory(threadID, amount, timestamp, callback) {
7
- let resolveFunc = () => {};
8
- let rejectFunc = () => {};
9
-
10
- const returnPromise = new Promise((resolve, reject) => {
11
- resolveFunc = resolve;
12
- rejectFunc = reject;
13
- });
14
-
15
- // কলব্যাক না থাকলে প্রমিজ হ্যান্ডলার সেট করা হচ্ছে
16
- if (!callback) {
17
- callback = (err, friendList) => {
18
- if (err) {
19
- return rejectFunc(err);
20
- }
21
- resolveFunc(friendList);
22
- };
23
- }
24
-
25
- const form = {
26
- client: "mercury"
27
- };
28
-
29
- // ইউজার নাকি পেজ/গ্রুপ থ্রেড তা যাচাই করার জন্য ইউজার ইনফো ফেচ করা হচ্ছে
30
- api.getUserInfo(threadID, (err, res) => {
31
- if (err) {
32
- return callback(err);
33
- }
34
-
35
- const key = Object.keys(res).length > 0 ? "user_ids" : "thread_fbids";
36
- form[`messages[${key}][${threadID}][offset]`] = 0;
37
- form[`messages[${key}][${threadID}][timestamp]`] = timestamp;
38
- form[`messages[${key}][${threadID}][limit]`] = amount;
39
-
40
- if (ctx.globalOptions.pageID) {
41
- form.request_user_id = ctx.globalOptions.pageID;
42
- }
43
-
44
- defaultFuncs
45
- .post(
46
- "https://www.facebook.com/ajax/mercury/thread_info.php",
47
- ctx.jar,
48
- form
49
- )
50
- .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
51
- .then(resData => {
52
- if (resData.error) {
53
- throw resData;
54
- } else if (!resData.payload) {
55
- throw { error: "Could not retrieve thread history." };
56
- }
57
-
58
- // কোনো মেসেজ হিস্ট্রি না থাকলে খালি অ্যারে দিয়ে ক্র্যাশ আটকানো হচ্ছে
59
- if (!resData.payload.actions) {
60
- resData.payload.actions = [];
61
- }
62
-
63
- const userIDs = {};
64
- resData.payload.actions.forEach(v => {
65
- userIDs[v.author.split(":").pop()] = "";
66
- });
67
-
68
- // মেসেজদাতাদের নাম বের করার জন্য সবার ইউজার ইনফো ফেচ করা হচ্ছে
69
- api.getUserInfo(Object.keys(userIDs), (err, data) => {
70
- if (err) return callback(err);
71
-
72
- resData.payload.actions.forEach(v => {
73
- const senderID = v.author.split(":").pop();
74
- const sender = data[senderID];
75
-
76
- v.sender_name = sender ? sender.name : "Facebook User";
77
- v.sender_fbid = v.author;
78
- delete v.author;
79
- });
80
-
81
- callback(
82
- null,
83
- resData.payload.actions.map(utils.formatHistoryMessage)
84
- );
85
- });
86
- })
87
- .catch(err => {
88
- utils.error("getThreadHistory", err);
89
- return callback(err);
90
- });
91
- });
92
-
93
- return returnPromise;
94
- };
95
- };
@@ -1,77 +0,0 @@
1
- "use strict";
2
-
3
- const utils = require("../utils");
4
-
5
- module.exports = function (defaultFuncs, api, ctx) {
6
- return function getThreadInfo(threadID, callback) {
7
- let resolveFunc = () => {};
8
- let rejectFunc = () => {};
9
-
10
- const returnPromise = new Promise((resolve, reject) => {
11
- resolveFunc = resolve;
12
- rejectFunc = reject;
13
- });
14
-
15
- if (!callback) {
16
- callback = (err, friendList) => {
17
- if (err) {
18
- return rejectFunc(err);
19
- }
20
- resolveFunc(friendList);
21
- };
22
- }
23
-
24
- const form = {
25
- client: "mercury"
26
- };
27
-
28
- // ইউজার নাকি পেজ/গ্রুপ থ্রেড তা যাচাই করার জন্য ইউজার ইনফো ফেচ করা হচ্ছে
29
- api.getUserInfo(threadID, (err, userRes) => {
30
- if (err) {
31
- return callback(err);
32
- }
33
-
34
- const key = Object.keys(userRes).length > 0 ? "user_ids" : "thread_fbids";
35
- form[`threads[${key}][0]`] = threadID;
36
-
37
- // টাইপো ঠিক করা হলো: pageId -> pageID
38
- if (ctx.globalOptions.pageID) {
39
- form.request_user_id = ctx.globalOptions.pageID;
40
- }
41
-
42
- defaultFuncs
43
- .post(
44
- "https://www.facebook.com/ajax/mercury/thread_info.php",
45
- ctx.jar,
46
- form
47
- )
48
- .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
49
- .then(resData => {
50
- if (resData.error) {
51
- throw resData;
52
- } else if (!resData.payload) {
53
- throw { error: "Could not retrieve thread Info." };
54
- }
55
-
56
- const threadData = resData.payload.threads?.[0];
57
- const userData = userRes[threadID];
58
-
59
- if (threadData == null) {
60
- throw { error: "ThreadData is null" };
61
- }
62
-
63
- // থ্রেডের নাম ও ছবি ইউজার ডাটা অনুযায়ী আপডেট করা হচ্ছে
64
- threadData.name = userData?.name ?? threadData.name;
65
- threadData.image_src = userData?.thumbSrc ?? threadData.image_src;
66
-
67
- callback(null, utils.formatThread(threadData));
68
- })
69
- .catch(err => {
70
- utils.error("getThreadInfo", err);
71
- return callback(err);
72
- });
73
- });
74
-
75
- return returnPromise;
76
- };
77
- };
@@ -1,86 +0,0 @@
1
- "use strict";
2
-
3
- const utils = require("../utils");
4
-
5
- module.exports = function (defaultFuncs, api, ctx) {
6
- return function getThreadList(start, end, type, callback) {
7
- // প্রমিজ সাপোর্ট অ্যাড করার জন্য হ্যান্ডলার তৈরি
8
- let resolveFunc = () => {};
9
- let rejectFunc = () => {};
10
- const returnPromise = new Promise((resolve, reject) => {
11
- resolveFunc = resolve;
12
- rejectFunc = reject;
13
- });
14
-
15
- // আর্গুমেন্ট শিফটিং এবং কলব্যাক ডিটেকশন
16
- if (typeof type === "function") {
17
- callback = type;
18
- type = "inbox";
19
- }
20
-
21
- if (!callback && typeof end === "function") {
22
- callback = end;
23
- end = start + 20;
24
- type = "inbox";
25
- }
26
-
27
- if (!callback) {
28
- callback = (err, data) => {
29
- if (err) return rejectFunc(err);
30
- resolveFunc(data);
31
- };
32
- }
33
-
34
- // টাইপ ও রেঞ্জ ভ্যালিডেশন
35
- if (typeof start !== "number" || typeof end !== "number") {
36
- return callback({ error: "getThreadList: start and end must be numbers." });
37
- }
38
-
39
- type = type || "inbox";
40
- if (type === "archived") {
41
- type = "action:archived";
42
- } else if (type !== "inbox" && type !== "pending" && type !== "other" && type !== "action:archived") {
43
- return callback({
44
- error: "type can only be one of the following: inbox, pending, archived, other",
45
- });
46
- }
47
-
48
- if (end <= start) {
49
- end = start + 20;
50
- }
51
-
52
- const form = {
53
- client: "mercury"
54
- };
55
-
56
- form[`${type}[offset]`] = start;
57
- form[`${type}[limit]`] = end - start;
58
-
59
- if (ctx.globalOptions.pageID) {
60
- form.request_user_id = ctx.globalOptions.pageID;
61
- }
62
-
63
- defaultFuncs
64
- .post(
65
- "https://www.facebook.com/ajax/mercury/threadlist_info.php",
66
- ctx.jar,
67
- form
68
- )
69
- .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
70
- .then(resData => {
71
- if (resData.error) {
72
- throw resData;
73
- }
74
- return callback(
75
- null,
76
- (resData.payload?.threads || []).map(utils.formatThread)
77
- );
78
- })
79
- .catch(err => {
80
- utils.error("getThreadList", err);
81
- return callback(err);
82
- });
83
-
84
- return returnPromise;
85
- };
86
- };
@@ -1,58 +0,0 @@
1
- "use strict";
2
-
3
- const utils = require("../utils");
4
-
5
- module.exports = function (defaultFuncs, api, ctx) {
6
- return function httpPostFormData(url, form, customHeader, callback, notAPI) {
7
- let resolveFunc = () => {};
8
- let rejectFunc = () => {};
9
-
10
- const returnPromise = new Promise((resolve, reject) => {
11
- resolveFunc = resolve;
12
- rejectFunc = reject;
13
- });
14
-
15
- // আর্গুমেন্ট শিফটিং লজিক অপ্টিমাইজেশন
16
- const formType = utils.getType(form);
17
- if (formType === "Function" || formType === "AsyncFunction") {
18
- callback = form;
19
- form = {};
20
- }
21
-
22
- const headerType = utils.getType(customHeader);
23
- if (headerType === "Function" || headerType === "AsyncFunction") {
24
- callback = customHeader;
25
- customHeader = {};
26
- }
27
-
28
- customHeader = customHeader || {};
29
-
30
- if (utils.getType(callback) === "Boolean") {
31
- notAPI = callback;
32
- callback = null;
33
- }
34
-
35
- if (!callback) {
36
- callback = (err, data) => {
37
- if (err) return rejectFunc(err);
38
- resolveFunc(data);
39
- };
40
- }
41
-
42
- // রিকোয়েস্ট মেথড ডিসিশন (API নাকি সাধারণ POST Form Data রিকোয়েস্ট)
43
- const requestPromise = notAPI
44
- ? utils.postFormData(url, ctx.jar, form, ctx.globalOptions, ctx, customHeader)
45
- : defaultFuncs.postFormData(url, ctx.jar, form, null, customHeader);
46
-
47
- requestPromise
48
- .then(resData => {
49
- callback(null, resData.body.toString());
50
- })
51
- .catch(err => {
52
- utils.error("httpPostFormData", err);
53
- return callback(err);
54
- });
55
-
56
- return returnPromise;
57
- };
58
- };
@@ -1,96 +0,0 @@
1
- "use strict";
2
-
3
- const utils = require("../utils");
4
- const EventEmitter = require("node:events");
5
-
6
- // নোটিফিকেশন ডাটা ফরম্যাট করার হেল্পার ফাংশন
7
- function format(res, globalCallback) {
8
- const checkMinutes = (date_1, date_2) => {
9
- const ms_1 = date_1.getTime();
10
- const ms_2 = date_2.getTime();
11
- return Math.ceil((ms_2 - ms_1) / (60 * 1000));
12
- };
13
-
14
- const edges = res?.notifications_page?.edges || [];
15
-
16
- for (const index of edges) {
17
- if (index.node?.row_type !== "NOTIFICATION") continue;
18
-
19
- const notifData = index.node.notif;
20
- if (!notifData) continue;
21
-
22
- const timestamp = notifData.creation_time?.timestamp;
23
-
24
- // ১ মিনিটের মধ্যে আসা নোটিফিকেশনগুলো ফিল্টার করা হচ্ছে
25
- if (timestamp && checkMinutes(new Date(timestamp * 1000), new Date()) <= 1) {
26
- globalCallback(null, {
27
- // বাগ ফিক্স: res.node এর পরিবর্তে index.node (বা notifData) ব্যবহার করা হলো যেন ক্র্যাশ না করে
28
- id: notifData.id,
29
- noti_id: notifData.notif_id,
30
- body: notifData.body?.text || "",
31
- url: notifData.url,
32
- timestamp: timestamp * 1000
33
- });
34
- }
35
- }
36
- }
37
-
38
- module.exports = function (defaultFuncs, api, ctx) {
39
- let globalCallback, interval;
40
-
41
- function MessageRepeat() {
42
- interval = setInterval(() => {
43
- return defaultFuncs
44
- .post("https://www.facebook.com/api/graphql/", ctx.jar, {
45
- fb_api_req_friendly_name: "CometNotificationsRootQuery",
46
- doc_id: 6663491207045267,
47
- variables: JSON.stringify({
48
- count: 5,
49
- environment: "MAIN_SURFACE",
50
- filter_tokens: ["Cg8CZnQPA2FsbAE="],
51
- scale: 1
52
- }),
53
- server_timestamps: true
54
- })
55
- .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
56
- .then(res => {
57
- if (res.error || res.errors) {
58
- throw res;
59
- }
60
- return format(res.data?.viewer, globalCallback);
61
- })
62
- .catch(err => {
63
- utils.error("listenNotification", err);
64
- clearInterval(interval);
65
- interval = undefined;
66
- return globalCallback(err);
67
- });
68
- }, 60 * 1000);
69
- }
70
-
71
- return function notification(callback) {
72
- class MessageEmitter extends EventEmitter {
73
- stop() {
74
- globalCallback = () => {};
75
-
76
- if (interval) {
77
- clearInterval(interval);
78
- interval = undefined;
79
- }
80
- Message.emit("stop", new Date());
81
- }
82
- }
83
-
84
- const Message = new MessageEmitter();
85
-
86
- if (typeof callback === "function") {
87
- globalCallback = callback;
88
- } else {
89
- globalCallback = (error, message) =>
90
- error ? Message.emit("error", error) : Message.emit("message", message);
91
- }
92
-
93
- MessageRepeat();
94
- return Message;
95
- };
96
- };
@@ -1,75 +0,0 @@
1
- "use strict";
2
-
3
- const utils = require("../utils");
4
- const log = require("npmlog");
5
-
6
- module.exports = function (defaultFuncs, api, ctx) {
7
- /**
8
- * Refreshes the fb_dtsg and jazoest values.
9
- */
10
- return function refreshFb_dtsg(obj, callback) {
11
- let resolveFunc = () => {};
12
- let rejectFunc = () => {};
13
- const returnPromise = new Promise((resolve, reject) => {
14
- resolveFunc = resolve;
15
- rejectFunc = reject;
16
- });
17
-
18
- // আর্গুমেন্ট শিফটিং লজিক
19
- if (utils.getType(obj) === "Function" || utils.getType(obj) === "AsyncFunction") {
20
- callback = obj;
21
- obj = {};
22
- }
23
-
24
- obj = obj || {};
25
-
26
- if (utils.getType(obj) !== "Object") {
27
- throw new utils.CustomError("The first parameter must be an object or a callback function");
28
- }
29
-
30
- if (!callback) {
31
- callback = (err, data) => {
32
- if (err) return rejectFunc(err);
33
- resolveFunc(data);
34
- };
35
- }
36
-
37
- // টোকেন রিফ্রেশ লজিক
38
- if (Object.keys(obj).length === 0) {
39
- utils
40
- .get('https://m.facebook.com/', ctx.jar, null, ctx.globalOptions, { noRef: true })
41
- .then(resData => {
42
- const html = resData.body;
43
- const fb_dtsg = utils.getFrom(html, 'name="fb_dtsg" value="', '"');
44
- const jazoest = utils.getFrom(html, 'name="jazoest" value="', '"');
45
-
46
- if (!fb_dtsg) {
47
- throw new utils.CustomError("Could not find fb_dtsg in HTML after requesting https://m.facebook.com/");
48
- }
49
-
50
- ctx.fb_dtsg = fb_dtsg;
51
- ctx.jazoest = jazoest;
52
-
53
- callback(null, {
54
- data: { fb_dtsg, jazoest },
55
- message: "refreshed fb_dtsg and jazoest"
56
- });
57
- })
58
- .catch(err => {
59
- log.error("refreshFb_dtsg", err);
60
- return callback(err);
61
- });
62
- } else {
63
- // ম্যানুয়ালি টোকেন সেট করার লজিক
64
- Object.keys(obj).forEach(key => {
65
- ctx[key] = obj[key];
66
- });
67
- callback(null, {
68
- data: obj,
69
- message: `refreshed ${Object.keys(obj).join(", ")}`
70
- });
71
- }
72
-
73
- return returnPromise;
74
- };
75
- };
@@ -1,59 +0,0 @@
1
- 'use strict';
2
-
3
- const utils = require('../utils.js');
4
- // @NethWs3Dev
5
-
6
- module.exports = function (http, api, ctx) {
7
- // ডাটা ফরম্যাট করার হেল্পার ফাংশন
8
- const formatData = (res) => ({
9
- id: res?.node?.id || null,
10
- image: res?.node?.image || {},
11
- package: res?.node?.pack ? {
12
- name: res.node.pack.name,
13
- id: res.node.pack.id
14
- } : {},
15
- label: res?.node?.label || ""
16
- });
17
-
18
- return function searchStickers(query = '', callback) {
19
- let resolveFunc = () => {};
20
- let rejectFunc = () => {};
21
- const returnPromise = new Promise((resolve, reject) => {
22
- resolveFunc = resolve;
23
- rejectFunc = reject;
24
- });
25
-
26
- if (!callback) {
27
- callback = (err, data) => {
28
- if (err) return rejectFunc(err);
29
- resolveFunc(data);
30
- };
31
- }
32
-
33
- const form = {
34
- fb_api_req_friendly_name: 'StickersFlyoutTagSelectorQuery',
35
- variables: JSON.stringify({
36
- stickerWidth: 64,
37
- stickerHeight: 64,
38
- stickerInterface: 'messages',
39
- query
40
- }),
41
- doc_id: '4642836929159953'
42
- };
43
-
44
- http
45
- .post('https://www.facebook.com/api/graphql/', ctx.jar, form)
46
- .then(utils.parseAndCheckLogin(ctx, http))
47
- .then(res => {
48
- // ডাটা স্ট্রাকচার সেফটি চেক
49
- const edges = res?.data?.sticker_search?.sticker_results?.edges || [];
50
- return callback(null, edges.map(formatData));
51
- })
52
- .catch(err => {
53
- utils.error('searchStickers', err);
54
- return callback(err);
55
- });
56
-
57
- return returnPromise;
58
- };
59
- };