diff --git a/structures/Attachment.ts b/structures/Attachment.ts new file mode 100644 index 0000000..9fc700c --- /dev/null +++ b/structures/Attachment.ts @@ -0,0 +1,36 @@ +import type { Model } from "./Base.ts"; +import type { Snowflake } from "../util/Snowflake.ts"; +import type { Session } from "../session/Session.ts"; +import type { DiscordAttachment } from "../vendor/external.ts"; + +/** + * Represents an attachment + * @link https://discord.com/developers/docs/resources/channel#attachment-object + * */ +export class Attachment implements Model { + constructor(session: Session, data: DiscordAttachment) { + this.session = session; + this.id = data.id; + + this.contentType = data.content_type ? data.content_type : undefined; + this.attachment = data.url; + this.proxyUrl = data.proxy_url; + this.name = data.filename; + this.size = data.size; + this.height = data.height ? data.height : undefined; + this.width = data.width ? data.width : undefined; + this.ephemeral = !!data.ephemeral + } + + readonly session: Session; + readonly id: Snowflake; + + contentType?: string; + attachment: string; + proxyUrl: string; + name: string; + size: number; + height?: number; + width?: number; + ephemeral: boolean; +} diff --git a/structures/Message.ts b/structures/Message.ts index ef431ca..8000858 100644 --- a/structures/Message.ts +++ b/structures/Message.ts @@ -3,6 +3,7 @@ import type { Snowflake } from "../util/Snowflake.ts"; import type { Session } from "../session/mod.ts"; import type { AllowedMentionsTypes, DiscordMessage } from "../vendor/external.ts"; import { User } from "./User.ts"; +import { Attachment } from "./Attachment.ts"; import { MessageFlags, Routes } from "../util/mod.ts"; /** @@ -49,6 +50,8 @@ export class Message implements Model { this.pinned = !!data.pinned; this.tts = !!data.tts; this.content = data.content!; + + this.attachments = data.attachments.map((attachment) => new Attachment(session, attachment)); } readonly session: Session; @@ -62,6 +65,8 @@ export class Message implements Model { tts: boolean; content: string; + attachments: Attachment[]; + get url() { return `https://discord.com/channels/${this.guildId ?? "@me"}/${this.channelId}/${this.id}`; } diff --git a/structures/User.ts b/structures/User.ts index fea9493..a7fa2ae 100644 --- a/structures/User.ts +++ b/structures/User.ts @@ -61,4 +61,8 @@ export class User implements Model { return `${url}.${options.format ?? (url.includes("/a_") ? "gif" : "jpg")}?size=${options.size}`; } + + toString() { + return `<@${this.id}>`; + } } diff --git a/util/shared/flags.ts b/util/shared/flags.ts index ea342b8..226a25e 100644 --- a/util/shared/flags.ts +++ b/util/shared/flags.ts @@ -3,21 +3,21 @@ */ export enum MessageFlags { /** this message has been published to subscribed channels (via Channel Following) */ - CROSSPOSTED = 1 << 0, + CrossPosted = 1 << 0, /** this message originated from a message in another channel (via Channel Following) */ - IS_CROSSPOST = 1 << 1, + IsCrosspost = 1 << 1, /** do not include any embeds when serializing this message */ - SUPPRESS_EMBEDS = 1 << 2, + SupressEmbeds = 1 << 2, /** the source message for this crosspost has been deleted (via Channel Following) */ - SOURCE_MESSAGE_DELETED = 1 << 3, + SourceMessageDeleted = 1 << 3, /** this message came from the urgent message system */ - URGENT = 1 << 4, + Urgent = 1 << 4, /** this message has an associated thread, with the same id as the message */ - HAS_THREAD = 1 << 5, + HasThread = 1 << 5, /** this message is only visible to the user who invoked the Interaction */ - EPHEMERAL = 1 << 6, + Ephemeral = 1 << 6, /** this message is an Interaction Response and the bot is "thinking" */ - LOADING = 1 << 7, + Loading = 1 << 7, /** this message failed to mention some roles and add their members to the thread */ - FAILED_TO_MENTION_SOME_ROLES_IN_THREAD = 1 << 8, + FailedToMentionSomeRolesInThread = 1 << 8, }