@cexy/hoonfca 1.0.7 → 2.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 (191) hide show
  1. package/LICENSE +3 -0
  2. package/README.md +100 -632
  3. package/examples/login-with-cookies.js +102 -0
  4. package/examples/verify.js +70 -0
  5. package/index.js +2 -8
  6. package/package.json +83 -61
  7. package/src/{api/action → apis}/addExternalModule.js +24 -25
  8. package/src/apis/addUserToGroup.js +108 -0
  9. package/src/apis/changeAdminStatus.js +148 -0
  10. package/src/apis/changeArchivedStatus.js +61 -0
  11. package/src/apis/changeAvatar.js +103 -0
  12. package/src/apis/changeBio.js +69 -0
  13. package/src/apis/changeBlockedStatus.js +54 -0
  14. package/src/apis/changeGroupImage.js +136 -0
  15. package/src/apis/changeThreadColor.js +116 -0
  16. package/src/apis/changeThreadEmoji.js +53 -0
  17. package/src/apis/comment.js +207 -0
  18. package/src/apis/createAITheme.js +129 -0
  19. package/src/apis/createNewGroup.js +79 -0
  20. package/src/apis/createPoll.js +73 -0
  21. package/src/apis/deleteMessage.js +44 -0
  22. package/src/apis/deleteThread.js +52 -0
  23. package/src/apis/e2ee.js +17 -0
  24. package/src/apis/editMessage.js +70 -0
  25. package/src/apis/emoji.js +124 -0
  26. package/src/apis/fetchThemeData.js +82 -0
  27. package/src/apis/follow.js +81 -0
  28. package/src/apis/forwardMessage.js +52 -0
  29. package/src/apis/friend.js +243 -0
  30. package/src/apis/gcmember.js +122 -0
  31. package/src/apis/gcname.js +123 -0
  32. package/src/apis/gcrule.js +119 -0
  33. package/src/apis/getAccess.js +111 -0
  34. package/src/apis/getBotInfo.js +88 -0
  35. package/src/apis/getBotInitialData.js +43 -0
  36. package/src/apis/getFriendsList.js +79 -0
  37. package/src/apis/getMessage.js +423 -0
  38. package/src/apis/getTheme.js +95 -0
  39. package/src/apis/getThemeInfo.js +116 -0
  40. package/src/apis/getThreadHistory.js +239 -0
  41. package/src/apis/getThreadInfo.js +267 -0
  42. package/src/apis/getThreadList.js +232 -0
  43. package/src/apis/getThreadPictures.js +58 -0
  44. package/src/apis/getUserID.js +117 -0
  45. package/src/apis/getUserInfo.js +513 -0
  46. package/src/{api/users → apis}/getUserInfoV2.js +146 -134
  47. package/src/apis/handleMessageRequest.js +50 -0
  48. package/src/apis/httpGet.js +63 -0
  49. package/src/apis/httpPost.js +89 -0
  50. package/src/apis/httpPostFormData.js +69 -0
  51. package/src/apis/listenMqtt.js +1236 -0
  52. package/src/apis/listenSpeed.js +179 -0
  53. package/src/apis/logout.js +87 -0
  54. package/src/apis/markAsDelivered.js +47 -0
  55. package/src/{api/messaging → apis}/markAsRead.js +99 -88
  56. package/src/apis/markAsReadAll.js +40 -0
  57. package/src/apis/markAsSeen.js +70 -0
  58. package/src/apis/mqttDeltaValue.js +278 -0
  59. package/src/apis/muteThread.js +45 -0
  60. package/src/apis/nickname.js +132 -0
  61. package/src/apis/notes.js +163 -0
  62. package/src/apis/pinMessage.js +150 -0
  63. package/src/apis/produceMetaTheme.js +180 -0
  64. package/src/apis/realtime.js +182 -0
  65. package/src/apis/removeUserFromGroup.js +117 -0
  66. package/src/apis/resolvePhotoUrl.js +58 -0
  67. package/src/apis/searchForThread.js +154 -0
  68. package/src/apis/sendMessage.js +354 -0
  69. package/src/apis/sendMessageMqtt.js +249 -0
  70. package/src/apis/sendTypingIndicator.js +91 -0
  71. package/src/apis/setMessageReaction.js +27 -0
  72. package/src/apis/setMessageReactionMqtt.js +61 -0
  73. package/src/apis/setThreadTheme.js +260 -0
  74. package/src/apis/setThreadThemeMqtt.js +94 -0
  75. package/src/apis/share.js +107 -0
  76. package/src/apis/shareContact.js +66 -0
  77. package/src/apis/stickers.js +257 -0
  78. package/src/apis/story.js +181 -0
  79. package/src/apis/theme.js +233 -0
  80. package/src/apis/unfriend.js +47 -0
  81. package/src/apis/unsendMessage.js +17 -0
  82. package/src/engine/client.js +92 -0
  83. package/src/engine/models/buildAPI.js +152 -0
  84. package/src/engine/models/loginHelper.js +519 -0
  85. package/src/engine/models/setOptions.js +88 -0
  86. package/src/security/e2ee.js +109 -0
  87. package/src/types/index.d.ts +498 -0
  88. package/src/utils/antiSuspension.js +506 -0
  89. package/src/utils/auth-helpers.js +149 -0
  90. package/src/utils/autoReLogin.js +336 -0
  91. package/src/utils/axios.js +436 -0
  92. package/src/utils/cache.js +54 -0
  93. package/src/utils/clients.js +282 -0
  94. package/src/utils/constants.js +410 -23
  95. package/src/utils/formatters/data/formatAttachment.js +370 -0
  96. package/src/utils/formatters/data/formatDelta.js +109 -0
  97. package/src/utils/formatters/index.js +159 -0
  98. package/src/utils/formatters/value/formatCookie.js +91 -0
  99. package/src/utils/formatters/value/formatDate.js +36 -0
  100. package/src/utils/formatters/value/formatID.js +16 -0
  101. package/src/utils/formatters.js +1373 -0
  102. package/src/utils/headers.js +214 -99
  103. package/src/utils/index.js +153 -0
  104. package/src/utils/monitoring.js +333 -0
  105. package/src/utils/rateLimiter.js +319 -0
  106. package/src/utils/tokenRefresh.js +657 -0
  107. package/src/utils/user-agents.js +238 -0
  108. package/src/utils/validation.js +157 -0
  109. package/CHANGELOG.md +0 -181
  110. package/DOCS.md +0 -2636
  111. package/LICENSE-MIT +0 -21
  112. package/func/checkUpdate.js +0 -233
  113. package/func/logger.js +0 -48
  114. package/index.d.ts +0 -746
  115. package/module/config.js +0 -67
  116. package/module/login.js +0 -154
  117. package/module/loginHelper.js +0 -1034
  118. package/module/options.js +0 -54
  119. package/src/api/action/changeAvatar.js +0 -137
  120. package/src/api/action/changeBio.js +0 -75
  121. package/src/api/action/enableAutoSaveAppState.js +0 -73
  122. package/src/api/action/getCurrentUserID.js +0 -7
  123. package/src/api/action/handleFriendRequest.js +0 -57
  124. package/src/api/action/logout.js +0 -76
  125. package/src/api/action/refreshFb_dtsg.js +0 -48
  126. package/src/api/action/setPostReaction.js +0 -106
  127. package/src/api/action/unfriend.js +0 -54
  128. package/src/api/http/httpGet.js +0 -46
  129. package/src/api/http/httpPost.js +0 -52
  130. package/src/api/http/postFormData.js +0 -47
  131. package/src/api/messaging/addUserToGroup.js +0 -68
  132. package/src/api/messaging/changeAdminStatus.js +0 -122
  133. package/src/api/messaging/changeArchivedStatus.js +0 -55
  134. package/src/api/messaging/changeBlockedStatus.js +0 -48
  135. package/src/api/messaging/changeGroupImage.js +0 -90
  136. package/src/api/messaging/changeNickname.js +0 -70
  137. package/src/api/messaging/changeThreadColor.js +0 -79
  138. package/src/api/messaging/changeThreadEmoji.js +0 -106
  139. package/src/api/messaging/createNewGroup.js +0 -88
  140. package/src/api/messaging/createPoll.js +0 -43
  141. package/src/api/messaging/createThemeAI.js +0 -98
  142. package/src/api/messaging/deleteMessage.js +0 -56
  143. package/src/api/messaging/deleteThread.js +0 -56
  144. package/src/api/messaging/editMessage.js +0 -68
  145. package/src/api/messaging/forwardAttachment.js +0 -51
  146. package/src/api/messaging/getEmojiUrl.js +0 -29
  147. package/src/api/messaging/getFriendsList.js +0 -82
  148. package/src/api/messaging/getMessage.js +0 -829
  149. package/src/api/messaging/getThemePictures.js +0 -62
  150. package/src/api/messaging/handleMessageRequest.js +0 -65
  151. package/src/api/messaging/markAsDelivered.js +0 -57
  152. package/src/api/messaging/markAsReadAll.js +0 -49
  153. package/src/api/messaging/markAsSeen.js +0 -61
  154. package/src/api/messaging/muteThread.js +0 -50
  155. package/src/api/messaging/removeUserFromGroup.js +0 -106
  156. package/src/api/messaging/resolvePhotoUrl.js +0 -43
  157. package/src/api/messaging/scheduler.js +0 -264
  158. package/src/api/messaging/searchForThread.js +0 -52
  159. package/src/api/messaging/sendMessage.js +0 -272
  160. package/src/api/messaging/sendTypingIndicator.js +0 -67
  161. package/src/api/messaging/setMessageReaction.js +0 -76
  162. package/src/api/messaging/setTitle.js +0 -119
  163. package/src/api/messaging/shareContact.js +0 -49
  164. package/src/api/messaging/threadColors.js +0 -128
  165. package/src/api/messaging/unsendMessage.js +0 -81
  166. package/src/api/messaging/uploadAttachment.js +0 -94
  167. package/src/api/socket/core/connectMqtt.js +0 -255
  168. package/src/api/socket/core/emitAuth.js +0 -106
  169. package/src/api/socket/core/getSeqID.js +0 -40
  170. package/src/api/socket/core/getTaskResponseData.js +0 -22
  171. package/src/api/socket/core/markDelivery.js +0 -12
  172. package/src/api/socket/core/parseDelta.js +0 -391
  173. package/src/api/socket/detail/buildStream.js +0 -208
  174. package/src/api/socket/detail/constants.js +0 -24
  175. package/src/api/socket/listenMqtt.js +0 -364
  176. package/src/api/socket/middleware/index.js +0 -216
  177. package/src/api/threads/getThreadHistory.js +0 -664
  178. package/src/api/threads/getThreadInfo.js +0 -438
  179. package/src/api/threads/getThreadList.js +0 -293
  180. package/src/api/threads/getThreadPictures.js +0 -78
  181. package/src/api/users/getUserID.js +0 -65
  182. package/src/api/users/getUserInfo.js +0 -327
  183. package/src/core/sendReqMqtt.js +0 -96
  184. package/src/database/models/index.js +0 -87
  185. package/src/database/models/thread.js +0 -45
  186. package/src/database/models/user.js +0 -46
  187. package/src/database/threadData.js +0 -98
  188. package/src/database/userData.js +0 -89
  189. package/src/utils/client.js +0 -320
  190. package/src/utils/format.js +0 -1115
  191. package/src/utils/request.js +0 -305
@@ -1,255 +0,0 @@
1
- "use strict";
2
- const { formatID } = require("../../../utils/format");
3
- module.exports = function createListenMqtt(deps) {
4
- const { WebSocket, mqtt, HttpsProxyAgent, buildStream, buildProxy,
5
- topics, parseDelta, getTaskResponseData, logger, emitAuth
6
- } = deps;
7
-
8
- return function listenMqtt(defaultFuncs, api, ctx, globalCallback) {
9
-
10
- function scheduleReconnect(delayMs) {
11
- const d = (ctx._mqttOpt && ctx._mqttOpt.reconnectDelayMs) || 2000;
12
- const ms = typeof delayMs === "number" ? delayMs : d;
13
- if (ctx._reconnectTimer) {
14
- logger("mqtt reconnect already scheduled", "warn");
15
- return; // debounce
16
- }
17
- if (ctx._ending) {
18
- logger("mqtt reconnect skipped - ending", "warn");
19
- return;
20
- }
21
- logger(`mqtt will reconnect in ${ms}ms`, "warn");
22
- ctx._reconnectTimer = setTimeout(() => {
23
- ctx._reconnectTimer = null;
24
- if (!ctx._ending) {
25
- listenMqtt(defaultFuncs, api, ctx, globalCallback);
26
- }
27
- }, ms);
28
- }
29
- function isEndingLikeError(msg) {
30
- return /No subscription existed|client disconnecting|socket hang up|ECONNRESET/i.test(msg || "");
31
- }
32
-
33
- const chatOn = ctx.globalOptions.online;
34
- const sessionID = Math.floor(Math.random() * Number.MAX_SAFE_INTEGER) + 1;
35
- const username = {
36
- u: ctx.userID, s: sessionID, chat_on: chatOn, fg: false, d: ctx.clientId,
37
- ct: "websocket", aid: 219994525426954, aids: null, mqtt_sid: "",
38
- cp: 3, ecp: 10, st: [], pm: [], dc: "", no_auto_fg: true, gas: null, pack: [], p: null, php_override: ""
39
- };
40
-
41
- const cookies = api.getCookies();
42
- let host;
43
- if (ctx.mqttEndpoint) host = `${ctx.mqttEndpoint}&sid=${sessionID}&cid=${ctx.clientId}`;
44
- else if (ctx.region) host = `wss://edge-chat.facebook.com/chat?region=${ctx.region.toLowerCase()}&sid=${sessionID}&cid=${ctx.clientId}`;
45
- else host = `wss://edge-chat.facebook.com/chat?sid=${sessionID}&cid=${ctx.clientId}`;
46
-
47
- const options = {
48
- clientId: "mqttwsclient",
49
- protocolId: "MQIsdp",
50
- protocolVersion: 3,
51
- username: JSON.stringify(username),
52
- clean: true,
53
- wsOptions: {
54
- headers: {
55
- Cookie: cookies,
56
- Origin: "https://www.facebook.com",
57
- "User-Agent": ctx.globalOptions.userAgent || "Mozilla/5.0",
58
- Referer: "https://www.facebook.com/",
59
- Host: "edge-chat.facebook.com",
60
- Connection: "Upgrade",
61
- Pragma: "no-cache",
62
- "Cache-Control": "no-cache",
63
- Upgrade: "websocket",
64
- "Sec-WebSocket-Version": "13",
65
- "Accept-Encoding": "gzip, deflate, br",
66
- "Accept-Language": "vi,en;q=0.9",
67
- "Sec-WebSocket-Extensions": "permessage-deflate; client_max_window_bits"
68
- },
69
- origin: "https://www.facebook.com",
70
- protocolVersion: 13,
71
- binaryType: "arraybuffer"
72
- },
73
- keepalive: 30,
74
- reschedulePings: true,
75
- reconnectPeriod: 0,
76
- connectTimeout: 5000
77
- };
78
- if (ctx.globalOptions.proxy !== undefined) {
79
- const agent = new HttpsProxyAgent(ctx.globalOptions.proxy);
80
- options.wsOptions.agent = agent;
81
- }
82
-
83
- ctx.mqttClient = new mqtt.Client(
84
- () => buildStream(options, new WebSocket(host, options.wsOptions), buildProxy()),
85
- options
86
- );
87
- const mqttClient = ctx.mqttClient;
88
- // Remove global reference to prevent memory leak
89
- // Only set if needed for debugging, but clear on cleanup
90
- if (process.env.DEBUG_MQTT) {
91
- global.mqttClient = mqttClient;
92
- }
93
-
94
- mqttClient.on("error", function (err) {
95
- const msg = String(err && err.message ? err.message : err || "");
96
- if ((ctx._ending || ctx._cycling) && /No subscription existed|client disconnecting/i.test(msg)) {
97
- logger(`mqtt expected during shutdown: ${msg}`, "info");
98
- return;
99
- }
100
-
101
- if (/Not logged in|Not logged in.|blocked the login|401|403/i.test(msg)) {
102
- try {
103
- if (mqttClient && mqttClient.connected) {
104
- mqttClient.end(true);
105
- }
106
- } catch (_) { }
107
- return emitAuth(ctx, api, globalCallback,
108
- /blocked/i.test(msg) ? "login_blocked" : "not_logged_in",
109
- msg
110
- );
111
- }
112
- logger(`mqtt error: ${msg}`, "error");
113
- try {
114
- if (mqttClient && mqttClient.connected) {
115
- mqttClient.end(true);
116
- }
117
- } catch (_) { }
118
- if (ctx._ending || ctx._cycling) return;
119
-
120
- if (ctx.globalOptions.autoReconnect && !ctx._ending) {
121
- const d = (ctx._mqttOpt && ctx._mqttOpt.reconnectDelayMs) || 2000;
122
- logger(`mqtt autoReconnect listenMqtt() in ${d}ms`, "warn");
123
- // Use scheduleReconnect to prevent multiple reconnections
124
- scheduleReconnect(d);
125
- } else {
126
- globalCallback({ type: "stop_listen", error: msg || "Connection refused" }, null);
127
- }
128
- });
129
-
130
- mqttClient.on("connect", function () {
131
- if (process.env.OnStatus === undefined) {
132
- logger("fca-unoffcial premium", "info");
133
- process.env.OnStatus = true;
134
- }
135
- ctx._cycling = false;
136
-
137
- topics.forEach(t => mqttClient.subscribe(t));
138
-
139
-
140
- const queue = {
141
- sync_api_version: 11, max_deltas_able_to_process: 100, delta_batch_size: 500,
142
- encoding: "JSON", entity_fbid: ctx.userID, initial_titan_sequence_id: ctx.lastSeqId, device_params: null
143
- };
144
- const topic = ctx.syncToken ? "/messenger_sync_get_diffs" : "/messenger_sync_create_queue";
145
- if (ctx.syncToken) { queue.last_seq_id = ctx.lastSeqId; queue.sync_token = ctx.syncToken; }
146
- mqttClient.publish(topic, JSON.stringify(queue), { qos: 1, retain: false });
147
- mqttClient.publish("/foreground_state", JSON.stringify({ foreground: chatOn }), { qos: 1 });
148
- mqttClient.publish("/set_client_settings", JSON.stringify({ make_user_available_when_in_foreground: true }), { qos: 1 });
149
- const d = (ctx._mqttOpt && ctx._mqttOpt.reconnectDelayMs) || 2000;
150
- let rTimeout = setTimeout(function () {
151
- rTimeout = null;
152
- if (ctx._ending) {
153
- logger("mqtt t_ms timeout skipped - ending", "warn");
154
- return;
155
- }
156
- logger(`mqtt t_ms timeout, cycling in ${d}ms`, "warn");
157
- try {
158
- if (mqttClient && mqttClient.connected) {
159
- mqttClient.end(true);
160
- }
161
- } catch (_) { }
162
- scheduleReconnect(d);
163
- }, 5000);
164
-
165
- // Store timeout reference for cleanup
166
- ctx._rTimeout = rTimeout;
167
-
168
- ctx.tmsWait = function () {
169
- if (rTimeout) {
170
- clearTimeout(rTimeout);
171
- rTimeout = null;
172
- }
173
- if (ctx._rTimeout) {
174
- delete ctx._rTimeout;
175
- }
176
- if (ctx.globalOptions.emitReady) globalCallback({ type: "ready", error: null });
177
- delete ctx.tmsWait;
178
- };
179
- });
180
-
181
- mqttClient.on("message", function (topic, message) {
182
- if (ctx._ending) return; // Ignore messages if ending
183
- try {
184
- let jsonMessage = Buffer.isBuffer(message) ? Buffer.from(message).toString() : message;
185
- try {
186
- jsonMessage = JSON.parse(jsonMessage);
187
- } catch (parseErr) {
188
- logger(`mqtt message parse error for topic ${topic}: ${parseErr && parseErr.message ? parseErr.message : String(parseErr)}`, "warn");
189
- jsonMessage = {};
190
- }
191
-
192
- if (jsonMessage.type === "jewel_requests_add") {
193
- globalCallback(null, { type: "friend_request_received", actorFbId: jsonMessage.from.toString(), timestamp: Date.now().toString() });
194
- } else if (jsonMessage.type === "jewel_requests_remove_old") {
195
- globalCallback(null, { type: "friend_request_cancel", actorFbId: jsonMessage.from.toString(), timestamp: Date.now().toString() });
196
- } else if (topic === "/t_ms") {
197
- if (ctx.tmsWait && typeof ctx.tmsWait == "function") ctx.tmsWait();
198
- if (jsonMessage.firstDeltaSeqId && jsonMessage.syncToken) {
199
- ctx.lastSeqId = jsonMessage.firstDeltaSeqId;
200
- ctx.syncToken = jsonMessage.syncToken;
201
- }
202
- if (jsonMessage.lastIssuedSeqId) ctx.lastSeqId = parseInt(jsonMessage.lastIssuedSeqId);
203
- for (const dlt of (jsonMessage.deltas || [])) {
204
- parseDelta(defaultFuncs, api, ctx, globalCallback, { delta: dlt });
205
- }
206
- } else if (topic === "/thread_typing" || topic === "/orca_typing_notifications") {
207
- const typ = {
208
- type: "typ",
209
- isTyping: !!jsonMessage.state,
210
- from: jsonMessage.sender_fbid.toString(),
211
- threadID: formatID((jsonMessage.thread || jsonMessage.sender_fbid).toString())
212
- };
213
- globalCallback(null, typ);
214
- } else if (topic === "/orca_presence") {
215
- if (!ctx.globalOptions.updatePresence) {
216
- for (const data of (jsonMessage.list || [])) {
217
- const presence = { type: "presence", userID: String(data.u), timestamp: data.l * 1000, statuses: data.p };
218
- globalCallback(null, presence);
219
- }
220
- }
221
- } else if (topic === "/ls_resp") {
222
- const parsedPayload = JSON.parse(jsonMessage.payload);
223
- const reqID = jsonMessage.request_id;
224
- if (ctx["tasks"].has(reqID)) {
225
- const taskData = ctx["tasks"].get(reqID);
226
- const { type: taskType, callback: taskCallback } = taskData;
227
- const taskRespData = getTaskResponseData(taskType, parsedPayload);
228
- if (taskRespData == null) taskCallback("error", null);
229
- else taskCallback(null, Object.assign({ type: taskType, reqID }, taskRespData));
230
- }
231
- }
232
- } catch (ex) {
233
- const errMsg = ex && ex.message ? ex.message : String(ex || "Unknown error");
234
- logger(`mqtt message handler error: ${errMsg}`, "error");
235
- // Don't crash on message parsing errors, just log and continue
236
- }
237
- });
238
-
239
- mqttClient.on("close", function () {
240
- if (ctx._ending || ctx._cycling) {
241
- logger("mqtt close expected", "info");
242
- return;
243
- }
244
- logger("mqtt connection closed", "warn");
245
- });
246
-
247
- mqttClient.on("disconnect", () => {
248
- if (ctx._ending || ctx._cycling) {
249
- logger("mqtt disconnect expected", "info");
250
- return;
251
- }
252
- logger("mqtt disconnected", "warn");
253
- });
254
- };
255
- };
@@ -1,106 +0,0 @@
1
- "use strict";
2
- module.exports = function createEmitAuth({ logger }) {
3
- return function emitAuth(ctx, api, globalCallback, reason, detail) {
4
- // Clean up all timers
5
- try {
6
- if (ctx._autoCycleTimer) {
7
- clearInterval(ctx._autoCycleTimer);
8
- ctx._autoCycleTimer = null;
9
- }
10
- } catch (_) { }
11
- try {
12
- if (ctx._reconnectTimer) {
13
- clearTimeout(ctx._reconnectTimer);
14
- ctx._reconnectTimer = null;
15
- }
16
- } catch (_) { }
17
-
18
- try {
19
- ctx._ending = true;
20
- ctx._cycling = false;
21
- } catch (_) { }
22
-
23
- // Clean up MQTT client
24
- try {
25
- if (ctx.mqttClient) {
26
- ctx.mqttClient.removeAllListeners();
27
- if (ctx.mqttClient.connected) {
28
- ctx.mqttClient.end(true);
29
- }
30
- }
31
- } catch (_) { }
32
-
33
- ctx.mqttClient = undefined;
34
- ctx.loggedIn = false;
35
-
36
- // Clean up timeout references
37
- try {
38
- if (ctx._rTimeout) {
39
- clearTimeout(ctx._rTimeout);
40
- ctx._rTimeout = null;
41
- }
42
- } catch (_) { }
43
-
44
- // Clean up tasks Map to prevent memory leak
45
- try {
46
- if (ctx.tasks && ctx.tasks instanceof Map) {
47
- ctx.tasks.clear();
48
- }
49
- } catch (_) { }
50
-
51
- // Clean up userInfo intervals
52
- try {
53
- if (ctx._userInfoIntervals && Array.isArray(ctx._userInfoIntervals)) {
54
- ctx._userInfoIntervals.forEach(interval => {
55
- try {
56
- clearInterval(interval);
57
- } catch (_) { }
58
- });
59
- ctx._userInfoIntervals = [];
60
- }
61
- } catch (_) { }
62
-
63
- // Clean up autoSave intervals
64
- try {
65
- if (ctx._autoSaveInterval && Array.isArray(ctx._autoSaveInterval)) {
66
- ctx._autoSaveInterval.forEach(interval => {
67
- try {
68
- clearInterval(interval);
69
- } catch (_) { }
70
- });
71
- ctx._autoSaveInterval = [];
72
- }
73
- } catch (_) { }
74
-
75
- // Clean up scheduler
76
- try {
77
- if (ctx._scheduler && typeof ctx._scheduler.destroy === "function") {
78
- ctx._scheduler.destroy();
79
- ctx._scheduler = undefined;
80
- }
81
- } catch (_) { }
82
-
83
- // Clear global mqttClient reference if set
84
- try {
85
- if (global.mqttClient) {
86
- delete global.mqttClient;
87
- }
88
- } catch (_) { }
89
-
90
- const msg = detail || reason;
91
- logger(`auth change -> ${reason}: ${msg}`, "error");
92
-
93
- if (typeof globalCallback === "function") {
94
- try {
95
- globalCallback({
96
- type: "account_inactive",
97
- reason,
98
- error: msg,
99
- timestamp: Date.now()
100
- }, null);
101
- } catch (cbErr) {
102
- logger(`emitAuth callback error: ${cbErr && cbErr.message ? cbErr.message : String(cbErr)}`, "error");
103
- }
104
- }
105
- };
106
- };
@@ -1,40 +0,0 @@
1
- "use strict";
2
- const { getType } = require("../../../utils/format");
3
- const { parseAndCheckLogin } = require("../../../utils/client");
4
- module.exports = function createGetSeqID(deps) {
5
- const { listenMqtt, logger, emitAuth } = deps;
6
-
7
- return function getSeqID(defaultFuncs, api, ctx, globalCallback, form) {
8
- ctx.t_mqttCalled = false;
9
- return defaultFuncs
10
- .post("https://www.facebook.com/api/graphqlbatch/", ctx.jar, form)
11
- .then(parseAndCheckLogin(ctx, defaultFuncs))
12
- .then(resData => {
13
- if (getType(resData) !== "Array") throw { error: "Not logged in" };
14
- if (!Array.isArray(resData) || !resData.length) return;
15
- const lastRes = resData[resData.length - 1];
16
- if (lastRes && lastRes.successful_results === 0) return;
17
-
18
- const syncSeqId = resData[0]?.o0?.data?.viewer?.message_threads?.sync_sequence_id;
19
- if (syncSeqId) {
20
- ctx.lastSeqId = syncSeqId;
21
- logger("mqtt getSeqID ok -> listenMqtt()", "info");
22
- listenMqtt(defaultFuncs, api, ctx, globalCallback);
23
- } else {
24
- throw { error: "getSeqId: no sync_sequence_id found." };
25
- }
26
- })
27
- .catch(err => {
28
- const detail = (err && err.detail && err.detail.message) ? ` | detail=${err.detail.message}` : "";
29
- const msg = ((err && err.error) || (err && err.message) || String(err || "")) + detail;
30
- if (/Not logged in/i.test(msg)) {
31
- return emitAuth(ctx, api, globalCallback, "not_logged_in", msg);
32
- }
33
- if (/blocked the login/i.test(msg)) {
34
- return emitAuth(ctx, api, globalCallback, "login_blocked", msg);
35
- }
36
- logger(`getSeqID error: ${msg}`, "error");
37
- return emitAuth(ctx, api, globalCallback, "auth_error", msg);
38
- });
39
- };
40
- };
@@ -1,22 +0,0 @@
1
- "use strict";
2
- module.exports = function getTaskResponseData(taskType, payload) {
3
- try {
4
- switch (taskType) {
5
- case "send_message_mqtt":
6
- return {
7
- type: taskType,
8
- threadID: payload.step[1][2][2][1][2],
9
- messageID: payload.step[1][2][2][1][3],
10
- payload: payload.step[1][2]
11
- };
12
- case "set_message_reaction":
13
- return { mid: payload.step[1][2][2][1][4] };
14
- case "edit_message":
15
- return { mid: payload.step[1][2][2][1][2] };
16
- default:
17
- return null;
18
- }
19
- } catch (e) {
20
- return null;
21
- }
22
- };
@@ -1,12 +0,0 @@
1
- "use strict";
2
- module.exports = function markDelivery(ctx, api, threadID, messageID) {
3
- if (threadID && messageID) {
4
- api.markAsDelivered(threadID, messageID, err => {
5
- if (err) {} else {
6
- if (ctx.globalOptions.autoMarkRead) {
7
- api.markAsRead(threadID, err2 => {});
8
- }
9
- }
10
- });
11
- }
12
- };