more things
This commit is contained in:
		
							parent
							
								
									e3bce85f09
								
							
						
					
					
						commit
						c3fafdfcf0
					
				
					 10 changed files with 138 additions and 24 deletions
				
			
		|  | @ -5,11 +5,14 @@ import { CategoryChannel } from '../structures/guildCategoryChannel.ts' | |||
| import { GuildTextChannel } from '../structures/textChannel.ts' | ||||
| import { VoiceChannel } from '../structures/guildVoiceChannel.ts' | ||||
| import { | ||||
|   ChannelTypes, | ||||
|   GuildCategoryChannelPayload, | ||||
|   GuildChannelPayload, | ||||
|   GuildTextChannelPayload, | ||||
|   GuildVoiceChannelPayload | ||||
|   GuildVoiceChannelPayload, | ||||
|   Overwrite | ||||
| } from '../types/channel.ts' | ||||
| import { CHANNEL } from '../types/endpoint.ts' | ||||
| import { CHANNEL, GUILD_CHANNELS } from '../types/endpoint.ts' | ||||
| import { BaseChildManager } from './baseChild.ts' | ||||
| import { ChannelsManager } from './channels.ts' | ||||
| 
 | ||||
|  | @ -19,6 +22,19 @@ export type GuildChannelPayloads = | |||
|   | GuildCategoryChannelPayload | ||||
| export type GuildChannel = GuildTextChannel | VoiceChannel | CategoryChannel | ||||
| 
 | ||||
| export interface CreateChannelOptions { | ||||
|   name: string | ||||
|   type?: ChannelTypes | ||||
|   topic?: string | ||||
|   bitrate?: number | ||||
|   userLimit?: number | ||||
|   rateLimitPerUser?: number | ||||
|   position?: number | ||||
|   permissionOverwrites?: Overwrite[] | ||||
|   parent?: CategoryChannel | string | ||||
|   nsfw?: boolean | ||||
| } | ||||
| 
 | ||||
| export class GuildChannelsManager extends BaseChildManager< | ||||
|   GuildChannelPayloads, | ||||
|   GuildChannel | ||||
|  | @ -55,4 +71,32 @@ export class GuildChannelsManager extends BaseChildManager< | |||
|     } | ||||
|     return true | ||||
|   } | ||||
| 
 | ||||
|   /** Create a new Guild Channel */ | ||||
|   async create(options: CreateChannelOptions): Promise<GuildChannel> { | ||||
|     if (options.name === undefined) | ||||
|       throw new Error('name is required for GuildChannelsManager#create') | ||||
|     const res = ((await this.client.rest.post(GUILD_CHANNELS(this.guild.id)), | ||||
|     { | ||||
|       name: options.name, | ||||
|       type: options.type, | ||||
|       topic: options.topic, | ||||
|       bitrate: options.bitrate, | ||||
|       user_limit: options.userLimit, | ||||
|       rate_limit_per_user: options.rateLimitPerUser, | ||||
|       position: options.position, | ||||
|       permission_overwrites: options.permissionOverwrites, | ||||
|       parent_id: | ||||
|         options.parent === undefined | ||||
|           ? undefined | ||||
|           : typeof options.parent === 'object' | ||||
|           ? options.parent.id | ||||
|           : options.parent, | ||||
|       nsfw: options.nsfw | ||||
|     }) as unknown) as GuildChannelPayload | ||||
| 
 | ||||
|     await this.set(res.id, res) | ||||
|     const channel = await this.get(res.id) | ||||
|     return (channel as unknown) as GuildChannel | ||||
|   } | ||||
| } | ||||
|  |  | |||
|  | @ -17,6 +17,13 @@ export class GuildVoiceStatesManager extends BaseManager< | |||
|     this.guild = guild | ||||
|   } | ||||
| 
 | ||||
|   /** Get Client's Voice State in the Guild */ | ||||
|   async me(): Promise<VoiceState | undefined> { | ||||
|     const member = await this.guild.me() | ||||
|     return await this.get(member.id) | ||||
|   } | ||||
| 
 | ||||
|   /** Get a Voice State by User ID */ | ||||
|   async get(key: string): Promise<VoiceState | undefined> { | ||||
|     const raw = await this._get(key) | ||||
|     if (raw === undefined) return | ||||
|  |  | |||
|  | @ -3,8 +3,13 @@ import { Emoji } from '../structures/emoji.ts' | |||
| import { Guild } from '../structures/guild.ts' | ||||
| import { Message } from '../structures/message.ts' | ||||
| import { MessageReaction } from '../structures/messageReaction.ts' | ||||
| import { User } from '../structures/user.ts' | ||||
| import { Reaction } from '../types/channel.ts' | ||||
| import { MESSAGE_REACTION, MESSAGE_REACTIONS } from '../types/endpoint.ts' | ||||
| import { | ||||
|   MESSAGE_REACTION, | ||||
|   MESSAGE_REACTIONS, | ||||
|   MESSAGE_REACTION_USER | ||||
| } from '../types/endpoint.ts' | ||||
| import { BaseManager } from './base.ts' | ||||
| 
 | ||||
| export class MessageReactionsManager extends BaseManager< | ||||
|  | @ -77,4 +82,23 @@ export class MessageReactionsManager extends BaseManager< | |||
|     ) | ||||
|     return this | ||||
|   } | ||||
| 
 | ||||
|   /** Remove a specific Emoji from Reactions */ | ||||
|   async removeUser( | ||||
|     emoji: Emoji | string, | ||||
|     user: User | string | ||||
|   ): Promise<MessageReactionsManager> { | ||||
|     const val = encodeURIComponent( | ||||
|       (typeof emoji === 'object' ? emoji.id ?? emoji.name : emoji) as string | ||||
|     ) | ||||
|     await this.client.rest.delete( | ||||
|       MESSAGE_REACTION_USER( | ||||
|         this.message.channel.id, | ||||
|         this.message.id, | ||||
|         val, | ||||
|         typeof user === 'string' ? user : user.id | ||||
|       ) | ||||
|     ) | ||||
|     return this | ||||
|   } | ||||
| } | ||||
|  |  | |||
|  | @ -1,5 +1,6 @@ | |||
| import { Client } from '../models/client.ts' | ||||
| import { MessageReaction } from '../structures/messageReaction.ts' | ||||
| import { User } from '../structures/user.ts' | ||||
| import { UsersManager } from './users.ts' | ||||
| 
 | ||||
| export class ReactionUsersManager extends UsersManager { | ||||
|  | @ -10,4 +11,14 @@ export class ReactionUsersManager extends UsersManager { | |||
|     this.cacheName = `reaction_users:${reaction.message.id}` | ||||
|     this.reaction = reaction | ||||
|   } | ||||
| 
 | ||||
|   /** Remove all Users from this Reaction */ | ||||
|   async removeAll(): Promise<void> { | ||||
|     await this.reaction.message.reactions.removeEmoji(this.reaction.emoji) | ||||
|   } | ||||
| 
 | ||||
|   /** Remove a specific User from this Reaction */ | ||||
|   async remove(user: User | string): Promise<void> { | ||||
|     await this.reaction.message.reactions.removeUser(this.reaction.emoji, user) | ||||
|   } | ||||
| } | ||||
|  |  | |||
|  | @ -134,7 +134,7 @@ export class Client extends EventEmitter { | |||
|     handler: (interaction: Interaction) => any | ||||
|   }> | ||||
| 
 | ||||
|   _decoratedSlashModules?: SlashModule[] | ||||
|   _decoratedSlashModules?: string[] | ||||
|   _id?: string | ||||
| 
 | ||||
|   /** Shard on which this Client is */ | ||||
|  | @ -291,6 +291,7 @@ export class Client extends EventEmitter { | |||
|   } | ||||
| } | ||||
| 
 | ||||
| /** Event decorator to create an Event handler from function */ | ||||
| export function event(name?: keyof ClientEvents) { | ||||
|   return function (client: Client | Extension, prop: keyof ClientEvents) { | ||||
|     const listener = ((client as unknown) as { | ||||
|  | @ -311,7 +312,7 @@ export function slash(name?: string, guild?: string) { | |||
|     if (client._decoratedSlash === undefined) client._decoratedSlash = [] | ||||
|     const item = (client as { [name: string]: any })[prop] | ||||
|     if (typeof item !== 'function') { | ||||
|       client._decoratedSlash.push(item) | ||||
|       throw new Error('@slash decorator requires a function') | ||||
|     } else | ||||
|       client._decoratedSlash.push({ | ||||
|         name: name ?? prop, | ||||
|  | @ -327,8 +328,7 @@ export function subslash(parent: string, name?: string, guild?: string) { | |||
|     if (client._decoratedSlash === undefined) client._decoratedSlash = [] | ||||
|     const item = (client as { [name: string]: any })[prop] | ||||
|     if (typeof item !== 'function') { | ||||
|       item.parent = parent | ||||
|       client._decoratedSlash.push(item) | ||||
|       throw new Error('@subslash decorator requires a function') | ||||
|     } else | ||||
|       client._decoratedSlash.push({ | ||||
|         parent, | ||||
|  | @ -350,9 +350,7 @@ export function groupslash( | |||
|     if (client._decoratedSlash === undefined) client._decoratedSlash = [] | ||||
|     const item = (client as { [name: string]: any })[prop] | ||||
|     if (typeof item !== 'function') { | ||||
|       item.parent = parent | ||||
|       item.group = group | ||||
|       client._decoratedSlash.push(item) | ||||
|       throw new Error('@groupslash decorator requires a function') | ||||
|     } else | ||||
|       client._decoratedSlash.push({ | ||||
|         group, | ||||
|  |  | |||
|  | @ -382,6 +382,7 @@ export class CommandClient extends Client implements CommandClientOptions { | |||
|   } | ||||
| } | ||||
| 
 | ||||
| /** Command decorator */ | ||||
| export function command(options?: CommandOptions) { | ||||
|   return function (target: CommandClient | Extension, name: string) { | ||||
|     if (target._decoratedCommands === undefined) target._decoratedCommands = {} | ||||
|  | @ -390,10 +391,8 @@ export function command(options?: CommandOptions) { | |||
|       [name: string]: (ctx: CommandContext) => any | ||||
|     })[name] | ||||
| 
 | ||||
|     if (prop instanceof Command) { | ||||
|       target._decoratedCommands[prop.name] = prop | ||||
|       return | ||||
|     } | ||||
|     if (typeof prop !== 'function') | ||||
|       throw new Error('@command decorator can only be used on functions') | ||||
| 
 | ||||
|     const command = new Command() | ||||
| 
 | ||||
|  |  | |||
|  | @ -14,11 +14,11 @@ import { RESTManager } from './rest.ts' | |||
| import { SlashModule } from './slashModule.ts' | ||||
| import { verify as edverify } from 'https://deno.land/x/ed25519/mod.ts' | ||||
| import { Buffer } from 'https://deno.land/std@0.80.0/node/buffer.ts' | ||||
| import { | ||||
| import type { | ||||
|   Request as ORequest, | ||||
|   Response as OResponse | ||||
| } from 'https://deno.land/x/opine@1.0.0/src/types.ts' | ||||
| import { Context } from 'https://deno.land/x/oak@v6.4.0/mod.ts' | ||||
| import type { Context } from 'https://deno.land/x/oak@v6.4.0/mod.ts' | ||||
| 
 | ||||
| export class SlashCommand { | ||||
|   slash: SlashCommandsManager | ||||
|  | @ -353,7 +353,7 @@ export class SlashClient { | |||
|     handler: (interaction: Interaction) => any | ||||
|   }> | ||||
| 
 | ||||
|   _decoratedSlashModules?: SlashModule[] | ||||
|   _decoratedSlashModules?: string[] | ||||
| 
 | ||||
|   constructor(options: SlashOptions) { | ||||
|     let id = options.id | ||||
|  | @ -378,7 +378,14 @@ export class SlashClient { | |||
| 
 | ||||
|     if (this.client?._decoratedSlashModules !== undefined) { | ||||
|       this.client._decoratedSlashModules.forEach((e) => { | ||||
|         this.modules.push(e) | ||||
|         const mod = ((this.client as unknown) as { | ||||
|           [name: string]: SlashModule | ||||
|         })[e] | ||||
|         if (!(mod instanceof SlashModule)) | ||||
|           throw new Error( | ||||
|             '@slashModule can only be used on SlashModule instances' | ||||
|           ) | ||||
|         this.modules.push(mod) | ||||
|       }) | ||||
|     } | ||||
| 
 | ||||
|  | @ -390,7 +397,12 @@ export class SlashClient { | |||
| 
 | ||||
|     if (this._decoratedSlashModules !== undefined) { | ||||
|       this._decoratedSlashModules.forEach((e) => { | ||||
|         this.modules.push(e) | ||||
|         const mod = ((this as unknown) as { [name: string]: SlashModule })[e] | ||||
|         if (!(mod instanceof SlashModule)) | ||||
|           throw new Error( | ||||
|             '@slashModule can only be used on SlashModule instances' | ||||
|           ) | ||||
|         this.modules.push(mod) | ||||
|       }) | ||||
|     } | ||||
| 
 | ||||
|  | @ -418,11 +430,13 @@ export class SlashClient { | |||
|     return this | ||||
|   } | ||||
| 
 | ||||
|   /** Load a Slash Module */ | ||||
|   loadModule(module: SlashModule): SlashClient { | ||||
|     this.modules.push(module) | ||||
|     return this | ||||
|   } | ||||
| 
 | ||||
|   /** Get all Handlers. Including Slash Modules */ | ||||
|   getHandlers(): SlashCommandHandler[] { | ||||
|     let res = this.handlers | ||||
|     for (const mod of this.modules) { | ||||
|  | @ -438,6 +452,7 @@ export class SlashClient { | |||
|     return res | ||||
|   } | ||||
| 
 | ||||
|   /** Get Handler for an Interaction. Supports nested sub commands and sub command groups. */ | ||||
|   private _getCommand(i: Interaction): SlashCommandHandler | undefined { | ||||
|     return this.getHandlers().find((e) => { | ||||
|       const hasGroupOrParent = e.group !== undefined || e.parent !== undefined | ||||
|  | @ -467,6 +482,10 @@ export class SlashClient { | |||
|     if (interaction.type !== InteractionType.APPLICATION_COMMAND) return | ||||
| 
 | ||||
|     const cmd = this._getCommand(interaction) | ||||
|     if (cmd?.group !== undefined) | ||||
|       interaction.data.options = interaction.data.options[0].options ?? [] | ||||
|     if (cmd?.parent !== undefined) | ||||
|       interaction.data.options = interaction.data.options[0].options ?? [] | ||||
| 
 | ||||
|     if (cmd === undefined) return | ||||
| 
 | ||||
|  |  | |||
|  | @ -13,8 +13,6 @@ export class GroupDMChannel extends Channel { | |||
|     this.name = data.name | ||||
|     this.icon = data.icon | ||||
|     this.ownerID = data.owner_id | ||||
|     // TODO: Cache in Gateway Event Code
 | ||||
|     // cache.set('groupchannel', this.id, this)
 | ||||
|   } | ||||
| 
 | ||||
|   readFromData(data: GroupDMChannelPayload): void { | ||||
|  |  | |||
|  | @ -8,9 +8,13 @@ import { | |||
|   IntegrationExpireBehavior | ||||
| } from '../types/guild.ts' | ||||
| import { Base } from './base.ts' | ||||
| import { RolesManager } from '../managers/roles.ts' | ||||
| import { CreateGuildRoleOptions, RolesManager } from '../managers/roles.ts' | ||||
| import { InviteManager } from '../managers/invites.ts' | ||||
| import { GuildChannelsManager } from '../managers/guildChannels.ts' | ||||
| import { | ||||
|   CreateChannelOptions, | ||||
|   GuildChannel, | ||||
|   GuildChannelsManager | ||||
| } from '../managers/guildChannels.ts' | ||||
| import { MembersManager } from '../managers/members.ts' | ||||
| import { Role } from './role.ts' | ||||
| import { GuildEmojisManager } from '../managers/guildEmojis.ts' | ||||
|  | @ -297,6 +301,16 @@ export class Guild extends Base { | |||
|     return raw.map((e) => new GuildIntegration(this.client, e)) | ||||
|   } | ||||
| 
 | ||||
|   /** Create a new Guild Channel */ | ||||
|   async createChannel(options: CreateChannelOptions): Promise<GuildChannel> { | ||||
|     return this.channels.create(options) | ||||
|   } | ||||
| 
 | ||||
|   /** Create a new Guild Role */ | ||||
|   async createRole(options?: CreateGuildRoleOptions): Promise<Role> { | ||||
|     return this.roles.create(options) | ||||
|   } | ||||
| 
 | ||||
|   /** | ||||
|    * Chunks the Guild Members, i.e. cache them. | ||||
|    * @param options Options regarding the Members Request | ||||
|  |  | |||
|  | @ -32,7 +32,7 @@ const GUILD_BANS = (guildID: string): string => | |||
|   `${DISCORD_API_URL}/v${DISCORD_API_VERSION}/guilds/${guildID}/bans` | ||||
| const GUILD_CHANNEL = (channelID: string): string => | ||||
|   `${DISCORD_API_URL}/v${DISCORD_API_VERSION}/channels/${channelID}` | ||||
| const GUILD_CHANNELS = (guildID: string, channelID: string): string => | ||||
| const GUILD_CHANNELS = (guildID: string): string => | ||||
|   `${DISCORD_API_URL}/v${DISCORD_API_VERSION}/guilds/${guildID}/channels` | ||||
| const GUILD_MEMBER = (guildID: string, memberID: string): string => | ||||
|   `${DISCORD_API_URL}/v${DISCORD_API_VERSION}/guilds/${guildID}/members/${memberID}` | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue