shadowx-fca 8.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 (174) hide show
  1. package/README.md +1066 -0
  2. package/build/messagix.dll +0 -0
  3. package/build/messagix.so +0 -0
  4. package/checkUpdate.js +393 -0
  5. package/config.json +17 -0
  6. package/e2ee.js +563 -0
  7. package/e2eetest.js +356 -0
  8. package/index.js +611 -0
  9. package/lib/index.mjs +1412 -0
  10. package/logger.js +500 -0
  11. package/package.json +65 -0
  12. package/src/GetBotInfo.js +66 -0
  13. package/src/OldMessage.js +182 -0
  14. package/src/Screenshot.js +83 -0
  15. package/src/addExternalModule.js +13 -0
  16. package/src/addUserToGroup.js +33 -0
  17. package/src/approveGroupJoinRequests.js +18 -0
  18. package/src/changeAdminStatus.js +16 -0
  19. package/src/changeArchivedStatus.js +17 -0
  20. package/src/changeAvatar.js +136 -0
  21. package/src/changeAvatarV2.js +86 -0
  22. package/src/changeAvt.js +85 -0
  23. package/src/changeBio.js +76 -0
  24. package/src/changeBlockedStatus.js +20 -0
  25. package/src/changeBlockedStatusMqtt.js +80 -0
  26. package/src/changeCover.js +72 -0
  27. package/src/changeGroupImage.js +16 -0
  28. package/src/changeName.js +79 -0
  29. package/src/changeNickname.js +16 -0
  30. package/src/changeThreadColor.js +15 -0
  31. package/src/changeThreadEmoji.js +15 -0
  32. package/src/changeThreadMemberNickname.js +6 -0
  33. package/src/changeUsername.js +59 -0
  34. package/src/createCommentPost.js +230 -0
  35. package/src/createNewGroup.js +38 -0
  36. package/src/createNote.js +35 -0
  37. package/src/createPoll.js +27 -0
  38. package/src/createPost.js +276 -0
  39. package/src/createThemeAI.js +129 -0
  40. package/src/data/cache/system/data.json +4 -0
  41. package/src/data/cache/system/datahandle.js +21 -0
  42. package/src/data/getThreadInfo.json +1 -0
  43. package/src/deleteComment.js +23 -0
  44. package/src/deleteMessage.js +15 -0
  45. package/src/deleteThread.js +15 -0
  46. package/src/denyGroupJoinRequests.js +18 -0
  47. package/src/e2ee/crypto.js +173 -0
  48. package/src/e2ee/index.js +144 -0
  49. package/src/e2ee/proto/ArmadilloApplication.proto +281 -0
  50. package/src/e2ee/proto/ArmadilloICDC.proto +14 -0
  51. package/src/e2ee/proto/ConsumerApplication.proto +232 -0
  52. package/src/e2ee/proto/MessageApplication.proto +82 -0
  53. package/src/e2ee/proto/MessageTransport.proto +77 -0
  54. package/src/e2ee/proto/WACommon.proto +66 -0
  55. package/src/e2ee/proto/WAMediaTransport.proto +176 -0
  56. package/src/e2ee/proto/proto-writer.ts +76 -0
  57. package/src/e2ee/protocol.js +196 -0
  58. package/src/e2ee/ratchet.js +219 -0
  59. package/src/e2ee/store.js +182 -0
  60. package/src/e2ee.js +8 -0
  61. package/src/editMessage.js +56 -0
  62. package/src/editMessageOld.js +67 -0
  63. package/src/enableReactions.js +24 -0
  64. package/src/follow.js +74 -0
  65. package/src/followUser.js +23 -0
  66. package/src/forwardAttachment.js +16 -0
  67. package/src/friendList.js +98 -0
  68. package/src/getAccess.js +112 -0
  69. package/src/getAppState.js +13 -0
  70. package/src/getAvatarUser.js +11 -0
  71. package/src/getBio.js +24 -0
  72. package/src/getBotInitialData.js +42 -0
  73. package/src/getCtx.js +5 -0
  74. package/src/getCurrentUserID.js +6 -0
  75. package/src/getEmojiUrl.js +29 -0
  76. package/src/getFriendsList.js +36 -0
  77. package/src/getMessage.js +37 -0
  78. package/src/getNotes.js +17 -0
  79. package/src/getOptions.js +5 -0
  80. package/src/getPinnedMessages.js +33 -0
  81. package/src/getPostInfo.js +17 -0
  82. package/src/getProfileInfo.js +17 -0
  83. package/src/getPublicData.js +25 -0
  84. package/src/getRegion.js +7 -0
  85. package/src/getRepInfo.js +17 -0
  86. package/src/getStickerPacks.js +25 -0
  87. package/src/getStickers.js +39 -0
  88. package/src/getStoryReactions.js +18 -0
  89. package/src/getThreadHistory.js +45 -0
  90. package/src/getThreadHistoryDeprecated.js +71 -0
  91. package/src/getThreadInfo.js +73 -0
  92. package/src/getThreadInfoDeprecated.js +56 -0
  93. package/src/getThreadList.js +76 -0
  94. package/src/getThreadListDeprecated.js +46 -0
  95. package/src/getThreadPictures.js +59 -0
  96. package/src/getThreadTheme.js +77 -0
  97. package/src/getUID.js +17 -0
  98. package/src/getUserID.js +17 -0
  99. package/src/getUserInfo.js +28 -0
  100. package/src/handleFriendRequest.js +21 -0
  101. package/src/handleMessageRequest.js +15 -0
  102. package/src/httpGet.js +13 -0
  103. package/src/httpPost.js +12 -0
  104. package/src/httpPostFormData.js +12 -0
  105. package/src/listenE2EE.js +75 -0
  106. package/src/listenMqtt.js +802 -0
  107. package/src/listenNotification.js +85 -0
  108. package/src/logout.js +22 -0
  109. package/src/markAsDelivered.js +17 -0
  110. package/src/markAsRead.js +14 -0
  111. package/src/markAsReadAll.js +15 -0
  112. package/src/markAsSeen.js +15 -0
  113. package/src/metaTheme.js +185 -0
  114. package/src/muteThread.js +52 -0
  115. package/src/note.js +228 -0
  116. package/src/pin.js +53 -0
  117. package/src/pinMessage.js +6 -0
  118. package/src/postComment.js +29 -0
  119. package/src/postFormData.js +46 -0
  120. package/src/reactToComment.js +31 -0
  121. package/src/reactToPost.js +32 -0
  122. package/src/refreshFb_dtsg.js +31 -0
  123. package/src/removeSuspiciousAccount.js +74 -0
  124. package/src/removeUserFromGroup.js +15 -0
  125. package/src/reply.js +442 -0
  126. package/src/resolvePhotoUrl.js +15 -0
  127. package/src/searchForThread.js +20 -0
  128. package/src/searchFriends.js +28 -0
  129. package/src/searchStickers.js +53 -0
  130. package/src/send.js +46 -0
  131. package/src/sendAudio.js +8 -0
  132. package/src/sendBroadcast.js +93 -0
  133. package/src/sendButtons.js +161 -0
  134. package/src/sendComment.js +159 -0
  135. package/src/sendEmoji.js +10 -0
  136. package/src/sendFile.js +9 -0
  137. package/src/sendFriendRequest.js +33 -0
  138. package/src/sendGif.js +24 -0
  139. package/src/sendImage.js +9 -0
  140. package/src/sendLocation.js +9 -0
  141. package/src/sendMessage.js +487 -0
  142. package/src/sendMessage1.js +309 -0
  143. package/src/sendMessageMqtt.js +68 -0
  144. package/src/sendSticker.js +8 -0
  145. package/src/sendTypingIndicator.js +36 -0
  146. package/src/sendTypingIndicatorV2.js +28 -0
  147. package/src/sendVideo.js +9 -0
  148. package/src/sessionGuard.js +130 -0
  149. package/src/setActiveStatus.js +16 -0
  150. package/src/setMessageReaction.js +61 -0
  151. package/src/setMessageReactionMqtt.js +62 -0
  152. package/src/setOptions.js +22 -0
  153. package/src/setPollVote.js +17 -0
  154. package/src/setPostReaction.js +112 -0
  155. package/src/setProfileGuard.js +44 -0
  156. package/src/setProfileLock.js +93 -0
  157. package/src/setStoryReaction.js +129 -0
  158. package/src/setStorySeen.js +99 -0
  159. package/src/setThreadTheme.js +17 -0
  160. package/src/setTitle.js +15 -0
  161. package/src/shareContact.js +33 -0
  162. package/src/shareLink.js +8 -0
  163. package/src/sharePost.js +31 -0
  164. package/src/stopListenMqtt.js +23 -0
  165. package/src/storyManager.js +353 -0
  166. package/src/suggestFriend.js +128 -0
  167. package/src/threadColors.js +131 -0
  168. package/src/unfollowUser.js +23 -0
  169. package/src/unfriend.js +15 -0
  170. package/src/unpinMessage.js +6 -0
  171. package/src/unsendMessage.js +14 -0
  172. package/src/uploadAttachment.js +58 -0
  173. package/src/uploadImageToImgbb.js +29 -0
  174. package/utils.js +2945 -0
Binary file
Binary file
package/checkUpdate.js ADDED
@@ -0,0 +1,393 @@
1
+ "use strict";
2
+
3
+ const axios = require('axios');
4
+ const { execSync } = require('child_process');
5
+ const fs = require('fs');
6
+ const path = require('path');
7
+ const logger = require('./logger');
8
+
9
+ /**
10
+ * Check for updates to shadowx-fca package
11
+ * @returns {Promise<boolean>} True if update was performed, false otherwise
12
+ */
13
+ async function checkForFCAUpdate() {
14
+ try {
15
+ logger.info('UPDATE', 'Checking for shadowx-fca updates...');
16
+
17
+ // Get latest version from npm registry
18
+ const { data: npmData } = await axios.get(
19
+ 'https://registry.npmjs.org/shadowx-fca/latest',
20
+ { timeout: 10000 }
21
+ );
22
+
23
+ const latestVersion = npmData.version;
24
+
25
+ // Check current installed version in multiple locations
26
+ let currentVersion = '0.0.0';
27
+ const searchPaths = [
28
+ path.join(process.cwd(), 'node_modules', 'shadowx-fca', 'package.json'),
29
+ path.join(__dirname, '..', 'package.json'), // Parent directory
30
+ path.join(process.cwd(), 'package.json'), // Check if running from source
31
+ ];
32
+
33
+ for (const pkgPath of searchPaths) {
34
+ if (fs.existsSync(pkgPath)) {
35
+ try {
36
+ const installedPackage = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
37
+ if (installedPackage.name === 'shadowx-fca') {
38
+ currentVersion = installedPackage.version;
39
+ break;
40
+ }
41
+ } catch (err) {
42
+ // Continue to next path
43
+ }
44
+ }
45
+ }
46
+
47
+ logger.debug('UPDATE', `Current version: ${currentVersion}, Latest version: ${latestVersion}`);
48
+
49
+ if (compareVersions(latestVersion, currentVersion) > 0) {
50
+ logger.box(
51
+ `✨ New update available!\n` +
52
+ `Current: v${currentVersion}\n` +
53
+ `Latest: v${latestVersion}`,
54
+ 'warn'
55
+ );
56
+
57
+ // Show changelog if available
58
+ await showChangelog(latestVersion);
59
+
60
+ // Confirm update
61
+ const shouldUpdate = await confirmUpdate();
62
+
63
+ if (shouldUpdate) {
64
+ logger.group('📦 Updating shadowx-fca', async () => {
65
+ // Backup current version
66
+ await backupCurrentVersion(currentVersion);
67
+
68
+ // Update npm package
69
+ await updateNpmPackage(latestVersion);
70
+
71
+ // Update version in user's package.json
72
+ await updateUserPackageJson(latestVersion);
73
+
74
+ logger.success('UPDATE', `Successfully updated to v${latestVersion}`);
75
+ logger.warn('UPDATE', 'Restarting to apply changes...');
76
+
77
+ // Graceful restart
78
+ setTimeout(() => {
79
+ process.exit(2);
80
+ }, 2000);
81
+
82
+ return true;
83
+ });
84
+ } else {
85
+ logger.info('UPDATE', 'Update skipped by user');
86
+ return false;
87
+ }
88
+ } else if (compareVersions(latestVersion, currentVersion) < 0) {
89
+ logger.info('UPDATE', `Running development version v${currentVersion} (latest: v${latestVersion})`);
90
+ return false;
91
+ } else {
92
+ logger.success('UPDATE', `shadowx-fca is up to date (v${currentVersion})`);
93
+ return false;
94
+ }
95
+ } catch (error) {
96
+ if (error.code === 'ECONNREFUSED' || error.code === 'ETIMEDOUT') {
97
+ logger.warn('UPDATE', 'Could not reach npm registry. Skipping update check.');
98
+ } else {
99
+ logger.error('UPDATE', `Failed to check for updates: ${error.message}`);
100
+ }
101
+ return false;
102
+ }
103
+ }
104
+
105
+ /**
106
+ * Show changelog for the new version
107
+ * @param {string} version - Latest version number
108
+ */
109
+ async function showChangelog(version) {
110
+ try {
111
+ const changelogUrls = [
112
+ `https://raw.githubusercontent.com/mueidmursalinrifat/shadowx-fca/main/CHANGELOG.md`,
113
+ `https://raw.githubusercontent.com/mueidmursalinrifat/shadowx-fca/master/CHANGELOG.md`,
114
+ ];
115
+
116
+ for (const url of changelogUrls) {
117
+ try {
118
+ const { data: changesData } = await axios.get(url, { timeout: 5000 });
119
+
120
+ logger.info('UPDATE', '📋 Recent Changes:');
121
+
122
+ // Parse changelog sections
123
+ const sections = changesData.split(/(?=##\s)/);
124
+ let latestChanges = '';
125
+
126
+ // Find the section for this version or the latest version
127
+ for (const section of sections) {
128
+ if (section.includes(version) || sections.indexOf(section) === 1) {
129
+ const lines = section.split('\n').filter(line => line.trim());
130
+ // Skip the header line
131
+ latestChanges = lines.slice(1, 6).join('\n');
132
+ break;
133
+ }
134
+ }
135
+
136
+ if (latestChanges) {
137
+ console.log(logger.C.dim + latestChanges + logger.C.reset);
138
+ } else {
139
+ // Show first few lines if no version-specific section
140
+ const lines = changesData.split('\n').slice(0, 10);
141
+ console.log(logger.C.dim + lines.join('\n') + logger.C.reset);
142
+ }
143
+ return;
144
+ } catch (err) {
145
+ // Try next URL
146
+ }
147
+ }
148
+ } catch (err) {
149
+ logger.debug('UPDATE', 'Could not fetch changelog');
150
+ }
151
+ }
152
+
153
+ /**
154
+ * Confirm with user before updating
155
+ * @returns {Promise<boolean>}
156
+ */
157
+ async function confirmUpdate() {
158
+ return new Promise((resolve) => {
159
+ // Auto-update in production, ask in development
160
+ if (process.env.NODE_ENV === 'production' || process.env.AUTO_UPDATE === 'true') {
161
+ logger.info('UPDATE', 'Auto-update enabled, proceeding...');
162
+ resolve(true);
163
+ return;
164
+ }
165
+
166
+ // If no TTY, auto-accept
167
+ if (!process.stdin.isTTY) {
168
+ logger.info('UPDATE', 'Non-interactive mode, proceeding with update...');
169
+ resolve(true);
170
+ return;
171
+ }
172
+
173
+ // Default to yes after timeout
174
+ const timeout = setTimeout(() => {
175
+ logger.info('UPDATE', 'No response, proceeding with update...');
176
+ resolve(true);
177
+ }, 10000);
178
+
179
+ process.stdout.write(
180
+ `${logger.C.bYellow}Do you want to update? (Y/n): ${logger.C.reset}`
181
+ );
182
+
183
+ const handler = (data) => {
184
+ clearTimeout(timeout);
185
+ const input = data.toString().trim().toLowerCase();
186
+ process.stdin.removeListener('data', handler);
187
+
188
+ if (input === 'n' || input === 'no') {
189
+ resolve(false);
190
+ } else {
191
+ resolve(true);
192
+ }
193
+ };
194
+
195
+ process.stdin.once('data', handler);
196
+ process.stdin.resume();
197
+ });
198
+ }
199
+
200
+ /**
201
+ * Backup current version before updating
202
+ * @param {string} currentVersion - Current version number
203
+ */
204
+ async function backupCurrentVersion(currentVersion) {
205
+ try {
206
+ const backupDir = path.join(process.cwd(), 'node_modules', '.shadowx-fca-backup');
207
+ const sourceDir = path.join(process.cwd(), 'node_modules', 'shadowx-fca');
208
+
209
+ if (fs.existsSync(sourceDir)) {
210
+ if (!fs.existsSync(backupDir)) {
211
+ fs.mkdirSync(backupDir, { recursive: true });
212
+ }
213
+
214
+ const backupPath = path.join(backupDir, `v${currentVersion}-${Date.now()}`);
215
+
216
+ // Copy package.json for reference
217
+ const pkgPath = path.join(sourceDir, 'package.json');
218
+ if (fs.existsSync(pkgPath)) {
219
+ fs.copyFileSync(pkgPath, path.join(backupDir, `package-v${currentVersion}.json`));
220
+ }
221
+
222
+ logger.debug('UPDATE', `Backed up current version v${currentVersion}`);
223
+ }
224
+ } catch (error) {
225
+ logger.warn('UPDATE', `Could not create backup: ${error.message}`);
226
+ }
227
+ }
228
+
229
+ /**
230
+ * Compare two semantic versions
231
+ * @param {string} v1 - First version
232
+ * @param {string} v2 - Second version
233
+ * @returns {number} 1 if v1 > v2, -1 if v1 < v2, 0 if equal
234
+ */
235
+ function compareVersions(v1, v2) {
236
+ const parts1 = v1.split('.').map(Number);
237
+ const parts2 = v2.split('.').map(Number);
238
+
239
+ for (let i = 0; i < Math.max(parts1.length, parts2.length); i++) {
240
+ const part1 = parts1[i] || 0;
241
+ const part2 = parts2[i] || 0;
242
+
243
+ if (part1 > part2) return 1;
244
+ if (part1 < part2) return -1;
245
+ }
246
+
247
+ return 0;
248
+ }
249
+
250
+ /**
251
+ * Update npm package to latest version
252
+ * @param {string} version - Version to install
253
+ * @returns {Promise<boolean>}
254
+ */
255
+ async function updateNpmPackage(version) {
256
+ return new Promise((resolve, reject) => {
257
+ try {
258
+ logger.info('UPDATE', `📦 Installing shadowx-fca@${version}...`);
259
+
260
+ // Try multiple package managers
261
+ const packageManagers = ['npm', 'yarn', 'pnpm'];
262
+ let installed = false;
263
+
264
+ for (const pm of packageManagers) {
265
+ try {
266
+ const command = pm === 'yarn'
267
+ ? `yarn add shadowx-fca@${version}`
268
+ : pm === 'pnpm'
269
+ ? `pnpm add shadowx-fca@${version}`
270
+ : `npm install shadowx-fca@${version} --save`;
271
+
272
+ logger.debug('UPDATE', `Trying ${pm}...`);
273
+
274
+ execSync(command, {
275
+ cwd: process.cwd(),
276
+ stdio: 'pipe',
277
+ timeout: 60000
278
+ });
279
+
280
+ installed = true;
281
+ logger.success('UPDATE', `Package installed successfully using ${pm}`);
282
+ break;
283
+ } catch (err) {
284
+ logger.debug('UPDATE', `${pm} failed: ${err.message}`);
285
+ }
286
+ }
287
+
288
+ if (installed) {
289
+ resolve(true);
290
+ } else {
291
+ reject(new Error('All package managers failed'));
292
+ }
293
+ } catch (error) {
294
+ logger.error('UPDATE', `Failed to install package: ${error.message}`);
295
+ reject(error);
296
+ }
297
+ });
298
+ }
299
+
300
+ /**
301
+ * Update user's package.json with new version
302
+ * @param {string} version - New version number
303
+ * @returns {Promise<boolean>}
304
+ */
305
+ async function updateUserPackageJson(version) {
306
+ try {
307
+ const userPackageJsonPath = path.join(process.cwd(), 'package.json');
308
+
309
+ if (!fs.existsSync(userPackageJsonPath)) {
310
+ logger.warn('UPDATE', 'No package.json found in project root');
311
+ return false;
312
+ }
313
+
314
+ const packageJson = JSON.parse(fs.readFileSync(userPackageJsonPath, 'utf-8'));
315
+ let updated = false;
316
+
317
+ // Update in dependencies
318
+ if (packageJson.dependencies && packageJson.dependencies['shadowx-fca']) {
319
+ packageJson.dependencies['shadowx-fca'] = `^${version}`;
320
+ updated = true;
321
+ }
322
+
323
+ // Update in devDependencies
324
+ if (packageJson.devDependencies && packageJson.devDependencies['shadowx-fca']) {
325
+ packageJson.devDependencies['shadowx-fca'] = `^${version}`;
326
+ updated = true;
327
+ }
328
+
329
+ // Update in peerDependencies
330
+ if (packageJson.peerDependencies && packageJson.peerDependencies['shadowx-fca']) {
331
+ packageJson.peerDependencies['shadowx-fca'] = `^${version}`;
332
+ updated = true;
333
+ }
334
+
335
+ if (updated) {
336
+ fs.writeFileSync(userPackageJsonPath, JSON.stringify(packageJson, null, 2) + '\n');
337
+ logger.success('UPDATE', `Updated package.json to shadowx-fca@^${version}`);
338
+ } else {
339
+ logger.debug('UPDATE', 'shadowx-fca not found in package.json dependencies');
340
+ }
341
+
342
+ return true;
343
+ } catch (error) {
344
+ logger.warn('UPDATE', `Failed to update user package.json: ${error.message}`);
345
+ return false;
346
+ }
347
+ }
348
+
349
+ /**
350
+ * Check for updates with retry mechanism
351
+ * @param {number} retries - Number of retry attempts
352
+ * @param {number} delay - Delay between retries in ms
353
+ * @returns {Promise<boolean>}
354
+ */
355
+ async function checkForUpdatesWithRetry(retries = 3, delay = 5000) {
356
+ for (let i = 0; i < retries; i++) {
357
+ try {
358
+ const result = await checkForFCAUpdate();
359
+ return result;
360
+ } catch (error) {
361
+ if (i < retries - 1) {
362
+ logger.warn('UPDATE', `Retry ${i + 1}/${retries} in ${delay/1000}s...`);
363
+ await new Promise(resolve => setTimeout(resolve, delay));
364
+ }
365
+ }
366
+ }
367
+ logger.error('UPDATE', 'All update attempts failed');
368
+ return false;
369
+ }
370
+
371
+ // Initialize update check if not disabled
372
+ function initAutoUpdate() {
373
+ const disableUpdate = process.env.DISABLE_UPDATE === 'true' ||
374
+ process.argv.includes('--no-update');
375
+
376
+ if (!disableUpdate) {
377
+ // Check for updates after a delay to not block startup
378
+ setTimeout(() => {
379
+ checkForUpdatesWithRetry().catch(() => {
380
+ // Silently fail - updates are non-critical
381
+ });
382
+ }, 3000);
383
+ }
384
+ }
385
+
386
+ module.exports = {
387
+ checkForFCAUpdate,
388
+ updateNpmPackage,
389
+ updateUserPackageJson,
390
+ checkForUpdatesWithRetry,
391
+ initAutoUpdate,
392
+ compareVersions
393
+ };
package/config.json ADDED
@@ -0,0 +1,17 @@
1
+ {
2
+ "e2ee": {
3
+ "enable": true,
4
+ "memoryOnly": true,
5
+ "autoReconnect": true,
6
+ "logLevel": "none",
7
+ "devicePath": null
8
+ },
9
+ "enableTypingIndicator": true,
10
+ "typingDuration": 2000,
11
+ "listenEvents": true,
12
+ "autoMarkRead": true,
13
+ "autoMarkDelivery": false,
14
+ "selfListen": false,
15
+ "online": true,
16
+ "logLevel": "silent"
17
+ }