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)
|
||||
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 { Guild } from '../structures/guild.ts'
|
||||
import { Template } from '../structures/template.ts'
|
||||
import { GUILD } from '../types/endpoint.ts'
|
||||
import { GuildPayload, MemberPayload } from '../types/guild.ts'
|
||||
import { BaseManager } from './base.ts'
|
||||
|
@ -32,4 +34,17 @@ export class GuildManager extends BaseManager<GuildPayload, Guild> {
|
|||
.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
|
||||
}
|
||||
|
||||
/** 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 type { Collector } from './collectors.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 */
|
||||
export interface ClientProperties {
|
||||
|
@ -354,6 +358,58 @@ export class Client extends HarmonyEventEmitter<ClientEvents> {
|
|||
// @ts-ignore
|
||||
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 */
|
||||
|
|
|
@ -4,6 +4,7 @@ import {
|
|||
GuildFeatures,
|
||||
GuildIntegrationPayload,
|
||||
GuildPayload,
|
||||
GuildWidgetPayload,
|
||||
IntegrationAccountPayload,
|
||||
IntegrationExpireBehavior
|
||||
} 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 { RequestMembersOptions } from '../gateway/index.ts'
|
||||
import { GuildPresencesManager } from '../managers/presences.ts'
|
||||
import { TemplatePayload } from '../types/template.ts'
|
||||
import { Template } from './template.ts'
|
||||
|
||||
export class GuildBan extends Base {
|
||||
guild: Guild
|
||||
|
@ -326,6 +329,125 @@ export class Guild extends Base {
|
|||
}, 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 {
|
||||
|
|
|
@ -150,3 +150,12 @@ export interface GuildBanPayload {
|
|||
reason: string | null
|
||||
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
|
||||
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