feat: GuildTextChannel#{permissionsFor,overwritesFor}, TextChannel#triggerTyping, many other things
This commit is contained in:
parent
04c4e7760b
commit
c1cd6276ae
17 changed files with 236 additions and 78 deletions
|
@ -1,9 +1,9 @@
|
||||||
import { Client } from '../models/client.ts'
|
import { Client } from '../models/client.ts'
|
||||||
import { ApplicationPayload } from '../types/application.ts'
|
import { ApplicationPayload } from '../types/application.ts'
|
||||||
import { Base } from './base.ts'
|
import { SnowflakeBase } from './base.ts'
|
||||||
import { User } from './user.ts'
|
import { User } from './user.ts'
|
||||||
|
|
||||||
export class Application extends Base {
|
export class Application extends SnowflakeBase {
|
||||||
id: string
|
id: string
|
||||||
name: string
|
name: string
|
||||||
icon: string
|
icon: string
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import { Client } from '../models/client.ts'
|
import { Client } from '../models/client.ts'
|
||||||
|
import { Snowflake } from '../utils/snowflake.ts'
|
||||||
|
|
||||||
export class Base {
|
export class Base {
|
||||||
client: Client
|
client: Client
|
||||||
|
@ -7,3 +8,17 @@ export class Base {
|
||||||
this.client = client
|
this.client = client
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export class SnowflakeBase extends Base {
|
||||||
|
id!: string
|
||||||
|
|
||||||
|
/** Get Snowflake Object */
|
||||||
|
get snowflake(): Snowflake {
|
||||||
|
return new Snowflake(this.id)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Timestamp of when resource was created */
|
||||||
|
get timestamp(): Date {
|
||||||
|
return new Date(this.snowflake.timestamp)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
import { Client } from '../models/client.ts'
|
import { Client } from '../models/client.ts'
|
||||||
import { ChannelPayload, ChannelTypes } from '../types/channel.ts'
|
import { ChannelPayload, ChannelTypes } from '../types/channel.ts'
|
||||||
import { Base } from './base.ts'
|
import { SnowflakeBase } from './base.ts'
|
||||||
|
|
||||||
export class Channel extends Base {
|
export class Channel extends SnowflakeBase {
|
||||||
type: ChannelTypes
|
type: ChannelTypes
|
||||||
id: string
|
id: string
|
||||||
static cacheName = 'channel'
|
static cacheName = 'channel'
|
||||||
|
|
|
@ -9,7 +9,9 @@ import {
|
||||||
EmbedTypes,
|
EmbedTypes,
|
||||||
EmbedVideo
|
EmbedVideo
|
||||||
} from '../types/channel.ts'
|
} from '../types/channel.ts'
|
||||||
|
import { Colors, ColorUtil } from '../utils/colorutil.ts'
|
||||||
|
|
||||||
|
/** Message Embed Object */
|
||||||
export class Embed {
|
export class Embed {
|
||||||
title?: string
|
title?: string
|
||||||
type?: EmbedTypes
|
type?: EmbedTypes
|
||||||
|
@ -41,7 +43,7 @@ export class Embed {
|
||||||
this.fields = data?.fields
|
this.fields = data?.fields
|
||||||
}
|
}
|
||||||
|
|
||||||
// khk4912
|
/** Convert Embed Object to Embed Payload JSON */
|
||||||
toJSON(): EmbedPayload {
|
toJSON(): EmbedPayload {
|
||||||
return {
|
return {
|
||||||
title: this.title,
|
title: this.title,
|
||||||
|
@ -60,63 +62,116 @@ export class Embed {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Set Title of the Embed */
|
||||||
setTitle(title: string): Embed {
|
setTitle(title: string): Embed {
|
||||||
this.title = title
|
this.title = title
|
||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Set Embed description */
|
||||||
setDescription(description: string): Embed {
|
setDescription(description: string): Embed {
|
||||||
this.description = description
|
this.description = description
|
||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Set Embed Type */
|
||||||
setType(type: EmbedTypes): Embed {
|
setType(type: EmbedTypes): Embed {
|
||||||
this.type = type
|
this.type = type
|
||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
setURL(url: string): Embed {
|
/** Set URL of the Embed */
|
||||||
this.url = url
|
setURL(url: string): Embed
|
||||||
|
setURL(url: URL): Embed
|
||||||
|
setURL(url: string | URL): Embed {
|
||||||
|
this.url = typeof url === 'object' ? url.toString() : url
|
||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
setTimestamp(timestamp: string): Embed {
|
/** Set Timestamp of the Embed */
|
||||||
this.timestamp = timestamp
|
setTimestamp(timeString: string): Embed
|
||||||
|
setTimestamp(unixTimestamp: number): Embed
|
||||||
|
setTimestamp(dateObject: Date): Embed
|
||||||
|
setTimestamp(timestamp: string | Date | number): Embed {
|
||||||
|
this.timestamp = new Date(timestamp).toISOString()
|
||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
setColor(hex: number): Embed {
|
/** Set Color of the Embed */
|
||||||
this.color = hex
|
setColor(hexInt: number): Embed
|
||||||
|
setColor(r: number, g: number, b: number): Embed
|
||||||
|
setColor(random: 'random'): Embed
|
||||||
|
setColor(hexStr: string): Embed
|
||||||
|
setColor(namedColor: keyof Colors): Embed
|
||||||
|
setColor(
|
||||||
|
color: number | 'random' | string | keyof Colors,
|
||||||
|
g?: number,
|
||||||
|
b?: number
|
||||||
|
): Embed {
|
||||||
|
if (typeof color === 'number' && g === undefined && b === undefined) {
|
||||||
|
this.color = color
|
||||||
|
} else if (typeof color === 'string' && color.toLowerCase() === 'random') {
|
||||||
|
this.color = ColorUtil.resolveHex(ColorUtil.randomHex())
|
||||||
|
} else if (typeof color === 'string' && color.startsWith('#')) {
|
||||||
|
this.color = ColorUtil.resolveHex(color)
|
||||||
|
} else if (
|
||||||
|
typeof color === 'number' &&
|
||||||
|
g !== undefined &&
|
||||||
|
b !== undefined
|
||||||
|
) {
|
||||||
|
this.color = ColorUtil.resolveRGB([color, g, b])
|
||||||
|
} else if (typeof color === 'string') {
|
||||||
|
this.color = ColorUtil.resolveColor(color as keyof Colors)
|
||||||
|
} else
|
||||||
|
throw new Error(
|
||||||
|
'Invalid Embed Color. Must be RGB, Hex (string or number), valid color name or a valid CSS color.'
|
||||||
|
)
|
||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
setFooter(footer: EmbedFooter): Embed {
|
/** Set Footer of the Embed */
|
||||||
this.footer = footer
|
setFooter(text: string, icon?: string): Embed
|
||||||
|
setFooter(footer: EmbedFooter): Embed
|
||||||
|
setFooter(footer: EmbedFooter | string, icon?: string): Embed {
|
||||||
|
this.footer =
|
||||||
|
typeof footer === 'string' ? { text: footer, icon_url: icon } : footer
|
||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
setImage(image: EmbedImage): Embed {
|
/** Set Image of the Embed */
|
||||||
this.image = image
|
setImage(image: EmbedImage | string): Embed {
|
||||||
|
this.image = typeof image === 'string' ? { url: image } : image
|
||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
setThumbnail(thumbnail: EmbedThumbnail): Embed {
|
/** Set Thumbnail Image of the Embed */
|
||||||
this.thumbnail = thumbnail
|
setThumbnail(thumbnail: EmbedThumbnail | string): Embed {
|
||||||
|
this.thumbnail =
|
||||||
|
typeof thumbnail === 'string' ? { url: thumbnail } : thumbnail
|
||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
setVideo(video: EmbedVideo): Embed {
|
/** Set Embed Video */
|
||||||
this.video = video
|
setVideo(video: EmbedVideo | string): Embed {
|
||||||
|
this.video = typeof video === 'string' ? { url: video } : video
|
||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
setProvider(provider: EmbedProvider): Embed {
|
/** Set Provider of the Embed */
|
||||||
this.provider = provider
|
setProvider(name: string, url?: string): Embed
|
||||||
|
setProvider(provider: EmbedProvider): Embed
|
||||||
|
setProvider(provider: EmbedProvider | string, url?: string): Embed {
|
||||||
|
this.provider =
|
||||||
|
typeof provider === 'string' ? { name: provider, url } : provider
|
||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
setAuthor(author: EmbedAuthor): Embed {
|
/** Set Author of the Embed */
|
||||||
this.author = author
|
setAuthor(author: EmbedAuthor): Embed
|
||||||
|
setAuthor(name: string, image?: string): Embed
|
||||||
|
setAuthor(author: EmbedAuthor | string, image?: string): Embed {
|
||||||
|
this.author =
|
||||||
|
typeof author === 'string' ? { name: author, icon_url: image } : author
|
||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -125,23 +180,29 @@ export class Embed {
|
||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
addField(name: string, value: string, inline?: boolean): Embed {
|
/** Adds a Field to the Embed */
|
||||||
|
addField(field: EmbedField): Embed
|
||||||
|
addField(name: string, value: string, inline?: boolean): Embed
|
||||||
|
addField(name: string | EmbedField, value?: string, inline?: boolean): Embed {
|
||||||
|
if (typeof name !== 'object' && value === undefined)
|
||||||
|
throw new Error('field value is required')
|
||||||
|
const field: EmbedField =
|
||||||
|
typeof name === 'object' ? name : { name, value: value as string, inline }
|
||||||
|
|
||||||
if (this.fields === undefined) {
|
if (this.fields === undefined) {
|
||||||
this.fields = [
|
this.fields = [field]
|
||||||
{
|
|
||||||
name: name,
|
|
||||||
value: value,
|
|
||||||
inline: inline
|
|
||||||
}
|
|
||||||
]
|
|
||||||
} else {
|
} else {
|
||||||
this.fields.push({
|
this.fields.push(field)
|
||||||
name: name,
|
|
||||||
value: value,
|
|
||||||
inline: inline
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Adds multiple fields to the Embed */
|
||||||
|
addFields(...fields: EmbedField[]): Embed {
|
||||||
|
for (const field of fields) {
|
||||||
|
this.addField(field)
|
||||||
|
}
|
||||||
|
return this
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,13 +1,24 @@
|
||||||
import { Client } from '../models/client.ts'
|
import { Client } from '../models/client.ts'
|
||||||
import { EmojiPayload } from '../types/emoji.ts'
|
import { EmojiPayload } from '../types/emoji.ts'
|
||||||
import { EMOJI } from '../types/endpoint.ts'
|
import { EMOJI } from '../types/endpoint.ts'
|
||||||
|
import { Snowflake } from '../utils/snowflake.ts'
|
||||||
import { Base } from './base.ts'
|
import { Base } from './base.ts'
|
||||||
import { Guild } from './guild.ts'
|
import { Guild } from './guild.ts'
|
||||||
import { Role } from './role.ts'
|
import { Role } from './role.ts'
|
||||||
import { User } from './user.ts'
|
import { User } from './user.ts'
|
||||||
|
|
||||||
|
/** Guild Emoji Object */
|
||||||
export class Emoji extends Base {
|
export class Emoji extends Base {
|
||||||
id: string | null
|
id: string | null
|
||||||
|
|
||||||
|
get snowflake(): Snowflake | null {
|
||||||
|
return this.id === null ? null : new Snowflake(this.id)
|
||||||
|
}
|
||||||
|
|
||||||
|
get timestamp(): Date | null {
|
||||||
|
return this.snowflake === null ? null : new Date(this.snowflake.timestamp)
|
||||||
|
}
|
||||||
|
|
||||||
name: string | null
|
name: string | null
|
||||||
roles?: string[]
|
roles?: string[]
|
||||||
user?: User
|
user?: User
|
||||||
|
@ -48,7 +59,7 @@ export class Emoji extends Base {
|
||||||
if (this.id === null) throw new Error('Emoji ID is not valid.')
|
if (this.id === null) throw new Error('Emoji ID is not valid.')
|
||||||
if (this.guild === undefined) throw new Error('Guild is undefined')
|
if (this.guild === undefined) throw new Error('Guild is undefined')
|
||||||
const roles = Array.isArray(data.roles)
|
const roles = Array.isArray(data.roles)
|
||||||
? data.roles.map(role => (role instanceof Role ? role.id : role))
|
? data.roles.map((role) => (role instanceof Role ? role.id : role))
|
||||||
: [data.roles instanceof Role ? data.roles.id : data.roles]
|
: [data.roles instanceof Role ? data.roles.id : data.roles]
|
||||||
const res = await this.client.rest.patch(EMOJI(this.guild.id, this.id), {
|
const res = await this.client.rest.patch(EMOJI(this.guild.id, this.id), {
|
||||||
...data,
|
...data,
|
||||||
|
@ -82,5 +93,5 @@ export interface ModifyGuildEmojiParams {
|
||||||
/** Name of the emoji */
|
/** Name of the emoji */
|
||||||
name?: string
|
name?: string
|
||||||
/** Roles to which this emoji will be whitelisted */
|
/** Roles to which this emoji will be whitelisted */
|
||||||
roles?: string | Role | Array<string | Role>;
|
roles?: string | Role | Array<string | Role>
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,7 +17,7 @@ import {
|
||||||
GuildPruneCountPayload,
|
GuildPruneCountPayload,
|
||||||
GuildBeginPrunePayload
|
GuildBeginPrunePayload
|
||||||
} from '../types/guild.ts'
|
} from '../types/guild.ts'
|
||||||
import { Base } from './base.ts'
|
import { Base, SnowflakeBase } from './base.ts'
|
||||||
import { CreateGuildRoleOptions, RolesManager } from '../managers/roles.ts'
|
import { CreateGuildRoleOptions, RolesManager } from '../managers/roles.ts'
|
||||||
import { InviteManager } from '../managers/invites.ts'
|
import { InviteManager } from '../managers/invites.ts'
|
||||||
import {
|
import {
|
||||||
|
@ -132,7 +132,7 @@ export class GuildBans {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export class Guild extends Base {
|
export class Guild extends SnowflakeBase {
|
||||||
id: string
|
id: string
|
||||||
name?: string
|
name?: string
|
||||||
icon?: string
|
icon?: string
|
||||||
|
|
|
@ -3,7 +3,7 @@ import { Client } from '../models/client.ts'
|
||||||
import { GUILD_MEMBER } from '../types/endpoint.ts'
|
import { GUILD_MEMBER } from '../types/endpoint.ts'
|
||||||
import { MemberPayload } from '../types/guild.ts'
|
import { MemberPayload } from '../types/guild.ts'
|
||||||
import { Permissions } from '../utils/permissions.ts'
|
import { Permissions } from '../utils/permissions.ts'
|
||||||
import { Base } from './base.ts'
|
import { SnowflakeBase } from './base.ts'
|
||||||
import { Guild } from './guild.ts'
|
import { Guild } from './guild.ts'
|
||||||
import { Role } from './role.ts'
|
import { Role } from './role.ts'
|
||||||
import { User } from './user.ts'
|
import { User } from './user.ts'
|
||||||
|
@ -15,7 +15,7 @@ export interface MemberData {
|
||||||
mute?: boolean
|
mute?: boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
export class Member extends Base {
|
export class Member extends SnowflakeBase {
|
||||||
id: string
|
id: string
|
||||||
user: User
|
user: User
|
||||||
nick?: string
|
nick?: string
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { Base } from './base.ts'
|
import { SnowflakeBase } from './base.ts'
|
||||||
import {
|
import {
|
||||||
Attachment,
|
Attachment,
|
||||||
MessageActivity,
|
MessageActivity,
|
||||||
|
@ -21,7 +21,7 @@ import { Emoji } from './emoji.ts'
|
||||||
|
|
||||||
type AllMessageOptions = MessageOptions | Embed
|
type AllMessageOptions = MessageOptions | Embed
|
||||||
|
|
||||||
export class Message extends Base {
|
export class Message extends SnowflakeBase {
|
||||||
id: string
|
id: string
|
||||||
channelID: string
|
channelID: string
|
||||||
channel: TextChannel
|
channel: TextChannel
|
||||||
|
@ -30,7 +30,6 @@ export class Message extends Base {
|
||||||
author: User
|
author: User
|
||||||
member?: Member
|
member?: Member
|
||||||
content: string
|
content: string
|
||||||
timestamp: string
|
|
||||||
editedTimestamp?: string
|
editedTimestamp?: string
|
||||||
tts: boolean
|
tts: boolean
|
||||||
mentions: MessageMentions
|
mentions: MessageMentions
|
||||||
|
@ -63,7 +62,6 @@ export class Message extends Base {
|
||||||
this.guildID = data.guild_id
|
this.guildID = data.guild_id
|
||||||
this.author = author
|
this.author = author
|
||||||
this.content = data.content
|
this.content = data.content
|
||||||
this.timestamp = data.timestamp
|
|
||||||
this.editedTimestamp = data.edited_timestamp
|
this.editedTimestamp = data.edited_timestamp
|
||||||
this.tts = data.tts
|
this.tts = data.tts
|
||||||
this.mentions = new MessageMentions(this.client, this)
|
this.mentions = new MessageMentions(this.client, this)
|
||||||
|
@ -91,7 +89,6 @@ export class Message extends Base {
|
||||||
this.channelID = data.channel_id ?? this.channelID
|
this.channelID = data.channel_id ?? this.channelID
|
||||||
this.guildID = data.guild_id ?? this.guildID
|
this.guildID = data.guild_id ?? this.guildID
|
||||||
this.content = data.content ?? this.content
|
this.content = data.content ?? this.content
|
||||||
this.timestamp = data.timestamp ?? this.timestamp
|
|
||||||
this.editedTimestamp = data.edited_timestamp ?? this.editedTimestamp
|
this.editedTimestamp = data.edited_timestamp ?? this.editedTimestamp
|
||||||
this.tts = data.tts ?? this.tts
|
this.tts = data.tts ?? this.tts
|
||||||
this.attachments = data.attachments ?? this.attachments
|
this.attachments = data.attachments ?? this.attachments
|
||||||
|
|
|
@ -3,9 +3,9 @@ import {
|
||||||
MessageStickerFormatTypes,
|
MessageStickerFormatTypes,
|
||||||
MessageStickerPayload
|
MessageStickerPayload
|
||||||
} from '../types/channel.ts'
|
} from '../types/channel.ts'
|
||||||
import { Base } from './base.ts'
|
import { SnowflakeBase } from './base.ts'
|
||||||
|
|
||||||
export class MessageSticker extends Base {
|
export class MessageSticker extends SnowflakeBase {
|
||||||
id: string
|
id: string
|
||||||
packID: string
|
packID: string
|
||||||
name: string
|
name: string
|
||||||
|
|
|
@ -77,6 +77,7 @@ export class ClientPresence {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Parses from Payload */
|
||||||
parse(payload: StatusPayload): ClientPresence {
|
parse(payload: StatusPayload): ClientPresence {
|
||||||
this.afk = payload.afk
|
this.afk = payload.afk
|
||||||
this.activity = payload.activities ?? undefined
|
this.activity = payload.activities ?? undefined
|
||||||
|
@ -86,10 +87,12 @@ export class ClientPresence {
|
||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Parses from Payload and creates new ClientPresence */
|
||||||
static parse(payload: StatusUpdatePayload): ClientPresence {
|
static parse(payload: StatusUpdatePayload): ClientPresence {
|
||||||
return new ClientPresence().parse(payload)
|
return new ClientPresence().parse(payload)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Creates Presence Payload */
|
||||||
create(): StatusPayload {
|
create(): StatusPayload {
|
||||||
return {
|
return {
|
||||||
afk: this.afk === undefined ? false : this.afk,
|
afk: this.afk === undefined ? false : this.afk,
|
||||||
|
@ -100,6 +103,7 @@ export class ClientPresence {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Creates Activity Payload */
|
||||||
createActivity(): ActivityGame[] | null {
|
createActivity(): ActivityGame[] | null {
|
||||||
// eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
|
// eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
|
||||||
const activity =
|
const activity =
|
||||||
|
@ -118,47 +122,45 @@ export class ClientPresence {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Set Status of Presence */
|
||||||
setStatus(status: StatusType): ClientPresence {
|
setStatus(status: StatusType): ClientPresence {
|
||||||
this.status = status
|
this.status = status
|
||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Set Activity for Presence */
|
||||||
setActivity(activity: ActivityGame): ClientPresence {
|
setActivity(activity: ActivityGame): ClientPresence {
|
||||||
this.activity = activity
|
this.activity = activity
|
||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Set Activities for Presence */
|
||||||
setActivities(activities: ActivityGame[]): ClientPresence {
|
setActivities(activities: ActivityGame[]): ClientPresence {
|
||||||
this.activity = activities
|
this.activity = activities
|
||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Set AFK value */
|
||||||
setAFK(afk: boolean): ClientPresence {
|
setAFK(afk: boolean): ClientPresence {
|
||||||
this.afk = afk
|
this.afk = afk
|
||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Remove AFK (set false) */
|
||||||
removeAFK(): ClientPresence {
|
removeAFK(): ClientPresence {
|
||||||
this.afk = false
|
this.afk = false
|
||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Toggle AFK (boolean) value */
|
||||||
toggleAFK(): ClientPresence {
|
toggleAFK(): ClientPresence {
|
||||||
this.afk = this.afk === undefined ? true : !this.afk
|
this.afk = this.afk === undefined ? true : !this.afk
|
||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Set Since property of Activity */
|
||||||
setSince(since?: number): ClientPresence {
|
setSince(since?: number): ClientPresence {
|
||||||
this.since = since
|
this.since = since
|
||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
// setClientStatus(
|
|
||||||
// client: 'desktop' | 'web' | 'mobile',
|
|
||||||
// status: StatusType
|
|
||||||
// ): ClientPresence {
|
|
||||||
// if (this.clientStatus === undefined) this.clientStatus = {}
|
|
||||||
// this.clientStatus[client] = status
|
|
||||||
// return this
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
import { Client } from '../models/client.ts'
|
import { Client } from '../models/client.ts'
|
||||||
import { Base } from './base.ts'
|
import { SnowflakeBase } from './base.ts'
|
||||||
import { RoleModifyPayload, RolePayload } from '../types/role.ts'
|
import { RoleModifyPayload, RolePayload } from '../types/role.ts'
|
||||||
import { Permissions } from '../utils/permissions.ts'
|
import { Permissions } from '../utils/permissions.ts'
|
||||||
import { Guild } from './guild.ts'
|
import { Guild } from './guild.ts'
|
||||||
|
|
||||||
export class Role extends Base {
|
export class Role extends SnowflakeBase {
|
||||||
id: string
|
id: string
|
||||||
guild: Guild
|
guild: Guild
|
||||||
name: string
|
name: string
|
||||||
|
|
|
@ -8,6 +8,7 @@ import {
|
||||||
InteractionResponsePayload,
|
InteractionResponsePayload,
|
||||||
InteractionResponseType
|
InteractionResponseType
|
||||||
} from '../types/slash.ts'
|
} from '../types/slash.ts'
|
||||||
|
import { SnowflakeBase } from './base.ts'
|
||||||
import { Embed } from './embed.ts'
|
import { Embed } from './embed.ts'
|
||||||
import { Guild } from './guild.ts'
|
import { Guild } from './guild.ts'
|
||||||
import { Member } from './member.ts'
|
import { Member } from './member.ts'
|
||||||
|
@ -39,7 +40,7 @@ export interface InteractionResponse {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export class Interaction {
|
export class Interaction extends SnowflakeBase {
|
||||||
client: Client
|
client: Client
|
||||||
type: number
|
type: number
|
||||||
token: string
|
token: string
|
||||||
|
@ -59,6 +60,7 @@ export class Interaction {
|
||||||
member: Member
|
member: Member
|
||||||
}
|
}
|
||||||
) {
|
) {
|
||||||
|
super(client)
|
||||||
this.client = client
|
this.client = client
|
||||||
this.type = data.type
|
this.type = data.type
|
||||||
this.token = data.token
|
this.token = data.token
|
||||||
|
|
|
@ -19,6 +19,7 @@ import {
|
||||||
MESSAGE_REACTION_USER
|
MESSAGE_REACTION_USER
|
||||||
} from '../types/endpoint.ts'
|
} from '../types/endpoint.ts'
|
||||||
import { Collection } from '../utils/collection.ts'
|
import { Collection } from '../utils/collection.ts'
|
||||||
|
import { Permissions } from '../utils/permissions.ts'
|
||||||
import { Channel } from './channel.ts'
|
import { Channel } from './channel.ts'
|
||||||
import { Embed } from './embed.ts'
|
import { Embed } from './embed.ts'
|
||||||
import { Emoji } from './emoji.ts'
|
import { Emoji } from './emoji.ts'
|
||||||
|
@ -30,6 +31,7 @@ import { User } from './user.ts'
|
||||||
|
|
||||||
export type AllMessageOptions = MessageOptions | Embed
|
export type AllMessageOptions = MessageOptions | Embed
|
||||||
|
|
||||||
|
/** Channel object for Text Channel type */
|
||||||
export class TextChannel extends Channel {
|
export class TextChannel extends Channel {
|
||||||
lastMessageID?: string
|
lastMessageID?: string
|
||||||
lastPinTimestamp?: string
|
lastPinTimestamp?: string
|
||||||
|
@ -226,8 +228,15 @@ export class TextChannel extends Channel {
|
||||||
|
|
||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Trigger the typing indicator. NOT recommended to be used by bots unless you really want to. */
|
||||||
|
async triggerTyping(): Promise<TextChannel> {
|
||||||
|
await this.client.rest.api.channels[this.id].typing.psot()
|
||||||
|
return this
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Represents a Text Channel but in a Guild */
|
||||||
export class GuildTextChannel extends TextChannel {
|
export class GuildTextChannel extends TextChannel {
|
||||||
guildID: string
|
guildID: string
|
||||||
name: string
|
name: string
|
||||||
|
@ -273,6 +282,7 @@ export class GuildTextChannel extends TextChannel {
|
||||||
this.rateLimit = data.rate_limit_per_user ?? this.rateLimit
|
this.rateLimit = data.rate_limit_per_user ?? this.rateLimit
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Edit the Guild Text Channel */
|
||||||
async edit(
|
async edit(
|
||||||
options?: ModifyGuildTextChannelOption
|
options?: ModifyGuildTextChannelOption
|
||||||
): Promise<GuildTextChannel> {
|
): Promise<GuildTextChannel> {
|
||||||
|
@ -328,4 +338,54 @@ export class GuildTextChannel extends TextChannel {
|
||||||
async createInvite(options?: CreateInviteOptions): Promise<Invite> {
|
async createInvite(options?: CreateInviteOptions): Promise<Invite> {
|
||||||
return this.guild.invites.create(this.id, options)
|
return this.guild.invites.create(this.id, options)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Get Permission Overties for a specific Member */
|
||||||
|
async overwritesFor(member: Member | string): Promise<Overwrite[]> {
|
||||||
|
member = (typeof member === 'string'
|
||||||
|
? await this.guild.members.get(member)
|
||||||
|
: member) as Member
|
||||||
|
if (member === undefined) throw new Error('Member not found')
|
||||||
|
const roles = await member.roles.array()
|
||||||
|
|
||||||
|
const overwrites: Overwrite[] = []
|
||||||
|
|
||||||
|
for (const overwrite of this.permissionOverwrites) {
|
||||||
|
if (overwrite.id === this.guild.id) {
|
||||||
|
overwrites.push(overwrite)
|
||||||
|
} else if (roles.some((e) => e.id === overwrite.id) === true) {
|
||||||
|
overwrites.push(overwrite)
|
||||||
|
} else if (overwrite.id === member.id) {
|
||||||
|
overwrites.push(overwrite)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return overwrites
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Get Permissions for a Member in this Channel */
|
||||||
|
async permissionsFor(member: Member | string): Promise<Permissions> {
|
||||||
|
const id = typeof member === 'string' ? member : member.id
|
||||||
|
if (id === this.guild.ownerID) return new Permissions(Permissions.ALL)
|
||||||
|
|
||||||
|
member = (typeof member === 'string'
|
||||||
|
? await this.guild.members.get(member)
|
||||||
|
: member) as Member
|
||||||
|
if (member === undefined) throw new Error('Member not found')
|
||||||
|
|
||||||
|
if (member.permissions.has('ADMINISTRATOR') === true)
|
||||||
|
return new Permissions(Permissions.ALL)
|
||||||
|
|
||||||
|
const overwrites = await this.overwritesFor(member)
|
||||||
|
const everyoneOW = overwrites.find((e) => e.id === this.guild.id)
|
||||||
|
const roleOWs = overwrites.filter((e) => e.type === 0)
|
||||||
|
const memberOWs = overwrites.filter((e) => e.type === 1)
|
||||||
|
|
||||||
|
return member.permissions
|
||||||
|
.remove(everyoneOW !== undefined ? Number(everyoneOW.deny) : 0)
|
||||||
|
.add(everyoneOW !== undefined ? Number(everyoneOW.allow) : 0)
|
||||||
|
.remove(roleOWs.length === 0 ? 0 : roleOWs.map((e) => Number(e.deny)))
|
||||||
|
.add(roleOWs.length === 0 ? 0 : roleOWs.map((e) => Number(e.allow)))
|
||||||
|
.remove(memberOWs.length === 0 ? 0 : memberOWs.map((e) => Number(e.deny)))
|
||||||
|
.add(memberOWs.length === 0 ? 0 : memberOWs.map((e) => Number(e.allow)))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
import { Client } from '../models/client.ts'
|
import { Client } from '../models/client.ts'
|
||||||
import { UserPayload } from '../types/user.ts'
|
import { UserPayload } from '../types/user.ts'
|
||||||
import { UserFlagsManager } from '../utils/userFlags.ts'
|
import { UserFlagsManager } from '../utils/userFlags.ts'
|
||||||
import { Base } from './base.ts'
|
import { SnowflakeBase } from './base.ts'
|
||||||
import { ImageURL } from './cdn.ts'
|
import { ImageURL } from './cdn.ts'
|
||||||
import { ImageSize, ImageFormats } from '../types/cdn.ts'
|
import { ImageSize, ImageFormats } from '../types/cdn.ts'
|
||||||
import { DEFAULT_USER_AVATAR, USER_AVATAR } from '../types/endpoint.ts'
|
import { DEFAULT_USER_AVATAR, USER_AVATAR } from '../types/endpoint.ts'
|
||||||
|
|
||||||
export class User extends Base {
|
export class User extends SnowflakeBase {
|
||||||
id: string
|
id: string
|
||||||
username: string
|
username: string
|
||||||
discriminator: string
|
discriminator: string
|
||||||
|
|
|
@ -1,5 +1,11 @@
|
||||||
// Ported from https://github.com/discordjs/discord.js/blob/master/src/util/BitField.js
|
// Ported from https://github.com/discordjs/discord.js/blob/master/src/util/BitField.js
|
||||||
export type BitFieldResolvable = number | BitField | string | BitField[]
|
export type BitFieldResolvable =
|
||||||
|
| number
|
||||||
|
| number[]
|
||||||
|
| BitField
|
||||||
|
| string
|
||||||
|
| string[]
|
||||||
|
| BitField[]
|
||||||
|
|
||||||
/** Bit Field utility to work with Bits and Flags */
|
/** Bit Field utility to work with Bits and Flags */
|
||||||
export class BitField {
|
export class BitField {
|
||||||
|
@ -20,7 +26,7 @@ export class BitField {
|
||||||
}
|
}
|
||||||
|
|
||||||
has(bit: BitFieldResolvable, ...args: any[]): boolean {
|
has(bit: BitFieldResolvable, ...args: any[]): boolean {
|
||||||
if (Array.isArray(bit)) return bit.every((p) => this.has(p))
|
if (Array.isArray(bit)) return (bit.every as any)((p: any) => this.has(p))
|
||||||
return (this.bitfield & BitField.resolve(this.flags, bit)) === bit
|
return (this.bitfield & BitField.resolve(this.flags, bit)) === bit
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -89,9 +95,10 @@ export class BitField {
|
||||||
if (typeof bit === 'number' && bit >= 0) return bit
|
if (typeof bit === 'number' && bit >= 0) return bit
|
||||||
if (bit instanceof BitField) return this.resolve(flags, bit.bitfield)
|
if (bit instanceof BitField) return this.resolve(flags, bit.bitfield)
|
||||||
if (Array.isArray(bit))
|
if (Array.isArray(bit))
|
||||||
return bit
|
return (bit.map as any)((p: any) => this.resolve(flags, p)).reduce(
|
||||||
.map((p) => this.resolve(flags, p))
|
(prev: any, p: any) => prev | p,
|
||||||
.reduce((prev, p) => prev | p, 0)
|
0
|
||||||
|
)
|
||||||
if (typeof bit === 'string' && typeof flags[bit] !== 'undefined')
|
if (typeof bit === 'string' && typeof flags[bit] !== 'undefined')
|
||||||
return flags[bit]
|
return flags[bit]
|
||||||
const error = new RangeError('BITFIELD_INVALID')
|
const error = new RangeError('BITFIELD_INVALID')
|
||||||
|
|
|
@ -1,10 +1,12 @@
|
||||||
// Ported from https://github.com/discordjs/discord.js/blob/master/src/util/Permissions.js
|
// Ported from https://github.com/discordjs/discord.js/blob/master/src/util/Permissions.js
|
||||||
import { PermissionFlags } from '../types/permissionFlags.ts'
|
import { PermissionFlags } from '../types/permissionFlags.ts'
|
||||||
import { BitField } from './bitfield.ts'
|
import { BitField, BitFieldResolvable } from './bitfield.ts'
|
||||||
|
|
||||||
export type PermissionResolvable =
|
export type PermissionResolvable =
|
||||||
| string
|
| string
|
||||||
|
| string[]
|
||||||
| number
|
| number
|
||||||
|
| number[]
|
||||||
| Permissions
|
| Permissions
|
||||||
| PermissionResolvable[]
|
| PermissionResolvable[]
|
||||||
|
|
||||||
|
@ -13,7 +15,7 @@ export class Permissions extends BitField {
|
||||||
static DEFAULT = 104324673
|
static DEFAULT = 104324673
|
||||||
static ALL = Object.values(PermissionFlags).reduce((all, p) => all | p, 0)
|
static ALL = Object.values(PermissionFlags).reduce((all, p) => all | p, 0)
|
||||||
|
|
||||||
constructor(bits: any) {
|
constructor(bits: BitFieldResolvable) {
|
||||||
super(PermissionFlags, bits)
|
super(PermissionFlags, bits)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
/** Utility class to extract data from a Snowflake (Discord ID) */
|
||||||
export class Snowflake {
|
export class Snowflake {
|
||||||
id: string
|
id: string
|
||||||
|
|
||||||
|
@ -9,19 +10,19 @@ export class Snowflake {
|
||||||
return BigInt.asUintN(64, BigInt(this.id))
|
return BigInt.asUintN(64, BigInt(this.id))
|
||||||
}
|
}
|
||||||
|
|
||||||
get timestamp(): string {
|
get timestamp(): number {
|
||||||
return ((this.snowflake >> 22n) + 1420070400000n).toString()
|
return Number(((this.snowflake >> 22n) + 1420070400000n).toString())
|
||||||
}
|
}
|
||||||
|
|
||||||
get workerID(): string {
|
get workerID(): number {
|
||||||
return ((this.snowflake & 0x3e0000n) >> 17n).toString()
|
return Number(((this.snowflake & 0x3e0000n) >> 17n).toString())
|
||||||
}
|
}
|
||||||
|
|
||||||
get processID(): string {
|
get processID(): number {
|
||||||
return ((this.snowflake & 0x1f00n) >> 12n).toString()
|
return Number(((this.snowflake & 0x1f00n) >> 12n).toString())
|
||||||
}
|
}
|
||||||
|
|
||||||
get increment(): string {
|
get increment(): number {
|
||||||
return (this.snowflake & 0xfffn).toString()
|
return Number((this.snowflake & 0xfffn).toString())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue