@cexy/hoonfca 1.0.7 → 2.0.1

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/examples/login-with-cookies.js +102 -0
  3. package/examples/verify.js +70 -0
  4. package/index.js +2 -8
  5. package/package.json +82 -61
  6. package/src/{api/action → apis}/addExternalModule.js +24 -25
  7. package/src/apis/addUserToGroup.js +108 -0
  8. package/src/apis/changeAdminStatus.js +148 -0
  9. package/src/apis/changeArchivedStatus.js +61 -0
  10. package/src/apis/changeAvatar.js +103 -0
  11. package/src/apis/changeBio.js +69 -0
  12. package/src/apis/changeBlockedStatus.js +54 -0
  13. package/src/apis/changeGroupImage.js +136 -0
  14. package/src/apis/changeThreadColor.js +116 -0
  15. package/src/apis/changeThreadEmoji.js +53 -0
  16. package/src/apis/comment.js +207 -0
  17. package/src/apis/createAITheme.js +129 -0
  18. package/src/apis/createNewGroup.js +79 -0
  19. package/src/apis/createPoll.js +73 -0
  20. package/src/apis/deleteMessage.js +44 -0
  21. package/src/apis/deleteThread.js +52 -0
  22. package/src/apis/e2ee.js +17 -0
  23. package/src/apis/editMessage.js +70 -0
  24. package/src/apis/emoji.js +124 -0
  25. package/src/apis/fetchThemeData.js +82 -0
  26. package/src/apis/follow.js +81 -0
  27. package/src/apis/forwardMessage.js +52 -0
  28. package/src/apis/friend.js +243 -0
  29. package/src/apis/gcmember.js +122 -0
  30. package/src/apis/gcname.js +123 -0
  31. package/src/apis/gcrule.js +119 -0
  32. package/src/apis/getAccess.js +111 -0
  33. package/src/apis/getBotInfo.js +88 -0
  34. package/src/apis/getBotInitialData.js +43 -0
  35. package/src/apis/getFriendsList.js +79 -0
  36. package/src/apis/getMessage.js +423 -0
  37. package/src/apis/getTheme.js +95 -0
  38. package/src/apis/getThemeInfo.js +116 -0
  39. package/src/apis/getThreadHistory.js +239 -0
  40. package/src/apis/getThreadInfo.js +267 -0
  41. package/src/apis/getThreadList.js +232 -0
  42. package/src/apis/getThreadPictures.js +58 -0
  43. package/src/apis/getUserID.js +117 -0
  44. package/src/apis/getUserInfo.js +513 -0
  45. package/src/{api/users → apis}/getUserInfoV2.js +146 -134
  46. package/src/apis/handleMessageRequest.js +50 -0
  47. package/src/apis/httpGet.js +63 -0
  48. package/src/apis/httpPost.js +89 -0
  49. package/src/apis/httpPostFormData.js +69 -0
  50. package/src/apis/listenMqtt.js +1236 -0
  51. package/src/apis/listenSpeed.js +179 -0
  52. package/src/apis/logout.js +87 -0
  53. package/src/apis/markAsDelivered.js +47 -0
  54. package/src/{api/messaging → apis}/markAsRead.js +99 -88
  55. package/src/apis/markAsReadAll.js +40 -0
  56. package/src/apis/markAsSeen.js +70 -0
  57. package/src/apis/mqttDeltaValue.js +278 -0
  58. package/src/apis/muteThread.js +45 -0
  59. package/src/apis/nickname.js +132 -0
  60. package/src/apis/notes.js +163 -0
  61. package/src/apis/pinMessage.js +150 -0
  62. package/src/apis/produceMetaTheme.js +180 -0
  63. package/src/apis/realtime.js +182 -0
  64. package/src/apis/removeUserFromGroup.js +117 -0
  65. package/src/apis/resolvePhotoUrl.js +58 -0
  66. package/src/apis/searchForThread.js +154 -0
  67. package/src/apis/sendMessage.js +354 -0
  68. package/src/apis/sendMessageMqtt.js +249 -0
  69. package/src/apis/sendTypingIndicator.js +91 -0
  70. package/src/apis/setMessageReaction.js +27 -0
  71. package/src/apis/setMessageReactionMqtt.js +61 -0
  72. package/src/apis/setThreadTheme.js +260 -0
  73. package/src/apis/setThreadThemeMqtt.js +94 -0
  74. package/src/apis/share.js +107 -0
  75. package/src/apis/shareContact.js +66 -0
  76. package/src/apis/stickers.js +257 -0
  77. package/src/apis/story.js +181 -0
  78. package/src/apis/theme.js +233 -0
  79. package/src/apis/unfriend.js +47 -0
  80. package/src/apis/unsendMessage.js +17 -0
  81. package/src/engine/client.js +92 -0
  82. package/src/engine/models/buildAPI.js +152 -0
  83. package/src/engine/models/loginHelper.js +519 -0
  84. package/src/engine/models/setOptions.js +88 -0
  85. package/src/security/e2ee.js +109 -0
  86. package/src/types/index.d.ts +498 -0
  87. package/src/utils/antiSuspension.js +506 -0
  88. package/src/utils/auth-helpers.js +149 -0
  89. package/src/utils/autoReLogin.js +336 -0
  90. package/src/utils/axios.js +436 -0
  91. package/src/utils/cache.js +54 -0
  92. package/src/utils/clients.js +282 -0
  93. package/src/utils/constants.js +410 -23
  94. package/src/utils/formatters/data/formatAttachment.js +370 -0
  95. package/src/utils/formatters/data/formatDelta.js +109 -0
  96. package/src/utils/formatters/index.js +159 -0
  97. package/src/utils/formatters/value/formatCookie.js +91 -0
  98. package/src/utils/formatters/value/formatDate.js +36 -0
  99. package/src/utils/formatters/value/formatID.js +16 -0
  100. package/src/utils/formatters.js +1373 -0
  101. package/src/utils/headers.js +214 -99
  102. package/src/utils/index.js +153 -0
  103. package/src/utils/monitoring.js +333 -0
  104. package/src/utils/rateLimiter.js +319 -0
  105. package/src/utils/tokenRefresh.js +657 -0
  106. package/src/utils/user-agents.js +238 -0
  107. package/src/utils/validation.js +157 -0
  108. package/CHANGELOG.md +0 -181
  109. package/DOCS.md +0 -2636
  110. package/LICENSE-MIT +0 -21
  111. package/README.md +0 -632
  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
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+
3
+ const utils = require('../../utils');
4
+
5
+ /**
6
+ * Sets global options for the API.
7
+ *
8
+ * @param {object} globalOptions The global options object to modify.
9
+ * @param {object} [options={}] New options to apply.
10
+ * @returns {Promise<void>}
11
+ */
12
+ async function setOptions(globalOptions, options = {}) {
13
+ const optionHandlers = {
14
+ online: (value) => (globalOptions.online = Boolean(value)),
15
+ selfListen: (value) => (globalOptions.selfListen = Boolean(value)),
16
+ selfListenEvent: (value) => (globalOptions.selfListenEvent = value),
17
+ listenEvents: (value) => (globalOptions.listenEvents = Boolean(value)),
18
+ updatePresence: (value) => (globalOptions.updatePresence = Boolean(value)),
19
+ forceLogin: (value) => (globalOptions.forceLogin = Boolean(value)),
20
+ userAgent: (value) => (globalOptions.userAgent = value),
21
+ autoMarkDelivery: (value) => (globalOptions.autoMarkDelivery = Boolean(value)),
22
+ autoMarkRead: (value) => (globalOptions.autoMarkRead = Boolean(value)),
23
+ listenTyping: (value) => (globalOptions.listenTyping = Boolean(value)),
24
+ proxy(value) {
25
+ if (typeof value !== "string") {
26
+ delete globalOptions.proxy;
27
+ utils.setProxy();
28
+ } else {
29
+ globalOptions.proxy = value;
30
+ utils.setProxy(value);
31
+ }
32
+ },
33
+ autoReconnect: (value) => (globalOptions.autoReconnect = Boolean(value)),
34
+ emitReady: (value) => (globalOptions.emitReady = Boolean(value)),
35
+ randomUserAgent(value) {
36
+ globalOptions.randomUserAgent = Boolean(value);
37
+ if (value) {
38
+ globalOptions.userAgent = utils.randomUserAgent();
39
+ }
40
+ },
41
+ simulateTyping: (value) => (globalOptions.simulateTyping = Boolean(value)),
42
+ bypassRegion(value) {
43
+ if (value){
44
+ value = value.toUpperCase();
45
+ }
46
+ globalOptions.bypassRegion = value;
47
+ },
48
+ maxConcurrentRequests(value) {
49
+ if (typeof value === 'number') {
50
+ globalOptions.maxConcurrentRequests = Math.floor(value);
51
+ utils.configureRateLimiter({ maxConcurrentRequests: globalOptions.maxConcurrentRequests });
52
+ }
53
+ },
54
+ maxRequestsPerMinute(value) {
55
+ if (typeof value === 'number') {
56
+ globalOptions.maxRequestsPerMinute = Math.floor(value);
57
+ utils.configureRateLimiter({ maxRequestsPerMinute: globalOptions.maxRequestsPerMinute });
58
+ }
59
+ },
60
+ requestCooldownMs(value) {
61
+ if (typeof value === 'number') {
62
+ globalOptions.requestCooldownMs = Math.floor(value);
63
+ utils.configureRateLimiter({ requestCooldownMs: globalOptions.requestCooldownMs });
64
+ }
65
+ },
66
+ errorCacheTtlMs(value) {
67
+ if (typeof value === 'number') {
68
+ globalOptions.errorCacheTtlMs = Math.floor(value);
69
+ utils.configureRateLimiter({ errorCacheTtlMs: globalOptions.errorCacheTtlMs });
70
+ }
71
+ },
72
+ stealthMode(value) {
73
+ const enable = Boolean(value);
74
+ globalOptions.stealthMode = enable;
75
+ if (enable) {
76
+ globalOptions.updatePresence = false;
77
+ globalOptions.online = false;
78
+ globalOptions.simulateTyping = false;
79
+ utils.configureRateLimiter({ maxConcurrentRequests: 2, maxRequestsPerMinute: 60 });
80
+ }
81
+ }
82
+ };
83
+ Object.entries(options).forEach(([key, value]) => {
84
+ if (optionHandlers[key]) optionHandlers[key](value);
85
+ });
86
+ }
87
+
88
+ module.exports = setOptions;
@@ -0,0 +1,109 @@
1
+ const crypto = require('crypto');
2
+
3
+ function b64(buf) {
4
+ return Buffer.from(buf).toString('base64');
5
+ }
6
+ function b64d(str) {
7
+ return Buffer.from(str, 'base64');
8
+ }
9
+ function ensure(ctx) {
10
+ if (!ctx.e2ee) {
11
+ ctx.e2ee = { enabled: false, bot: null, peers: Object.create(null) };
12
+ }
13
+ return ctx.e2ee;
14
+ }
15
+ function genBot(ctx) {
16
+ const e = ensure(ctx);
17
+ if (!e.bot) {
18
+ const { publicKey, privateKey } = crypto.generateKeyPairSync('x25519');
19
+ e.bot = {
20
+ publicKey: publicKey.export({ type: 'spki', format: 'der' }),
21
+ privateKey: privateKey.export({ type: 'pkcs8', format: 'der' })
22
+ };
23
+ }
24
+ }
25
+ function enable(ctx) {
26
+ const e = ensure(ctx);
27
+ genBot(ctx);
28
+ e.enabled = true;
29
+ }
30
+ function disable(ctx) {
31
+ const e = ensure(ctx);
32
+ e.enabled = false;
33
+ }
34
+ function getPublicKey(ctx) {
35
+ genBot(ctx);
36
+ return b64(ensure(ctx).bot.publicKey);
37
+ }
38
+ function setPeerKey(ctx, threadID, peerPublicKeyB64) {
39
+ const e = ensure(ctx);
40
+ e.peers[String(threadID)] = peerPublicKeyB64;
41
+ }
42
+ function clearPeerKey(ctx, threadID) {
43
+ const e = ensure(ctx);
44
+ delete e.peers[String(threadID)];
45
+ }
46
+ function hasPeer(ctx, threadID) {
47
+ const e = ensure(ctx);
48
+ return !!e.peers[String(threadID)];
49
+ }
50
+ function isEnabled(ctx) {
51
+ const e = ensure(ctx);
52
+ return !!e.enabled;
53
+ }
54
+ function deriveKey(ctx, threadID) {
55
+ const e = ensure(ctx);
56
+ if (!e.bot || !e.peers[String(threadID)]) {
57
+ throw new Error('missing_keys');
58
+ }
59
+ const priv = crypto.createPrivateKey({ key: e.bot.privateKey, format: 'der', type: 'pkcs8' });
60
+ const pub = crypto.createPublicKey({ key: b64d(e.peers[String(threadID)]), format: 'der', type: 'spki' });
61
+ const shared = crypto.diffieHellman({ privateKey: priv, publicKey: pub });
62
+ const salt = Buffer.from(String(threadID));
63
+ return crypto.hkdfSync('sha256', shared, salt, Buffer.from('neokex-e2ee-v1'), 32);
64
+ }
65
+ function encrypt(ctx, threadID, plaintext) {
66
+ const key = deriveKey(ctx, threadID);
67
+ const iv = crypto.randomBytes(12);
68
+ const cipher = crypto.createCipheriv('aes-256-gcm', key, iv);
69
+ const ct = Buffer.concat([cipher.update(Buffer.from(String(plaintext))), cipher.final()]);
70
+ const tag = cipher.getAuthTag();
71
+ const payload = {
72
+ v: 1,
73
+ alg: 'X25519+HKDF+AES-256-GCM',
74
+ n: b64(iv),
75
+ t: b64(tag),
76
+ c: b64(ct)
77
+ };
78
+ const body = Buffer.from(JSON.stringify(payload)).toString('base64');
79
+ return '.NKX-E2EE|' + body;
80
+ }
81
+ function decrypt(ctx, threadID, armored) {
82
+ const s = String(armored || '');
83
+ if (!s.startsWith('.NKX-E2EE|')) return null;
84
+ const raw = s.slice('.NKX-E2EE|'.length);
85
+ let payload;
86
+ try { payload = JSON.parse(Buffer.from(raw, 'base64').toString()); } catch (_) { return null; }
87
+ if (!payload || payload.v !== 1) return null;
88
+ const key = deriveKey(ctx, threadID);
89
+ const iv = b64d(payload.n);
90
+ const tag = b64d(payload.t);
91
+ const ct = b64d(payload.c);
92
+ const decipher = crypto.createDecipheriv('aes-256-gcm', key, iv);
93
+ decipher.setAuthTag(tag);
94
+ const pt = Buffer.concat([decipher.update(ct), decipher.final()]);
95
+ return pt.toString();
96
+ }
97
+
98
+ module.exports = {
99
+ ensure,
100
+ enable,
101
+ disable,
102
+ isEnabled,
103
+ getPublicKey,
104
+ setPeerKey,
105
+ clearPeerKey,
106
+ hasPeer,
107
+ encrypt,
108
+ decrypt
109
+ };
@@ -0,0 +1,498 @@
1
+ /// <reference types="node" />
2
+ import { ReadStream } from "fs";
3
+ import { EventEmitter } from "events";
4
+
5
+ declare module "@neoaz07/nkxfca" {
6
+ export type UserID = string;
7
+ export type ThreadID = string;
8
+ export type MessageID = string;
9
+ export type Callback<T = any> = (err: any, result?: T) => void;
10
+
11
+ export interface Coordinates {
12
+ latitude: number;
13
+ longitude: number;
14
+ }
15
+
16
+ export interface Mention {
17
+ tag: string;
18
+ id: UserID;
19
+ fromIndex?: number;
20
+ }
21
+
22
+ export interface Reaction {
23
+ reaction: string;
24
+ userID: UserID;
25
+ }
26
+
27
+ export interface StickerPackInfo {
28
+ id: string;
29
+ name: string;
30
+ thumbnail?: string;
31
+ }
32
+
33
+ export interface StickerInfo {
34
+ type: "sticker";
35
+ ID: string;
36
+ url?: string;
37
+ animatedUrl?: string;
38
+ packID?: string;
39
+ label: string;
40
+ stickerID: string;
41
+ }
42
+
43
+ export interface AddedStickerPackInfo {
44
+ id: string;
45
+ name: string;
46
+ in_sticker_tray: boolean;
47
+ artist?: string;
48
+ preview_image?: { uri: string };
49
+ thumbnail_image?: { uri: string };
50
+ }
51
+
52
+ export interface CommentMessage {
53
+ body: string;
54
+ attachment?: ReadStream[];
55
+ mentions?: Mention[];
56
+ url?: string;
57
+ sticker?: string;
58
+ }
59
+
60
+ export interface CommentResult {
61
+ id: string;
62
+ url: string;
63
+ count: number;
64
+ }
65
+
66
+ export interface ShareResult {
67
+ postID: string;
68
+ url: string;
69
+ }
70
+
71
+ export interface Attachment {
72
+ type: "photo" | "animated_image" | "video" | "audio" | "file" | "sticker" | "share" | "location" | "unknown";
73
+ ID: string;
74
+ filename: string;
75
+ url?: string;
76
+ name?: string;
77
+ }
78
+
79
+ export interface PhotoAttachment extends Attachment {
80
+ type: "photo";
81
+ thumbnailUrl: string;
82
+ previewUrl: string;
83
+ previewWidth: number;
84
+ previewHeight: number;
85
+ largePreviewUrl: string;
86
+ largePreviewWidth: number;
87
+ largePreviewHeight: number;
88
+ width: number;
89
+ height: number;
90
+ }
91
+
92
+ export interface VideoAttachment extends Attachment {
93
+ type: "video";
94
+ duration: number;
95
+ width: number;
96
+ height: number;
97
+ previewUrl: string;
98
+ previewWidth: number;
99
+ previewHeight: number;
100
+ videoType: "file_attachment" | "native_video" | "unknown";
101
+ }
102
+
103
+ export interface AudioAttachment extends Attachment {
104
+ type: "audio";
105
+ duration: number;
106
+ audioType: string;
107
+ isVoiceMail: boolean;
108
+ }
109
+
110
+ export interface FileAttachment extends Attachment {
111
+ type: "file";
112
+ isMalicious: boolean;
113
+ contentType: string;
114
+ }
115
+
116
+ export interface StickerAttachment extends Attachment {
117
+ type: "sticker";
118
+ packID: string;
119
+ spriteUrl?: string;
120
+ spriteUrl2x?: string;
121
+ width: number;
122
+ height: number;
123
+ caption: string;
124
+ description: string;
125
+ frameCount: number;
126
+ frameRate: number;
127
+ framesPerRow: number;
128
+ framesPerCol: number;
129
+ }
130
+
131
+ export interface ShareAttachment extends Attachment {
132
+ type: "share";
133
+ title: string;
134
+ description?: string;
135
+ source?: string;
136
+ image?: string;
137
+ width?: number;
138
+ height?: number;
139
+ playable?: boolean;
140
+ subattachments?: any[];
141
+ properties: Record<string, any>;
142
+ }
143
+
144
+ export type AnyAttachment =
145
+ | PhotoAttachment
146
+ | VideoAttachment
147
+ | AudioAttachment
148
+ | FileAttachment
149
+ | StickerAttachment
150
+ | ShareAttachment;
151
+
152
+ export interface MessageReply {
153
+ messageID: MessageID;
154
+ senderID: UserID;
155
+ body: string;
156
+ attachments: AnyAttachment[];
157
+ timestamp: string;
158
+ isReply: true;
159
+ }
160
+
161
+ export interface Message {
162
+ type: "message";
163
+ senderID: UserID;
164
+ body: string;
165
+ threadID: ThreadID;
166
+ messageID: MessageID;
167
+ attachments: AnyAttachment[];
168
+ mentions: Record<string, string>;
169
+ timestamp: string;
170
+ isGroup: boolean;
171
+ participantIDs?: UserID[];
172
+ messageReply?: MessageReply;
173
+ isUnread?: boolean;
174
+ reactions?: Reaction[];
175
+ }
176
+
177
+ export interface Event {
178
+ type: "event";
179
+ threadID: ThreadID;
180
+ logMessageType: string;
181
+ logMessageData: any;
182
+ logMessageBody: string;
183
+ timestamp: string;
184
+ author: UserID;
185
+ }
186
+
187
+ export interface TypingIndicator {
188
+ type: "typ";
189
+ isTyping: boolean;
190
+ from: UserID;
191
+ threadID: ThreadID;
192
+ fromMobile: boolean;
193
+ }
194
+
195
+ export interface UnsendMessageEvent {
196
+ type: "unsend";
197
+ messageID: MessageID;
198
+ threadID: ThreadID;
199
+ senderID: UserID;
200
+ deletionTimestamp: string;
201
+ }
202
+
203
+ export interface EmojiEvent {
204
+ type: "change_thread_emoji";
205
+ threadID: ThreadID;
206
+ author: UserID;
207
+ emoji: string;
208
+ }
209
+
210
+ export interface GroupNameEvent {
211
+ type: "change_thread_name";
212
+ threadID: ThreadID;
213
+ author: UserID;
214
+ name: string;
215
+ }
216
+
217
+ export interface NicknameEvent {
218
+ type: "change_thread_nickname";
219
+ threadID: ThreadID;
220
+ author: UserID;
221
+ participantID: UserID;
222
+ nickname: string;
223
+ }
224
+
225
+ export type ListenEvent = Message | Event | TypingIndicator;
226
+
227
+ export interface UserInfo {
228
+ id: UserID;
229
+ name: string;
230
+ firstName: string;
231
+ lastName?: string;
232
+ vanity: string;
233
+ profileUrl: string;
234
+ profilePicUrl: string;
235
+ gender: string;
236
+ type: "user" | "page";
237
+ isFriend: boolean;
238
+ isBirthday: boolean;
239
+ bio?: string;
240
+ live_city?: string;
241
+ followers?: string;
242
+ following?: string;
243
+ coverPhoto?: string;
244
+ }
245
+
246
+ export interface ThreadInfo {
247
+ threadID: ThreadID;
248
+ threadName?: string;
249
+ participantIDs: UserID[];
250
+ userInfo: UserInfo[];
251
+ unreadCount: number;
252
+ messageCount: number;
253
+ imageSrc?: string;
254
+ timestamp: string;
255
+ muteUntil: number;
256
+ isGroup: boolean;
257
+ isArchived: boolean;
258
+ isSubscribed: boolean;
259
+ folder: string;
260
+ nicknames: Record<UserID, string>;
261
+ adminIDs: UserID[];
262
+ emoji?: string;
263
+ color?: string;
264
+ canReply: boolean;
265
+ inviteLink: {
266
+ enable: boolean;
267
+ link: string | null;
268
+ };
269
+ }
270
+
271
+ export interface MessageObject {
272
+ body?: string;
273
+ attachment?: ReadStream | ReadStream[];
274
+ sticker?: string;
275
+ emoji?: string;
276
+ emojiSize?: "small" | "medium" | "large";
277
+ mentions?: Mention[];
278
+ edit?: [string, number][];
279
+ url?: string;
280
+ location?: Coordinates;
281
+ }
282
+
283
+ export interface FriendInfo {
284
+ alternateName: string;
285
+ firstName: string;
286
+ gender: string;
287
+ userID: UserID;
288
+ isFriend: boolean;
289
+ fullName: string;
290
+ profilePicture: string;
291
+ type: string;
292
+ profileUrl: string;
293
+ vanity: string;
294
+ isBirthday: boolean;
295
+ }
296
+
297
+ export interface HealthStatus {
298
+ mqttConnected: boolean;
299
+ autoReconnect: boolean;
300
+ tokenRefresh: {
301
+ lastRefresh: number;
302
+ nextRefresh: number;
303
+ failureCount: number;
304
+ };
305
+ rateLimiter: {
306
+ activeRequests: number;
307
+ maxConcurrentRequests: number;
308
+ maxRequestsPerMinute: number;
309
+ threadCooldowns: number;
310
+ endpointCooldowns: number;
311
+ errorCacheSize: number;
312
+ } | null;
313
+ }
314
+
315
+ export interface API {
316
+ setOptions(options: LoginOptions): void;
317
+ getAppState(): any[];
318
+ getCurrentUserID(): UserID;
319
+ getHealthStatus(): HealthStatus;
320
+
321
+ listen(callback: (err: any, event: ListenEvent) => void): EventEmitter;
322
+
323
+ listenMqtt(callback: (err: any, event: ListenEvent) => void): void;
324
+
325
+ sendMessage(
326
+ message: string | MessageObject,
327
+ threadID: ThreadID,
328
+ replyToMessage?: MessageID | Callback<Message>,
329
+ callback?: Callback<Message>,
330
+ ): Promise<Message> | void;
331
+
332
+ sendMessageMqtt(
333
+ message: string | MessageObject,
334
+ threadID: ThreadID,
335
+ replyToMessage?: MessageID,
336
+ callback?: Callback<Message>,
337
+ ): void;
338
+
339
+ editMessage(text: string, messageID: MessageID, callback?: Callback): void;
340
+
341
+ unsendMessage(messageID: MessageID, threadID: ThreadID, callback?: Callback<UnsendMessageEvent>): Promise<UnsendMessageEvent>;
342
+
343
+ forwardMessage(messageID: MessageID, threadID: ThreadID, callback?: Callback): Promise<void>;
344
+
345
+ deleteMessage(messageIDs: MessageID | MessageID[], callback?: Callback): Promise<void>;
346
+
347
+ setMessageReaction(reaction: string, messageID: MessageID, callback?: Callback, forceCustomReaction?: boolean): Promise<void>;
348
+ setMessageReactionMqtt(reaction: string, messageID: MessageID, threadID: ThreadID, callback?: Callback): Promise<void>;
349
+
350
+ shareContact(text: string, senderID: UserID, threadID: ThreadID, callback?: Callback): void;
351
+ shareContact(senderID: UserID, threadID: ThreadID, callback?: Callback): void;
352
+ resolvePhotoUrl(photoID: string, callback?: Callback<string>): Promise<string>;
353
+
354
+ pinMessage(action: "pin" | "unpin", threadID: ThreadID, messageID: MessageID): Promise<any>;
355
+ pinMessage(action: "list", threadID: ThreadID): Promise<Message[]>;
356
+
357
+ markAsRead(threadID: ThreadID, read?: boolean, callback?: Callback): Promise<any>;
358
+ markAsReadAll(callback?: Callback): Promise<void>;
359
+ markAsSeen(timestamp?: number, callback?: Callback): Promise<void>;
360
+ markAsDelivered(threadID: ThreadID, messageID: MessageID, callback?: Callback): Promise<void>;
361
+
362
+ muteThread(threadID: ThreadID, muteSeconds: number, callback?: Callback): Promise<void>;
363
+
364
+ sendTypingIndicator(sendTyping: boolean, threadID: ThreadID, callback?: Callback): Promise<void>;
365
+
366
+ getThreadInfo(threadID: ThreadID, callback?: Callback<ThreadInfo>): Promise<ThreadInfo>;
367
+ getThreadInfo(threadID: ThreadID[], callback?: Callback<Record<ThreadID, ThreadInfo>>): Promise<Record<ThreadID, ThreadInfo>>;
368
+
369
+ getThreadList(limit: number, timestamp: number | null, tags: string[], callback?: Callback<ThreadInfo[]>): Promise<ThreadInfo[]>;
370
+ getThreadHistory(threadID: ThreadID, amount: number, timestamp: number | null, callback?: Callback<Message[]>): Promise<Message[]>;
371
+ getThreadPictures(threadID: ThreadID, offset: number, limit: number, callback?: Callback<string[]>): Promise<string[]>;
372
+
373
+ getMessage(messageID: MessageID, callback?: Callback<Message>): Promise<Message>;
374
+
375
+ getUserInfo(id: UserID, usePayload?: boolean, callback?: Callback<UserInfo>): Promise<UserInfo>;
376
+ getUserInfo(id: UserID[], usePayload?: boolean, callback?: Callback<Record<UserID, UserInfo>>): Promise<Record<UserID, UserInfo>>;
377
+ getUserInfoV2(id: UserID, callback?: Callback<UserInfo>): Promise<UserInfo>;
378
+ getUserID(name: string, callback?: Callback<{ userID: UserID; [key: string]: any }[]>): Promise<{ userID: UserID; [key: string]: any }[]>;
379
+
380
+ getFriendsList(callback?: Callback<Record<UserID, FriendInfo>>): Promise<Record<UserID, FriendInfo>>;
381
+
382
+ searchForThread(name: string, callback?: Callback<ThreadInfo[]>): Promise<ThreadInfo[]>;
383
+
384
+ createNewGroup(participantIDs: UserID[], groupName?: string, callback?: Callback<ThreadID>): Promise<ThreadID>;
385
+
386
+ addUserToGroup(userID: UserID, threadID: ThreadID, callback?: Callback): Promise<void>;
387
+ removeUserFromGroup(userID: UserID, threadID: ThreadID, callback?: Callback): Promise<void>;
388
+ changeAdminStatus(threadID: ThreadID, userID: UserID, adminStatus: boolean, callback?: Callback): Promise<void>;
389
+
390
+ changeGroupImage(image: ReadStream, threadID: ThreadID, callback?: Callback): Promise<void>;
391
+ changeThreadColor(color: string, threadID: ThreadID, callback?: Callback): Promise<void>;
392
+ changeThreadEmoji(emoji: string, threadID: ThreadID, callback?: Callback): Promise<void>;
393
+
394
+ changeArchivedStatus(threadID: ThreadID | ThreadID[], archive: boolean, callback?: Callback): Promise<void>;
395
+ changeBlockedStatus(userID: UserID, block: boolean, callback?: Callback): Promise<void>;
396
+
397
+ changeAvatar(image: ReadStream, callback?: Callback): Promise<void>;
398
+ changeBio(bio: string, publish: boolean, callback?: Callback): Promise<void>;
399
+
400
+ handleMessageRequest(threadID: ThreadID | ThreadID[], accept: boolean, callback?: Callback): Promise<void>;
401
+
402
+ deleteThread(threadID: ThreadID | ThreadID[], callback?: Callback): Promise<void>;
403
+
404
+ createPoll(title: string, threadID: ThreadID, options?: Record<string, boolean>, callback?: Callback): Promise<void>;
405
+
406
+ logout(callback?: (err: any) => void): Promise<void>;
407
+
408
+ addExternalModule(moduleObj: Record<string, Function>): void;
409
+ getAccess(authCode?: string, callback?: Callback<string>): Promise<string>;
410
+
411
+ httpGet(url: string, form?: any, customHeader?: any, callback?: Callback<string>, notAPI?: boolean): Promise<string>;
412
+ httpPost(url: string, form?: any, customHeader?: any, callback?: Callback<string>, notAPI?: boolean): Promise<string>;
413
+ httpPostFormData(url: string, form?: any, customHeader?: any, callback?: Callback<string>, notAPI?: boolean): Promise<string>;
414
+
415
+ getTheme(threadID: ThreadID): Promise<any[]>;
416
+ getThemeInfo(threadID: ThreadID): Promise<{ threadName?: string; color?: string; emoji?: string; [key: string]: any }>;
417
+ setThreadTheme(threadID: ThreadID, themeID: string, callback?: Callback): Promise<void>;
418
+ setThreadThemeMqtt(threadID: ThreadID, themeID: string, callback?: Callback): Promise<void>;
419
+ createAITheme(prompt: string): Promise<{ id: string; [key: string]: any }[]>;
420
+
421
+ follow(senderID: UserID, follow: boolean, callback?: Callback): void;
422
+ unfriend(userID: UserID, callback?: Callback): Promise<void>;
423
+ friend(userID: UserID, callback?: Callback): Promise<void>;
424
+
425
+ emoji(emoji: string, threadID?: ThreadID, callback?: Callback<EmojiEvent>): Promise<EmojiEvent>;
426
+ gcname(newName: string, threadID?: ThreadID, callback?: Callback<GroupNameEvent>): Promise<GroupNameEvent>;
427
+ nickname(nickname: string, threadID: ThreadID, participantID: UserID, callback?: Callback<NicknameEvent>): Promise<NicknameEvent>;
428
+ theme(newName: string, threadID?: ThreadID, callback?: Callback<GroupNameEvent>): Promise<GroupNameEvent>;
429
+
430
+ comment(msg: string | CommentMessage, postID: string, replyCommentID?: string, callback?: Callback<CommentResult>): Promise<CommentResult>;
431
+ share(text: string, postID: string, callback?: Callback<ShareResult>): Promise<ShareResult>;
432
+ share(postID: string, callback?: Callback<ShareResult>): Promise<ShareResult>;
433
+
434
+ stickers: {
435
+ search(query: string): Promise<StickerInfo[]>;
436
+ listPacks(): Promise<StickerPackInfo[]>;
437
+ getStorePacks(): Promise<StickerPackInfo[]>;
438
+ listAllPacks(): Promise<StickerPackInfo[]>;
439
+ addPack(packID: string): Promise<AddedStickerPackInfo>;
440
+ getStickersInPack(packID: string): Promise<StickerInfo[]>;
441
+ getAiStickers(options?: { limit?: number }): Promise<StickerInfo[]>;
442
+ };
443
+
444
+ e2ee: {
445
+ enable(): void;
446
+ disable(): void;
447
+ isEnabled(): boolean;
448
+ getPublicKey(): string;
449
+ setPeerKey(threadID: ThreadID, peerPublicKeyB64: string): void;
450
+ clearPeerKey(threadID: ThreadID): void;
451
+ hasPeer(threadID: ThreadID): boolean;
452
+ encrypt(threadID: ThreadID, text: string): string;
453
+ decrypt(threadID: ThreadID, armored: string): string | null;
454
+ };
455
+
456
+ getBotInfo(callback?: Callback): Promise<any>;
457
+ getUserInfoV2(userID: UserID, callback?: Callback<UserInfo>): Promise<UserInfo>;
458
+
459
+ [key: string]: any;
460
+ }
461
+
462
+ export interface LoginCredentials {
463
+ appState?: any;
464
+ email?: string;
465
+ password?: string;
466
+ }
467
+
468
+ export interface LoginOptions {
469
+ online?: boolean;
470
+ selfListen?: boolean;
471
+ listenEvents?: boolean;
472
+ updatePresence?: boolean;
473
+ forceLogin?: boolean;
474
+ autoMarkDelivery?: boolean;
475
+ autoMarkRead?: boolean;
476
+ listenTyping?: boolean;
477
+ proxy?: string;
478
+ autoReconnect?: boolean;
479
+ userAgent?: string;
480
+ emitReady?: boolean;
481
+ randomUserAgent?: boolean;
482
+ bypassRegion?: string;
483
+ simulateTyping?: boolean;
484
+ maxConcurrentRequests?: number;
485
+ maxRequestsPerMinute?: number;
486
+ requestCooldownMs?: number;
487
+ errorCacheTtlMs?: number;
488
+ stealthMode?: boolean;
489
+ persona?: "desktop" | "android" | "mobile";
490
+ logging?: boolean;
491
+ }
492
+
493
+ export function login(
494
+ credentials: LoginCredentials,
495
+ options: LoginOptions | Callback<API>,
496
+ callback?: Callback<API>
497
+ ): Promise<API> | void;
498
+ }