complete rest added
This commit is contained in:
parent
e7b0804616
commit
cc75a34d56
7 changed files with 250 additions and 0 deletions
|
@ -99,4 +99,20 @@ export class GuildChannelsManager extends BaseChildManager<
|
||||||
const channel = await this.get(res.id)
|
const channel = await this.get(res.id)
|
||||||
return (channel as unknown) as GuildChannel
|
return (channel as unknown) as GuildChannel
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Modify the positions of a set of channel positions for the guild. */
|
||||||
|
async editPositions(
|
||||||
|
...positions: Array<{ id: string | GuildChannel; position: number | null }>
|
||||||
|
): Promise<GuildChannelsManager> {
|
||||||
|
if (positions.length === 0)
|
||||||
|
throw new Error('No channel positions to change specified')
|
||||||
|
|
||||||
|
await this.client.rest.api.guilds[this.guild.id].channels.patch(
|
||||||
|
positions.map((e) => ({
|
||||||
|
id: typeof e.id === 'string' ? e.id : e.id.id,
|
||||||
|
position: e.position ?? null
|
||||||
|
}))
|
||||||
|
)
|
||||||
|
return this
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
|
import { fetchAuto } from '../../deps.ts'
|
||||||
import { Client } from '../models/client.ts'
|
import { Client } from '../models/client.ts'
|
||||||
import { Guild } from '../structures/guild.ts'
|
import { Guild } from '../structures/guild.ts'
|
||||||
|
import { Template } from '../structures/template.ts'
|
||||||
import { GUILD } from '../types/endpoint.ts'
|
import { GUILD } from '../types/endpoint.ts'
|
||||||
import { GuildPayload, MemberPayload } from '../types/guild.ts'
|
import { GuildPayload, MemberPayload } from '../types/guild.ts'
|
||||||
import { BaseManager } from './base.ts'
|
import { BaseManager } from './base.ts'
|
||||||
|
@ -32,4 +34,17 @@ export class GuildManager extends BaseManager<GuildPayload, Guild> {
|
||||||
.catch((e) => reject(e))
|
.catch((e) => reject(e))
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Create a new guild based on a template. */
|
||||||
|
async createFromTemplate(
|
||||||
|
template: Template | string,
|
||||||
|
name: string,
|
||||||
|
icon?: string
|
||||||
|
): Promise<Guild> {
|
||||||
|
if (icon?.startsWith('http') === true) icon = await fetchAuto(icon)
|
||||||
|
const guild = await this.client.rest.api.guilds.templates[
|
||||||
|
typeof template === 'object' ? template.code : template
|
||||||
|
].post({ name, icon })
|
||||||
|
return new Guild(this.client, guild)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -80,4 +80,20 @@ export class RolesManager extends BaseManager<RolePayload, Role> {
|
||||||
)
|
)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Modify the positions of a set of role positions for the guild. */
|
||||||
|
async editPositions(
|
||||||
|
...positions: Array<{ id: string | Role; position: number | null }>
|
||||||
|
): Promise<RolesManager> {
|
||||||
|
if (positions.length === 0)
|
||||||
|
throw new Error('No role positions to change specified')
|
||||||
|
|
||||||
|
await this.client.rest.api.guilds[this.guild.id].roles.patch(
|
||||||
|
positions.map((e) => ({
|
||||||
|
id: typeof e.id === 'string' ? e.id : e.id.id,
|
||||||
|
position: e.position ?? null
|
||||||
|
}))
|
||||||
|
)
|
||||||
|
return this
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,6 +21,10 @@ import { INVITE } from '../types/endpoint.ts'
|
||||||
import { ClientEvents } from '../gateway/handlers/index.ts'
|
import { ClientEvents } from '../gateway/handlers/index.ts'
|
||||||
import type { Collector } from './collectors.ts'
|
import type { Collector } from './collectors.ts'
|
||||||
import { HarmonyEventEmitter } from '../utils/events.ts'
|
import { HarmonyEventEmitter } from '../utils/events.ts'
|
||||||
|
import { VoiceRegion } from '../types/voice.ts'
|
||||||
|
import { fetchAuto } from '../../deps.ts'
|
||||||
|
import { DMChannel } from '../structures/dmChannel.ts'
|
||||||
|
import { Template } from '../structures/template.ts'
|
||||||
|
|
||||||
/** OS related properties sent with Gateway Identify */
|
/** OS related properties sent with Gateway Identify */
|
||||||
export interface ClientProperties {
|
export interface ClientProperties {
|
||||||
|
@ -354,6 +358,58 @@ export class Client extends HarmonyEventEmitter<ClientEvents> {
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
return super.emit(event, ...args)
|
return super.emit(event, ...args)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Returns an array of voice region objects that can be used when creating servers. */
|
||||||
|
async fetchVoiceRegions(): Promise<VoiceRegion[]> {
|
||||||
|
return this.rest.api.voice.regions.get()
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Modify current (Client) User. */
|
||||||
|
async editUser(data: {
|
||||||
|
username?: string
|
||||||
|
avatar?: string
|
||||||
|
}): Promise<Client> {
|
||||||
|
if (data.username === undefined && data.avatar === undefined)
|
||||||
|
throw new Error(
|
||||||
|
'Either username or avatar or both must be specified to edit'
|
||||||
|
)
|
||||||
|
|
||||||
|
if (data.avatar?.startsWith('http') === true) {
|
||||||
|
data.avatar = await fetchAuto(data.avatar)
|
||||||
|
}
|
||||||
|
|
||||||
|
await this.rest.api.users['@me'].patch({
|
||||||
|
username: data.username,
|
||||||
|
avatar: data.avatar
|
||||||
|
})
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Change Username of the Client User */
|
||||||
|
async setUsername(username: string): Promise<Client> {
|
||||||
|
return await this.editUser({ username })
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Change Avatar of the Client User */
|
||||||
|
async setAvatar(avatar: string): Promise<Client> {
|
||||||
|
return await this.editUser({ avatar })
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Create a DM Channel with a User */
|
||||||
|
async createDM(user: User | string): Promise<DMChannel> {
|
||||||
|
const id = typeof user === 'object' ? user.id : user
|
||||||
|
const dmPayload = await this.rest.api.users['@me'].channels.post({
|
||||||
|
recipient_id: id
|
||||||
|
})
|
||||||
|
await this.channels.set(dmPayload.id, dmPayload)
|
||||||
|
return (this.channels.get<DMChannel>(dmPayload.id) as unknown) as DMChannel
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Returns a template object for the given code. */
|
||||||
|
async fetchTemplate(code: string): Promise<Template> {
|
||||||
|
const payload = await this.rest.api.guilds.templates[code].get()
|
||||||
|
return new Template(this, payload)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Event decorator to create an Event handler from function */
|
/** Event decorator to create an Event handler from function */
|
||||||
|
|
|
@ -4,6 +4,7 @@ import {
|
||||||
GuildFeatures,
|
GuildFeatures,
|
||||||
GuildIntegrationPayload,
|
GuildIntegrationPayload,
|
||||||
GuildPayload,
|
GuildPayload,
|
||||||
|
GuildWidgetPayload,
|
||||||
IntegrationAccountPayload,
|
IntegrationAccountPayload,
|
||||||
IntegrationExpireBehavior
|
IntegrationExpireBehavior
|
||||||
} from '../types/guild.ts'
|
} from '../types/guild.ts'
|
||||||
|
@ -25,6 +26,8 @@ import { GUILD_BAN, GUILD_BANS, GUILD_INTEGRATIONS } from '../types/endpoint.ts'
|
||||||
import { GuildVoiceStatesManager } from '../managers/guildVoiceStates.ts'
|
import { GuildVoiceStatesManager } from '../managers/guildVoiceStates.ts'
|
||||||
import { RequestMembersOptions } from '../gateway/index.ts'
|
import { RequestMembersOptions } from '../gateway/index.ts'
|
||||||
import { GuildPresencesManager } from '../managers/presences.ts'
|
import { GuildPresencesManager } from '../managers/presences.ts'
|
||||||
|
import { TemplatePayload } from '../types/template.ts'
|
||||||
|
import { Template } from './template.ts'
|
||||||
|
|
||||||
export class GuildBan extends Base {
|
export class GuildBan extends Base {
|
||||||
guild: Guild
|
guild: Guild
|
||||||
|
@ -326,6 +329,125 @@ export class Guild extends Base {
|
||||||
}, timeout)
|
}, timeout)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Attach an integration object from the current user to the guild. */
|
||||||
|
async createIntegration(id: string, type: string): Promise<Guild> {
|
||||||
|
await this.client.rest.api.guilds[this.id].integrations.post({ id, type })
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Modify the behavior and settings of an integration object for the guild. */
|
||||||
|
async editIntegration(
|
||||||
|
id: string,
|
||||||
|
data: {
|
||||||
|
expireBehavior?: number | null
|
||||||
|
expireGracePeriod?: number | null
|
||||||
|
enableEmoticons?: boolean | null
|
||||||
|
}
|
||||||
|
): Promise<Guild> {
|
||||||
|
await this.client.rest.api.guilds[this.id].integrations[id].patch({
|
||||||
|
expire_behaviour: data.expireBehavior,
|
||||||
|
expire_grace_period: data.expireGracePeriod,
|
||||||
|
enable_emoticons: data.enableEmoticons
|
||||||
|
})
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Delete the attached integration object for the guild. Deletes any associated webhooks and kicks the associated bot if there is one. */
|
||||||
|
async deleteIntegration(id: string): Promise<Guild> {
|
||||||
|
await this.client.rest.api.guilds[this.id].integrations[id].delete()
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Sync an integration. */
|
||||||
|
async syncIntegration(id: string): Promise<Guild> {
|
||||||
|
await this.client.rest.api.guilds[this.id].integrations[id].sync.post()
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Returns the widget for the guild. */
|
||||||
|
async getWidget(): Promise<GuildWidgetPayload> {
|
||||||
|
return this.client.rest.api.guilds[this.id]['widget.json'].get()
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Modify a guild widget object for the guild. */
|
||||||
|
async editWidget(data: {
|
||||||
|
enabled?: boolean
|
||||||
|
channel?: string | GuildChannel
|
||||||
|
}): Promise<Guild> {
|
||||||
|
await this.client.rest.api.guilds[this.id].widget.patch({
|
||||||
|
enabled: data.enabled,
|
||||||
|
channel_id:
|
||||||
|
typeof data.channel === 'object' ? data.channel.id : data.channel
|
||||||
|
})
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Returns a partial invite object for guilds with that feature enabled. */
|
||||||
|
async getVanity(): Promise<{ code: string | null; uses: number }> {
|
||||||
|
return this.client.rest.api.guilds[this.id]['vanity-url'].get()
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Returns a PNG (URL) image widget for the guild. */
|
||||||
|
getWidgetImageURL(
|
||||||
|
style?: 'shield' | 'banner1' | 'banner2' | 'banner3' | 'banner4'
|
||||||
|
): string {
|
||||||
|
return `https://discord.com/api/v${this.client.rest.version ?? 8}/guilds/${
|
||||||
|
this.id
|
||||||
|
}/widget.png${style !== undefined ? `?style=${style}` : ''}`
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Leave a Guild. */
|
||||||
|
async leave(): Promise<Client> {
|
||||||
|
await this.client.rest.api.users['@me'].guilds[this.id].delete()
|
||||||
|
return this.client
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Returns an array of template objects. */
|
||||||
|
async getTemplates(): Promise<Template[]> {
|
||||||
|
return this.client.rest.api.guilds[this.id].templates
|
||||||
|
.get()
|
||||||
|
.then((temps: TemplatePayload[]) =>
|
||||||
|
temps.map((temp) => new Template(this.client, temp))
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Creates a template for the guild. */
|
||||||
|
async createTemplate(
|
||||||
|
name: string,
|
||||||
|
description?: string | null
|
||||||
|
): Promise<Template> {
|
||||||
|
const payload = await this.client.rest.api.guilds[this.id].templates.post({
|
||||||
|
name,
|
||||||
|
description
|
||||||
|
})
|
||||||
|
return new Template(this.client, payload)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Syncs the template to the guild's current state. */
|
||||||
|
async syncTemplate(code: string): Promise<Template> {
|
||||||
|
const payload = await this.client.rest.api.guilds[this.id].templates[
|
||||||
|
code
|
||||||
|
].sync.put()
|
||||||
|
return new Template(this.client, payload)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Modifies the template's metadata. */
|
||||||
|
async editTemplate(
|
||||||
|
code: string,
|
||||||
|
data: { name?: string; description?: string }
|
||||||
|
): Promise<Template> {
|
||||||
|
const payload = await this.client.rest.api.guilds[this.id].templates[
|
||||||
|
code
|
||||||
|
].patch({ name: data.name, description: data.description })
|
||||||
|
return new Template(this.client, payload)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Deletes the template. Requires the MANAGE_GUILD permission. */
|
||||||
|
async deleteTemplate(code: string): Promise<Guild> {
|
||||||
|
await this.client.rest.api.guilds[this.id].templates[code].delete()
|
||||||
|
return this
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export class GuildIntegration extends Base {
|
export class GuildIntegration extends Base {
|
||||||
|
|
|
@ -150,3 +150,12 @@ export interface GuildBanPayload {
|
||||||
reason: string | null
|
reason: string | null
|
||||||
user: UserPayload
|
user: UserPayload
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface GuildWidgetPayload {
|
||||||
|
id: string
|
||||||
|
name: string
|
||||||
|
instant_invite: string
|
||||||
|
channels: Array<{ id: string; name: string; position: number }>
|
||||||
|
members: MemberPayload[]
|
||||||
|
presence_count: number
|
||||||
|
}
|
||||||
|
|
|
@ -42,3 +42,19 @@ export interface VoiceStatePayload {
|
||||||
self_video: boolean
|
self_video: boolean
|
||||||
suppress: boolean
|
suppress: boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Voice Region Structure */
|
||||||
|
export interface VoiceRegion {
|
||||||
|
/** Unique ID for the region */
|
||||||
|
id: string
|
||||||
|
/** Name of the region */
|
||||||
|
name: string
|
||||||
|
/** True if this is a vip-only server */
|
||||||
|
vip: boolean
|
||||||
|
/** True for a single server that is closest to the current user's client */
|
||||||
|
optimal: boolean
|
||||||
|
/** Whether this is a deprecated voice region (avoid switching to these) */
|
||||||
|
deprecated: boolean
|
||||||
|
/** Whether this is a custom voice region (used for events/etc) */
|
||||||
|
custom: boolean
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue