ayman-fca 1.0.0

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 (124) hide show
  1. package/README.md +81 -0
  2. package/func/checkUpdate.js +13 -0
  3. package/func/logAdapter.js +30 -0
  4. package/func/logger.js +66 -0
  5. package/index.d.ts +751 -0
  6. package/index.js +15 -0
  7. package/module/config.js +38 -0
  8. package/module/login.js +111 -0
  9. package/module/loginHelper.js +1296 -0
  10. package/module/options.js +37 -0
  11. package/package.json +78 -0
  12. package/src/api/action/addExternalModule.js +19 -0
  13. package/src/api/action/changeAvatar.js +137 -0
  14. package/src/api/action/changeBio.js +48 -0
  15. package/src/api/action/enableAutoSaveAppState.js +72 -0
  16. package/src/api/action/getCurrentUserID.js +11 -0
  17. package/src/api/action/handleFriendRequest.js +33 -0
  18. package/src/api/action/logout.js +76 -0
  19. package/src/api/action/refreshFb_dtsg.js +62 -0
  20. package/src/api/action/setPostReaction.js +106 -0
  21. package/src/api/action/story.js +118 -0
  22. package/src/api/action/unfriend.js +30 -0
  23. package/src/api/http/httpGet.js +28 -0
  24. package/src/api/http/httpPost.js +32 -0
  25. package/src/api/http/postFormData.js +23 -0
  26. package/src/api/messaging/J +1 -0
  27. package/src/api/messaging/addUserToGroup.js +70 -0
  28. package/src/api/messaging/changeAdminStatus.js +72 -0
  29. package/src/api/messaging/changeArchivedStatus.js +31 -0
  30. package/src/api/messaging/changeBlockedStatus.js +27 -0
  31. package/src/api/messaging/changeGroupImage.js +91 -0
  32. package/src/api/messaging/changeNickname.js +70 -0
  33. package/src/api/messaging/changeThreadColor.js +44 -0
  34. package/src/api/messaging/changeThreadEmoji.js +111 -0
  35. package/src/api/messaging/createNewGroup.js +50 -0
  36. package/src/api/messaging/createPoll.js +52 -0
  37. package/src/api/messaging/createThemeAI.js +98 -0
  38. package/src/api/messaging/deleteMessage.js +73 -0
  39. package/src/api/messaging/deleteThread.js +29 -0
  40. package/src/api/messaging/editMessage.js +67 -0
  41. package/src/api/messaging/forwardAttachment.js +55 -0
  42. package/src/api/messaging/forwardMessage.js +73 -0
  43. package/src/api/messaging/getEmojiUrl.js +29 -0
  44. package/src/api/messaging/getFriendsList.js +82 -0
  45. package/src/api/messaging/getMessage.js +829 -0
  46. package/src/api/messaging/getThemePictures.js +62 -0
  47. package/src/api/messaging/groupActions.js +119 -0
  48. package/src/api/messaging/handleMessageRequest.js +31 -0
  49. package/src/api/messaging/markAsDelivered.js +31 -0
  50. package/src/api/messaging/markAsRead.js +88 -0
  51. package/src/api/messaging/markAsReadAll.js +28 -0
  52. package/src/api/messaging/markAsSeen.js +30 -0
  53. package/src/api/messaging/muteThread.js +27 -0
  54. package/src/api/messaging/notes.js +101 -0
  55. package/src/api/messaging/removeUserFromGroup.js +51 -0
  56. package/src/api/messaging/resolvePhotoUrl.js +29 -0
  57. package/src/api/messaging/scheduler.js +100 -0
  58. package/src/api/messaging/searchForThread.js +32 -0
  59. package/src/api/messaging/sendMessage.js +270 -0
  60. package/src/api/messaging/sendTypingIndicator.js +62 -0
  61. package/src/api/messaging/setMessageReaction.js +91 -0
  62. package/src/api/messaging/setTitle.js +86 -0
  63. package/src/api/messaging/shareContact.js +47 -0
  64. package/src/api/messaging/threadColors.js +128 -0
  65. package/src/api/messaging/unsendMessage.js +73 -0
  66. package/src/api/messaging/uploadAttachment.js +492 -0
  67. package/src/api/socket/core/connectMqtt.js +259 -0
  68. package/src/api/socket/core/emitAuth.js +79 -0
  69. package/src/api/socket/core/getSeqID.js +170 -0
  70. package/src/api/socket/core/getTaskResponseData.js +27 -0
  71. package/src/api/socket/core/parseDelta.js +377 -0
  72. package/src/api/socket/detail/buildStream.js +215 -0
  73. package/src/api/socket/detail/constants.js +29 -0
  74. package/src/api/socket/listenMqtt.js +377 -0
  75. package/src/api/socket/middleware/index.js +80 -0
  76. package/src/api/threads/getThreadHistory.js +664 -0
  77. package/src/api/threads/getThreadInfo.js +296 -0
  78. package/src/api/threads/getThreadList.js +293 -0
  79. package/src/api/threads/getThreadPictures.js +43 -0
  80. package/src/api/user/J +1 -0
  81. package/src/api/user/getUserID.js +48 -0
  82. package/src/api/user/getUserInfo.js +402 -0
  83. package/src/api/user/getUserInfoV2.js +134 -0
  84. package/src/core/sendReqMqtt.js +69 -0
  85. package/src/database/helpers.js +36 -0
  86. package/src/database/models/index.js +55 -0
  87. package/src/database/models/thread.js +44 -0
  88. package/src/database/models/user.js +39 -0
  89. package/src/database/threadData.js +92 -0
  90. package/src/database/userData.js +88 -0
  91. package/src/remote/remoteClient.js +71 -0
  92. package/src/utils/broadcast.js +62 -0
  93. package/src/utils/client.js +10 -0
  94. package/src/utils/constants.js +53 -0
  95. package/src/utils/cookies.js +73 -0
  96. package/src/utils/format/attachment.js +357 -0
  97. package/src/utils/format/cookie.js +9 -0
  98. package/src/utils/format/date.js +50 -0
  99. package/src/utils/format/decode.js +44 -0
  100. package/src/utils/format/delta.js +194 -0
  101. package/src/utils/format/ids.js +64 -0
  102. package/src/utils/format/index.js +64 -0
  103. package/src/utils/format/message.js +88 -0
  104. package/src/utils/format/presence.js +132 -0
  105. package/src/utils/format/readTyp.js +44 -0
  106. package/src/utils/format/thread.js +42 -0
  107. package/src/utils/format/utils.js +141 -0
  108. package/src/utils/headers.js +96 -0
  109. package/src/utils/loginParser/autoLogin.js +125 -0
  110. package/src/utils/loginParser/helpers.js +43 -0
  111. package/src/utils/loginParser/index.js +10 -0
  112. package/src/utils/loginParser/parseAndCheckLogin.js +220 -0
  113. package/src/utils/loginParser/textUtils.js +28 -0
  114. package/src/utils/request/H +1 -0
  115. package/src/utils/request/client.js +33 -0
  116. package/src/utils/request/config.js +25 -0
  117. package/src/utils/request/defaults.js +40 -0
  118. package/src/utils/request/helpers.js +31 -0
  119. package/src/utils/request/index.js +12 -0
  120. package/src/utils/request/methods.js +92 -0
  121. package/src/utils/request/proxy.js +23 -0
  122. package/src/utils/request/retry.js +87 -0
  123. package/src/utils/request/sanitize.js +41 -0
  124. package/src/utils/sessionKeeper.js +275 -0
package/index.d.ts ADDED
@@ -0,0 +1,751 @@
1
+ declare module '@dongdev/fca-unofficial' {
2
+ import type EventEmitter from "events";
3
+ import type { Duplex, Readable, Transform } from "stream";
4
+
5
+ // ============================================================================
6
+ // Type Definitions
7
+ // ============================================================================
8
+
9
+ type ReadableStream = Readable | Duplex | Transform;
10
+
11
+ // ============================================================================
12
+ // Login Function
13
+ // ============================================================================
14
+
15
+ function login(
16
+ credentials: Partial<{
17
+ email: string;
18
+ password: string;
19
+ appState: AppstateData;
20
+ Cookie?: string | string[] | Record<string, string>;
21
+ }>,
22
+ options: Partial<IFCAU_Options>,
23
+ callback: (err: Error | null, api: IFCAU_API) => void
24
+ ): void;
25
+ function login(
26
+ credentials: Partial<{
27
+ email: string;
28
+ password: string;
29
+ appState: AppstateData;
30
+ Cookie?: string | string[] | Record<string, string>;
31
+ }>,
32
+ options: Partial<IFCAU_Options>
33
+ ): Promise<IFCAU_API>;
34
+ function login(
35
+ credentials: Partial<{
36
+ email: string;
37
+ password: string;
38
+ appState: AppstateData;
39
+ Cookie?: string | string[] | Record<string, string>;
40
+ }>,
41
+ callback: (err: Error | null, api: IFCAU_API) => void
42
+ ): void;
43
+ function login(
44
+ credentials: Partial<{
45
+ email: string;
46
+ password: string;
47
+ appState: AppstateData;
48
+ Cookie?: string | string[] | Record<string, string>;
49
+ }>
50
+ ): Promise<IFCAU_API>;
51
+
52
+ export default login;
53
+ export { login };
54
+
55
+ // ============================================================================
56
+ // Core Types
57
+ // ============================================================================
58
+
59
+ export type Cookie = {
60
+ key: string;
61
+ value: string;
62
+ domain: string;
63
+ path?: string;
64
+ hostOnly?: boolean;
65
+ creation?: string;
66
+ lastAccessed?: string;
67
+ };
68
+
69
+ export type AppstateData = {
70
+ appState: Cookie[];
71
+ };
72
+
73
+ export type MessageObject = {
74
+ body: string;
75
+ sticker?: string;
76
+ attachment?: ReadableStream | ReadableStream[];
77
+ url?: string;
78
+ emoji?: string;
79
+ emojiSize?: string;
80
+ mentions?: {
81
+ tag: string;
82
+ id: string;
83
+ fromIndex?: number;
84
+ }[];
85
+ location?: {
86
+ latitude: number;
87
+ longitude: number;
88
+ current?: boolean;
89
+ };
90
+ };
91
+
92
+ // ============================================================================
93
+ // Send Message Function
94
+ // ============================================================================
95
+
96
+ function sendMessage(
97
+ message: string | MessageObject,
98
+ threadID: string | string[],
99
+ callback?: (err?: Error, data?: { threadID: string; messageID: string; timestamp: number }) => void,
100
+ replyMessageID?: string,
101
+ isGroup?: boolean
102
+ ): Promise<{ threadID: string; messageID: string; timestamp: number }>;
103
+ function sendMessage(
104
+ message: string | MessageObject,
105
+ threadID: string | string[],
106
+ replyMessageID?: string,
107
+ isGroup?: boolean
108
+ ): Promise<{ threadID: string; messageID: string; timestamp: number }>;
109
+
110
+ // ============================================================================
111
+ // API Interface
112
+ // ============================================================================
113
+
114
+ export type IFCAU_API = {
115
+ // Group Management
116
+ addUserToGroup: (userID: string, threadID: string, callback?: (err?: Error) => void) => Promise<void>;
117
+ removeUserFromGroup: (userID: string, threadID: string, callback?: (err?: Error) => void) => Promise<void>;
118
+ createNewGroup: (participantIDs: string[], groupTitle?: string, callback?: (err: Error, threadID: string) => void) => Promise<string>;
119
+
120
+ // Admin & Permissions
121
+ changeAdminStatus: (threadID: string, adminIDs: string | string[], adminStatus: boolean, callback?: (err?: Error) => void) => Promise<void>;
122
+ changeApprovalMode: (approvalMode: 0 | 1, threadID: string, callback?: (err?: Error) => void) => Promise<void>;
123
+
124
+ // Thread Management
125
+ changeArchivedStatus: (threadOrThreads: string | string[], archive: boolean, callback?: (err?: Error) => void) => Promise<void>;
126
+ changeBlockedStatus: (userID: string, blocked: boolean, callback?: (err?: Error) => void) => Promise<void>;
127
+ changeGroupImage: (image: ReadableStream, threadID: string, callback?: (err?: Error) => void) => Promise<void>;
128
+ changeNickname: (nickname: string, threadID: string, participantID: string, callback?: (err?: Error) => void) => Promise<void>;
129
+ changeThreadColor: (color: string, threadID: string, callback?: (err?: Error) => void) => Promise<void>;
130
+ changeThreadEmoji: (emoji: string | null, threadID: string, callback?: (err?: Error) => void) => Promise<void>;
131
+ setTitle: (newTitle: string, threadID: string, callback?: (err?: Error) => void) => Promise<void>;
132
+ deleteThread: (threadOrThreads: string | string[], callback?: (err?: Error) => void) => Promise<void>;
133
+ muteThread: (threadID: string, muteSeconds: number, callback?: (err?: Error) => void) => Promise<void>;
134
+
135
+ // Messages
136
+ sendMessage: typeof sendMessage;
137
+ editMessage: (text: string, messageID: string, callback?: (err?: Error) => void) => Promise<void>;
138
+ deleteMessage: (messageOrMessages: string | string[], callback?: (err?: Error) => void) => Promise<void>;
139
+ unsendMessage: (messageID: string, callback?: (err?: Error) => void) => Promise<void>;
140
+ unsendMessageMqtt: (messageID: string, threadID: string, callback?: (err?: Error) => void) => Promise<void>;
141
+ forwardMessage: (messageID: string, threadID: string, callback?: (err?: Error) => void) => Promise<void>;
142
+ forwardAttachment: (attachmentID: string, userOrUsers: string | string[], callback?: (err?: Error) => void) => Promise<void>;
143
+ pinMessage: (pinMode: boolean, messageID: string, threadID: string, callback?: (err?: Error) => void) => Promise<void>;
144
+
145
+ // Reactions & Interactions
146
+ setMessageReaction: (reaction: string, messageID: string, threadID: string, callback?: (err?: Error) => void, forceCustomReaction?: boolean) => Promise<void>;
147
+ setMessageReactionMqtt: (reaction: string, messageID: string, threadID: string, callback?: (err?: Error) => void) => Promise<void>;
148
+ sendTypingIndicator: (threadID: string, callback?: (err?: Error) => void) => Promise<void>;
149
+ sendTypingIndicatorMqtt: (isTyping: boolean, threadID: string, callback?: (err?: Error) => void) => Promise<void>;
150
+
151
+ // Polls
152
+ createPoll: (title: string, threadID: string, options?: { [item: string]: boolean }, callback?: (err?: Error) => void) => Promise<void>;
153
+
154
+ // Read & Delivery Status
155
+ markAsRead: (threadID: string, read?: boolean, callback?: (err?: Error) => void) => Promise<void>;
156
+ markAsReadAll: (callback?: (err?: Error) => void) => Promise<void>;
157
+ markAsDelivered: (threadID: string, messageID: string, callback?: (err?: Error) => void) => Promise<void>;
158
+ markAsSeen: (seenTimestamp?: number, callback?: (err?: Error) => void) => Promise<void>;
159
+
160
+ // Thread Information
161
+ getThreadInfo: (threadID: string, callback?: (err: Error | null, thread: IFCAU_Thread) => void) => Promise<IFCAU_Thread>;
162
+ getThreadList: (limit: number, timestamp: number | null, tags: string[], callback?: (err: Error | null, threads: IFCAU_ThreadList) => void) => Promise<IFCAU_ThreadList>;
163
+ getThreadHistory: (threadID: string, amount: number, time?: number, callback?: (err: Error | null, messages: any[]) => void) => Promise<any[]>;
164
+ getThreadPictures: (threadID: string, offset: number, limit: number, callback?: (err: Error | null, pictures: string[]) => void) => Promise<string[]>;
165
+
166
+ // User Information
167
+ getUserInfo: (userOrUsers: string | string[], callback?: (err: Error | null, users: { [id: string]: IFCAU_User }) => void) => Promise<{ [id: string]: IFCAU_User }>;
168
+ getUserID: (name: string, callback?: (err: Error | null, obj: IFCAU_UserIDResponse) => void) => Promise<IFCAU_UserIDResponse>;
169
+ getFriendsList: (callback?: (err: Error | null, friends: IFCAU_Friend[]) => void) => Promise<IFCAU_Friend[]>;
170
+ getCurrentUserID: () => string;
171
+
172
+ // Utilities
173
+ getAppState: () => any;
174
+ getEmojiUrl: (c: string, size: number, pixelRatio: number) => string;
175
+ resolvePhotoUrl: (photoID: string, callback?: (err: Error | null, url: string) => void) => Promise<string>;
176
+ threadColors: {
177
+ [color: string]: string;
178
+ };
179
+
180
+ // Message Requests
181
+ handleMessageRequest: (threadOrThreads: string | string[], accept: boolean, callback?: (err?: Error) => void) => Promise<void>;
182
+
183
+ // Event Listeners
184
+ listen: (callback?: (err: Error | null, message: IFCAU_ListenMessage) => void) => EventEmitter;
185
+ listenMqtt: (callback?: (err: Error | null, message: IFCAU_ListenMessage) => void) => EventEmitter & { stopListening: (callback?: () => void) => void };
186
+
187
+ // Lifecycle & Remote Events
188
+ on: (event: string, listener: (...args: any[]) => void) => IFCAU_Api;
189
+ once: (event: string, listener: (...args: any[]) => void) => IFCAU_Api;
190
+ off: (event: string, listener: (...args: any[]) => void) => IFCAU_Api;
191
+ removeAllListeners: (event?: string) => IFCAU_Api;
192
+
193
+ // Middleware System
194
+ useMiddleware: (middleware: IFCAU_Middleware | string, fn?: IFCAU_Middleware) => () => void;
195
+ removeMiddleware: (identifier: string | IFCAU_Middleware) => boolean;
196
+ clearMiddleware: () => void;
197
+ listMiddleware: () => string[];
198
+ setMiddlewareEnabled: (name: string, enabled: boolean) => boolean;
199
+ readonly middlewareCount: number;
200
+
201
+ // Configuration & Session
202
+ setOptions: (options: Partial<IFCAU_Options>) => void;
203
+ logout: (callback?: (err?: Error) => void) => Promise<void>;
204
+
205
+ // Message Scheduler
206
+ scheduler: {
207
+ scheduleMessage: (message: string | MessageObject, threadID: string | string[], when: Date | number | string, options?: { replyMessageID?: string; isGroup?: boolean; callback?: (err?: Error) => void }) => string;
208
+ cancelScheduledMessage: (id: string) => boolean;
209
+ getScheduledMessage: (id: string) => IFCAU_ScheduledMessage | null;
210
+ listScheduledMessages: () => IFCAU_ScheduledMessage[];
211
+ cancelAllScheduledMessages: () => number;
212
+ getScheduledCount: () => number;
213
+ cleanup: () => void;
214
+ };
215
+
216
+ // Auto-save AppState
217
+ enableAutoSaveAppState: (options?: { filePath?: string; interval?: number; saveOnLogin?: boolean }) => () => void;
218
+ };
219
+
220
+ // ============================================================================
221
+ // Listen Message Types
222
+ // ============================================================================
223
+
224
+ export type IFCAU_ListenMessage =
225
+ | {
226
+ type: "message";
227
+ attachments: IFCAU_Attachment[];
228
+ args: string[];
229
+ body: string;
230
+ isGroup: boolean;
231
+ mentions: { [id: string]: string };
232
+ messageID: string;
233
+ senderID: string;
234
+ threadID: string;
235
+ isUnread: boolean;
236
+ participantIDs: string[];
237
+ }
238
+ | {
239
+ type: "event";
240
+ author: string;
241
+ logMessageBody: string;
242
+ logMessageData: {
243
+ image: {
244
+ attachmentID: string;
245
+ width: number;
246
+ height: number;
247
+ url: string;
248
+ };
249
+ };
250
+ logMessageType: "log:thread-image";
251
+ threadID: string;
252
+ }
253
+ | {
254
+ type: "event";
255
+ author: string;
256
+ logMessageBody: string;
257
+ logMessageData: {
258
+ addedParticipants: {
259
+ fanoutPolicy: string;
260
+ firstName: string;
261
+ fullName: string;
262
+ groupJoinStatus: string;
263
+ initialFolder: string;
264
+ initialFolderId: {
265
+ systemFolderId: string;
266
+ };
267
+ lastUnsubscribeTimestampMs: string;
268
+ userFbId: string;
269
+ isMessengerUser: boolean;
270
+ }[];
271
+ };
272
+ logMessageType: "log:subscribe";
273
+ threadID: string;
274
+ participantIDs: string[];
275
+ }
276
+ | {
277
+ type: "event";
278
+ author: string;
279
+ logMessageBody: string;
280
+ logMessageData: { leftParticipantFbId: string };
281
+ logMessageType: "log:unsubscribe";
282
+ threadID: string;
283
+ participantIDs: string[];
284
+ }
285
+ | {
286
+ type: "event";
287
+ author: string;
288
+ logMessageBody: string;
289
+ logMessageData: { name: string };
290
+ logMessageType: "log:thread-name";
291
+ threadID: string;
292
+ participantIDs: string[];
293
+ }
294
+ | {
295
+ type: "event";
296
+ author: string;
297
+ logMessageBody: string;
298
+ logMessageData: {
299
+ theme_color: string;
300
+ gradient?: string;
301
+ should_show_icon: string;
302
+ theme_id: string;
303
+ accessibility_label: string;
304
+ theme_name_with_subtitle: string;
305
+ theme_emoji?: string;
306
+ };
307
+ logMessageType: "log:thread-color";
308
+ threadID: string;
309
+ participantIDs: string[];
310
+ }
311
+ | {
312
+ type: "event";
313
+ author: string;
314
+ logMessageBody: string;
315
+ logMessageData: {
316
+ thread_quick_reaction_instruction_key_id: string;
317
+ thread_quick_reaction_emoji: string;
318
+ thread_quick_reaction_emoji_url: string;
319
+ };
320
+ logMessageType: "log:thread-icon";
321
+ threadID: string;
322
+ participantIDs: string[];
323
+ }
324
+ | {
325
+ type: "event";
326
+ author: string;
327
+ logMessageBody: string;
328
+ logMessageData: {
329
+ nickname: string;
330
+ participant_id: string;
331
+ };
332
+ logMessageType: "log:user-nickname";
333
+ threadID: string;
334
+ participantIDs: string[];
335
+ }
336
+ | {
337
+ type: "event";
338
+ author: string;
339
+ logMessageBody: string;
340
+ logMessageData: {
341
+ THREAD_CATEGORY: string;
342
+ TARGET_ID: string;
343
+ ADMIN_TYPE: string;
344
+ ADMIN_EVENT: 'add_admin' | 'remove_admin';
345
+ };
346
+ logMessageType: "log:thread-admins";
347
+ threadID: string;
348
+ participantIDs: string[];
349
+ }
350
+ | {
351
+ type: "event";
352
+ author: string;
353
+ logMessageBody: string;
354
+ logMessageData: {
355
+ removed_option_ids: string;
356
+ question_json: string;
357
+ event_type: 'question_creation' | 'update_vote' | 'add_unvoted_option' | 'multiple_updates';
358
+ added_option_ids: string;
359
+ new_option_texts: string;
360
+ new_option_ids: string;
361
+ question_id: string;
362
+ };
363
+ logMessageType: "log:thread-poll";
364
+ threadID: string;
365
+ participantIDs: string[];
366
+ }
367
+ | {
368
+ type: "event";
369
+ author: string;
370
+ logMessageBody: string;
371
+ logMessageData: { APPROVAL_MODE: '0' | '1'; THREAD_CATEGORY: string };
372
+ logMessageType: "log:thread-approval-mode";
373
+ threadID: string;
374
+ participantIDs: string[];
375
+ }
376
+ | {
377
+ type: "event";
378
+ author: string;
379
+ logMessageBody: string;
380
+ logMessageData: any;
381
+ logMessageType: "log:thread-call";
382
+ threadID: string;
383
+ participantIDs: string[];
384
+ }
385
+ | {
386
+ type: "typ";
387
+ from: string;
388
+ fromMobile: boolean;
389
+ isTyping: boolean;
390
+ threadID: string;
391
+ }
392
+ | {
393
+ type: "read";
394
+ threadID: string;
395
+ time: number;
396
+ }
397
+ | {
398
+ type: "read_receipt";
399
+ reader: string;
400
+ threadID: string;
401
+ time: number;
402
+ }
403
+ | {
404
+ type: "message_reaction";
405
+ threadID: string;
406
+ messageID: string;
407
+ reaction: string;
408
+ senderID: string;
409
+ userID: string;
410
+ reactionTimestamp: number;
411
+ }
412
+ | {
413
+ type: "presence";
414
+ statuses: number;
415
+ timestamp: number;
416
+ userID: string;
417
+ }
418
+ | {
419
+ type: "message_unsend";
420
+ threadID: string;
421
+ senderID: string;
422
+ messageID: string;
423
+ deletionTimestamp: number;
424
+ }
425
+ | {
426
+ type: "message_reply";
427
+ attachments: IFCAU_Attachment[];
428
+ args: string[];
429
+ body: string;
430
+ isGroup: boolean;
431
+ mentions: { [id: string]: string };
432
+ messageID: string;
433
+ senderID: string;
434
+ threadID: string;
435
+ isUnread: boolean;
436
+ participantIDs: string[];
437
+ messageReply: {
438
+ attachments: IFCAU_Attachment[];
439
+ body: string;
440
+ isGroup: boolean;
441
+ mentions: { [id: string]: string };
442
+ messageID: string;
443
+ senderID: string;
444
+ threadID: string;
445
+ isUnread: boolean;
446
+ };
447
+ };
448
+
449
+ // ============================================================================
450
+ // Attachment Types
451
+ // ============================================================================
452
+
453
+ export type IFCAU_Attachment =
454
+ | {
455
+ type: "sticker";
456
+ ID: string;
457
+ url: string;
458
+ packID: string;
459
+ spriteUrl: string;
460
+ spriteUrl2x: string;
461
+ width: number;
462
+ height: number;
463
+ caption: string;
464
+ description: string;
465
+ frameCount: number;
466
+ frameRate: number;
467
+ framesPerRow: number;
468
+ framesPerCol: number;
469
+ }
470
+ | {
471
+ type: "file";
472
+ ID: string;
473
+ filename: string;
474
+ url: string;
475
+ isMalicious: boolean;
476
+ contentType: string;
477
+ }
478
+ | {
479
+ type: "photo";
480
+ ID: string;
481
+ filename: string;
482
+ thumbnailUrl: string;
483
+ previewUrl: string;
484
+ previewWidth: number;
485
+ previewHeight: number;
486
+ largePreviewUrl: string;
487
+ largePreviewWidth: number;
488
+ largePreviewHeight: number;
489
+ url: string;
490
+ width: number;
491
+ height: number;
492
+ }
493
+ | {
494
+ type: "animated_image";
495
+ ID: string;
496
+ filename: string;
497
+ previewUrl: string;
498
+ previewWidth: number;
499
+ previewHeight: number;
500
+ url: string;
501
+ width: number;
502
+ height: number;
503
+ }
504
+ | {
505
+ type: "video";
506
+ ID: string;
507
+ filename: string;
508
+ previewUrl: string;
509
+ previewWidth: number;
510
+ previewHeight: number;
511
+ url: string;
512
+ width: number;
513
+ height: number;
514
+ duration: number;
515
+ videoType: string;
516
+ }
517
+ | {
518
+ type: "audio";
519
+ ID: string;
520
+ filename: string;
521
+ audioType: string;
522
+ duration: number;
523
+ url: string;
524
+ isVoiceMail: boolean;
525
+ }
526
+ | {
527
+ type: "location";
528
+ ID: string;
529
+ latitude: number;
530
+ longitude: number;
531
+ image: string;
532
+ width: number;
533
+ height: number;
534
+ url: string;
535
+ address: string;
536
+ }
537
+ | {
538
+ type: "share";
539
+ ID: string;
540
+ url: string;
541
+ title: string;
542
+ description: string;
543
+ source: string;
544
+ image: string;
545
+ width: number;
546
+ height: number;
547
+ playable: boolean;
548
+ duration: number;
549
+ playableUrl: string;
550
+ subattachments: any;
551
+ properties: any;
552
+ };
553
+
554
+ // ============================================================================
555
+ // User Types
556
+ // ============================================================================
557
+
558
+ export type IFCAU_User = {
559
+ name: string;
560
+ firstName?: string;
561
+ vanity?: string;
562
+ thumbSrc: string;
563
+ profileUrl: string | null;
564
+ gender?: number;
565
+ type: string;
566
+ isFriend?: boolean;
567
+ isBirthday: boolean;
568
+ searchToken: any;
569
+ alternateName?: string;
570
+ };
571
+
572
+ export type IFCAU_UserIDResponse = {
573
+ userID: string;
574
+ photoUrl: string;
575
+ indexRank: number;
576
+ name: string;
577
+ isVerified: boolean;
578
+ profileUrl: string;
579
+ category: string;
580
+ score: number;
581
+ type: string;
582
+ }[];
583
+
584
+ export type IFCAU_Friend = {
585
+ alternativeName: string;
586
+ firstName: string;
587
+ gender: string;
588
+ userID: string;
589
+ isFriend: boolean;
590
+ fullName: string;
591
+ profilePicture: string;
592
+ type: string;
593
+ profileUrl: string;
594
+ vanity: string;
595
+ isBirthday: boolean;
596
+ };
597
+
598
+ // ============================================================================
599
+ // Thread Types
600
+ // ============================================================================
601
+
602
+ export type IFCAU_Thread = {
603
+ threadID: string;
604
+ participantIDs: string[];
605
+ threadName: string;
606
+ userInfo: (IFCAU_User & { id: string })[];
607
+ nicknames: { [id: string]: string } | null;
608
+ unreadCount: number;
609
+ messageCount: number;
610
+ imageSrc: string;
611
+ timestamp: number;
612
+ muteUntil: number | null;
613
+ isGroup: boolean;
614
+ isSubscribed: boolean;
615
+ folder: 'INBOX' | 'ARCHIVE' | string;
616
+ isArchived: boolean;
617
+ cannotReplyReason: string | null;
618
+ lastReadTimestamp: number;
619
+ emoji: string | null;
620
+ color: string | null;
621
+ adminIDs: string[];
622
+ approvalMode: boolean;
623
+ approvalQueue: { inviterID: string; requesterID: string; timestamp: string }[];
624
+ };
625
+
626
+ export type IFCAU_ThreadList = {
627
+ threadID: string;
628
+ name: string;
629
+ unreadCount: number;
630
+ messageCount: number;
631
+ imageSrc: string;
632
+ emoji: string | null;
633
+ color: string | null;
634
+ nicknames: { userid: string; nickname: string }[];
635
+ muteUntil: number | null;
636
+ participants: IFCAU_ThreadList_Participants[];
637
+ adminIDs: string[];
638
+ folder: "INBOX" | "ARCHIVED" | "PENNDING" | "OTHER" | string;
639
+ isGroup: boolean;
640
+ customizationEnabled: boolean;
641
+ participantAddMode: string;
642
+ reactionMuteMode: string;
643
+ isArchived: boolean;
644
+ isSubscribed: boolean;
645
+ timestamp: number;
646
+ snippet: string;
647
+ snippetAttachments: string;
648
+ snippetSender: string;
649
+ lastMessageTimestamp: number;
650
+ listReadTimestamp: number | null;
651
+ cannotReplyReason: string | null;
652
+ approvalMode: string;
653
+ }[];
654
+
655
+ export type IFCAU_ThreadList_Participants =
656
+ | {
657
+ accountType: "User";
658
+ userID: string;
659
+ name: string;
660
+ shortName: string;
661
+ gender: string;
662
+ url: string;
663
+ profilePicture: string;
664
+ username: string | null;
665
+ isViewerFriend: boolean;
666
+ isMessengerUser: boolean;
667
+ isVerified: boolean;
668
+ isMessageBlockedByViewer: boolean;
669
+ isViewerCoworker: boolean;
670
+ }
671
+ | {
672
+ accountType: "Page";
673
+ userID: string;
674
+ name: string;
675
+ url: string;
676
+ profilePicture: string;
677
+ username: string | null;
678
+ acceptMessengerUserFeedback: boolean;
679
+ isMessengerUser: boolean;
680
+ isVerified: boolean;
681
+ isMessengerPlatformBot: boolean;
682
+ isMessageBlockedByViewer: boolean;
683
+ }
684
+ | {
685
+ accountType: "ReducedMessagingActor";
686
+ userID: string;
687
+ name: string;
688
+ url: string;
689
+ profilePicture: string;
690
+ username: string | null;
691
+ acceptMessengerUserFeedback: boolean;
692
+ isMessageBlockedByViewer: boolean;
693
+ }
694
+ | {
695
+ accountType: "UnavailableMessagingActor";
696
+ userID: string;
697
+ name: string;
698
+ url: null;
699
+ profilePicture: string;
700
+ username: null;
701
+ acceptMessengerUserFeedback: boolean;
702
+ isMessageBlockedByViewer: boolean;
703
+ }
704
+ | {
705
+ accountType: string;
706
+ userID: string;
707
+ name: string;
708
+ };
709
+
710
+ // ============================================================================
711
+ // Middleware Types
712
+ // ============================================================================
713
+
714
+ export type IFCAU_Middleware = (event: IFCAU_ListenMessage, next: (err?: Error | false | null) => void) => void | Promise<void> | false | null;
715
+
716
+ // ============================================================================
717
+ // Scheduler Types
718
+ // ============================================================================
719
+
720
+ export type IFCAU_ScheduledMessage = {
721
+ id: string;
722
+ message: string | MessageObject;
723
+ threadID: string | string[];
724
+ timestamp: number;
725
+ createdAt: number;
726
+ options: {
727
+ replyMessageID?: string;
728
+ isGroup?: boolean;
729
+ callback?: (err?: Error) => void;
730
+ };
731
+ timeUntilSend: number;
732
+ };
733
+
734
+ // ============================================================================
735
+ // Options Type
736
+ // ============================================================================
737
+
738
+ export type IFCAU_Options = {
739
+ pauseLog: boolean;
740
+ logLevel: "silly" | "verbose" | "info" | "http" | "warn" | "error" | "silent";
741
+ selfListen: boolean;
742
+ listenEvents: boolean;
743
+ pageID: string;
744
+ updatePresence: boolean;
745
+ forceLogin: boolean;
746
+ userAgent: string;
747
+ autoMarkRead: boolean;
748
+ proxy: string;
749
+ online: boolean;
750
+ };
751
+ }