This commit is contained in:
socram03 2022-06-25 16:29:19 -04:00
parent dca91be86e
commit c76982541e
14 changed files with 167 additions and 168 deletions

View File

@ -6,7 +6,7 @@ import type { DiscordAttachment } from "../vendor/external.ts";
/** /**
* Represents an attachment * Represents an attachment
* @link https://discord.com/developers/docs/resources/channel#attachment-object * @link https://discord.com/developers/docs/resources/channel#attachment-object
* */ */
export class Attachment implements Model { export class Attachment implements Model {
constructor(session: Session, data: DiscordAttachment) { constructor(session: Session, data: DiscordAttachment) {
this.session = session; this.session = session;
@ -19,7 +19,7 @@ export class Attachment implements Model {
this.size = data.size; this.size = data.size;
this.height = data.height ? data.height : undefined; this.height = data.height ? data.height : undefined;
this.width = data.width ? data.width : undefined; this.width = data.width ? data.width : undefined;
this.ephemeral = !!data.ephemeral this.ephemeral = !!data.ephemeral;
} }
readonly session: Session; readonly session: Session;

View File

@ -6,7 +6,7 @@ import { iconHashToBigInt } from "../util/hash.ts";
/** /**
* Class for {@link Guild} and {@link AnonymousGuild} * Class for {@link Guild} and {@link AnonymousGuild}
* */ */
export abstract class BaseGuild implements Model { export abstract class BaseGuild implements Model {
constructor(session: Session, data: DiscordGuild) { constructor(session: Session, data: DiscordGuild) {
this.session = session; this.session = session;
@ -37,4 +37,3 @@ export abstract class BaseGuild implements Model {
return this.name; return this.name;
} }
} }

View File

@ -1,5 +1,5 @@
import type { Model } from "./Base.ts"; import type { Model } from "./Base.ts";
import { Snowflake, Session, DiscordChannel, ChannelTypes } from "../mod.ts"; import { ChannelTypes, DiscordChannel, Session, Snowflake } from "../mod.ts";
export abstract class Channel implements Model { export abstract class Channel implements Model {
constructor(session: Session, data: DiscordChannel) { constructor(session: Session, data: DiscordChannel) {
@ -12,5 +12,4 @@ export abstract class Channel implements Model {
readonly session: Session; readonly session: Session;
readonly name: string | undefined; readonly name: string | undefined;
readonly type: ChannelTypes; readonly type: ChannelTypes;
}
}

View File

@ -1,6 +1,6 @@
import { Channel } from "./Channel.ts"; import { Channel } from "./Channel.ts";
//import { User } from "./User.ts"; //import { User } from "./User.ts";
import { Session, DiscordChannel, Snowflake, Routes } from "../mod.ts"; import { DiscordChannel, Routes, Session, Snowflake } from "../mod.ts";
export class DMChannel extends Channel { export class DMChannel extends Channel {
constructor(session: Session, data: DiscordChannel) { constructor(session: Session, data: DiscordChannel) {
@ -15,8 +15,8 @@ export class DMChannel extends Channel {
const channel = await this.session.rest.runMethod<DiscordChannel>( const channel = await this.session.rest.runMethod<DiscordChannel>(
this.session.rest, this.session.rest,
"DELETE", "DELETE",
Routes.CHANNEL(this.id) Routes.CHANNEL(this.id),
) );
return new DMChannel(this.session, channel); return new DMChannel(this.session, channel);
} }
} }

View File

@ -2,8 +2,12 @@ import type { Model } from "./Base.ts";
import type { Snowflake } from "../util/Snowflake.ts"; import type { Snowflake } from "../util/Snowflake.ts";
import type { Session } from "../session/Session.ts"; import type { Session } from "../session/Session.ts";
import type { DiscordGuild, DiscordRole } from "../vendor/external.ts"; import type { DiscordGuild, DiscordRole } from "../vendor/external.ts";
import { DefaultMessageNotificationLevels, ExplicitContentFilterLevels, VerificationLevels } from "../vendor/external.ts"; import {
import { iconHashToBigInt, iconBigintToHash } from "../util/hash.ts"; DefaultMessageNotificationLevels,
ExplicitContentFilterLevels,
VerificationLevels,
} from "../vendor/external.ts";
import { iconBigintToHash, iconHashToBigInt } from "../util/hash.ts";
import { Member } from "./Member.ts"; import { Member } from "./Member.ts";
import { BaseGuild } from "./BaseGuild.ts"; import { BaseGuild } from "./BaseGuild.ts";
import { Role } from "./Role.ts"; import { Role } from "./Role.ts";
@ -21,7 +25,7 @@ export interface CreateRole {
/** /**
* Represents a guild * Represents a guild
* @link https://discord.com/developers/docs/resources/guild#guild-object * @link https://discord.com/developers/docs/resources/guild#guild-object
* */ */
export class Guild extends BaseGuild implements Model { export class Guild extends BaseGuild implements Model {
constructor(session: Session, data: DiscordGuild) { constructor(session: Session, data: DiscordGuild) {
super(session, data); super(session, data);
@ -55,8 +59,7 @@ export class Guild extends BaseGuild implements Model {
if (options.iconHash) { if (options.iconHash) {
if (typeof options.iconHash === "string") { if (typeof options.iconHash === "string") {
icon = options.iconHash; icon = options.iconHash;
} } else {
else {
icon = iconBigintToHash(options.iconHash); icon = iconBigintToHash(options.iconHash);
} }
} }
@ -72,7 +75,7 @@ export class Guild extends BaseGuild implements Model {
unicode_emoji: options.unicodeEmoji, unicode_emoji: options.unicodeEmoji,
hoist: options.hoist, hoist: options.hoist,
mentionable: options.mentionable, mentionable: options.mentionable,
} },
); );
return new Role(this.session, this, role); return new Role(this.session, this, role);

View File

@ -2,29 +2,28 @@ import { Channel } from "./Channel.ts";
import { Guild } from "./Guild.ts"; import { Guild } from "./Guild.ts";
import { DiscordChannel, Routes, Session, Snowflake } from "../mod.ts"; import { DiscordChannel, Routes, Session, Snowflake } from "../mod.ts";
export class GuildChannel extends Channel { export class GuildChannel extends Channel {
constructor(session: Session, data: DiscordChannel, guildId: Guild["id"]) { constructor(session: Session, data: DiscordChannel, guildId: Guild["id"]) {
super(session, data); super(session, data);
this.guildId = guildId; this.guildId = guildId;
this.position = data.position; this.position = data.position;
data.topic ? this.topic = data.topic : null; data.topic ? this.topic = data.topic : null;
data.parent_id ? this.parentId = data.parent_id : undefined; data.parent_id ? this.parentId = data.parent_id : undefined;
} }
guildId: Snowflake; guildId: Snowflake;
topic?: string; topic?: string;
position?: number; position?: number;
parentId?: Snowflake; parentId?: Snowflake;
delete(reason?: string) { delete(reason?: string) {
return this.session.rest.runMethod<DiscordChannel>( return this.session.rest.runMethod<DiscordChannel>(
this.session.rest, this.session.rest,
"DELETE", "DELETE",
Routes.CHANNEL(this.id), Routes.CHANNEL(this.id),
{ {
reason, reason,
}, },
); );
} }
} }

View File

@ -9,19 +9,19 @@ import { User } from "./User.ts";
/** /**
* @link https://discord.com/developers/docs/resources/guild#create-guild-ban * @link https://discord.com/developers/docs/resources/guild#create-guild-ban
* */ */
export interface CreateGuildBan { export interface CreateGuildBan {
/** Number of days to delete messages for (0-7) */ /** Number of days to delete messages for (0-7) */
deleteMessageDays?: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7; deleteMessageDays?: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7;
/** Reason for the ban */ /** Reason for the ban */
reason?: string; reason?: string;
} }
/** /**
* Represents a guild member * Represents a guild member
* TODO: add a `guild` property somehow * TODO: add a `guild` property somehow
* @link https://discord.com/developers/docs/resources/guild#guild-member-object * @link https://discord.com/developers/docs/resources/guild#guild-member-object
* */ */
export class Member implements Model { export class Member implements Model {
constructor(session: Session, data: MakeRequired<DiscordMember, "user">) { constructor(session: Session, data: MakeRequired<DiscordMember, "user">) {
this.session = session; this.session = session;
@ -33,7 +33,9 @@ export class Member implements Model {
this.deaf = !!data.deaf; this.deaf = !!data.deaf;
this.mute = !!data.mute; this.mute = !!data.mute;
this.pending = !!data.pending; this.pending = !!data.pending;
this.communicationDisabledUntilTimestamp = data.communication_disabled_until ? Number.parseInt(data.communication_disabled_until) : undefined; this.communicationDisabledUntilTimestamp = data.communication_disabled_until
? Number.parseInt(data.communication_disabled_until)
: undefined;
} }
readonly session: Session; readonly session: Session;
@ -63,16 +65,18 @@ export class Member implements Model {
/** /**
* Bans the member * Bans the member
* */ */
async ban(guildId: Snowflake, options: CreateGuildBan): Promise<Member> { async ban(guildId: Snowflake, options: CreateGuildBan): Promise<Member> {
await this.session.rest.runMethod<undefined>( await this.session.rest.runMethod<undefined>(
this.session.rest, this.session.rest,
"PUT", "PUT",
Routes.GUILD_BAN(guildId, this.id), Routes.GUILD_BAN(guildId, this.id),
options ? { options
delete_message_days: options.deleteMessageDays, ? {
reason: options.reason delete_message_days: options.deleteMessageDays,
} : {} reason: options.reason,
}
: {},
); );
return this; return this;
@ -80,13 +84,13 @@ export class Member implements Model {
/** /**
* Kicks the member * Kicks the member
* */ */
async kick(guildId: Snowflake, { reason }: { reason?: string }): Promise<Member> { async kick(guildId: Snowflake, { reason }: { reason?: string }): Promise<Member> {
await this.session.rest.runMethod<undefined>( await this.session.rest.runMethod<undefined>(
this.session.rest, this.session.rest,
"DELETE", "DELETE",
Routes.GUILD_MEMBER(guildId, this.id), Routes.GUILD_MEMBER(guildId, this.id),
{ reason } { reason },
); );
return this; return this;

View File

@ -55,10 +55,12 @@ export class Message implements Model {
this.attachments = data.attachments.map((attachment) => new Attachment(session, attachment)); this.attachments = data.attachments.map((attachment) => new Attachment(session, attachment));
// user is always null on MessageCreate and its replaced with author // user is always null on MessageCreate and its replaced with author
this.member = data.member ? new Member(session, { this.member = data.member
...data.member, ? new Member(session, {
user: data.author, ...data.member,
}) : undefined; user: data.author,
})
: undefined;
} }
readonly session: Session; readonly session: Session;

View File

@ -1,11 +1,11 @@
import { Guild } from "./Guild.ts"; import { Guild } from "./Guild.ts";
import { TextChannel } from "./TextChannel.ts" import { TextChannel } from "./TextChannel.ts";
import { Session, DiscordChannel } from "../mod.ts"; import { DiscordChannel, Session } from "../mod.ts";
export class NewsChannel extends TextChannel { export class NewsChannel extends TextChannel {
constructor(session: Session, data: DiscordChannel , guildId: Guild["id"]) { constructor(session: Session, data: DiscordChannel, guildId: Guild["id"]) {
super(session, data, guildId); super(session, data, guildId);
this.defaultAutoArchiveDuration = data.default_auto_archive_duration; this.defaultAutoArchiveDuration = data.default_auto_archive_duration;
} }
defaultAutoArchiveDuration?: number; defaultAutoArchiveDuration?: number;
} }

View File

@ -39,7 +39,7 @@ export class Role implements Model {
} }
get hexColor() { get hexColor() {
return `#${this.color.toString(16).padStart(6, '0')}`; return `#${this.color.toString(16).padStart(6, "0")}`;
} }
/* /*

View File

@ -2,15 +2,8 @@ import { GuildChannel } from "./GuildChannel.ts";
import { Guild } from "./Guild.ts"; import { Guild } from "./Guild.ts";
import { ThreadChannel } from "./ThreadChannel.ts"; import { ThreadChannel } from "./ThreadChannel.ts";
import { Message } from "./Message.ts"; import { Message } from "./Message.ts";
import { import { DiscordChannel, DiscordInviteCreate, DiscordMessage, Routes, Session, Snowflake } from "../mod.ts";
DiscordChannel, import { GetMessagesOptions } from "../util/Routes.ts";
DiscordInviteCreate,
Routes,
Session,
Snowflake,
DiscordMessage
} from "../mod.ts";
import { GetMessagesOptions } from "../util/Routes.ts"
/** /**
* Represents the options object to create an invitation * Represents the options object to create an invitation
@ -18,11 +11,11 @@ import { GetMessagesOptions } from "../util/Routes.ts"
*/ */
export interface DiscordInvite { export interface DiscordInvite {
max_age?: number; max_age?: number;
max_uses?: number; max_uses?: number;
unique?: boolean; unique?: boolean;
temporary: boolean; temporary: boolean;
reason?: string; reason?: string;
} }
/** /**
@ -31,70 +24,70 @@ export interface DiscordInvite {
*/ */
export interface ThreadCreateOptions { export interface ThreadCreateOptions {
name: string; name: string;
autoArchiveDuration: 60 | 1440 | 4320 | 10080; autoArchiveDuration: 60 | 1440 | 4320 | 10080;
type: 10 | 11 | 12; type: 10 | 11 | 12;
invitable?: boolean; invitable?: boolean;
reason?: string; reason?: string;
} }
export class TextChannel extends GuildChannel { export class TextChannel extends GuildChannel {
constructor(session: Session, data: DiscordChannel, guildId: Guild["id"]) { constructor(session: Session, data: DiscordChannel, guildId: Guild["id"]) {
super(session, data, guildId); super(session, data, guildId);
data.last_message_id ? this.lastMessageId = data.last_message_id : undefined; data.last_message_id ? this.lastMessageId = data.last_message_id : undefined;
data.last_pin_timestamp ? this.lastPinTimestamp = data.last_pin_timestamp : undefined; data.last_pin_timestamp ? this.lastPinTimestamp = data.last_pin_timestamp : undefined;
this.rateLimitPerUser = data.rate_limit_per_user ?? 0; this.rateLimitPerUser = data.rate_limit_per_user ?? 0;
this.nsfw = !!data.nsfw ?? false; this.nsfw = !!data.nsfw ?? false;
} }
lastMessageId?: Snowflake; lastMessageId?: Snowflake;
lastPinTimestamp?: string; lastPinTimestamp?: string;
rateLimitPerUser: number; rateLimitPerUser: number;
nsfw: boolean; nsfw: boolean;
async fetchPins(): Promise<Message[] | []> { async fetchPins(): Promise<Message[] | []> {
const messages = await this.session.rest.runMethod<DiscordMessage[]>( const messages = await this.session.rest.runMethod<DiscordMessage[]>(
this.session.rest, this.session.rest,
"GET", "GET",
Routes.CHANNEL_PINS(this.id), Routes.CHANNEL_PINS(this.id),
); );
return messages[0] ? messages.map((x: DiscordMessage) => new Message(this.session, x)) : []; return messages[0] ? messages.map((x: DiscordMessage) => new Message(this.session, x)) : [];
} }
// TODO return Invite Class // TODO return Invite Class
createInvite(options?: DiscordInvite) { createInvite(options?: DiscordInvite) {
return this.session.rest.runMethod<DiscordInviteCreate>( return this.session.rest.runMethod<DiscordInviteCreate>(
this.session.rest, this.session.rest,
"POST", "POST",
Routes.CHANNEL_INVITES(this.id), Routes.CHANNEL_INVITES(this.id),
options, options,
); );
} }
async createThread(options: ThreadCreateOptions): Promise<ThreadChannel> { async createThread(options: ThreadCreateOptions): Promise<ThreadChannel> {
const thread = await this.session.rest.runMethod<DiscordChannel>( const thread = await this.session.rest.runMethod<DiscordChannel>(
this.session.rest, this.session.rest,
"POST", "POST",
Routes.CHANNEL_CREATE_THREAD(this.id), Routes.CHANNEL_CREATE_THREAD(this.id),
options, options,
); );
return new ThreadChannel(this.session, thread, this.guildId); return new ThreadChannel(this.session, thread, this.guildId);
} }
async fetchMessages(options?: GetMessagesOptions): Promise<Message[] | []> { async fetchMessages(options?: GetMessagesOptions): Promise<Message[] | []> {
if (options?.limit! > 100) throw Error("Values must be between 0-100") if (options?.limit! > 100) throw Error("Values must be between 0-100");
const messages = await this.session.rest.runMethod<DiscordMessage[]>( const messages = await this.session.rest.runMethod<DiscordMessage[]>(
this.session.rest, this.session.rest,
"GET", "GET",
Routes.CHANNEL_MESSAGES(this.id, options) Routes.CHANNEL_MESSAGES(this.id, options),
) );
return messages[0] ? messages.map((x) => new Message(this.session, x)) : []; return messages[0] ? messages.map((x) => new Message(this.session, x)) : [];
} }
sendTyping() { sendTyping() {
this.session.rest.runMethod<undefined>( this.session.rest.runMethod<undefined>(
this.session.rest, this.session.rest,
"POST", "POST",
Routes.CHANNEL_TYPING(this.id), Routes.CHANNEL_TYPING(this.id),
); );
} }
} }

View File

@ -3,21 +3,21 @@ import { Guild } from "./Guild.ts";
import { DiscordChannel, Session, Snowflake } from "../mod.ts"; import { DiscordChannel, Session, Snowflake } from "../mod.ts";
export class ThreadChannel extends GuildChannel { export class ThreadChannel extends GuildChannel {
constructor(session: Session, data: DiscordChannel, guildId: Guild["id"]) { constructor(session: Session, data: DiscordChannel, guildId: Guild["id"]) {
super(session, data, guildId); super(session, data, guildId);
this.archived = !!data.thread_metadata?.archived; this.archived = !!data.thread_metadata?.archived;
this.archiveTimestamp = data.thread_metadata?.archive_timestamp; this.archiveTimestamp = data.thread_metadata?.archive_timestamp;
this.autoArchiveDuration = data.thread_metadata?.auto_archive_duration; this.autoArchiveDuration = data.thread_metadata?.auto_archive_duration;
this.locked = !!data.thread_metadata?.locked; this.locked = !!data.thread_metadata?.locked;
this.messageCount = data.message_count; this.messageCount = data.message_count;
this.memberCount = data.member_count; this.memberCount = data.member_count;
this.ownerId = data.owner_id; this.ownerId = data.owner_id;
} }
archived?: boolean; archived?: boolean;
archiveTimestamp?: string; archiveTimestamp?: string;
autoArchiveDuration?: number; autoArchiveDuration?: number;
locked?: boolean; locked?: boolean;
messageCount?: number; messageCount?: number;
memberCount?: number; memberCount?: number;
ownerId?: Snowflake; ownerId?: Snowflake;
} }

View File

@ -1,20 +1,20 @@
import { GuildChannel } from "./GuildChannel.ts"; import { GuildChannel } from "./GuildChannel.ts";
import { Guild } from "./Guild.ts"; import { Guild } from "./Guild.ts";
import { DiscordChannel, Session, VideoQualityModes, Snowflake } from "../mod.ts"; import { DiscordChannel, Session, Snowflake, VideoQualityModes } from "../mod.ts";
export class VoiceChannel extends GuildChannel { export class VoiceChannel extends GuildChannel {
constructor(session: Session, data: DiscordChannel, guild: Guild) { constructor(session: Session, data: DiscordChannel, guild: Guild) {
super(session, data, guild); super(session, data, guild);
this.bitRate = data.bitrate; this.bitRate = data.bitrate;
this.userLimit = data.user_limit ?? 0; this.userLimit = data.user_limit ?? 0;
data.rtc_region ? this.rtcRegion = data.rtc_region : undefined; data.rtc_region ? this.rtcRegion = data.rtc_region : undefined;
this.videoQuality = data.video_quality_mode; this.videoQuality = data.video_quality_mode;
this.nsfw = !!data.nsfw; this.nsfw = !!data.nsfw;
} }
bitRate?: number; bitRate?: number;
userLimit: number; userLimit: number;
rtcRegion?: Snowflake; rtcRegion?: Snowflake;
videoQuality?: VideoQualityModes; videoQuality?: VideoQualityModes;
nsfw?: boolean; nsfw?: boolean;
} }

View File

@ -80,9 +80,9 @@ export function GUILD_BAN(guildId: Snowflake, userId: Snowflake) {
} }
export interface GetBans { export interface GetBans {
limit?: number; limit?: number;
before?: Snowflake; before?: Snowflake;
after?: Snowflake; after?: Snowflake;
} }
/** used to unban members */ /** used to unban members */