@ryuu-reinzz/haruka-lib 4.0.1 → 4.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/main/socket.js +177 -105
  2. package/package.json +1 -1
package/main/socket.js CHANGED
@@ -51,9 +51,9 @@ import Sticker from './sticker-engine/index.js';
51
51
  const __filename = fileURLToPath(import.meta.url);
52
52
  const __dirname = dirname(__filename);
53
53
  let Button,
54
- ButtonV2,
55
- Carousel,
56
- AIRich;
54
+ ButtonV2,
55
+ Carousel,
56
+ AIRich;
57
57
  /**
58
58
  * @param {import('baileys').WASocket} socket
59
59
  */
@@ -1547,111 +1547,180 @@ function addProperty(socket, baileys) {
1547
1547
  text,
1548
1548
  contextInfo = {}
1549
1549
  } = content;
1550
- let {
1551
- title,
1552
- description,
1553
- thumbnail,
1554
- sourceUrl,
1555
- largerThumbnail = false,
1556
- favicon = false
1557
- } = contextInfo?.previewThumbnail || {};
1558
- let buffer;
1559
- let favBuffer;
1560
- try {
1561
- if (!contextInfo?.previewThumbnail) return await sendMessage(jid, content, options);
1562
-
1563
- if (Buffer.isBuffer(thumbnail)) {
1564
- buffer = thumbnail;
1565
- } else if (thumbnail.url) {
1566
- let response = await fetch(thumbnail.url);
1567
- if (!response.ok) throw new Error(`Gagal fetch thumbnail: ${response.statusText}`);
1568
- let arrayBuffer = await response.arrayBuffer();
1569
- buffer = Buffer.from(arrayBuffer);
1570
- }
1571
- if (Buffer.isBuffer(favicon)) {
1572
- favBuffer = favicon;
1573
- } else if (favicon?.url) {
1574
- let response = await fetch(favicon.url);
1575
- if (!response.ok) throw new Error(`Gagal fetch favicon: ${response.statusText}`);
1576
- let arrayBuffer = await response.arrayBuffer();
1577
- favBuffer = Buffer.from(arrayBuffer);
1578
- } else {
1550
+
1551
+ if (contextInfo?.previewThumbnail) {
1552
+ let {
1553
+ title,
1554
+ description,
1555
+ thumbnail,
1556
+ sourceUrl,
1557
+ largerThumbnail = false,
1579
1558
  favicon = false
1580
- }
1581
- let miniPreview = (await sharp(buffer).resize(90, 90, {
1582
- fit: "cover",
1583
- position: "centre"
1584
- }).jpeg({
1585
- quality: 80
1586
- }).toBuffer()).toString("base64");
1587
-
1588
- let miniFavicon = favicon ? await sharp(favBuffer)
1589
- .resize(48, 48, {
1559
+ } = contextInfo.previewThumbnail || {};
1560
+
1561
+ let buffer;
1562
+ let favBuffer;
1563
+
1564
+ try {
1565
+ if (Buffer.isBuffer(thumbnail)) {
1566
+ buffer = thumbnail;
1567
+ } else if (thumbnail?.url) {
1568
+ let response = await fetch(thumbnail.url);
1569
+ if (!response.ok) throw new Error(`Gagal fetch thumbnail: ${response.statusText}`);
1570
+ let arrayBuffer = await response.arrayBuffer();
1571
+ buffer = Buffer.from(arrayBuffer);
1572
+ }
1573
+
1574
+ if (Buffer.isBuffer(favicon)) {
1575
+ favBuffer = favicon;
1576
+ } else if (favicon?.url) {
1577
+ let response = await fetch(favicon.url);
1578
+ if (!response.ok) throw new Error(`Gagal fetch favicon: ${response.statusText}`);
1579
+ let arrayBuffer = await response.arrayBuffer();
1580
+ favBuffer = Buffer.from(arrayBuffer);
1581
+ } else {
1582
+ favicon = false;
1583
+ }
1584
+
1585
+ let miniPreview = (await sharp(buffer).resize(90, 90, {
1590
1586
  fit: "cover",
1591
1587
  position: "centre"
1592
- })
1593
- .jpeg({
1588
+ }).jpeg({
1594
1589
  quality: 80
1595
- })
1596
- .toBuffer() : undefined;
1597
- let Thumbnail = await prepareWAMessageMedia({
1598
- image: buffer
1599
- }, {
1600
- upload: socket.waUploadToServer,
1601
- mediaTypeOverride: "thumbnail-link"
1602
- });
1603
- let Favicon = favicon ? await prepareWAMessageMedia({
1604
- image: miniFavicon
1605
- }, {
1606
- upload: socket.waUploadToServer,
1607
- mediaTypeOverride: "thumbnail-link"
1608
- }) : undefined;
1609
- let message = {
1610
- extendedTextMessage: {
1611
- text: sourceUrl + "\n\n" + text,
1612
- matchedText: sourceUrl,
1613
- description: description,
1614
- title: title,
1615
- previewType: 'NONE',
1616
- jpegThumbnail: miniPreview,
1617
- thumbnailDirectPath: largerThumbnail ? Thumbnail?.imageMessage?.directPath : undefined,
1618
- thumbnailSha256: largerThumbnail ? Thumbnail?.imageMessage?.fileSha256 : undefined,
1619
- thumbnailEncSha256: largerThumbnail ? Thumbnail?.imageMessage?.fileEncSha256 : undefined,
1620
- mediaKey: largerThumbnail ? Thumbnail?.imageMessage?.mediaKey : undefined,
1621
- mediaKeyTimestamp: Math.floor(Date.now() / 1000).toString(),
1622
- thumbnailHeight: largerThumbnail ? Thumbnail?.imageMessage?.height : undefined,
1623
- thumbnailWidth: largerThumbnail ? Thumbnail?.imageMessage?.width : undefined,
1624
- type: "thumbnail",
1625
- faviconMMSMetadata: {
1626
- thumbnailDirectPath: Favicon?.imageMessage?.directPath,
1627
- thumbnailSha256: Favicon?.imageMessage?.fileSha256,
1628
- thumbnailEncSha256: Favicon?.imageMessage?.fileEncSha256,
1629
- mediaKey: Favicon?.imageMessage?.mediaKey,
1590
+ }).toBuffer()).toString("base64");
1591
+
1592
+ let miniFavicon = favicon ? await sharp(favBuffer)
1593
+ .resize(48, 48, {
1594
+ fit: "cover",
1595
+ position: "centre"
1596
+ })
1597
+ .jpeg({
1598
+ quality: 80
1599
+ })
1600
+ .toBuffer() : undefined;
1601
+
1602
+ let Thumbnail = await prepareWAMessageMedia({
1603
+ image: buffer
1604
+ }, {
1605
+ upload: socket.waUploadToServer,
1606
+ mediaTypeOverride: "thumbnail-link"
1607
+ });
1608
+
1609
+ let Favicon = favicon ? await prepareWAMessageMedia({
1610
+ image: miniFavicon
1611
+ }, {
1612
+ upload: socket.waUploadToServer,
1613
+ mediaTypeOverride: "thumbnail-link"
1614
+ }) : undefined;
1615
+
1616
+ let message = {
1617
+ extendedTextMessage: {
1618
+ text: sourceUrl + "\n\n" + text,
1619
+ matchedText: sourceUrl,
1620
+ description: description,
1621
+ title: title,
1622
+ previewType: 'NONE',
1623
+ jpegThumbnail: miniPreview,
1624
+ thumbnailDirectPath: largerThumbnail ? Thumbnail?.imageMessage?.directPath : undefined,
1625
+ thumbnailSha256: largerThumbnail ? Thumbnail?.imageMessage?.fileSha256 : undefined,
1626
+ thumbnailEncSha256: largerThumbnail ? Thumbnail?.imageMessage?.fileEncSha256 : undefined,
1627
+ mediaKey: largerThumbnail ? Thumbnail?.imageMessage?.mediaKey : undefined,
1630
1628
  mediaKeyTimestamp: Math.floor(Date.now() / 1000).toString(),
1631
- thumbnailHeight: Favicon?.imageMessage?.height,
1632
- thumbnailWidth: Favicon?.imageMessage?.width
1633
- },
1634
- inviteLinkGroupTypeV2: 'DEFAULT',
1635
- contextInfo: {
1636
- ...contextInfo,
1637
- ...(options.quoted ? {
1638
- stanzaId: options.quoted.key.id,
1639
- participant: options.quoted.key.participant || options.quoted.key.remoteJid,
1640
- quotedMessage: options.quoted.message,
1641
- remoteJid: options.quoted.key.remoteJid
1642
- } : {})
1629
+ thumbnailHeight: largerThumbnail ? Thumbnail?.imageMessage?.height : undefined,
1630
+ thumbnailWidth: largerThumbnail ? Thumbnail?.imageMessage?.width : undefined,
1631
+ type: "thumbnail",
1632
+ faviconMMSMetadata: {
1633
+ thumbnailDirectPath: Favicon?.imageMessage?.directPath,
1634
+ thumbnailSha256: Favicon?.imageMessage?.fileSha256,
1635
+ thumbnailEncSha256: Favicon?.imageMessage?.fileEncSha256,
1636
+ mediaKey: Favicon?.imageMessage?.mediaKey,
1637
+ mediaKeyTimestamp: Math.floor(Date.now() / 1000).toString(),
1638
+ thumbnailHeight: Favicon?.imageMessage?.height,
1639
+ thumbnailWidth: Favicon?.imageMessage?.width
1640
+ },
1641
+ inviteLinkGroupTypeV2: 'DEFAULT',
1642
+ contextInfo: {
1643
+ ...contextInfo,
1644
+ ...(options.quoted ? {
1645
+ stanzaId: options.quoted.key.id,
1646
+ participant: options.quoted.key.participant || options.quoted.key.remoteJid,
1647
+ quotedMessage: options.quoted.message,
1648
+ remoteJid: options.quoted.key.remoteJid
1649
+ } : {})
1650
+ }
1643
1651
  }
1644
- }
1645
- };
1652
+ };
1646
1653
 
1654
+ await socket.relayMessage(jid, message, {});
1655
+ return message;
1656
+ } catch (err) {
1657
+ console.error(err);
1658
+ return;
1659
+ }
1660
+ }
1647
1661
 
1648
- await socket.relayMessage(jid, message, {});
1662
+ if (contextInfo?.previewThumbnailV2) {
1663
+ let {
1664
+ title,
1665
+ description,
1666
+ thumbnail,
1667
+ sourceUrl
1668
+ } = contextInfo.previewThumbnailV2 || {};
1669
+
1670
+ if (typeof jid !== "string") throw new TypeError("jid is not string");
1671
+ if (typeof text !== "string") throw new TypeError("text is not string");
1672
+ if (typeof sourceUrl !== "string") throw new TypeError("sourceUrl (link) is not string");
1673
+ if (typeof title !== "string") throw new TypeError("title is not string");
1674
+ if (description && typeof description !== "string") throw new TypeError("description is not string");
1675
+ if (thumbnail && !Buffer.isBuffer(thumbnail) && typeof thumbnail.url !== "string") {
1676
+ throw new TypeError("thumbnail must be Buffer or object with url key");
1677
+ }
1649
1678
 
1650
- return message;
1651
- } catch (err) {
1652
- console.log(err)
1679
+ try {
1680
+ let bufferV2;
1681
+ if (Buffer.isBuffer(thumbnail)) {
1682
+ bufferV2 = thumbnail;
1683
+ } else if (thumbnail?.url) {
1684
+ let response = await fetch(thumbnail.url);
1685
+ if (!response.ok) throw new Error(`Gagal fetch thumbnail V2: ${response.statusText}`);
1686
+ let arrayBuffer = await response.arrayBuffer();
1687
+ bufferV2 = Buffer.from(arrayBuffer);
1688
+ }
1689
+
1690
+ const image = bufferV2 ?
1691
+ await prepareWAMessageMedia({
1692
+ image: bufferV2
1693
+ }, {
1694
+ upload: socket.waUploadToServer,
1695
+ mediaTypeOverride: "thumbnail-link",
1696
+ }).then((v) => v.imageMessage) :
1697
+ undefined;
1698
+
1699
+ text = text.includes(sourceUrl) ? text : `${sourceUrl}\n${text}`;
1700
+ return await socket.sendMessage(
1701
+ jid, {
1702
+ text,
1703
+ linkPreview: {
1704
+ "matched-text": sourceUrl,
1705
+ title,
1706
+ description,
1707
+ jpegThumbnail: image?.jpegThumbnail,
1708
+ highQualityThumbnail: image,
1709
+ },
1710
+ contextInfo: {
1711
+ ...contextInfo,
1712
+ previewThumbnailV2: undefined
1713
+ }
1714
+ },
1715
+ options
1716
+ );
1717
+ } catch (err) {
1718
+ console.error(err);
1719
+ return;
1720
+ }
1653
1721
  }
1654
- },
1722
+ return await socket.sendMessage(jid, content, options);
1723
+ },
1655
1724
  messageBuilder: function(jid, options = {}) {
1656
1725
  let currentInstancePromise = null;
1657
1726
 
@@ -1667,7 +1736,9 @@ function addProperty(socket, baileys) {
1667
1736
  if (type === 'AIRich') return new AIRich(socket);
1668
1737
  if (type === 'tutorial') {
1669
1738
  const aiRich = new AIRich(socket);
1670
- const fullText = await Buffer.from((await axios.get("https://raw.githubusercontent.com/reinzz556/haruka/refs/heads/main/readme.md", { responseType: "arraybuffer" })).data).toString()
1739
+ const fullText = await Buffer.from((await axios.get("https://raw.githubusercontent.com/reinzz556/haruka/refs/heads/main/readme.md", {
1740
+ responseType: "arraybuffer"
1741
+ })).data).toString()
1671
1742
  const codeBlockRegex = /```(\w*)\n([\s\S]*?)\n```/g;
1672
1743
 
1673
1744
  let lastIndex = 0;
@@ -1692,7 +1763,7 @@ function addProperty(socket, baileys) {
1692
1763
  aiRich.addText(remainingText);
1693
1764
  }
1694
1765
 
1695
-
1766
+
1696
1767
  return aiRich;
1697
1768
  }
1698
1769
  throw new Error(`Type ${type} tidak dikenali. Jika belum tau cara penggunaannya, silahkan execute kode ini:\n\`\`\`js\nreturn await socket.messageBuilder(m.chat).setType("tutorial").send()\n\`\`\``);
@@ -1728,7 +1799,8 @@ function addProperty(socket, baileys) {
1728
1799
 
1729
1800
  const proxy = new Proxy({}, handler);
1730
1801
  return proxy;
1731
- }, sendStickerPack: async (jid, packData, options = {}) => {
1802
+ },
1803
+ sendStickerPack: async (jid, packData, options = {}) => {
1732
1804
  try {
1733
1805
  const {
1734
1806
  name,
@@ -2445,8 +2517,8 @@ function addProperty(socket, baileys) {
2445
2517
 
2446
2518
  export default addProperty;
2447
2519
  export {
2448
- Button,
2449
- ButtonV2,
2450
- Carousel,
2451
- AIRich
2520
+ Button,
2521
+ ButtonV2,
2522
+ Carousel,
2523
+ AIRich
2452
2524
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ryuu-reinzz/haruka-lib",
3
- "version": "4.0.1",
3
+ "version": "4.0.2",
4
4
  "description": "Library extra for bot WhatsApp",
5
5
  "main": "main/index.js",
6
6
  "type": "module",