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…
	
	Add table
		Add a link
		
	
		Reference in a new issue