@stoatx/client 0.1.1 → 0.2.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.
package/dist/index.js CHANGED
@@ -384,7 +384,7 @@ var GatewayManager = class {
384
384
  if (payload.users) {
385
385
  for (const rawUser of payload.users) {
386
386
  this.client.users._add(rawUser);
387
- if (rawUser.relation === "User" && !this.client.user) {
387
+ if (rawUser.relationship === "User" && !this.client.user) {
388
388
  this.client.user = new ClientUser(this.client, rawUser);
389
389
  }
390
390
  }
@@ -551,7 +551,8 @@ var GatewayManager = class {
551
551
  }
552
552
  reconnect() {
553
553
  if (!this.token) {
554
- return this.client.emit("error", new Error("RECONNECT_FAILED: No token available."));
554
+ this.client.emit("error", new Error("RECONNECT_FAILED: No token available."));
555
+ return;
555
556
  }
556
557
  let waitTime = Math.pow(2, this.reconnectAttempts) * 1e3;
557
558
  const jitter = waitTime * 0.2 * Math.random();
@@ -827,11 +828,17 @@ import * as util2 from "util";
827
828
 
828
829
  // src/managers/BaseManager.ts
829
830
  var BaseManager = class {
831
+ cache;
832
+ client;
830
833
  constructor(client, limit = Infinity) {
831
834
  this.client = client;
832
835
  this.cache = new Collection(limit);
836
+ Object.defineProperty(this, "client", {
837
+ value: client,
838
+ enumerable: false,
839
+ writable: false
840
+ });
833
841
  }
834
- cache;
835
842
  /**
836
843
  * Transforms raw data into a Structure, patches if existing, and saves to cache.
837
844
  * @internal
@@ -1540,16 +1547,28 @@ var MemberRoleManager = class {
1540
1547
  }
1541
1548
  };
1542
1549
 
1550
+ // src/utils/Constants.ts
1551
+ var StoatCDN = "https://cdn.stoatusercontent.com";
1552
+
1543
1553
  // src/structures/Member.ts
1544
1554
  var Member = class extends Base {
1555
+ // The server ID the member is in
1545
1556
  serverId;
1557
+ // The nickname the member has in the server, if any.
1546
1558
  nickname = null;
1559
+ // The avatar the member has in the server, if any.
1547
1560
  avatar = null;
1548
- roleIds = [];
1561
+ /** @internal */
1562
+ _roles = [];
1563
+ // The date the member joined the server
1549
1564
  joinedAt;
1565
+ // The date the member's timeout expires, or null if not timed out
1550
1566
  timeout = null;
1567
+ // Whatever the user can talk in Voice Chat
1551
1568
  canPublish = false;
1569
+ // Whatever the user can hear in Voice Chat
1552
1570
  canRecieve = false;
1571
+ // Member roles manager
1553
1572
  roles;
1554
1573
  constructor(client, data) {
1555
1574
  super(client, { _id: data.user._id });
@@ -1561,11 +1580,17 @@ var Member = class extends Base {
1561
1580
  _patch(data) {
1562
1581
  if (data.nickname !== void 0) this.nickname = data.nickname;
1563
1582
  if (data.avatar !== void 0) this.avatar = data.avatar;
1564
- if (data.roles !== void 0) this.roleIds = data.roles;
1583
+ if (data.roles !== void 0) this._roles = data.roles;
1565
1584
  if (data.timeout !== void 0) this.timeout = data.timeout ? new Date(data.timeout) : null;
1566
1585
  if (data.can_publish !== void 0) this.canPublish = data.canPublish;
1567
1586
  if (data.can_recieve !== void 0) this.canRecieve = data.canRecieve;
1568
1587
  }
1588
+ /**
1589
+ * Get member role IDs
1590
+ */
1591
+ get roleIds() {
1592
+ return this._roles;
1593
+ }
1569
1594
  /** Gets the global User object for this member */
1570
1595
  get user() {
1571
1596
  return this.client.users.cache.get(this.id);
@@ -1574,18 +1599,12 @@ var Member = class extends Base {
1574
1599
  get server() {
1575
1600
  return this.client.servers.cache.get(this.serverId);
1576
1601
  }
1577
- /** Resolves the array of role strings into actual Role objects */
1578
- get roleObjects() {
1579
- const server = this.server;
1580
- if (!server) return [];
1581
- return this.roleIds.map((id) => server.roles.cache.get(id)).filter((role) => role !== void 0);
1582
- }
1583
1602
  /** Calculates the member's total permissions using BigInt */
1584
1603
  get permissions() {
1585
1604
  const server = this.server;
1586
1605
  if (!server) return 0n;
1587
1606
  let totalPerms = server.defaultPermissions ?? 0n;
1588
- for (const role of this.roleObjects) {
1607
+ for (const role of this.roles.cache.values()) {
1589
1608
  totalPerms |= BigInt(role.permissions);
1590
1609
  }
1591
1610
  if (server.ownerId === this.id) {
@@ -1593,40 +1612,76 @@ var Member = class extends Base {
1593
1612
  }
1594
1613
  return totalPerms;
1595
1614
  }
1596
- /** Checks if the member has a specific permission */
1597
- hasPermission(permission) {
1598
- return Permissions.has(this.permissions, permission);
1615
+ /** Get avatar URL for this member, or null if they don't have one.
1616
+ * @example
1617
+ * // Get a member's avatar URL
1618
+ * const avatarURL = member.avatarURL;
1619
+ * console.log(avatarURL); // https://cdn.stoat.chat/attachments/avatars/1234567890/avatar.png
1620
+ */
1621
+ get avatarURL() {
1622
+ if (!this.avatar) return null;
1623
+ return `${StoatCDN}/attachments/avatars/${this.avatar.id}/${this.avatar.filename}`;
1599
1624
  }
1600
1625
  /**
1601
- * Edits this member's nickname, avatar, roles, or timeout.
1626
+ * Ban this member from the server.
1627
+ * @param options The options for this ban
1628
+ * @example
1629
+ * // Ban a member with a reason and delete their messages from the last hour
1630
+ * await member.ban({ reason: "Spamming", deleteMessageSeconds: 3600 });
1602
1631
  */
1603
- async edit(options) {
1632
+ async ban(options) {
1604
1633
  let server = this.server;
1605
1634
  if (!server) server = await this.client.servers.fetch(this.serverId);
1606
- return await server.members.edit(this.id, options);
1635
+ await server.members.ban(this.id, options);
1607
1636
  }
1608
1637
  /**
1609
- * Kicks this member from the server.
1638
+ * Creates a DM channel between the client's user and this member.
1639
+ * @param force If true, forces the creation of a new DM channel even if one already exists.
1640
+ * @returns A promise that resolves to the created DMChannel object.
1641
+ * @throws {Error} If the API request fails.
1642
+ * @example
1643
+ * // Create a DM with this member
1644
+ * const dm = await member.createDM();
1645
+ * console.log(`DM channel ID: ${dm.id}`);
1610
1646
  */
1611
- async kick() {
1647
+ async createDM(force = false) {
1648
+ await this.client.users.createDM(this.id, { force });
1649
+ }
1650
+ /**
1651
+ * Timeout this member for a specified duration.
1652
+ * @param duration The duration of the timeout in milliseconds.
1653
+ * @example
1654
+ * // Timeout a member for 10 minutes (600,000 milliseconds)
1655
+ * await member.setTimeout(600000);
1656
+ */
1657
+ async setTimeout(duration) {
1612
1658
  let server = this.server;
1613
1659
  if (!server) server = await this.client.servers.fetch(this.serverId);
1614
- await server.members.kick(this.id);
1660
+ await server.members.setTimeout(this.id, duration);
1661
+ }
1662
+ /** Checks if the member has a specific permission */
1663
+ hasPermission(permission) {
1664
+ return Permissions.has(this.permissions, permission);
1615
1665
  }
1616
1666
  /**
1617
- * Bans this member from the server.
1618
- * @param options The options for this ban
1667
+ * Edit this member.
1668
+ * @param options The options to edit the member with (nickname, roles, timeout, etc.)
1669
+ * @returns A promise that resolves to the updated Member.
1619
1670
  */
1620
- async ban(options) {
1671
+ async edit(options) {
1621
1672
  let server = this.server;
1622
1673
  if (!server) server = await this.client.servers.fetch(this.serverId);
1623
- await server.members.ban(this.id, options);
1674
+ return await server.members.edit(this.id, options);
1624
1675
  }
1625
- async unban() {
1626
- let server = this.client.servers.cache.get(this.serverId);
1676
+ /**
1677
+ * Kick this member from the server.
1678
+ */
1679
+ async kick() {
1680
+ let server = this.server;
1627
1681
  if (!server) server = await this.client.servers.fetch(this.serverId);
1628
- await server.members.unban(this.id);
1682
+ await server.members.kick(this.id);
1629
1683
  }
1684
+ /** @internal */
1630
1685
  [util4.inspect.custom](depth, options, inspect10) {
1631
1686
  const { client, serverId, ...props } = this;
1632
1687
  return `${this.constructor.name} ${inspect10(
@@ -1664,17 +1719,41 @@ var MemberManager = class extends BaseManager {
1664
1719
  }
1665
1720
  return new Member(this.client, data);
1666
1721
  }
1722
+ /**
1723
+ * Resolve a string or mention to Member
1724
+ * @param member The MemberResolvable to resolve
1725
+ * @returns The resolved Member or undefined if not found
1726
+ */
1667
1727
  resolve(member) {
1668
1728
  if (member instanceof Member) return member;
1669
1729
  if (member instanceof User) return this.cache.get(member.id);
1670
1730
  if (typeof member === "string") return this.cache.get(member.replace(/[<@>]/g, ""));
1671
1731
  return void 0;
1672
1732
  }
1733
+ /**
1734
+ * Resolve a Member to their ID string.
1735
+ * @param member The MemberResolvable to resolve
1736
+ * @returns The resolved ID string
1737
+ * @throws {TypeError} If the provided resolvable is invalid
1738
+ */
1673
1739
  resolveId(member) {
1674
1740
  if (typeof member === "string") return member.replace(/[<@>]/g, "");
1675
1741
  if ("id" in member) return member.id;
1676
1742
  throw new TypeError("Invalid MemberResolvable provided.");
1677
1743
  }
1744
+ /**
1745
+ * Fetches a member from the server, or returns the cached version if available and not forced.
1746
+ * @param member The MemberResolvable to fetch
1747
+ * @param force Whether to bypass the cache and fetch fresh data from the API
1748
+ * @returns A promise that resolves to the fetched Member
1749
+ * @throws {Error} If the API request fails or the member is not found
1750
+ * @example
1751
+ * // Fetch a member by ID, using cache if available
1752
+ * const member = await server.members.fetch("1234567890");
1753
+ *
1754
+ * // Fetch a member by mention, bypassing cache
1755
+ * const member = await server.members.fetch("<@1234567890>", true);
1756
+ */
1678
1757
  async fetch(member, force = false) {
1679
1758
  if (!force) {
1680
1759
  const cached = this.resolve(member);
@@ -1721,6 +1800,14 @@ var MemberManager = class extends BaseManager {
1721
1800
  * Edits a member in the server.
1722
1801
  * @param member The MemberResolvable to edit.
1723
1802
  * @param options The fields to update (nickname, roles, timeout, etc.).
1803
+ * @returns A promise that resolves to the updated Member.
1804
+ * @throws {Error} If the API request fails or the member is not found.
1805
+ * @example
1806
+ * // Change a member's nickname and add a role
1807
+ * const updatedMember = await server.members.edit("1234567890", {
1808
+ * nickname: "New Nickname",
1809
+ * roles: ["roleId1", "roleId2"],
1810
+ * });
1724
1811
  */
1725
1812
  async edit(member, options) {
1726
1813
  const id = this.resolveId(member);
@@ -1747,6 +1834,9 @@ var MemberManager = class extends BaseManager {
1747
1834
  /**
1748
1835
  * Kicks a member from the server.
1749
1836
  * @param member The MemberResolvable to kick.
1837
+ * @example
1838
+ * // Kick a member by ID
1839
+ * await server.members.kick("1234567890");
1750
1840
  */
1751
1841
  async kick(member) {
1752
1842
  const id = this.resolveId(member);
@@ -1757,6 +1847,9 @@ var MemberManager = class extends BaseManager {
1757
1847
  * Bans a member from the server.
1758
1848
  * @param member The MemberResolvable to ban.
1759
1849
  * @param options The ban options
1850
+ * @example
1851
+ * // Ban a member by ID
1852
+ * await server.members.ban("1234567890", { reason: "Spamming", deleteMessageSeconds: 3600 });
1760
1853
  */
1761
1854
  async ban(member, options) {
1762
1855
  const id = this.resolveId(member);
@@ -1769,11 +1862,26 @@ var MemberManager = class extends BaseManager {
1769
1862
  /**
1770
1863
  * Unbans a user from the server
1771
1864
  * @param member The MemberResolvable to unban
1865
+ * @example
1866
+ * // Unban a member by ID
1867
+ * await server.members.unban("1234567890");
1772
1868
  */
1773
1869
  async unban(member) {
1774
1870
  const id = this.resolveId(member);
1775
1871
  await this.client.rest.delete(`/servers/${this.server.id}/bans/${id}`);
1776
1872
  }
1873
+ /**
1874
+ * Timeouts a member in the server for a specified duration.
1875
+ * @param member The MemberResolvable to timeout
1876
+ * @param duration The duration of the timeout in milliseconds
1877
+ * @example
1878
+ * // Timeout a member for 10 minutes
1879
+ * await server.members.setTimeout("1234567890", 10 * 60 * 1000);
1880
+ */
1881
+ async setTimeout(member, duration) {
1882
+ const id = this.resolveId(member);
1883
+ await this.edit(id, { timeout: new Date(Date.now() + duration).toISOString() });
1884
+ }
1777
1885
  [util5.inspect.custom]() {
1778
1886
  return this.cache;
1779
1887
  }
@@ -2138,7 +2246,7 @@ var RoleManager = class extends BaseManager {
2138
2246
  * console.log("Role deleted successfully.");
2139
2247
  *
2140
2248
  * // Delete a role using a Role object
2141
- * const role = await server.roles.fetch("01JE2MM759J5D7CHJF084R7MJ2");
2249
+ * const role = await server.roles.fetch("01JE2MM759J5D7CHJF084R7");
2142
2250
  * await server.roles.delete(role);
2143
2251
  * console.log("Role deleted successfully.");
2144
2252
  *
@@ -2626,6 +2734,38 @@ var UserManager = class extends BaseManager {
2626
2734
  const data = await this.client.rest.patch(`/users/@me`, payload);
2627
2735
  return this._add(data);
2628
2736
  }
2737
+ /**
2738
+ * The DM between the client's user and a user
2739
+ *
2740
+ * @param {string} userId The user id
2741
+ * @returns {?DMChannel}
2742
+ * @private
2743
+ */
2744
+ dmChannel(userId) {
2745
+ return this.client.channels.cache.find((channel) => channel.isDM() && channel.recipients.includes(userId)) ?? null;
2746
+ }
2747
+ /**
2748
+ * Creates a DM channel between the client's user and another user.
2749
+ * @param user The UserResolvable to create a DM with.
2750
+ * @param options Additional options for DM creation.
2751
+ * @param options.force If true, forces the creation of a new DM channel even if one already exists.
2752
+ * @returns A promise that resolves to the created DMChannel object.
2753
+ * @throws {TypeError} If an invalid UserResolvable is provided.
2754
+ * @throws {Error} If the API request fails.
2755
+ * @example
2756
+ * // Create a DM with a user by ID
2757
+ * const dm = await client.users.createDM("1234567890");
2758
+ * console.log(`DM channel ID: ${dm.id}`);
2759
+ */
2760
+ async createDM(user, { force = false } = {}) {
2761
+ const id = this.resolveId(user);
2762
+ if (!force) {
2763
+ const dmChannel = this.dmChannel(id);
2764
+ if (dmChannel) return dmChannel;
2765
+ }
2766
+ const data = await this.client.rest.get(`/users/${id}/dm`);
2767
+ return this.client.channels._add(data);
2768
+ }
2629
2769
  };
2630
2770
 
2631
2771
  // src/managers/SweepManager.ts
@@ -2780,3 +2920,4 @@ export {
2780
2920
  UserPresence,
2781
2921
  UserRelationship
2782
2922
  };
2923
+ //# sourceMappingURL=index.js.map