@cexy/hoonfca 1.0.1 → 1.0.3

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 (170) 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 +778 -1
  5. package/package.json +31 -84
  6. package/src/{apis/addExternalModule.js → addExternalModule.js} +4 -5
  7. package/src/addUserToGroup.js +113 -0
  8. package/src/changeAdminStatus.js +95 -0
  9. package/src/changeApprovalMode.js +79 -0
  10. package/src/changeArchivedStatus.js +55 -0
  11. package/src/changeBio.js +76 -0
  12. package/src/changeBlockedStatus.js +47 -0
  13. package/src/changeBlockedStatusMqtt.js +86 -0
  14. package/src/changeGroupImage.js +133 -0
  15. package/src/changeNickname.js +59 -0
  16. package/src/changeThreadColor.js +71 -0
  17. package/src/{apis/changeThreadEmoji.js → changeThreadEmoji.js} +8 -6
  18. package/src/createNewGroup.js +88 -0
  19. package/src/createPoll.js +130 -0
  20. package/src/deleteMessage.js +56 -0
  21. package/src/deleteThread.js +56 -0
  22. package/src/editMessage.js +63 -0
  23. package/src/forwardAttachment.js +60 -0
  24. package/src/forwardMessage.js +63 -0
  25. package/src/getCurrentUserID.js +7 -0
  26. package/src/getEmojiUrl.js +29 -0
  27. package/src/getFriendsList.js +84 -0
  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 +647 -0
  34. package/src/getThreadInfo.js +222 -0
  35. package/src/getThreadList.js +292 -0
  36. package/src/getThreadPictures.js +79 -0
  37. package/src/getUserID.js +66 -0
  38. package/src/getUserInfo.js +128 -0
  39. package/src/handleFriendRequest.js +57 -0
  40. package/src/handleMessageRequest.js +65 -0
  41. package/src/{apis/httpGet.js → httpGet.js} +15 -20
  42. package/src/httpPost.js +58 -0
  43. package/src/listenMqtt.js +1018 -0
  44. package/src/logout.js +75 -0
  45. package/src/markAsDelivered.js +58 -0
  46. package/src/{apis/markAsRead.js → markAsRead.js} +19 -30
  47. package/src/markAsReadAll.js +50 -0
  48. package/src/markAsSeen.js +61 -0
  49. package/src/muteThread.js +52 -0
  50. package/src/pinMessage.js +61 -0
  51. package/src/removeUserFromGroup.js +79 -0
  52. package/src/resolvePhotoUrl.js +45 -0
  53. package/src/searchForThread.js +53 -0
  54. package/src/searchUsers.js +89 -0
  55. package/src/sendComment.js +161 -0
  56. package/src/sendMessage.js +457 -0
  57. package/src/sendTypingIndicator.js +179 -0
  58. package/src/setBio.js +86 -0
  59. package/src/setMessageReaction.js +186 -0
  60. package/src/setPostReaction.js +71 -0
  61. package/src/setTheme.js +313 -0
  62. package/src/setTitle.js +90 -0
  63. package/src/shareContact.js +53 -0
  64. package/src/shareLink.js +62 -0
  65. package/src/threadColors.js +57 -0
  66. package/src/unfriend.js +53 -0
  67. package/src/unsendMessage.js +104 -0
  68. package/utils.js +1447 -0
  69. package/LICENSE +0 -3
  70. package/README.md +0 -491
  71. package/examples/login-with-cookies.js +0 -102
  72. package/examples/verify.js +0 -70
  73. package/src/apis/addUserToGroup.js +0 -108
  74. package/src/apis/changeAdminStatus.js +0 -148
  75. package/src/apis/changeArchivedStatus.js +0 -61
  76. package/src/apis/changeAvatar.js +0 -103
  77. package/src/apis/changeBio.js +0 -69
  78. package/src/apis/changeBlockedStatus.js +0 -54
  79. package/src/apis/changeGroupImage.js +0 -136
  80. package/src/apis/changeThreadColor.js +0 -116
  81. package/src/apis/comment.js +0 -207
  82. package/src/apis/createAITheme.js +0 -129
  83. package/src/apis/createNewGroup.js +0 -79
  84. package/src/apis/createPoll.js +0 -73
  85. package/src/apis/deleteMessage.js +0 -44
  86. package/src/apis/deleteThread.js +0 -52
  87. package/src/apis/e2ee.js +0 -17
  88. package/src/apis/editMessage.js +0 -70
  89. package/src/apis/emoji.js +0 -124
  90. package/src/apis/fetchThemeData.js +0 -82
  91. package/src/apis/follow.js +0 -81
  92. package/src/apis/forwardMessage.js +0 -52
  93. package/src/apis/friend.js +0 -243
  94. package/src/apis/gcmember.js +0 -122
  95. package/src/apis/gcname.js +0 -123
  96. package/src/apis/gcrule.js +0 -119
  97. package/src/apis/getAccess.js +0 -111
  98. package/src/apis/getBotInfo.js +0 -88
  99. package/src/apis/getBotInitialData.js +0 -43
  100. package/src/apis/getFriendsList.js +0 -79
  101. package/src/apis/getMessage.js +0 -423
  102. package/src/apis/getTheme.js +0 -95
  103. package/src/apis/getThemeInfo.js +0 -116
  104. package/src/apis/getThreadHistory.js +0 -239
  105. package/src/apis/getThreadInfo.js +0 -267
  106. package/src/apis/getThreadList.js +0 -232
  107. package/src/apis/getThreadPictures.js +0 -58
  108. package/src/apis/getUserID.js +0 -117
  109. package/src/apis/getUserInfo.js +0 -513
  110. package/src/apis/getUserInfoV2.js +0 -146
  111. package/src/apis/handleMessageRequest.js +0 -50
  112. package/src/apis/httpPost.js +0 -89
  113. package/src/apis/httpPostFormData.js +0 -69
  114. package/src/apis/listenMqtt.js +0 -1236
  115. package/src/apis/listenSpeed.js +0 -179
  116. package/src/apis/logout.js +0 -87
  117. package/src/apis/markAsDelivered.js +0 -47
  118. package/src/apis/markAsReadAll.js +0 -40
  119. package/src/apis/markAsSeen.js +0 -70
  120. package/src/apis/mqttDeltaValue.js +0 -278
  121. package/src/apis/muteThread.js +0 -45
  122. package/src/apis/nickname.js +0 -132
  123. package/src/apis/notes.js +0 -163
  124. package/src/apis/pinMessage.js +0 -150
  125. package/src/apis/produceMetaTheme.js +0 -180
  126. package/src/apis/realtime.js +0 -182
  127. package/src/apis/removeUserFromGroup.js +0 -117
  128. package/src/apis/resolvePhotoUrl.js +0 -58
  129. package/src/apis/searchForThread.js +0 -154
  130. package/src/apis/sendMessage.js +0 -354
  131. package/src/apis/sendMessageMqtt.js +0 -249
  132. package/src/apis/sendTypingIndicator.js +0 -91
  133. package/src/apis/setMessageReaction.js +0 -27
  134. package/src/apis/setMessageReactionMqtt.js +0 -61
  135. package/src/apis/setThreadTheme.js +0 -260
  136. package/src/apis/setThreadThemeMqtt.js +0 -94
  137. package/src/apis/share.js +0 -107
  138. package/src/apis/shareContact.js +0 -66
  139. package/src/apis/stickers.js +0 -257
  140. package/src/apis/story.js +0 -181
  141. package/src/apis/theme.js +0 -233
  142. package/src/apis/unfriend.js +0 -47
  143. package/src/apis/unsendMessage.js +0 -17
  144. package/src/engine/client.js +0 -92
  145. package/src/engine/models/buildAPI.js +0 -152
  146. package/src/engine/models/loginHelper.js +0 -519
  147. package/src/engine/models/setOptions.js +0 -88
  148. package/src/security/e2ee.js +0 -109
  149. package/src/types/index.d.ts +0 -498
  150. package/src/utils/antiSuspension.js +0 -506
  151. package/src/utils/auth-helpers.js +0 -149
  152. package/src/utils/autoReLogin.js +0 -336
  153. package/src/utils/axios.js +0 -436
  154. package/src/utils/cache.js +0 -54
  155. package/src/utils/clients.js +0 -282
  156. package/src/utils/constants.js +0 -410
  157. package/src/utils/formatters/data/formatAttachment.js +0 -370
  158. package/src/utils/formatters/data/formatDelta.js +0 -109
  159. package/src/utils/formatters/index.js +0 -159
  160. package/src/utils/formatters/value/formatCookie.js +0 -91
  161. package/src/utils/formatters/value/formatDate.js +0 -36
  162. package/src/utils/formatters/value/formatID.js +0 -16
  163. package/src/utils/formatters.js +0 -1373
  164. package/src/utils/headers.js +0 -230
  165. package/src/utils/index.js +0 -153
  166. package/src/utils/monitoring.js +0 -333
  167. package/src/utils/rateLimiter.js +0 -319
  168. package/src/utils/tokenRefresh.js +0 -657
  169. package/src/utils/user-agents.js +0 -238
  170. package/src/utils/validation.js +0 -157
@@ -1,278 +0,0 @@
1
- "use strict";
2
-
3
- const utils = require('../utils');
4
- const e2ee = require('../security/e2ee');
5
-
6
-
7
- function parseDelta(defaultFuncs, api, ctx, globalCallback, v) {
8
- if (v.delta.class == "NewMessage") {
9
-
10
- if (ctx.globalOptions.pageID && ctx.globalOptions.pageID != v.queue) return;
11
- (function resolveAttachmentUrl(i) {
12
- if (!v.delta.attachments || i == v.delta.attachments.length || utils.getType(v.delta.attachments) !== "Array") {
13
- var fmtMsg;
14
- try {
15
- fmtMsg = utils.formatDeltaMessage(v);
16
- } catch (err) {
17
- return;
18
- }
19
- if (fmtMsg) {
20
- try {
21
- if (e2ee.isEnabled(ctx) && !!v.delta.threadKey.threadFbId) {
22
- const dec = e2ee.decrypt(ctx, fmtMsg.threadID, fmtMsg.body);
23
- if (dec !== null) fmtMsg.body = dec;
24
- }
25
- } catch (_) {}
26
- if (ctx.globalOptions.autoMarkDelivery) {
27
- api.markAsDelivered(fmtMsg.threadID, fmtMsg.messageID);
28
- }
29
- if (!ctx.globalOptions.selfListen && fmtMsg.senderID === ctx.userID) {
30
- return;
31
- }
32
- return globalCallback(null, fmtMsg);
33
- }
34
- } else {
35
- var attachment = v.delta.attachments[i];
36
- if (attachment && attachment.mercury && attachment.mercury.attach_type == "photo") {
37
- api.resolvePhotoUrl(attachment.fbid, (err, url) => {
38
- if (!err) attachment.mercury.metadata.url = url;
39
- return resolveAttachmentUrl(i + 1);
40
- });
41
- } else {
42
- return resolveAttachmentUrl(i + 1);
43
- }
44
- }
45
- })(0);
46
- }
47
-
48
- if (v.delta.class == "ClientPayload") {
49
- var clientPayload = utils.decodeClientPayload(v.delta.payload);
50
- if (clientPayload && clientPayload.deltas) {
51
- for (var i in clientPayload.deltas) {
52
- var delta = clientPayload.deltas[i];
53
-
54
- if (delta.deltaMessageReaction && !!ctx.globalOptions.listenEvents) {
55
- const reactionEvent = {
56
- type: "message_reaction",
57
- threadID: (delta.deltaMessageReaction.threadKey.threadFbId || delta.deltaMessageReaction.threadKey.otherUserFbId).toString(),
58
- messageID: delta.deltaMessageReaction.messageId,
59
- reaction: delta.deltaMessageReaction.reaction,
60
- senderID: delta.deltaMessageReaction.userId.toString(),
61
- userID: delta.deltaMessageReaction.userId.toString()
62
- };
63
-
64
- if (!ctx.globalOptions.selfListen && reactionEvent.senderID === ctx.userID) {
65
- return;
66
- }
67
-
68
- globalCallback(null, reactionEvent);
69
- } else if (delta.deltaRecallMessageData && !!ctx.globalOptions.listenEvents) {
70
- globalCallback(null, {
71
- type: "message_unsend",
72
- threadID: (delta.deltaRecallMessageData.threadKey.threadFbId || delta.deltaRecallMessageData.threadKey.otherUserFbId).toString(),
73
- messageID: delta.deltaRecallMessageData.messageID,
74
- senderID: delta.deltaRecallMessageData.senderID.toString(),
75
- deletionTimestamp: delta.deltaRecallMessageData.deletionTimestamp,
76
- timestamp: delta.deltaRecallMessageData.timestamp
77
- });
78
- } else if (delta.deltaMessageReply) {
79
- var mdata = delta.deltaMessageReply.message?.data?.prng ? JSON.parse(delta.deltaMessageReply.message.data.prng) : [];
80
- var mentions = {};
81
- if (mdata) {
82
- mdata.forEach(m => mentions[m.i] = (delta.deltaMessageReply.message.body || "").substring(m.o, m.o + m.l));
83
- }
84
-
85
- var callbackToReturn = {
86
- type: "message_reply",
87
- threadID: (delta.deltaMessageReply.message.messageMetadata.threadKey.threadFbId || delta.deltaMessageReply.message.messageMetadata.threadKey.otherUserFbId).toString(),
88
- messageID: delta.deltaMessageReply.message.messageMetadata.messageId,
89
- senderID: delta.deltaMessageReply.message.messageMetadata.actorFbId.toString(),
90
- attachments: delta.deltaMessageReply.message.attachments.map(att => {
91
- try {
92
- var mercury = JSON.parse(att.mercuryJSON);
93
- Object.assign(att, mercury);
94
- return utils._formatAttachment(att);
95
- } catch (ex) {
96
- return { ...att, error: ex, type: "unknown" };
97
- }
98
- }),
99
- body: (delta.deltaMessageReply.message.body || ""),
100
- isGroup: !!delta.deltaMessageReply.message.messageMetadata.threadKey.threadFbId,
101
- mentions: mentions,
102
- timestamp: delta.deltaMessageReply.message.messageMetadata.timestamp,
103
- participantIDs: (delta.deltaMessageReply.message.participants || []).map(e => e.toString())
104
- };
105
- try {
106
- if (e2ee.isEnabled(ctx) && callbackToReturn.isGroup) {
107
- const dec = e2ee.decrypt(ctx, callbackToReturn.threadID, callbackToReturn.body);
108
- if (dec !== null) callbackToReturn.body = dec;
109
- }
110
- } catch (_) {}
111
-
112
- if (delta.deltaMessageReply.repliedToMessage) {
113
- var rmentions = {};
114
- var rmdata = delta.deltaMessageReply.repliedToMessage?.data?.prng ? JSON.parse(delta.deltaMessageReply.repliedToMessage.data.prng) : [];
115
- if (rmdata) {
116
- rmdata.forEach(m => rmentions[m.i] = (delta.deltaMessageReply.repliedToMessage.body || "").substring(m.o, m.o + m.l));
117
- }
118
-
119
- callbackToReturn.messageReply = {
120
- threadID: (delta.deltaMessageReply.repliedToMessage.messageMetadata.threadKey.threadFbId || delta.deltaMessageReply.repliedToMessage.messageMetadata.threadKey.otherUserFbId).toString(),
121
- messageID: delta.deltaMessageReply.repliedToMessage.messageMetadata.messageId,
122
- senderID: delta.deltaMessageReply.repliedToMessage.messageMetadata.actorFbId.toString(),
123
- attachments: delta.deltaMessageReply.repliedToMessage.attachments.map(att => {
124
- try {
125
- var mercury = JSON.parse(att.mercuryJSON);
126
- Object.assign(att, mercury);
127
- return utils._formatAttachment(att);
128
- } catch (ex) {
129
- return { ...att, error: ex, type: "unknown" };
130
- }
131
- }),
132
- body: delta.deltaMessageReply.repliedToMessage.body || "",
133
- isGroup: !!delta.deltaMessageReply.repliedToMessage.messageMetadata.threadKey.threadFbId,
134
- mentions: rmentions,
135
- timestamp: delta.deltaMessageReply.repliedToMessage.messageMetadata.timestamp,
136
- participantIDs: (delta.deltaMessageReply.repliedToMessage.participants || []).map(e => e.toString())
137
- };
138
- try {
139
- if (e2ee.isEnabled(ctx) && callbackToReturn.messageReply.isGroup) {
140
- const dec2 = e2ee.decrypt(ctx, callbackToReturn.messageReply.threadID, callbackToReturn.messageReply.body);
141
- if (dec2 !== null) callbackToReturn.messageReply.body = dec2;
142
- }
143
- } catch (_) {}
144
- }
145
- if (ctx.globalOptions.autoMarkDelivery) api.markAsDelivered(callbackToReturn.threadID, callbackToReturn.messageID);
146
- if (!ctx.globalOptions.selfListen && callbackToReturn.senderID === ctx.userID) return;
147
- return globalCallback(null, callbackToReturn);
148
- }
149
- }
150
- return;
151
- }
152
- }
153
-
154
- if (v.delta.class !== "NewMessage" && !ctx.globalOptions.listenEvents) return;
155
- switch (v.delta.class) {
156
- case "ReadReceipt":
157
- var fmtMsg;
158
- try {
159
- fmtMsg = utils.formatDeltaReadReceipt(v.delta);
160
- } catch (err) {
161
- return;
162
- }
163
- if (fmtMsg) globalCallback(null, fmtMsg);
164
- break;
165
- case "AdminTextMessage":
166
- switch (v.delta.type) {
167
- case "instant_game_dynamic_custom_update":
168
- case "accept_pending_thread":
169
- case "confirm_friend_request":
170
- case "shared_album_delete":
171
- case "shared_album_addition":
172
- case "pin_messages_v2":
173
- case "unpin_messages_v2":
174
- case "change_thread_theme":
175
- case "change_thread_nickname":
176
- case "change_thread_icon":
177
- case "change_thread_quick_reaction":
178
- case "change_thread_admins":
179
- case "group_poll":
180
- case "joinable_group_link_mode_change":
181
- case "magic_words":
182
- case "change_thread_approval_mode":
183
- case "messenger_call_log":
184
- case "participant_joined_group_call":
185
- case "rtc_call_log":
186
- case "update_vote":
187
- var fmtEvent;
188
- try {
189
- fmtEvent = utils.formatDeltaEvent(v.delta);
190
- } catch (err) {
191
- return;
192
- }
193
- if (fmtEvent) globalCallback(null, fmtEvent);
194
- break;
195
- }
196
- break;
197
- case "ThreadName":
198
- case "ParticipantsAddedToGroupThread":
199
- case "ParticipantLeftGroupThread":
200
- var fmtEvent2;
201
- try {
202
- fmtEvent2 = utils.formatDeltaEvent(v.delta);
203
- } catch (err) {
204
- return;
205
- }
206
- if (!ctx.globalOptions.selfListen && fmtEvent2 && fmtEvent2.author && fmtEvent2.author.toString() === ctx.userID) return;
207
- if (!ctx.loggedIn) return;
208
- if (fmtEvent2) globalCallback(null, fmtEvent2);
209
- break;
210
- case "ForcedFetch":
211
- if (!v.delta.threadKey) return;
212
- var mid = v.delta.messageId;
213
- var tid = v.delta.threadKey.threadFbId;
214
- if (mid && tid) {
215
- var form = {
216
- av: ctx.globalOptions.pageID,
217
- queries: JSON.stringify({
218
- o0: {
219
- doc_id: "2848441488556444",
220
- query_params: {
221
- thread_and_message_id: {
222
- thread_id: tid.toString(),
223
- message_id: mid
224
- }
225
- }
226
- }
227
- })
228
- };
229
- defaultFuncs.post("https://www.facebook.com/api/graphqlbatch/", ctx.jar, form)
230
- .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
231
- .then(resData => {
232
- if (resData[resData.length - 1].error_results > 0) throw resData[0].o0.errors;
233
- if (resData[resData.length - 1].successful_results === 0) throw { error: "forcedFetch: no successful_results" };
234
- var fetchData = resData[0].o0.data.message;
235
- if (utils.getType(fetchData) === "Object") {
236
- if (fetchData.__typename === "UserMessage" && fetchData.extensible_attachment) {
237
- var event = {
238
- type: "message",
239
- senderID: utils.formatID(fetchData.message_sender.id),
240
- body: fetchData.message.text || "",
241
- threadID: utils.formatID(tid.toString()),
242
- messageID: fetchData.message_id,
243
- attachments: [{
244
- type: "share",
245
- ID: fetchData.extensible_attachment.legacy_attachment_id,
246
- url: fetchData.extensible_attachment.story_attachment.url,
247
- title: fetchData.extensible_attachment.story_attachment.title_with_entities.text,
248
- description: fetchData.extensible_attachment.story_attachment.description ? fetchData.extensible_attachment.story_attachment.description.text : "",
249
- source: fetchData.extensible_attachment.story_attachment.source,
250
- image: ((fetchData.extensible_attachment.story_attachment.media || {}).image || {}).uri,
251
- width: ((fetchData.extensible_attachment.story_attachment.media || {}).image || {}).width,
252
- height: ((fetchData.extensible_attachment.story_attachment.media || {}).image || {}).height,
253
- playable: ((fetchData.extensible_attachment.story_attachment.media || {}).is_playable || false),
254
- duration: ((fetchData.extensible_attachment.story_attachment.media || {}).playable_duration_in_ms || 0)
255
- }],
256
- mentions: {},
257
- timestamp: parseInt(fetchData.timestamp_precise),
258
- isGroup: fetchData.message_sender.id !== tid.toString()
259
- };
260
- try {
261
- if (e2ee.isEnabled(ctx) && event.isGroup) {
262
- const dec = e2ee.decrypt(ctx, event.threadID, event.body);
263
- if (dec !== null) event.body = dec;
264
- }
265
- } catch (_) {}
266
- globalCallback(null, event);
267
- }
268
- }
269
- })
270
- .catch(err => {});
271
- }
272
- break;
273
- }
274
- }
275
-
276
- module.exports = {
277
- parseDelta
278
- };
@@ -1,45 +0,0 @@
1
- "use strict";
2
-
3
- const utils = require('../utils');
4
-
5
- module.exports = (defaultFuncs, api, ctx) => {
6
- return async function muteThread(threadID, muteSeconds, 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, result) => {
16
- if (err) return rejectFunc(err);
17
- resolveFunc(result);
18
- };
19
- }
20
-
21
- try {
22
- const form = {
23
- thread_fbid: threadID,
24
- mute_settings: muteSeconds
25
- };
26
-
27
- const res = await defaultFuncs.post(
28
- "https://www.facebook.com/ajax/mercury/change_mute_thread.php",
29
- ctx.jar,
30
- form
31
- ).then(utils.parseAndCheckLogin(ctx, defaultFuncs));
32
-
33
- if (res && res.error) {
34
- throw res;
35
- }
36
-
37
- callback(null, { success: true });
38
- } catch (err) {
39
- utils.error("muteThread", err);
40
- callback(err);
41
- }
42
-
43
- return returnPromise;
44
- };
45
- };
@@ -1,132 +0,0 @@
1
- "use strict";
2
-
3
- const utils = require('../utils');
4
-
5
- module.exports = function (defaultFuncs, api, ctx) {
6
- /**
7
- * Made by Choru Official
8
- * Mqtt
9
- * Sets a nickname for a participant in a Facebook thread via MQTT.
10
- *
11
- * @param {string} nickname The new nickname to set.
12
- * @param {string} threadID The ID of the thread.
13
- * @param {string} participantID The ID of the participant whose nickname will be changed. Defaults to the current user's ID if not provided or a function.
14
- * @param {Function} [callback] Optional callback function to be invoked upon completion.
15
- * @param {string} [initiatorID] The ID of the user who initiated the nickname change (e.g., from event.senderID).
16
- * @returns {Promise<object>} A promise that resolves with a structured event object on success or rejects on error.
17
- */
18
- return function setNickname(nickname, threadID, participantID, callback, initiatorID) {
19
- let _callback;
20
- let _initiatorID;
21
-
22
- let _resolvePromise;
23
- let _rejectPromise;
24
- const returnPromise = new Promise((resolve, reject) => {
25
- _resolvePromise = resolve;
26
- _rejectPromise = reject;
27
- });
28
-
29
- if (utils.getType(callback) === "Function" || utils.getType(callback) === "AsyncFunction") {
30
- _callback = callback;
31
- _initiatorID = initiatorID;
32
- } else if (utils.getType(threadID) === "Function" || utils.getType(threadID) === "AsyncFunction") {
33
- _callback = threadID;
34
- threadID = null;
35
- _initiatorID = callback;
36
- } else if (utils.getType(participantID) === "Function" || utils.getType(participantID) === "AsyncFunction") {
37
- _callback = participantID;
38
- participantID = ctx.userID;
39
- _initiatorID = callback;
40
- }
41
- else if (utils.getType(callback) === "string") {
42
- _initiatorID = callback;
43
- _callback = undefined;
44
- } else {
45
- _callback = undefined;
46
- _initiatorID = undefined;
47
- }
48
-
49
- if (!_callback) {
50
- _callback = function (__err, __data) {
51
- if (__err) _rejectPromise(__err);
52
- else _resolvePromise(__data);
53
- };
54
- } else {
55
- const originalCallback = _callback;
56
- _callback = function(__err, __data) {
57
- if (__err) {
58
- originalCallback(__err);
59
- _rejectPromise(__err);
60
- } else {
61
- originalCallback(null, __data);
62
- _resolvePromise(__data);
63
- }
64
- };
65
- }
66
-
67
- _initiatorID = _initiatorID || ctx.userID;
68
-
69
- threadID = threadID || ctx.threadID;
70
- participantID = participantID || ctx.userID;
71
-
72
- if (!threadID) {
73
- return _callback(new Error("threadID is required to set a nickname."));
74
- }
75
- if (typeof nickname !== 'string') {
76
- return _callback(new Error("nickname must be a string."));
77
- }
78
-
79
- if (!ctx.mqttClient) {
80
- return _callback(new Error("Not connected to MQTT"));
81
- }
82
-
83
- ctx.wsReqNumber += 1;
84
- ctx.wsTaskNumber += 1;
85
-
86
- const queryPayload = {
87
- thread_key: threadID.toString(),
88
- contact_id: participantID.toString(),
89
- nickname: nickname,
90
- sync_group: 1,
91
- };
92
-
93
- const query = {
94
- failure_count: null,
95
- label: '44',
96
- payload: JSON.stringify(queryPayload),
97
- queue_name: 'thread_participant_nickname',
98
- task_id: ctx.wsTaskNumber,
99
- };
100
-
101
- const context = {
102
- app_id: ctx.appID,
103
- payload: {
104
- epoch_id: parseInt(utils.generateOfflineThreadingID()),
105
- tasks: [query],
106
- version_id: '24631415369801570',
107
- },
108
- request_id: ctx.wsReqNumber,
109
- type: 3,
110
- };
111
- context.payload = JSON.stringify(context.payload);
112
-
113
- ctx.mqttClient.publish('/ls_req', JSON.stringify(context), { qos: 1, retain: false }, (err) => {
114
- if (err) {
115
- return _callback(new Error(`MQTT publish failed for setNickname: ${err.message || err}`));
116
- }
117
-
118
- const nicknameChangeEvent = {
119
- type: "thread_nickname_update",
120
- threadID: threadID,
121
- participantID: participantID,
122
- newNickname: nickname,
123
- senderID: _initiatorID,
124
- BotID: ctx.userID,
125
- timestamp: Date.now(),
126
- };
127
- _callback(null, nicknameChangeEvent);
128
- });
129
-
130
- return returnPromise;
131
- };
132
- };
package/src/apis/notes.js DELETED
@@ -1,163 +0,0 @@
1
- "use strict";
2
-
3
- const utils = require('../utils');
4
-
5
- /**
6
- * @ChoruOfficial
7
- * @description A module for interacting with Facebook Messenger Notes. This is not for creating notes on a user's profile page, but rather the temporary status-like notes in Messenger.
8
- * @param {Object} defaultFuncs The default functions provided by the API wrapper.
9
- * @param {Object} api The full API object.
10
- * @param {Object} ctx The context object containing the user's session state (e.g., userID, jar).
11
- * @returns {Object} An object containing methods to create, delete, recreate, and check notes.
12
- */
13
- module.exports = function(defaultFuncs, api, ctx) {
14
-
15
- /**
16
- * @callback notesCallback
17
- * @param {Error|null} error An error object if the request fails, otherwise null.
18
- * @param {Object} [data] The data returned from the API.
19
- */
20
-
21
- /**
22
- * Checks for the currently active note for the logged-in user.
23
- * @param {notesCallback} callback A callback function that is executed after the request. It receives an error object (if any) and an object representing the current note.
24
- */
25
- function checkNote(callback) {
26
- if (typeof callback !== 'function') {
27
- callback = () => {};
28
- }
29
-
30
- const form = {
31
- fb_api_caller_class: "RelayModern",
32
- fb_api_req_friendly_name: "MWInboxTrayNoteCreationDialogQuery",
33
- variables: JSON.stringify({ scale: 2 }),
34
- doc_id: "30899655739648624",
35
- };
36
-
37
- defaultFuncs
38
- .post("https://www.facebook.com/api/graphql/", ctx.jar, form)
39
- .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
40
- .then(resData => {
41
- if (resData && resData.errors) throw resData.errors[0];
42
- const currentNote = resData?.data?.viewer?.actor?.msgr_user_rich_status;
43
- callback(null, currentNote);
44
- })
45
- .catch(err => {
46
- utils.error("notes.checkNote", err);
47
- callback(err);
48
- });
49
- }
50
-
51
- /**
52
- * Creates a new note with the provided text. The note lasts for 24 hours (86400 seconds).
53
- * @param {string} text The content of the note.
54
- * @param {notesCallback} callback A callback function that is executed after the request. It receives an error object (if any) and an object confirming the note's creation status.
55
- */
56
- function createNote(text, privacy = "EVERYONE", callback) {
57
- if (typeof callback !== 'function') {
58
- callback = () => {};
59
- }
60
-
61
- const variables = {
62
- input: {
63
- client_mutation_id: Math.round(Math.random() * 10).toString(),
64
- actor_id: ctx.userID,
65
- description: text,
66
- duration: 86400,
67
- note_type: "TEXT_NOTE",
68
- privacy,
69
- session_id: utils.getGUID(),
70
- },
71
- };
72
- const form = {
73
- fb_api_caller_class: "RelayModern",
74
- fb_api_req_friendly_name: "MWInboxTrayNoteCreationDialogCreationStepContentMutation",
75
- variables: JSON.stringify(variables),
76
- doc_id: "24060573783603122",
77
- };
78
-
79
- defaultFuncs
80
- .post("https://www.facebook.com/api/graphql/", ctx.jar, form)
81
- .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
82
- .then(resData => {
83
- if (resData && resData.errors) throw resData.errors[0];
84
- const status = resData?.data?.xfb_rich_status_create?.status;
85
- if (!status) throw new Error("Could not find note status in the server response.");
86
- callback(null, status);
87
- })
88
- .catch(err => {
89
- utils.error("notes.createNote", err);
90
- callback(err);
91
- });
92
- }
93
-
94
- /**
95
- * Deletes a specific note by its ID.
96
- * @param {string} noteID The ID of the note to be deleted.
97
- * @param {notesCallback} callback A callback function that is executed after the request. It receives an error object (if any) and an object confirming the deletion.
98
- */
99
- function deleteNote(noteID, callback) {
100
- if (typeof callback !== 'function') {
101
- callback = () => {};
102
- }
103
-
104
- const variables = {
105
- input: {
106
- client_mutation_id: Math.round(Math.random() * 10).toString(),
107
- actor_id: ctx.userID,
108
- rich_status_id: noteID,
109
- },
110
- };
111
- const form = {
112
- fb_api_caller_class: "RelayModern",
113
- fb_api_req_friendly_name: "useMWInboxTrayDeleteNoteMutation",
114
- variables: JSON.stringify(variables),
115
- doc_id: "9532619970198958",
116
- };
117
-
118
- defaultFuncs
119
- .post("https://www.facebook.com/api/graphql/", ctx.jar, form)
120
- .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
121
- .then(resData => {
122
- if (resData && resData.errors) throw resData.errors[0];
123
- const deletedStatus = resData?.data?.xfb_rich_status_delete;
124
- if (!deletedStatus) throw new Error("Could not find deletion status in the server response.");
125
- callback(null, deletedStatus);
126
- })
127
- .catch(err => {
128
- utils.error("notes.deleteNote", err);
129
- callback(err);
130
- });
131
- }
132
-
133
- /**
134
- * A convenience function that first deletes an old note and then creates a new one.
135
- * @param {string} oldNoteID The ID of the note to delete.
136
- * @param {string} newText The text for the new note.
137
- * @param {notesCallback} callback A callback function that is executed after the request. It receives an error object (if any) and an object containing the deletion and creation statuses.
138
- */
139
- function recreateNote(oldNoteID, newText, callback) {
140
- if (typeof callback !== 'function') {
141
- callback = () => {};
142
- }
143
-
144
- deleteNote(oldNoteID, (err, deleted) => {
145
- if (err) {
146
- return callback(err);
147
- }
148
- createNote(newText, (err, created) => {
149
- if (err) {
150
- return callback(err);
151
- }
152
- callback(null, { deleted, created });
153
- });
154
- });
155
- }
156
-
157
- return {
158
- create: createNote,
159
- delete: deleteNote,
160
- recreate: recreateNote,
161
- check: checkNote,
162
- };
163
- };