@crysnovax/baileys 2.6.1 → 2.6.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,60 +1,3 @@
1
-
2
- <h2 align="center">
3
- <img src="https://media2.giphy.com/media/QssGEmpkyEOhBCb7e1/giphy.gif?cid=ecf05e47a0n3gi1bfqntqmob8g9aid1oyj2wr3ds3mg700bl&rid=giphy.gif" width="28" />
4
- About Me
5
- <img src="https://media2.giphy.com/media/QssGEmpkyEOhBCb7e1/giphy.gif?cid=ecf05e47a0n3gi1bfqntqmob8g9aid1oyj2wr3ds3mg700bl&rid=giphy.gif" width="28" />
6
- </h2>
7
-
8
- ```javascript
9
- const crysnova = {
10
- name: "CRYSNOVA AI",
11
- location: "🌍 Global",
12
- role: "Full Stack Developer & Bot Creator",
13
- stack: ["JavaScript", "Node.js", "Cloudflare Workers", "WhatsApp Bot Development"],
14
- interests: ["AI", "Automation", "Open Source", "Building Cool Stuff"],
15
- currentFocus: "Building the most powerful WhatsApp bot ecosystem 🚀",
16
- funFact: "My code runs 24/7 on Cloudflare's edge network ⚡"
17
- };
18
- ```
19
-
20
- <br />
21
-
22
- <h2 align="center">
23
- <img src="https://media.giphy.com/media/iY8CRBdQXODJSCERIr/giphy.gif" width="28" />
24
- Tech Stack
25
- <img src="https://media.giphy.com/media/iY8CRBdQXODJSCERIr/giphy.gif" width="28" />
26
- </h2>
27
-
28
- <p align="center">
29
- <img src="https://img.shields.io/badge/JavaScript-F7DF1E?style=for-the-badge&logo=javascript&logoColor=black&labelColor=0a0f0a&color=10b981" />
30
- <img src="https://img.shields.io/badge/Node.js-339933?style=for-the-badge&logo=node.js&logoColor=white&labelColor=0a0f0a&color=10b981" />
31
- <img src="https://img.shields.io/badge/Cloudflare-F38020?style=for-the-badge&logo=cloudflare&logoColor=white&labelColor=0a0f0a&color=10b981" />
32
- <img src="https://img.shields.io/badge/Workers-F38020?style=for-the-badge&logo=cloudflareworkers&logoColor=white&labelColor=0a0f0a&color=10b981" />
33
- <img src="https://img.shields.io/badge/GitHub-181717?style=for-the-badge&logo=github&logoColor=white&labelColor=0a0f0a&color=10b981" />
34
- <img src="https://img.shields.io/badge/Baileys-25D366?style=for-the-badge&logo=whatsapp&logoColor=white&labelColor=0a0f0a&color=10b981" />
35
- <img src="https://img.shields.io/badge/API-FF6F00?style=for-the-badge&logo=fastapi&logoColor=white&labelColor=0a0f0a&color=10b981" />
36
- <img src="https://img.shields.io/badge/KV-FF4F00?style=for-the-badge&logo=cloudflare&logoColor=white&labelColor=0a0f0a&color=10b981" />
37
- </p>
38
- <br />
39
-
40
- <h2 align="center">
41
- <img src="https://media.giphy.com/media/W5eoZHPpUx9sapR0eu/giphy.gif" width="28" />
42
- Featured Projects
43
- <img src="https://media.giphy.com/media/W5eoZHPpUx9sapR0eu/giphy.gif" width="28" />
44
- </h2>
45
-
46
- <div align="center">
47
-
48
- | 🚀 Project | ⭐ Stars | 📝 Description |
49
- |-----------|---------|---------------|
50
- | **CRYSNOVA AI** | [![Stars](https://img.shields.io/github/stars/crysnovax/CRYSNOVA_AI?style=flat&color=10b981)](https://github.com/crysnovax/CRYSNOVA_AI) | 550+ Command WhatsApp Bot with AI Integration |
51
- | **API Gateway** | [![Stars](https://img.shields.io/github/stars/crysnovax/API?style=flat&color=10b981)](https://github.com/crysnovax/API) | Nexray Endpoints Unified API Gateway |
52
- | **Economy Engine** | [![Stars](https://img.shields.io/github/stars/crysnovax?style=flat&color=10b981)](https://github.com/crysnovax) | Realistic Virtual Economy with Banking System |
53
-
54
- </div>
55
-
56
-
57
-
58
1
  <p align="center">
59
2
  <img src="https://readme-typing-svg.demolab.com?font=Fira+Code&weight=700&size=32&duration=3000&pause=800&color=10B981&center=true&vCenter=true&width=650&lines=%F0%9F%9A%80+%40crysnovax%2Fbailey%3B+WhatsApp+API+for+Node.js%3B+Rich+Messages+%7C+Meta+AI+Style%3B+Production+Ready+%E2%9C%85" alt="Typing Animation" />
60
3
  </p>
@@ -90,15 +33,18 @@ const crysnova = {
90
33
  | 10 | [Welcome Flow](#welcome-flow) | Auto-greet new contacts with FAQ menus |
91
34
  | 11 | [Payment Messages](#payment-messages) | Invites, invoices, orders, payment requests |
92
35
  | 12 | [Message Options](#message-options) | AI icon, ephemeral, spoilers, view once, raw, and more |
93
- | 13 | [Newsletter Management](#newsletter-management) | Create, update, follow, react, delete newsletters |
94
- | 14 | [Group Management](#group-management) | Create, settings, participants, invites, metadata |
95
- | 15 | [Community Management](#community-management) | Communities, subgroups, linked groups |
96
- | 16 | [Profile & Business](#profile--business) | Profile pictures, business catalog, products, quick replies |
97
- | 17 | [Privacy & Security](#privacy--security) | Last seen, online, status, read receipts, calls |
98
- | 18 | [Events Reference](#events-reference) | Full list of socket event listeners |
99
- | 19 | [Image Processing](#image-processing) | Sharp, NAPI-RS, Jimp auto-detection |
100
- | 20 | [Condition of Use](#condition-of-use) | Channel follow agreement |
101
- | 21 | [Credits](#credits) | Attribution and enhancements |
36
+ | 13 | [Status & Stories](#status--stories) | Post status updates with text, media, mentions |
37
+ | 14 | [Favorites](#favorites) | Manage WhatsApp Favorites list |
38
+ | 15 | [Newsletter Management](#newsletter-management) | Create, update, follow, react, delete newsletters |
39
+ | 16 | [Group Management](#group-management) | Create, settings, participants, invites, metadata |
40
+ | 17 | [Community Management](#community-management) | Communities, subgroups, linked groups |
41
+ | 18 | [Profile & Business](#profile--business) | Profile pictures, business catalog, products, quick replies |
42
+ | 19 | [Privacy & Security](#privacy--security) | Last seen, online, status, read receipts, calls |
43
+ | 20 | [Utility Methods](#utility-methods) | LID mapping, dirty bits, app state sync, props |
44
+ | 21 | [Events Reference](#events-reference) | Full list of socket event listeners |
45
+ | 22 | [Image Processing](#image-processing) | Sharp, NAPI-RS, Jimp auto-detection |
46
+ | 23 | [Condition of Use](#condition-of-use) | Channel follow agreement |
47
+ | 24 | [Credits](#credits) | Attribution and enhancements |
102
48
 
103
49
  ---
104
50
 
@@ -113,12 +59,16 @@ const crysnova = {
113
59
  | Rich Messages | ✅ | Code blocks, tables, inline entities, carousel cards |
114
60
  | Meta AI Style | ✅ | Live thinking indicators without "edited" badges |
115
61
  | Welcome Flow | ✅ | Auto-greet new contacts with interactive FAQ menus |
62
+ | Status Posting | ✅ | Text with colors/fonts, image, video, audio, mentions |
63
+ | Favorites Management | ✅ | Add/remove JIDs with local persistence |
64
+ | HD Profile Picture | ✅ | Full-size upload with no crop or resize via `{ hd: true }` (max 720px) |
65
+ | LID/PN Resolution | ✅ | Cross-resolve LID and phone number JIDs |
66
+ | Member Labels | ✅ | Group participant labels |
116
67
  | No Obfuscation | ✅ | Fully readable, auditable source code |
117
68
  | Newsletter Ready | ✅ | Full media support, quoting, quiz polls |
118
69
  | Image Processing | ✅ | Auto-detects `sharp`, `@napi-rs/image`, or `jimp` |
119
70
  | Safe FFmpeg | ✅ | Uses `spawn` instead of `exec` |
120
71
  | In-Memory Store | ✅ | Reintroduced with minimal ESM adaptation |
121
- | HD Profile Picture | 🆕 | Full-size upload with no crop or resize via `{ hd: true }` |
122
72
 
123
73
  ---
124
74
 
@@ -776,6 +726,10 @@ sock.sendMessage(jid, {
776
726
 
777
727
  ## Meta AI Features
778
728
 
729
+ Meta AI-style thinking indicators and live reasoning feeds. Works on **all WhatsApp clients** — no "Update WhatsApp" messages.
730
+
731
+ > **Note:** These use plain text placeholders with typing indicators, not native Meta AI rendering (which only works on AI-enabled WhatsApp clients). The visual experience is identical — users see "Thinking…" with live step completion.
732
+
779
733
  ### Meta Typing Indicator
780
734
 
781
735
  Show a live thinking indicator that you control. Delete it manually when ready — no "edited" badge ever appears.
@@ -797,6 +751,19 @@ await sock.sendMessage(jid, { delete: placeholder.key })
797
751
  await sock.sendMessage(jid, { text: 'Here is your answer!' })
798
752
  ```
799
753
 
754
+ **What users see:**
755
+ ```
756
+ [typing… indicator]
757
+
758
+ _Thinking…_
759
+ ○ Reading your message…
760
+ ○ Writing response…
761
+
762
+ [auto-deletes]
763
+
764
+ Here is your answer!
765
+ ```
766
+
800
767
  ### Meta Compositing
801
768
 
802
769
  Full flow: indicator shows → auto-deletes → clean final message lands. Works with every rich content type.
@@ -875,6 +842,30 @@ await replayPlanning(
875
842
  )
876
843
  ```
877
844
 
845
+ **What users see:**
846
+ ```
847
+ _Thinking…_
848
+ ○ Understanding your question…
849
+ ○ Searching for data…
850
+ ○ Writing the answer…
851
+
852
+ [step 1 completes]
853
+ _Thinking…_
854
+ ✓ Understanding your question…
855
+ ○ Searching for data…
856
+ ○ Writing the answer…
857
+
858
+ [step 2 completes]
859
+ _Thinking…_
860
+ ✓ Understanding your question…
861
+ ✓ Searching for data…
862
+ ○ Writing the answer…
863
+
864
+ [all done, deletes, then:]
865
+
866
+ const answer = 42
867
+ ```
868
+
878
869
  **Step type helpers:**
879
870
 
880
871
  ```javascript
@@ -1149,6 +1140,161 @@ sock.sendMessage(jid, {
1149
1140
 
1150
1141
  ---
1151
1142
 
1143
+ ## Status & Stories
1144
+
1145
+ Post WhatsApp status updates with text, media, and targeted mentions.
1146
+
1147
+ ### Text Status
1148
+
1149
+ ```javascript
1150
+ // Plain text status
1151
+ sock.sendMessage(jid, {
1152
+ text: 'Hello world!',
1153
+ status: true
1154
+ })
1155
+
1156
+ // With background color (named)
1157
+ sock.sendMessage(jid, {
1158
+ text: 'Hello world!',
1159
+ status: true,
1160
+ backgroundColor: '#FFD32B2B' // red
1161
+ })
1162
+
1163
+ // With hex color
1164
+ sock.sendMessage(jid, {
1165
+ text: 'Hello world!',
1166
+ status: true,
1167
+ backgroundColor: '#FF0057FF' // blue
1168
+ })
1169
+
1170
+ // With font style (0-5)
1171
+ sock.sendMessage(jid, {
1172
+ text: 'Hello world!',
1173
+ status: true,
1174
+ backgroundColor: '#FF1FA15A', // green
1175
+ font: 2 // norican
1176
+ })
1177
+ ```
1178
+
1179
+ **Available colors:** `red`, `blue`, `green`, `black`, `white`, `purple`, `orange`, `pink`, `yellow`, `teal`
1180
+
1181
+ **Available fonts:** `0=sans`, `1=serif`, `2=norican`, `3=bryndan`, `4=bebasneue`, `5=futura`
1182
+
1183
+ ### Media Status
1184
+
1185
+ ```javascript
1186
+ // Image status
1187
+ sock.sendMessage(jid, {
1188
+ image: { url: './image.jpg' },
1189
+ caption: 'My status!',
1190
+ status: true
1191
+ })
1192
+
1193
+ // Video status
1194
+ sock.sendMessage(jid, {
1195
+ video: { url: './video.mp4' },
1196
+ caption: 'Watch this!',
1197
+ status: true
1198
+ })
1199
+
1200
+ // Audio status
1201
+ sock.sendMessage(jid, {
1202
+ audio: { url: './audio.mp3' },
1203
+ ptt: false,
1204
+ status: true
1205
+ })
1206
+ ```
1207
+
1208
+ ### Status with Targeted Viewers
1209
+
1210
+ ```javascript
1211
+ // Only specific contacts can see the status
1212
+ sock.sendMessage(jid, {
1213
+ text: 'Exclusive status!',
1214
+ status: true,
1215
+ statusJidList: [
1216
+ '628123456789@s.whatsapp.net',
1217
+ '628987654321@s.whatsapp.net'
1218
+ ]
1219
+ })
1220
+ ```
1221
+
1222
+ ### Status Mentions
1223
+
1224
+ ```javascript
1225
+ // Mention users/groups in status (they get a notification)
1226
+ sock.sendMessage([jidA, jidB, jidC], {
1227
+ text: 'Hey check my status!'
1228
+ })
1229
+ ```
1230
+
1231
+ ---
1232
+
1233
+ ## Favorites
1234
+
1235
+ Manage your WhatsApp Favorites list — add, remove, and sync across devices.
1236
+
1237
+ ### Add to Favorites
1238
+
1239
+ ```javascript
1240
+ // Add a single JID
1241
+ await sock.addToFavorites(['628123456789@s.whatsapp.net'])
1242
+
1243
+ // Add multiple JIDs (replaces entire list — merge handled by caller)
1244
+ await sock.addToFavorites([
1245
+ '628123456789@s.whatsapp.net',
1246
+ '628987654321@s.whatsapp.net',
1247
+ '1234@g.us'
1248
+ ])
1249
+ ```
1250
+
1251
+ ### Remove from Favorites
1252
+
1253
+ ```javascript
1254
+ // Remove specific JIDs (pass remaining list after filter)
1255
+ await sock.removeFromFavorites([
1256
+ '628123456789@s.whatsapp.net' // only this one remains
1257
+ ])
1258
+ ```
1259
+
1260
+ ### Full Example with Local Persistence
1261
+
1262
+ ```javascript
1263
+ const fs = require('fs')
1264
+ const path = require('path')
1265
+
1266
+ const FAV_FILE = path.join(__dirname, 'database', 'favorites.json')
1267
+
1268
+ const loadFavs = () => {
1269
+ try { return JSON.parse(fs.readFileSync(FAV_FILE, 'utf8')) }
1270
+ catch { return [] }
1271
+ }
1272
+
1273
+ const saveFavs = (favs) => {
1274
+ fs.mkdirSync(path.dirname(FAV_FILE), { recursive: true })
1275
+ fs.writeFileSync(FAV_FILE, JSON.stringify(favs, null, 2))
1276
+ }
1277
+
1278
+ // Add
1279
+ const existing = loadFavs()
1280
+ const target = '628123456789@s.whatsapp.net'
1281
+ if (!existing.includes(target)) {
1282
+ const merged = [...existing, target]
1283
+ await sock.addToFavorites(merged)
1284
+ saveFavs(merged)
1285
+ }
1286
+
1287
+ // Remove
1288
+ const toRemove = '628123456789@s.whatsapp.net'
1289
+ const remaining = existing.filter(jid => jid !== toRemove)
1290
+ await sock.addToFavorites(remaining)
1291
+ saveFavs(remaining)
1292
+ ```
1293
+
1294
+ > **Note:** WhatsApp favorites use a single app state record. Each `SET` replaces the entire list. Always pass the complete desired array.
1295
+
1296
+ ---
1297
+
1152
1298
  ## Newsletter Management
1153
1299
 
1154
1300
  ```javascript
@@ -1344,7 +1490,9 @@ sock.updateProfilePicture(jid, { url })
1344
1490
  // Standard with custom dimensions
1345
1491
  sock.updateProfilePicture(jid, { url }, { width: 640, height: 640 })
1346
1492
 
1347
- // 🆕 HD — full resolution, no crop, no resize
1493
+ // HD — preserves original aspect ratio, no crop, no padding
1494
+ // Images under 720px pass through unchanged.
1495
+ // Larger images are scaled down proportionally to fit within 720px.
1348
1496
  sock.updateProfilePicture(jid, buffer, { hd: true })
1349
1497
  sock.updateProfilePicture(jid, { url }, { hd: true })
1350
1498
 
@@ -1498,6 +1646,91 @@ sock.updateDisableLinkPreviewsPrivacy(true)
1498
1646
 
1499
1647
  ---
1500
1648
 
1649
+ ## Utility Methods
1650
+
1651
+ ### LID / Phone Number Resolution
1652
+
1653
+ ```javascript
1654
+ // Resolve LID ↔ PN cross-mappings
1655
+ const userId = await sock.findUserId('628123456789@s.whatsapp.net')
1656
+ console.log(userId)
1657
+ // { lid: '1234567890@lid', phoneNumber: '628123456789@s.whatsapp.net' }
1658
+
1659
+ const userId2 = await sock.findUserId('1234567890@lid')
1660
+ console.log(userId2)
1661
+ // { lid: '1234567890@lid', phoneNumber: '628123456789@s.whatsapp.net' }
1662
+ ```
1663
+
1664
+ ### Fetch User Status
1665
+
1666
+ ```javascript
1667
+ // Fetch status metadata for one or more users
1668
+ const statusList = await sock.fetchStatus('628123456789@s.whatsapp.net', '628987654321@s.whatsapp.net')
1669
+ ```
1670
+
1671
+ ### Fetch Disappearing Duration
1672
+
1673
+ ```javascript
1674
+ // Get disappearing message duration for contacts
1675
+ const durations = await sock.fetchDisappearingDuration('628123456789@s.whatsapp.net')
1676
+ ```
1677
+
1678
+ ### Bot List
1679
+
1680
+ ```javascript
1681
+ // Fetch official bot list (v2)
1682
+ const bots = await sock.getBotListV2()
1683
+ // [{ jid: '...', personaId: '...' }]
1684
+ ```
1685
+
1686
+ ### Call Links
1687
+
1688
+ ```javascript
1689
+ // Create voice/video call link
1690
+ const token = await sock.createCallLink('audio') // voice call
1691
+ const token2 = await sock.createCallLink('video') // video call
1692
+ const token3 = await sock.createCallLink('video', { // with scheduled event
1693
+ startTime: Date.now() + 3600000
1694
+ })
1695
+ ```
1696
+
1697
+ ### Server Properties
1698
+
1699
+ ```javascript
1700
+ // Access server-assigned AB props
1701
+ console.log(sock.serverProps)
1702
+ // {
1703
+ // privacyTokenOn1to1: true, // tctoken on 1:1 messages
1704
+ // profilePicPrivacyToken: true, // tctoken on profile pic IQs
1705
+ // lidTrustedTokenIssueToLid: false // issue tctokens to LID
1706
+ // }
1707
+ ```
1708
+
1709
+ ### App State Sync
1710
+
1711
+ ```javascript
1712
+ // Force resync specific collections
1713
+ await sock.resyncAppState(['regular_high', 'regular_low'], false)
1714
+
1715
+ // Apply custom app patch
1716
+ await sock.appPatch({
1717
+ syncAction: { ... },
1718
+ index: ['...'],
1719
+ type: 'regular_low',
1720
+ apiVersion: 5,
1721
+ operation: proto.SyncdMutation.SyncdOperation.SET
1722
+ })
1723
+ ```
1724
+
1725
+ ### Clean Dirty Bits
1726
+
1727
+ ```javascript
1728
+ // Clear dirty bits for specific sync types
1729
+ await sock.cleanDirtyBits('account_sync', timestamp)
1730
+ ```
1731
+
1732
+ ---
1733
+
1501
1734
  ## Events Reference
1502
1735
 
1503
1736
  ```javascript
@@ -1611,6 +1844,10 @@ Full credit to the original maintainers and contributors:
1611
1844
  - Rich message types (code blocks, tables, inline entities)
1612
1845
  - Meta AI-style compositing and replay planning
1613
1846
  - Welcome flow with FAQ auto-greeting
1847
+ - Status posting with text, media, colors, fonts, mentions
1848
+ - Favorites management with full list sync
1849
+ - LID/PN cross-resolution
1850
+ - Member labels for groups
1614
1851
  - Newsletter media fixes and quiz support
1615
1852
  - Image processing auto-detection
1616
1853
  - Safe FFmpeg spawn-based execution
@@ -5,7 +5,7 @@ import { DEFAULT_CACHE_TTLS, HISTORY_SYNC_PAUSED_TIMEOUT_MS, PROCESSABLE_HISTORY
5
5
  import { ALL_WA_PATCH_NAMES } from '../Types/index.js';
6
6
  import { SyncState } from '../Types/State.js';
7
7
  import { chatModificationToAppPatch, decodePatches, decodeSyncdSnapshot, encodeSyncdPatch, ensureLTHashStateVersion, extractSyncdPatches, generateProfilePicture, getHistoryMsg, isAppStateSyncIrrecoverable, isMissingKeyError, MAX_SYNC_ATTEMPTS, newLTHashState, processSyncAction } from '../Utils/index.js';
8
- import { getStream, toBuffer } from '../Utils/messages-media.js';
8
+ import { generateProfilePictureHD } from '../Utils/messages-media.js';
9
9
  import { makeMutex } from '../Utils/make-mutex.js';
10
10
  import processMessage from '../Utils/process-message.js';
11
11
  import { buildTcTokenFromJid } from '../Utils/tc-token-utils.js';
@@ -228,18 +228,12 @@ export const makeChatsSocket = (config) => {
228
228
  else {
229
229
  targetJid = undefined;
230
230
  }
231
- let img;
232
- if (dimensions?.hd) {
233
- // crysnovax@HD-Profile --- bypass resize/crop, send raw buffer directly
234
- if (Buffer.isBuffer(content)) {
235
- img = content;
236
- } else {
237
- const { stream } = await getStream(content);
238
- img = await toBuffer(stream);
239
- }
240
- } else {
241
- ({ img } = await generateProfilePicture(content, dimensions));
242
- }
231
+ // crysnovax@HD-Profile --- Dual mode:
232
+ // hd:true → generateProfilePictureHD (preserves aspect ratio, caps at 1920, manages file size)
233
+ // standard generateProfilePicture (720×720 square crop, or custom dimensions)
234
+ const { img } = dimensions?.hd
235
+ ? await generateProfilePictureHD(content)
236
+ : await generateProfilePicture(content, dimensions);
243
237
  await query({
244
238
  tag: 'iq',
245
239
  attrs: {
@@ -942,6 +936,26 @@ export const makeChatsSocket = (config) => {
942
936
  quickReply: { timestamp, deleted: true }
943
937
  }, '');
944
938
  };
939
+ /**
940
+ * crysnovax@Favorites --- Set complete WhatsApp Favorites list.
941
+ * Replaces server-side list with the provided array (merging is handled by caller).
942
+ * @param jids — complete array of JIDs to set as favorites
943
+ */
944
+ const addToFavorites = (jids) => {
945
+ return chatModify({
946
+ favorites: { jids, add: true }
947
+ }, '');
948
+ };
949
+ /**
950
+ * crysnovax@Favorites --- Remove all favorites (clear list).
951
+ */
952
+ const removeFromFavorites = (jids) => {
953
+ // For single removal, caller must pass remaining list to addToFavorites
954
+ // This sends the provided jids array (should be remaining items after filter)
955
+ return chatModify({
956
+ favorites: { jids, add: true }
957
+ }, '');
958
+ };
945
959
  /**
946
960
  * queries need to be fired on connection open
947
961
  * help ensure parity with WA Web
@@ -1228,6 +1242,8 @@ export const makeChatsSocket = (config) => {
1228
1242
  removeMessageLabel,
1229
1243
  star,
1230
1244
  addOrEditQuickReply,
1231
- removeQuickReply
1245
+ removeQuickReply,
1246
+ addToFavorites,
1247
+ removeFromFavorites
1232
1248
  };
1233
1249
  };
@@ -5,6 +5,7 @@ import { DEFAULT_CACHE_TTLS, HISTORY_SYNC_PAUSED_TIMEOUT_MS, PROCESSABLE_HISTORY
5
5
  import { ALL_WA_PATCH_NAMES } from '../Types/index.js';
6
6
  import { SyncState } from '../Types/State.js';
7
7
  import { chatModificationToAppPatch, decodePatches, decodeSyncdSnapshot, encodeSyncdPatch, ensureLTHashStateVersion, extractSyncdPatches, generateProfilePicture, getHistoryMsg, isAppStateSyncIrrecoverable, isMissingKeyError, MAX_SYNC_ATTEMPTS, newLTHashState, processSyncAction } from '../Utils/index.js';
8
+ import { generateProfilePictureHD } from '../Utils/messages-media.js';
8
9
  import { makeMutex } from '../Utils/make-mutex.js';
9
10
  import processMessage from '../Utils/process-message.js';
10
11
  import { buildTcTokenFromJid } from '../Utils/tc-token-utils.js';
@@ -207,7 +208,15 @@ export const makeChatsSocket = (config) => {
207
208
  }
208
209
  return userId;
209
210
  };
210
- /** update the profile picture for yourself or a group */
211
+ /** update the profile picture for yourself or a group
212
+ *
213
+ * Standard (crop + resize to 720×720):
214
+ * sock.updateProfilePicture(jid, content)
215
+ * sock.updateProfilePicture(jid, content, { width: 640, height: 640 })
216
+ *
217
+ * HD (full-size, no crop, no resize):
218
+ * sock.updateProfilePicture(jid, content, { hd: true })
219
+ */
211
220
  const updateProfilePicture = async (jid, content, dimensions) => {
212
221
  let targetJid;
213
222
  if (!jid) {
@@ -219,7 +228,12 @@ export const makeChatsSocket = (config) => {
219
228
  else {
220
229
  targetJid = undefined;
221
230
  }
222
- const { img } = await generateProfilePicture(content, dimensions);
231
+ // crysnovax@HD-Profile --- Dual mode:
232
+ // hd:true → generateProfilePictureHD (preserves aspect ratio, caps at 1920, manages file size)
233
+ // standard → generateProfilePicture (720×720 square crop, or custom dimensions)
234
+ const { img } = dimensions?.hd
235
+ ? await generateProfilePictureHD(content)
236
+ : await generateProfilePicture(content, dimensions);
223
237
  await query({
224
238
  tag: 'iq',
225
239
  attrs: {
@@ -1218,6 +1218,36 @@ export const makeMessagesSocket = (config) => {
1218
1218
  : disappearingMessagesInChat;
1219
1219
  await groupToggleEphemeral(jid, value);
1220
1220
  }
1221
+ // crysnovax@Status --- status:true flag routes any message type to status@broadcast
1222
+ // Supports: text with backgroundColor + font, image, video, audio, sticker
1223
+ // Usage: sock.sendMessage(jid, { text: 'Hello', status: true, backgroundColor: '#FF0000', font: 2 })
1224
+ // sock.sendMessage(jid, { audio: buffer, status: true, ptt: false })
1225
+ else if ('status' in content && content.status === true) {
1226
+ const { status: _, backgroundColor, font, statusJidList: contentJidList, ...statusContent } = content;
1227
+ const fullMsg = await generateWAMessage('status@broadcast', statusContent, {
1228
+ logger,
1229
+ userJid,
1230
+ upload: waUploadToServer,
1231
+ mediaCache: config.mediaCache,
1232
+ options: config.options,
1233
+ ...options,
1234
+ ...(backgroundColor ? { backgroundColor } : {}),
1235
+ ...(font !== undefined ? { font } : {}),
1236
+ messageId: generateMessageIDV2(userJid)
1237
+ });
1238
+ await relayMessage('status@broadcast', fullMsg.message, {
1239
+ messageId: fullMsg.key.id,
1240
+ statusJidList: contentJidList || options.statusJidList,
1241
+ additionalAttributes: options.additionalAttributes || {},
1242
+ additionalNodes: options.additionalNodes || []
1243
+ });
1244
+ if (config.emitOwnEvents) {
1245
+ process.nextTick(async () => {
1246
+ await messageMutex.mutex(() => upsertMessage(fullMsg, 'append'));
1247
+ });
1248
+ }
1249
+ return fullMsg;
1250
+ }
1221
1251
  else {
1222
1252
  const fullMsg = await generateWAMessage(jid, content, {
1223
1253
  logger,