diff --git a/structures/Permissions.ts b/structures/Permissions.ts new file mode 100644 index 0000000..d334337 --- /dev/null +++ b/structures/Permissions.ts @@ -0,0 +1,42 @@ +import { BitwisePermissionFlags } from "../vendor/external.ts"; + +export type PermissionString = keyof typeof BitwisePermissionFlags; +export type PermissionResolvable= + | bigint + | PermissionString + | PermissionString[] + | BitwisePermissionFlags; + +export class Permissions { + static Flags = BitwisePermissionFlags; + bitfield: bigint; + + constructor(bitfield: PermissionResolvable) { + this.bitfield = Permissions.resolve(bitfield); + } + + has(bit: PermissionResolvable) { + if (this.bitfield & BigInt(Permissions.Flags.ADMINISTRATOR)) { + return true; + } + + return !!(this.bitfield & Permissions.resolve(bit)); + } + + static resolve(bit: PermissionResolvable): bigint { + switch (typeof bit) { + case "bigint": + return bit; + case "number": + return BigInt(bit); + case "string": + return BigInt(Permissions.Flags[bit]); + case "object": + return Permissions.resolve(bit.map((p) => BigInt(Permissions.Flags[p])).reduce((acc, cur) => acc | cur, 0n)); + default: + throw new TypeError(`Cannot resolve permission: ${bit}`); + } + } +} + +export default Permissions; diff --git a/structures/Role.ts b/structures/Role.ts index 9b71a56..34b5d03 100644 --- a/structures/Role.ts +++ b/structures/Role.ts @@ -1,8 +1,10 @@ import type { Model } from "./Base.ts"; import type { Session } from "../session/Session.ts"; import type { DiscordRole } from "../vendor/external.ts"; -import { Snowflake, Routes } from "../mod.ts"; +import { Snowflake } from "../mod.ts"; import { iconHashToBigInt } from "../util/hash.ts"; +import { Permissions } from "./Permissions.ts"; +import { Guild } from "./Guild.ts"; export class Role implements Model { constructor(session: Session, guildId: Snowflake, data: DiscordRole) { @@ -16,6 +18,7 @@ export class Role implements Model { this.unicodeEmoji = data.unicode_emoji; this.mentionable = data.mentionable; this.managed = data.managed; + this.permissions = new Permissions(BigInt(data.permissions)); } session: Session; @@ -28,6 +31,7 @@ export class Role implements Model { unicodeEmoji?: string; mentionable: boolean; managed: boolean; + permissions: Permissions; get createdTimestamp() { return Snowflake.snowflakeToTimestamp(this.id); @@ -41,8 +45,9 @@ export class Role implements Model { return `#${this.color.toString(16).padStart(6, "0")}`; } - async delete() { - await this.session.rest.runMethod(this.session.rest, "DELETE", Routes.GUILD_ROLE(this.guildId, this.id)); + async delete(): Promise { + // cool jS trick + await Guild.prototype.deleteRole.call({ id: this.guildId }, this.id); } toString() { diff --git a/util/Routes.ts b/util/Routes.ts index 68865eb..7a06e7e 100644 --- a/util/Routes.ts +++ b/util/Routes.ts @@ -105,3 +105,7 @@ export function GUILD_ROLE(guildId: Snowflake, roleId: Snowflake) { export function GUILD_ROLES(guildId: Snowflake) { return `/guilds/${guildId}/roles`; } + +export function USER_DM() { + return `/users/@me/channels`; +}