@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
@@ -1,70 +1,82 @@
1
1
  "use strict";
2
2
 
3
- const utils = require("../utils");
3
+ var utils = require("../utils");
4
+ var log = require("npmlog");
4
5
 
5
- // চ্যাট রিমাইন্ডার ফরম্যাট করার ফাংশন
6
6
  function formatEventReminders(reminder) {
7
7
  return {
8
8
  reminderID: reminder.id,
9
- eventCreatorID: reminder.lightweight_event_creator?.id,
9
+ eventCreatorID: reminder.lightweight_event_creator.id,
10
10
  time: reminder.time,
11
- eventType: reminder.lightweight_event_type?.toLowerCase(),
11
+ eventType: reminder.lightweight_event_type.toLowerCase(),
12
12
  locationName: reminder.location_name,
13
+ // @TODO verify this
13
14
  locationCoordinates: reminder.location_coordinates,
14
15
  locationPage: reminder.location_page,
15
- eventStatus: reminder.lightweight_event_status?.toLowerCase(),
16
+ eventStatus: reminder.lightweight_event_status.toLowerCase(),
16
17
  note: reminder.note,
17
- repeatMode: reminder.repeat_mode?.toLowerCase(),
18
+ repeatMode: reminder.repeat_mode.toLowerCase(),
18
19
  eventTitle: reminder.event_title,
19
20
  triggerMessage: reminder.trigger_message,
20
21
  secondsToNotifyBefore: reminder.seconds_to_notify_before,
21
22
  allowsRsvp: reminder.allows_rsvp,
22
23
  relatedEvent: reminder.related_event,
23
- members: (reminder.event_reminder_members?.edges || []).map(member => ({
24
- memberID: member.node?.id,
25
- state: member.guest_list_state?.toLowerCase(),
26
- })),
24
+ members: reminder.event_reminder_members.edges.map(function (member) {
25
+ return {
26
+ memberID: member.node.id,
27
+ state: member.guest_list_state.toLowerCase(),
28
+ };
29
+ }),
27
30
  };
28
31
  }
29
32
 
30
- // গ্রাফকিউএল রেসপন্স থেকে থ্রেডের তথ্য ফিল্টার ও পার্স করার ফাংশন
31
33
  function formatThreadGraphQLResponse(data) {
32
- if (data?.errors) return null;
33
- const messageThread = data?.message_thread;
34
- if (!messageThread) return null;
34
+ var messageThread = data.o0.data.message_thread;
35
+ var threadID = messageThread.thread_key.thread_fbid
36
+ ? messageThread.thread_key.thread_fbid
37
+ : messageThread.thread_key.other_user_id;
35
38
 
36
- const threadID = messageThread.thread_key?.thread_fbid || messageThread.thread_key?.other_user_id;
37
-
38
- const lastM = messageThread.last_message;
39
- const snippetID = lastM?.nodes?.[0]?.message_sender?.messaging_actor?.id || null;
40
- const snippetText = lastM?.nodes?.[0]?.snippet || null;
41
- const lastR = messageThread.last_read_receipt;
42
- const lastReadTimestamp = lastR?.nodes?.[0]?.timestamp_precise || null;
39
+ // Remove me
40
+ var lastM = messageThread.last_message;
41
+ var snippetID =
42
+ lastM &&
43
+ lastM.nodes &&
44
+ lastM.nodes[0] &&
45
+ lastM.nodes[0].message_sender &&
46
+ lastM.nodes[0].message_sender.messaging_actor
47
+ ? lastM.nodes[0].message_sender.messaging_actor.id
48
+ : null;
49
+ var snippetText =
50
+ lastM && lastM.nodes && lastM.nodes[0] ? lastM.nodes[0].snippet : null;
51
+ var lastR = messageThread.last_read_receipt;
52
+ var lastReadTimestamp =
53
+ lastR && lastR.nodes && lastR.nodes[0] && lastR.nodes[0].timestamp_precise
54
+ ? lastR.nodes[0].timestamp_precise
55
+ : null;
43
56
 
44
57
  return {
45
58
  threadID: threadID,
46
59
  threadName: messageThread.name,
47
- participantIDs: (messageThread.all_participants?.edges || []).map(
48
- d => d.node?.messaging_actor?.id
60
+ participantIDs: messageThread.all_participants.edges.map(
61
+ (d) => d.node.messaging_actor.id,
49
62
  ),
50
- userInfo: (messageThread.all_participants?.edges || []).map(d => ({
51
- id: d.node?.messaging_actor?.id,
52
- name: d.node?.messaging_actor?.name,
53
- firstName: d.node?.messaging_actor?.short_name,
54
- vanity: d.node?.messaging_actor?.username,
55
- url: d.node?.messaging_actor?.url,
56
- thumbSrc: d.node?.messaging_actor?.big_image_src?.uri,
57
- profileUrl: d.node?.messaging_actor?.big_image_src?.uri,
58
- gender: d.node?.messaging_actor?.gender,
59
- type: d.node?.messaging_actor?.__typename,
60
- isFriend: d.node?.messaging_actor?.is_viewer_friend,
61
- isBirthday: !!d.node?.messaging_actor?.is_birthday,
63
+ userInfo: messageThread.all_participants.edges.map((d) => ({
64
+ id: d.node.messaging_actor.id,
65
+ name: d.node.messaging_actor.name,
66
+ firstName: d.node.messaging_actor.short_name,
67
+ vanity: d.node.messaging_actor.username,
68
+ thumbSrc: d.node.messaging_actor.big_image_src.uri,
69
+ profileUrl: d.node.messaging_actor.url,
70
+ gender: d.node.messaging_actor.gender,
71
+ type: d.node.messaging_actor.__typename,
72
+ isFriend: d.node.messaging_actor.is_viewer_friend,
73
+ isBirthday: !!d.node.messaging_actor.is_birthday, //not sure?
62
74
  })),
63
75
  unreadCount: messageThread.unread_count,
64
76
  messageCount: messageThread.messages_count,
65
77
  timestamp: messageThread.updated_time_precise,
66
78
  muteUntil: messageThread.mute_until,
67
- isGroup: messageThread.thread_type === "GROUP",
79
+ isGroup: messageThread.thread_type == "GROUP",
68
80
  isSubscribed: messageThread.is_viewer_subscribed,
69
81
  isArchived: messageThread.has_viewer_archived,
70
82
  folder: messageThread.folder,
@@ -72,64 +84,77 @@ function formatThreadGraphQLResponse(data) {
72
84
  eventReminders: messageThread.event_reminders
73
85
  ? messageThread.event_reminders.nodes.map(formatEventReminders)
74
86
  : null,
75
- emoji: messageThread.customization_info?.emoji || null,
76
- color: messageThread.customization_info?.outgoing_bubble_color
77
- ? messageThread.customization_info.outgoing_bubble_color.slice(2)
87
+ emoji: messageThread.customization_info
88
+ ? messageThread.customization_info.emoji
78
89
  : null,
79
- threadTheme: messageThread.thread_theme,
80
- nicknames: messageThread.customization_info?.participant_customizations
81
- ? messageThread.customization_info.participant_customizations.reduce((res, val) => {
82
- if (val.nickname) res[val.participant_id] = val.nickname;
83
- return res;
84
- }, {})
85
- : {},
86
- adminIDs: messageThread.thread_admins,
90
+ color:
91
+ messageThread.customization_info &&
92
+ messageThread.customization_info.outgoing_bubble_color
93
+ ? messageThread.customization_info.outgoing_bubble_color.slice(2)
94
+ : null,
95
+ nicknames:
96
+ messageThread.customization_info &&
97
+ messageThread.customization_info.participant_customizations
98
+ ? messageThread.customization_info.participant_customizations.reduce(
99
+ function (res, val) {
100
+ if (val.nickname) res[val.participant_id] = val.nickname;
101
+ return res;
102
+ },
103
+ {},
104
+ )
105
+ : {},
106
+ adminIDs: messageThread.thread_admins.map((el) => el.id),
87
107
  approvalMode: Boolean(messageThread.approval_mode),
88
- approvalQueue: (messageThread.group_approval_queue?.nodes || []).map(a => ({
89
- inviterID: a.inviter?.id,
90
- requesterID: a.requester?.id,
108
+ approvalQueue: messageThread.group_approval_queue.nodes.map((a) => ({
109
+ inviterID: a.inviter.id,
110
+ requesterID: a.requester.id,
91
111
  timestamp: a.request_timestamp,
92
- request_source: a.request_source,
112
+ request_source: a.request_source, // @Undocumented
93
113
  })),
94
- reactionsMuteMode: messageThread.reactions_mute_mode?.toLowerCase(),
95
- mentionsMuteMode: messageThread.mentions_mute_mode?.toLowerCase(),
114
+
115
+ // @Undocumented
116
+ reactionsMuteMode: messageThread.reactions_mute_mode.toLowerCase(),
117
+ mentionsMuteMode: messageThread.mentions_mute_mode.toLowerCase(),
96
118
  isPinProtected: messageThread.is_pin_protected,
97
119
  relatedPageThread: messageThread.related_page_thread,
120
+
121
+ // @Legacy
98
122
  name: messageThread.name,
99
123
  snippet: snippetText,
100
124
  snippetSender: snippetID,
101
125
  snippetAttachments: [],
102
126
  serverTimestamp: messageThread.updated_time_precise,
103
- imageSrc: messageThread.image?.uri || null,
127
+ imageSrc: messageThread.image ? messageThread.image.uri : null,
104
128
  isCanonicalUser: messageThread.is_canonical_neo_user,
105
- isCanonical: messageThread.thread_type !== "GROUP",
129
+ isCanonical: messageThread.thread_type != "GROUP",
106
130
  recipientsLoadable: true,
107
131
  hasEmailParticipant: false,
108
132
  readOnly: false,
109
133
  canReply: messageThread.cannot_reply_reason == null,
110
- lastMessageTimestamp: messageThread.last_message?.timestamp_precise || null,
134
+ lastMessageTimestamp: messageThread.last_message
135
+ ? messageThread.last_message.timestamp_precise
136
+ : null,
111
137
  lastMessageType: "message",
112
138
  lastReadTimestamp: lastReadTimestamp,
113
- threadType: messageThread.thread_type === "GROUP" ? 2 : 1,
114
- inviteLink: {
115
- enable: messageThread.joinable_mode ? messageThread.joinable_mode.mode === 1 : false,
116
- link: messageThread.joinable_mode ? messageThread.joinable_mode.link : null,
117
- },
139
+ threadType: messageThread.thread_type == "GROUP" ? 2 : 1,
118
140
  };
119
141
  }
120
142
 
121
143
  module.exports = function (defaultFuncs, api, ctx) {
122
- return function getThreadInfoGraphQL(threadID, callback) {
123
- let resolveFunc = () => {};
124
- let rejectFunc = () => {};
125
- const returnPromise = new Promise((resolve, reject) => {
144
+ return function getThreadInfoGraphQL(threadID, callback, no_cache) {
145
+ var resolveFunc = function () {};
146
+ var rejectFunc = function () {};
147
+ var returnPromise = new Promise(function (resolve, reject) {
126
148
  resolveFunc = resolve;
127
149
  rejectFunc = reject;
128
150
  });
129
151
 
130
- const callbackType = utils.getType(callback);
131
- if (callbackType !== "Function" && callbackType !== "AsyncFunction") {
132
- callback = (err, data) => {
152
+ if (!no_cache && typeof callback == "boolean") no_cache = callback;
153
+ if (
154
+ utils.getType(callback) != "Function" &&
155
+ utils.getType(callback) != "AsyncFunction"
156
+ ) {
157
+ callback = function (err, data) {
133
158
  if (err) {
134
159
  return rejectFunc(err);
135
160
  }
@@ -137,58 +162,61 @@ module.exports = function (defaultFuncs, api, ctx) {
137
162
  };
138
163
  }
139
164
 
140
- if (utils.getType(threadID) !== "Array") {
141
- threadID = [threadID];
142
- }
165
+ const cache = utils.groupsCache.findOneById(`${threadID}`);
143
166
 
144
- const queries = {};
145
- // map() এর জায়গায় স্ট্যান্ডার্ড forEach ব্যবহার করা হয়েছে
146
- threadID.forEach((t, i) => {
147
- queries["o" + i] = {
148
- doc_id: "3449967031715030",
149
- query_params: {
150
- id: t,
151
- message_limit: 0,
152
- load_messages: false,
153
- load_read_receipts: false,
154
- before: null,
155
- },
167
+ if (!no_cache && cache) {
168
+ callback(null, cache);
169
+ return returnPromise;
170
+ } else {
171
+ // `queries` has to be a string. I couldn't tell from the dev console. This
172
+ // took me a really long time to figure out. I deserve a cookie for this.
173
+ var form = {
174
+ queries: JSON.stringify({
175
+ o0: {
176
+ // This doc_id is valid as of July 20th, 2020
177
+ doc_id: "3449967031715030",
178
+ query_params: {
179
+ id: threadID,
180
+ message_limit: 0,
181
+ load_messages: false,
182
+ load_read_receipts: false,
183
+ before: null,
184
+ },
185
+ },
186
+ }),
187
+ batch_name: "MessengerGraphQLThreadFetcher",
156
188
  };
157
- });
158
189
 
159
- const form = {
160
- queries: JSON.stringify(queries),
161
- batch_name: "MessengerGraphQLThreadFetcher",
162
- };
163
-
164
- defaultFuncs
165
- .post("https://www.facebook.com/api/graphqlbatch/", ctx.jar, form)
166
- .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
167
- .then(resData => {
168
- if (resData.error) {
169
- throw resData;
170
- }
171
-
172
- const threadInfos = {};
173
- for (let i = resData.length - 2; i >= 0; i--) {
174
- const rawData = resData[i][Object.keys(resData[i])[0]]?.data;
175
- const threadInfo = formatThreadGraphQLResponse(rawData);
176
- if (threadInfo) {
177
- threadInfos[threadInfo.threadID || threadID[threadID.length - 1 - i]] = threadInfo;
190
+ defaultFuncs
191
+ .post("https://www.facebook.com/api/graphqlbatch/", ctx.jar, form)
192
+ .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
193
+ .then(function (resData) {
194
+ if (resData.error) {
195
+ throw resData;
196
+ }
197
+ // This returns us an array of things. The last one is the success /
198
+ // failure one.
199
+ // @TODO What do we do in this case?
200
+ if (resData[resData.length - 1].error_results !== 0) {
201
+ throw new Error("well darn there was an error_result");
178
202
  }
179
- }
180
203
 
181
- if (Object.values(threadInfos).length === 1) {
182
- callback(null, Object.values(threadInfos)[0]);
183
- } else {
184
- callback(null, threadInfos);
185
- }
186
- })
187
- .catch(() => {
188
- // এরর হলে ক্র্যাশ না করে নিরাপদে নাল রিটার্ন করবে
189
- callback(null, null);
190
- });
204
+ let data = formatThreadGraphQLResponse(resData[0]);
205
+ data._id = threadID;
191
206
 
192
- return returnPromise;
207
+ utils.groupsCache.addOne(data);
208
+ setInterval(
209
+ () => utils.groupsCache.deleteOneUsingId(`${threadID}`),
210
+ ctx.globalOptions.cacheTime,
211
+ );
212
+ callback(null, data);
213
+ })
214
+ .catch(function (err) {
215
+ log.error("getThreadInfoGraphQL", err);
216
+ return callback(err);
217
+ });
218
+
219
+ return returnPromise;
220
+ }
193
221
  };
194
222
  };