Merge branch 'main' into main
This commit is contained in:
		
						commit
						e1a8a8526a
					
				
					 19 changed files with 303 additions and 99 deletions
				
			
		|  | @ -17,7 +17,7 @@ export const guildEmojiUpdate: GatewayEventHandler = async ( | ||||||
|     const _updated: EmojiPayload[] = [] |     const _updated: EmojiPayload[] = [] | ||||||
| 
 | 
 | ||||||
|     for (const raw of d.emojis) { |     for (const raw of d.emojis) { | ||||||
|       const emojiID = raw.id !== null ? raw.id : raw.name |       const emojiID = (raw.id !== null ? raw.id : raw.name) as string | ||||||
|       const has = emojis.get(emojiID) |       const has = emojis.get(emojiID) | ||||||
|       if (has === undefined) { |       if (has === undefined) { | ||||||
|         await guild.emojis.set(emojiID, raw) |         await guild.emojis.set(emojiID, raw) | ||||||
|  | @ -27,7 +27,7 @@ export const guildEmojiUpdate: GatewayEventHandler = async ( | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     for (const emoji of emojis.values()) { |     for (const emoji of emojis.values()) { | ||||||
|       const emojiID = emoji.id !== null ? emoji.id : emoji.name |       const emojiID = (emoji.id !== null ? emoji.id : emoji.name) as string | ||||||
|       const find = _updated.find((e) => { |       const find = _updated.find((e) => { | ||||||
|         const eID = e.id !== null ? e.id : e.name |         const eID = e.id !== null ? e.id : e.name | ||||||
|         return emojiID === eID |         return emojiID === eID | ||||||
|  | @ -36,7 +36,7 @@ export const guildEmojiUpdate: GatewayEventHandler = async ( | ||||||
|         await guild.emojis.delete(emojiID) |         await guild.emojis.delete(emojiID) | ||||||
|         deleted.push(emoji) |         deleted.push(emoji) | ||||||
|       } else { |       } else { | ||||||
|         const foundID = find.id !== null ? find.id : find.name |         const foundID = (find.id !== null ? find.id : find.name) as string | ||||||
|         const before = (await guild.emojis.get(foundID)) as Emoji |         const before = (await guild.emojis.get(foundID)) as Emoji | ||||||
|         await guild.emojis.set(foundID, find) |         await guild.emojis.set(foundID, find) | ||||||
|         const after = (await guild.emojis.get(foundID)) as Emoji |         const after = (await guild.emojis.get(foundID)) as Emoji | ||||||
|  |  | ||||||
|  | @ -99,238 +99,248 @@ export const gatewayHandlers: { | ||||||
|   INTERACTION_CREATE: interactionCreate |   INTERACTION_CREATE: interactionCreate | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| export interface EventTypes { |  | ||||||
|   [name: string]: (...args: any[]) => void |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| export interface VoiceServerUpdateData { | export interface VoiceServerUpdateData { | ||||||
|   token: string |   token: string | ||||||
|   endpoint: string |   endpoint: string | ||||||
|   guild: Guild |   guild: Guild | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| export interface ClientEvents extends EventTypes { | export interface ClientEvents { | ||||||
|   /** When Client has successfully connected to Discord */ |   /** When Client has successfully connected to Discord */ | ||||||
|   ready: () => void |   ready: [] | ||||||
|   /** When a successful reconnect has been made */ |   /** When a successful reconnect has been made */ | ||||||
|   reconnect: () => void |   reconnect: [] | ||||||
|   /** When a successful session resume has been done */ |   /** When a successful session resume has been done */ | ||||||
|   resumed: () => void |   resumed: [] | ||||||
|   /** |   /** | ||||||
|    * When a new Channel is created |    * When a new Channel is created | ||||||
|    * @param channel New Channel object |    * @param channel New Channel object | ||||||
|    */ |    */ | ||||||
|   channelCreate: (channel: EveryChannelTypes) => void |   channelCreate: [channel: EveryChannelTypes] | ||||||
|   /** |   /** | ||||||
|    * When a Channel was deleted |    * When a Channel was deleted | ||||||
|    * @param channel Channel object which was deleted |    * @param channel Channel object which was deleted | ||||||
|    */ |    */ | ||||||
|   channelDelete: (channel: EveryChannelTypes) => void |   channelDelete: [channel: EveryChannelTypes] | ||||||
|   /** |   /** | ||||||
|    * Channel's Pinned Messages were updated |    * Channel's Pinned Messages were updated | ||||||
|    * @param before Channel object before update |    * @param before Channel object before update | ||||||
|    * @param after Channel object after update |    * @param after Channel object after update | ||||||
|    */ |    */ | ||||||
|   channelPinsUpdate: ( |   channelPinsUpdate: [ | ||||||
|     before: EveryTextChannelTypes, |     before: EveryTextChannelTypes, | ||||||
|     after: EveryTextChannelTypes |     after: EveryTextChannelTypes | ||||||
|   ) => void |   ] | ||||||
|   /** |   /** | ||||||
|    * A Channel was updated |    * A Channel was updated | ||||||
|    * @param before Channel object before update |    * @param before Channel object before update | ||||||
|    * @param after Channel object after update |    * @param after Channel object after update | ||||||
|    */ |    */ | ||||||
|   channelUpdate: (before: EveryChannelTypes, after: EveryChannelTypes) => void |   channelUpdate: [before: EveryChannelTypes, after: EveryChannelTypes] | ||||||
|   /** |   /** | ||||||
|    * A User was banned from a Guild |    * A User was banned from a Guild | ||||||
|    * @param guild The Guild from which User was banned |    * @param guild The Guild from which User was banned | ||||||
|    * @param user The User who was banned |    * @param user The User who was banned | ||||||
|    */ |    */ | ||||||
|   guildBanAdd: (guild: Guild, user: User) => void |   guildBanAdd: [guild: Guild, user: User] | ||||||
|   /** |   /** | ||||||
|    * A ban from a User in Guild was elevated |    * A ban from a User in Guild was elevated | ||||||
|    * @param guild Guild from which ban was removed |    * @param guild Guild from which ban was removed | ||||||
|    * @param user User of which ban was elevated |    * @param user User of which ban was elevated | ||||||
|    */ |    */ | ||||||
|   guildBanRemove: (guild: Guild, user: User) => void |   guildBanRemove: [guild: Guild, user: User] | ||||||
|   /** |   /** | ||||||
|    * Client has joined a new Guild. |    * Client has joined a new Guild. | ||||||
|    * @param guild The new Guild object |    * @param guild The new Guild object | ||||||
|    */ |    */ | ||||||
|   guildCreate: (guild: Guild) => void |   guildCreate: [guild: Guild] | ||||||
|   /** |   /** | ||||||
|    * A Guild in which Client was either deleted, or bot was kicked |    * A Guild in which Client was either deleted, or bot was kicked | ||||||
|    * @param guild The Guild object |    * @param guild The Guild object | ||||||
|    */ |    */ | ||||||
|   guildDelete: (guild: Guild) => void |   guildDelete: [guild: Guild] | ||||||
|   /** |   /** | ||||||
|    * A new Emoji was added to Guild |    * A new Emoji was added to Guild | ||||||
|    * @param guild Guild in which Emoji was added |    * @param guild Guild in which Emoji was added | ||||||
|    * @param emoji The Emoji which was added |    * @param emoji The Emoji which was added | ||||||
|    */ |    */ | ||||||
|   guildEmojiAdd: (guild: Guild, emoji: Emoji) => void |   guildEmojiAdd: [guild: Guild, emoji: Emoji] | ||||||
|   /** |   /** | ||||||
|    * An Emoji was deleted from Guild |    * An Emoji was deleted from Guild | ||||||
|    * @param guild Guild from which Emoji was deleted |    * @param guild Guild from which Emoji was deleted | ||||||
|    * @param emoji Emoji which was deleted |    * @param emoji Emoji which was deleted | ||||||
|    */ |    */ | ||||||
|   guildEmojiDelete: (guild: Guild, emoji: Emoji) => void |   guildEmojiDelete: [Guild, Emoji] | ||||||
|   /** |   /** | ||||||
|    * An Emoji in a Guild was updated |    * An Emoji in a Guild was updated | ||||||
|    * @param guild Guild in which Emoji was updated |    * @param guild Guild in which Emoji was updated | ||||||
|    * @param before Emoji object before update |    * @param before Emoji object before update | ||||||
|    * @param after Emoji object after update |    * @param after Emoji object after update | ||||||
|    */ |    */ | ||||||
|   guildEmojiUpdate: (guild: Guild, before: Emoji, after: Emoji) => void |   guildEmojiUpdate: [guild: Guild, before: Emoji, after: Emoji] | ||||||
|   /** |   /** | ||||||
|    * Guild's Integrations were updated |    * Guild's Integrations were updated | ||||||
|    * @param guild The Guild object |    * @param guild The Guild object | ||||||
|    */ |    */ | ||||||
|   guildIntegrationsUpdate: (guild: Guild) => void |   guildIntegrationsUpdate: [guild: Guild] | ||||||
|   /** |   /** | ||||||
|    * A new Member has joined a Guild |    * A new Member has joined a Guild | ||||||
|    * @param member The Member object |    * @param member The Member object | ||||||
|    */ |    */ | ||||||
|   guildMemberAdd: (member: Member) => void |   guildMemberAdd: [member: Member] | ||||||
|   /** |   /** | ||||||
|    * A Guild Member has either left or was kicked from Guild |    * A Guild Member has either left or was kicked from Guild | ||||||
|    * @param member The Member object |    * @param member The Member object | ||||||
|    */ |    */ | ||||||
|   guildMemberRemove: (member: Member) => void |   guildMemberRemove: [member: Member] | ||||||
|   /** |   /** | ||||||
|    * A Guild Member was updated. Nickname changed, role assigned, etc. |    * A Guild Member was updated. Nickname changed, role assigned, etc. | ||||||
|    * @param before Member object before update |    * @param before Member object before update | ||||||
|    * @param after Member object after update |    * @param after Member object after update | ||||||
|    */ |    */ | ||||||
|   guildMemberUpdate: (before: Member, after: Member) => void |   guildMemberUpdate: [before: Member, after: Member] | ||||||
|   /** |   /** | ||||||
|    * A new Role was created in Guild |    * A new Role was created in Guild | ||||||
|    * @param role The new Role object |    * @param role The new Role object | ||||||
|    */ |    */ | ||||||
|   guildRoleCreate: (role: Role) => void |   guildRoleCreate: [role: Role] | ||||||
|   /** |   /** | ||||||
|    * A Role was deleted from the Guild |    * A Role was deleted from the Guild | ||||||
|    * @param role The Role object |    * @param role The Role object | ||||||
|    */ |    */ | ||||||
|   guildRoleDelete: (role: Role) => void |   guildRoleDelete: [role: Role] | ||||||
|   /** |   /** | ||||||
|    * A Role was updated in a Guild |    * A Role was updated in a Guild | ||||||
|    * @param before Role object before update |    * @param before Role object before update | ||||||
|    * @param after Role object after updated |    * @param after Role object after updated | ||||||
|    */ |    */ | ||||||
|   guildRoleUpdate: (before: Role, after: Role) => void |   guildRoleUpdate: [before: Role, after: Role] | ||||||
|   /** |   /** | ||||||
|    * A Guild has been updated. For example name, icon, etc. |    * A Guild has been updated. For example name, icon, etc. | ||||||
|    * @param before Guild object before update |    * @param before Guild object before update | ||||||
|    * @param after Guild object after update |    * @param after Guild object after update | ||||||
|    */ |    */ | ||||||
|   guildUpdate: (before: Guild, after: Guild) => void |   guildUpdate: [before: Guild, after: Guild] | ||||||
|   /** |   /** | ||||||
|    * A new Message was created (sent) |    * A new Message was created (sent) | ||||||
|    * @param message The new Message object |    * @param message The new Message object | ||||||
|    */ |    */ | ||||||
|   messageCreate: (message: Message) => void |   messageCreate: [message: Message] | ||||||
|   /** |   /** | ||||||
|    * A Message was deleted. |    * A Message was deleted. | ||||||
|    * @param message The Message object |    * @param message The Message object | ||||||
|    */ |    */ | ||||||
|   messageDelete: (message: Message) => void |   messageDelete: [message: Message] | ||||||
|   /** |   /** | ||||||
|    * Messages were bulk deleted in a Guild Text Channel |    * Messages were bulk deleted in a Guild Text Channel | ||||||
|    * @param channel Channel in which Messages were deleted |    * @param channel Channel in which Messages were deleted | ||||||
|    * @param messages Collection of Messages deleted |    * @param messages Collection of Messages deleted | ||||||
|    * @param uncached Set of Messages deleted's IDs which were not cached |    * @param uncached Set of Messages deleted's IDs which were not cached | ||||||
|    */ |    */ | ||||||
|   messageDeleteBulk: ( |   messageDeleteBulk: [ | ||||||
|     channel: GuildTextChannel, |     channel: GuildTextChannel, | ||||||
|     messages: Collection<string, Message>, |     messages: Collection<string, Message>, | ||||||
|     uncached: Set<string> |     uncached: Set<string> | ||||||
|   ) => void |   ] | ||||||
|   /** |   /** | ||||||
|    * A Message was updated. For example content, embed, etc. |    * A Message was updated. For example content, embed, etc. | ||||||
|    * @param before Message object before update |    * @param before Message object before update | ||||||
|    * @param after Message object after update |    * @param after Message object after update | ||||||
|    */ |    */ | ||||||
|   messageUpdate: (before: Message, after: Message) => void |   messageUpdate: [before: Message, after: Message] | ||||||
|   /** |   /** | ||||||
|    * Reaction was added to a Message |    * Reaction was added to a Message | ||||||
|    * @param reaction Reaction object |    * @param reaction Reaction object | ||||||
|    * @param user User who added the reaction |    * @param user User who added the reaction | ||||||
|    */ |    */ | ||||||
|   messageReactionAdd: (reaction: MessageReaction, user: User) => void |   messageReactionAdd: [reaction: MessageReaction, user: User] | ||||||
|   /** |   /** | ||||||
|    * Reaction was removed fro a Message |    * Reaction was removed fro a Message | ||||||
|    * @param reaction Reaction object |    * @param reaction Reaction object | ||||||
|    * @param user User to who removed the reaction |    * @param user User to who removed the reaction | ||||||
|    */ |    */ | ||||||
|   messageReactionRemove: (reaction: MessageReaction, user: User) => void |   messageReactionRemove: [reaction: MessageReaction, user: User] | ||||||
|   /** |   /** | ||||||
|    * All reactions were removed from a Message |    * All reactions were removed from a Message | ||||||
|    * @param message Message from which reactions were removed |    * @param message Message from which reactions were removed | ||||||
|    */ |    */ | ||||||
|   messageReactionRemoveAll: (message: Message) => void |   messageReactionRemoveAll: [message: Message] | ||||||
|   /** |   /** | ||||||
|    * All reactions of a single Emoji were removed |    * All reactions of a single Emoji were removed | ||||||
|    * @param message The Message object |    * @param message The Message object | ||||||
|    * @param emoji The Emoji object |    * @param emoji The Emoji object | ||||||
|    */ |    */ | ||||||
|   messageReactionRemoveEmoji: (message: Message, emoji: Emoji) => void |   messageReactionRemoveEmoji: [message: Message, emoji: Emoji] | ||||||
|   /** |   /** | ||||||
|    * A User has started typing in a Text Channel |    * A User has started typing in a Text Channel | ||||||
|  |    * @param user User who started typing | ||||||
|  |    * @param channel Channel which user started typing in | ||||||
|  |    * @param at Date when user started typing | ||||||
|  |    * @param guild Guild which user started typing in (can be undefined) | ||||||
|    */ |    */ | ||||||
|   typingStart: ( |   typingStart: [ | ||||||
|     user: User, |     user: User, | ||||||
|     channel: TextChannel, |     channel: TextChannel, | ||||||
|     at: Date, |     at: Date, | ||||||
|     guildData?: TypingStartGuildData |     guild: TypingStartGuildData | undefined | ||||||
|   ) => void |   ] | ||||||
|   /** |   /** | ||||||
|    * A new Invite was created |    * A new Invite was created | ||||||
|    * @param invite New Invite object |    * @param invite New Invite object | ||||||
|    */ |    */ | ||||||
|   inviteCreate: (invite: Invite) => void |   inviteCreate: [invite: Invite] | ||||||
|   /** |   /** | ||||||
|    * An Invite was deleted |    * An Invite was deleted | ||||||
|    * @param invite Invite object |    * @param invite Invite object | ||||||
|    */ |    */ | ||||||
|   inviteDelete: (invite: Invite) => void |   inviteDelete: [invite: Invite] | ||||||
|   /** |   /** | ||||||
|    * A User was updated. For example username, avatar, etc. |    * A User was updated. For example username, avatar, etc. | ||||||
|    * @param before The User object before update |    * @param before The User object before update | ||||||
|    * @param after The User object after update |    * @param after The User object after update | ||||||
|    */ |    */ | ||||||
|   userUpdate: (before: User, after: User) => void |   userUpdate: [before: User, after: User] | ||||||
|   /** |   /** | ||||||
|    * Client has received credentials for establishing connection to Voice Server |    * Client has received credentials for establishing connection to Voice Server | ||||||
|  |    * @param data Updated voice server object | ||||||
|    */ |    */ | ||||||
|   voiceServerUpdate: (data: VoiceServerUpdateData) => void |   voiceServerUpdate: [data: VoiceServerUpdateData] | ||||||
|   /** |   /** | ||||||
|    * A User has joined a Voice Channel |    * A User has joined a Voice Channel | ||||||
|  |    * @param state Added voice state object | ||||||
|    */ |    */ | ||||||
|   voiceStateAdd: (state: VoiceState) => void |   voiceStateAdd: [state: VoiceState] | ||||||
|   /** |   /** | ||||||
|    * A User has left a Voice Channel |    * A User has left a Voice Channel | ||||||
|  |    * @param state Removed voice state object | ||||||
|    */ |    */ | ||||||
|   voiceStateRemove: (state: VoiceState) => void |   voiceStateRemove: [state: VoiceState] | ||||||
|   /** |   /** | ||||||
|    * Voice State of a User has been updated |    * Voice State of a User has been updated | ||||||
|    * @param before Voice State object before update |    * @param before Voice State object before update | ||||||
|    * @param after Voice State object after update |    * @param after Voice State object after update | ||||||
|    */ |    */ | ||||||
|   voiceStateUpdate: (state: VoiceState, after: VoiceState) => void |   voiceStateUpdate: [before: VoiceState, after: VoiceState] | ||||||
|   /** |   /** | ||||||
|    * A User's presence has been updated |    * A User's presence has been updated | ||||||
|    * @param presence New Presence |    * @param presence New Presence | ||||||
|    */ |    */ | ||||||
|   presenceUpdate: (presence: Presence) => void |   presenceUpdate: [presence: Presence] | ||||||
|   /** |   /** | ||||||
|    * Webhooks of a Channel in a Guild has been updated |    * Webhooks of a Channel in a Guild has been updated | ||||||
|    * @param guild Guild in which Webhooks were updated |    * @param guild Guild in which Webhooks were updated | ||||||
|    * @param channel Channel of which Webhooks were updated |    * @param channel Channel of which Webhooks were updated | ||||||
|    */ |    */ | ||||||
|   webhooksUpdate: (guild: Guild, channel: GuildTextChannel) => void |   webhooksUpdate: [guild: Guild, channel: GuildTextChannel] | ||||||
|   /** |   /** | ||||||
|    * An Interaction was created |    * An Interaction was created | ||||||
|  |    * @param interaction Created interaction object | ||||||
|    */ |    */ | ||||||
|   interactionCreate: (interaction: Interaction) => void |   interactionCreate: [interaction: Interaction] | ||||||
|  | 
 | ||||||
|  |   /** | ||||||
|  |    * When debug message was made | ||||||
|  |    * @param message Debug message | ||||||
|  |    */ | ||||||
|  |   debug: [message: string] | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -29,7 +29,7 @@ export const messageReactionAdd: GatewayEventHandler = async ( | ||||||
|     } else return |     } else return | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   const emojiID = d.emoji.id !== null ? d.emoji.id : d.emoji.name |   const emojiID = (d.emoji.id !== null ? d.emoji.id : d.emoji.name) as string | ||||||
|   let reaction = await message.reactions.get(emojiID) |   let reaction = await message.reactions.get(emojiID) | ||||||
|   if (reaction === undefined) { |   if (reaction === undefined) { | ||||||
|     await message.reactions.set(emojiID, { |     await message.reactions.set(emojiID, { | ||||||
|  |  | ||||||
|  | @ -27,7 +27,7 @@ export const messageReactionRemove: GatewayEventHandler = async ( | ||||||
|     } else return |     } else return | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   const emojiID = d.emoji.id !== null ? d.emoji.id : d.emoji.name |   const emojiID = (d.emoji.id !== null ? d.emoji.id : d.emoji.name) as string | ||||||
|   const reaction = await message.reactions.get(emojiID) |   const reaction = await message.reactions.get(emojiID) | ||||||
|   if (reaction === undefined) return |   if (reaction === undefined) return | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -19,7 +19,7 @@ export const messageReactionRemoveEmoji: GatewayEventHandler = async ( | ||||||
|     } else return |     } else return | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   const emojiID = d.emoji.id !== null ? d.emoji.id : d.emoji.name |   const emojiID = (d.emoji.id !== null ? d.emoji.id : d.emoji.name) as string | ||||||
|   const reaction = await message.reactions.get(emojiID) |   const reaction = await message.reactions.get(emojiID) | ||||||
|   if (reaction === undefined) return |   if (reaction === undefined) return | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -37,10 +37,15 @@ export class BaseManager<T, T2> { | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   /** Deletes a key from Cache */ |   /** Deletes a key from Cache */ | ||||||
|   async delete(key: string): Promise<boolean> { |   async _delete(key: string): Promise<boolean> { | ||||||
|     return this.client.cache.delete(this.cacheName, key) |     return this.client.cache.delete(this.cacheName, key) | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   /** Alias to _delete (cache) for compatibility purposes */ | ||||||
|  |   async delete(key: string): Promise<boolean> { | ||||||
|  |     return await this._delete(key) | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|   /** Gets an Array of values from Cache */ |   /** Gets an Array of values from Cache */ | ||||||
|   async array(): Promise<T2[]> { |   async array(): Promise<T2[]> { | ||||||
|     let arr = await (this.client.cache.array(this.cacheName) as T[]) |     let arr = await (this.client.cache.array(this.cacheName) as T[]) | ||||||
|  |  | ||||||
|  | @ -36,6 +36,7 @@ export class GuildChannelsManager extends BaseChildManager< | ||||||
|     else return undefined |     else return undefined | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   /** Delete a Guild Channel */ | ||||||
|   async delete(id: string): Promise<boolean> { |   async delete(id: string): Promise<boolean> { | ||||||
|     return this.client.rest.delete(CHANNEL(id)) |     return this.client.rest.delete(CHANNEL(id)) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  | @ -88,7 +88,7 @@ export class GuildEmojisManager extends BaseChildManager<EmojiPayload, Emoji> { | ||||||
|     const arr = await this.array() |     const arr = await this.array() | ||||||
|     for (const elem of arr) { |     for (const elem of arr) { | ||||||
|       const emojiID = elem.id !== null ? elem.id : elem.name |       const emojiID = elem.id !== null ? elem.id : elem.name | ||||||
|       this.parent.delete(emojiID) |       this.parent.delete(emojiID as string) | ||||||
|     } |     } | ||||||
|     return true |     return true | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  | @ -1,7 +1,7 @@ | ||||||
| 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 { Invite } from '../structures/invite.ts' | import { Invite } from '../structures/invite.ts' | ||||||
| import { GUILD_INVITES } from '../types/endpoint.ts' | import { INVITE } from '../types/endpoint.ts' | ||||||
| import { InvitePayload } from '../types/invite.ts' | import { InvitePayload } from '../types/invite.ts' | ||||||
| import { BaseManager } from './base.ts' | import { BaseManager } from './base.ts' | ||||||
| 
 | 
 | ||||||
|  | @ -19,14 +19,15 @@ export class InviteManager extends BaseManager<InvitePayload, Invite> { | ||||||
|     return new Invite(this.client, raw) |     return new Invite(this.client, raw) | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   async fetch(id: string): Promise<Invite | undefined> { |   /** Fetch an Invite */ | ||||||
|  |   async fetch(id: string): Promise<Invite> { | ||||||
|     return await new Promise((resolve, reject) => { |     return await new Promise((resolve, reject) => { | ||||||
|       this.client.rest |       this.client.rest | ||||||
|         .get(GUILD_INVITES(this.guild.id)) |         .get(INVITE(id)) | ||||||
|         .then(async (data) => { |         .then(async (data) => { | ||||||
|           this.set(id, data as InvitePayload) |           this.set(id, data as InvitePayload) | ||||||
|           const newInvite = await this.get(data.code) |           const newInvite = await this.get(data.code) | ||||||
|           resolve(newInvite) |           resolve(newInvite as Invite) | ||||||
|         }) |         }) | ||||||
|         .catch((e) => reject(e)) |         .catch((e) => reject(e)) | ||||||
|     }) |     }) | ||||||
|  |  | ||||||
|  | @ -60,7 +60,7 @@ export class MemberRolesManager extends BaseChildManager<RolePayload, Role> { | ||||||
|       true |       true | ||||||
|     ) |     ) | ||||||
| 
 | 
 | ||||||
|     return res.status === 204 |     return res.response.status === 204 | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   async remove(role: string | Role): Promise<boolean> { |   async remove(role: string | Role): Promise<boolean> { | ||||||
|  | @ -76,6 +76,6 @@ export class MemberRolesManager extends BaseChildManager<RolePayload, Role> { | ||||||
|       true |       true | ||||||
|     ) |     ) | ||||||
| 
 | 
 | ||||||
|     return res.status === 204 |     return res.response.status === 204 | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -58,6 +58,7 @@ export class MembersManager extends BaseManager<MemberPayload, Member> { | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   /** Fetch a Guild Member */ | ||||||
|   async fetch(id: string): Promise<Member> { |   async fetch(id: string): Promise<Member> { | ||||||
|     return await new Promise((resolve, reject) => { |     return await new Promise((resolve, reject) => { | ||||||
|       this.client.rest |       this.client.rest | ||||||
|  |  | ||||||
|  | @ -4,6 +4,7 @@ import { Guild } from '../structures/guild.ts' | ||||||
| import { Message } from '../structures/message.ts' | import { Message } from '../structures/message.ts' | ||||||
| import { MessageReaction } from '../structures/messageReaction.ts' | import { MessageReaction } from '../structures/messageReaction.ts' | ||||||
| import { Reaction } from '../types/channel.ts' | import { Reaction } from '../types/channel.ts' | ||||||
|  | import { MESSAGE_REACTION, MESSAGE_REACTIONS } from '../types/endpoint.ts' | ||||||
| import { BaseManager } from './base.ts' | import { BaseManager } from './base.ts' | ||||||
| 
 | 
 | ||||||
| export class MessageReactionsManager extends BaseManager< | export class MessageReactionsManager extends BaseManager< | ||||||
|  | @ -23,7 +24,7 @@ export class MessageReactionsManager extends BaseManager< | ||||||
| 
 | 
 | ||||||
|     const emojiID = raw.emoji.id !== null ? raw.emoji.id : raw.emoji.name |     const emojiID = raw.emoji.id !== null ? raw.emoji.id : raw.emoji.name | ||||||
| 
 | 
 | ||||||
|     let emoji = await this.client.emojis.get(emojiID) |     let emoji = await this.client.emojis.get(emojiID as string) | ||||||
|     if (emoji === undefined) emoji = new Emoji(this.client, raw.emoji) |     if (emoji === undefined) emoji = new Emoji(this.client, raw.emoji) | ||||||
| 
 | 
 | ||||||
|     const reaction = new MessageReaction(this.client, raw, this.message, emoji) |     const reaction = new MessageReaction(this.client, raw, this.message, emoji) | ||||||
|  | @ -46,7 +47,7 @@ export class MessageReactionsManager extends BaseManager< | ||||||
|     return await Promise.all( |     return await Promise.all( | ||||||
|       arr.map(async (raw) => { |       arr.map(async (raw) => { | ||||||
|         const emojiID = raw.emoji.id !== null ? raw.emoji.id : raw.emoji.name |         const emojiID = raw.emoji.id !== null ? raw.emoji.id : raw.emoji.name | ||||||
|         let emoji = await this.client.emojis.get(emojiID) |         let emoji = await this.client.emojis.get(emojiID as string) | ||||||
|         if (emoji === undefined) emoji = new Emoji(this.client, raw.emoji) |         if (emoji === undefined) emoji = new Emoji(this.client, raw.emoji) | ||||||
| 
 | 
 | ||||||
|         return new MessageReaction(this.client, raw, this.message, emoji) |         return new MessageReaction(this.client, raw, this.message, emoji) | ||||||
|  | @ -58,4 +59,22 @@ export class MessageReactionsManager extends BaseManager< | ||||||
|     await this.client.cache.deleteCache(`reaction_users:${this.message.id}`) |     await this.client.cache.deleteCache(`reaction_users:${this.message.id}`) | ||||||
|     return this.client.cache.deleteCache(this.cacheName) |     return this.client.cache.deleteCache(this.cacheName) | ||||||
|   } |   } | ||||||
|  | 
 | ||||||
|  |   /** Remove all Reactions from the Message */ | ||||||
|  |   async removeAll(): Promise<void> { | ||||||
|  |     await this.client.rest.delete( | ||||||
|  |       MESSAGE_REACTIONS(this.message.channel.id, this.message.id) | ||||||
|  |     ) | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   /** Remove a specific Emoji from Reactions */ | ||||||
|  |   async removeEmoji(emoji: Emoji | string): Promise<MessageReactionsManager> { | ||||||
|  |     const val = encodeURIComponent( | ||||||
|  |       (typeof emoji === 'object' ? emoji.id ?? emoji.name : emoji) as string | ||||||
|  |     ) | ||||||
|  |     await this.client.rest.delete( | ||||||
|  |       MESSAGE_REACTION(this.message.channel.id, this.message.id, val) | ||||||
|  |     ) | ||||||
|  |     return this | ||||||
|  |   } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -1,10 +1,19 @@ | ||||||
|  | import { Permissions } from '../../mod.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 { Role } from '../structures/role.ts' | import { Role } from '../structures/role.ts' | ||||||
| import { GUILD_ROLE } from '../types/endpoint.ts' | import { GUILD_ROLE, GUILD_ROLES } from '../types/endpoint.ts' | ||||||
| import { RolePayload } from '../types/role.ts' | import { RolePayload } from '../types/role.ts' | ||||||
| import { BaseManager } from './base.ts' | import { BaseManager } from './base.ts' | ||||||
| 
 | 
 | ||||||
|  | export interface CreateGuildRoleOptions { | ||||||
|  |   name?: string | ||||||
|  |   permissions?: number | string | Permissions | ||||||
|  |   color?: number | string | ||||||
|  |   hoist?: boolean | ||||||
|  |   mentionable?: boolean | ||||||
|  | } | ||||||
|  | 
 | ||||||
| export class RolesManager extends BaseManager<RolePayload, Role> { | export class RolesManager extends BaseManager<RolePayload, Role> { | ||||||
|   guild: Guild |   guild: Guild | ||||||
| 
 | 
 | ||||||
|  | @ -13,13 +22,14 @@ export class RolesManager extends BaseManager<RolePayload, Role> { | ||||||
|     this.guild = guild |     this.guild = guild | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   /** Fetch a Guild Role (from API) */ | ||||||
|   async fetch(id: string): Promise<Role> { |   async fetch(id: string): Promise<Role> { | ||||||
|     return await new Promise((resolve, reject) => { |     return await new Promise((resolve, reject) => { | ||||||
|       this.client.rest |       this.client.rest | ||||||
|         .get(GUILD_ROLE(this.guild.id, id)) |         .get(GUILD_ROLE(this.guild.id, id)) | ||||||
|         .then((data) => { |         .then(async (data) => { | ||||||
|           this.set(id, data as RolePayload) |           await this.set(id, data as RolePayload) | ||||||
|           resolve(new Role(this.client, data as RolePayload)) |           resolve(((await this.get(id)) as unknown) as Role) | ||||||
|         }) |         }) | ||||||
|         .catch((e) => reject(e)) |         .catch((e) => reject(e)) | ||||||
|     }) |     }) | ||||||
|  | @ -31,4 +41,43 @@ export class RolesManager extends BaseManager<RolePayload, Role> { | ||||||
|     } |     } | ||||||
|     return true |     return true | ||||||
|   } |   } | ||||||
|  | 
 | ||||||
|  |   /** Create a Guild Role */ | ||||||
|  |   async create(data?: CreateGuildRoleOptions): Promise<Role> { | ||||||
|  |     if (typeof data?.color === 'string') { | ||||||
|  |       if (data.color.startsWith('#')) data.color = data.color.slice(1) | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     const roleRaw = ((await this.client.rest.post(GUILD_ROLES(this.guild.id), { | ||||||
|  |       name: data?.name, | ||||||
|  |       permissions: | ||||||
|  |         data?.permissions === undefined | ||||||
|  |           ? undefined | ||||||
|  |           : (typeof data.permissions === 'object' | ||||||
|  |               ? data.permissions.bitfield | ||||||
|  |               : data.permissions | ||||||
|  |             ).toString(), | ||||||
|  |       color: | ||||||
|  |         data?.color === undefined | ||||||
|  |           ? undefined | ||||||
|  |           : typeof data.color === 'string' | ||||||
|  |           ? isNaN(parseInt(data.color, 16)) | ||||||
|  |             ? 0 | ||||||
|  |             : parseInt(data.color, 16) | ||||||
|  |           : data.color, | ||||||
|  |       hoist: data?.hoist ?? false, | ||||||
|  |       mentionable: data?.mentionable ?? false | ||||||
|  |     })) as unknown) as RolePayload | ||||||
|  | 
 | ||||||
|  |     await this.set(roleRaw.id, roleRaw) | ||||||
|  |     return ((await this.get(roleRaw.id)) as unknown) as Role | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   /** Delete a Guild Role */ | ||||||
|  |   async delete(role: Role | string): Promise<boolean> { | ||||||
|  |     await this.client.rest.delete( | ||||||
|  |       GUILD_ROLE(this.guild.id, typeof role === 'object' ? role.id : role) | ||||||
|  |     ) | ||||||
|  |     return true | ||||||
|  |   } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -1,3 +1,4 @@ | ||||||
|  | /* eslint-disable @typescript-eslint/method-signature-style */ | ||||||
| import { User } from '../structures/user.ts' | import { User } from '../structures/user.ts' | ||||||
| import { GatewayIntents } from '../types/gateway.ts' | import { GatewayIntents } from '../types/gateway.ts' | ||||||
| import { Gateway } from '../gateway/index.ts' | import { Gateway } from '../gateway/index.ts' | ||||||
|  | @ -10,13 +11,15 @@ import { ChannelsManager } from '../managers/channels.ts' | ||||||
| import { ClientPresence } from '../structures/presence.ts' | import { ClientPresence } from '../structures/presence.ts' | ||||||
| import { EmojisManager } from '../managers/emojis.ts' | import { EmojisManager } from '../managers/emojis.ts' | ||||||
| import { ActivityGame, ClientActivity } from '../types/presence.ts' | import { ActivityGame, ClientActivity } from '../types/presence.ts' | ||||||
| import { ClientEvents } from '../gateway/handlers/index.ts' |  | ||||||
| import { Extension } from './extensions.ts' | import { Extension } from './extensions.ts' | ||||||
| import { SlashClient } from './slashClient.ts' | import { SlashClient } from './slashClient.ts' | ||||||
| import { Interaction } from '../structures/slash.ts' | import { Interaction } from '../structures/slash.ts' | ||||||
| import { SlashModule } from './slashModule.ts' | import { SlashModule } from './slashModule.ts' | ||||||
| import type { ShardManager } from './shard.ts' | import type { ShardManager } from './shard.ts' | ||||||
| import { Application } from '../structures/application.ts' | import { Application } from '../structures/application.ts' | ||||||
|  | import { Invite } from '../structures/invite.ts' | ||||||
|  | import { INVITE } from '../types/endpoint.ts' | ||||||
|  | import { ClientEvents } from '../gateway/handlers/index.ts' | ||||||
| 
 | 
 | ||||||
| /** OS related properties sent with Gateway Identify */ | /** OS related properties sent with Gateway Identify */ | ||||||
| export interface ClientProperties { | export interface ClientProperties { | ||||||
|  | @ -53,6 +56,32 @@ export interface ClientOptions { | ||||||
|   enableSlash?: boolean |   enableSlash?: boolean | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | export declare interface Client { | ||||||
|  |   on<K extends keyof ClientEvents>( | ||||||
|  |     event: K, | ||||||
|  |     listener: (...args: ClientEvents[K]) => void | ||||||
|  |   ): this | ||||||
|  |   on(event: string | symbol, listener: (...args: any[]) => void): this | ||||||
|  | 
 | ||||||
|  |   once<K extends keyof ClientEvents>( | ||||||
|  |     event: K, | ||||||
|  |     listener: (...args: ClientEvents[K]) => void | ||||||
|  |   ): this | ||||||
|  |   once(event: string | symbol, listener: (...args: any[]) => void): this | ||||||
|  | 
 | ||||||
|  |   emit<K extends keyof ClientEvents>( | ||||||
|  |     event: K, | ||||||
|  |     ...args: ClientEvents[K] | ||||||
|  |   ): boolean | ||||||
|  |   emit(event: string | symbol, ...args: any[]): boolean | ||||||
|  | 
 | ||||||
|  |   off<K extends keyof ClientEvents>( | ||||||
|  |     event: K, | ||||||
|  |     listener: (...args: ClientEvents[K]) => void | ||||||
|  |   ): this | ||||||
|  |   off(event: string | symbol, listener: (...args: any[]) => void): this | ||||||
|  | } | ||||||
|  | 
 | ||||||
| /** | /** | ||||||
|  * Discord Client. |  * Discord Client. | ||||||
|  */ |  */ | ||||||
|  | @ -93,7 +122,10 @@ export class Client extends EventEmitter { | ||||||
|   canary: boolean = false |   canary: boolean = false | ||||||
|   /** Client's presence. Startup one if set before connecting */ |   /** Client's presence. Startup one if set before connecting */ | ||||||
|   presence: ClientPresence = new ClientPresence() |   presence: ClientPresence = new ClientPresence() | ||||||
|   _decoratedEvents?: { [name: string]: (...args: any[]) => any } |   _decoratedEvents?: { | ||||||
|  |     [name: string]: (...args: any[]) => void | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|   _decoratedSlash?: Array<{ |   _decoratedSlash?: Array<{ | ||||||
|     name: string |     name: string | ||||||
|     guild?: string |     guild?: string | ||||||
|  | @ -105,18 +137,6 @@ export class Client extends EventEmitter { | ||||||
|   _decoratedSlashModules?: SlashModule[] |   _decoratedSlashModules?: SlashModule[] | ||||||
|   _id?: string |   _id?: string | ||||||
| 
 | 
 | ||||||
|   public on = <K extends string>(event: K, listener: ClientEvents[K]): this => |  | ||||||
|     this._untypedOn(event, listener) |  | ||||||
| 
 |  | ||||||
|   public emit = <K extends string>( |  | ||||||
|     event: K, |  | ||||||
|     ...args: Parameters<ClientEvents[K]> |  | ||||||
|   ): boolean => this._untypedEmit(event, ...args) |  | ||||||
| 
 |  | ||||||
|   private readonly _untypedOn = this.on |  | ||||||
| 
 |  | ||||||
|   private readonly _untypedEmit = this.emit |  | ||||||
| 
 |  | ||||||
|   /** Shard on which this Client is */ |   /** Shard on which this Client is */ | ||||||
|   shard: number = 0 |   shard: number = 0 | ||||||
|   /** Shard Manager of this Client if Sharded */ |   /** Shard Manager of this Client if Sharded */ | ||||||
|  | @ -211,6 +231,18 @@ export class Client extends EventEmitter { | ||||||
|     return new Application(this, app) |     return new Application(this, app) | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   /** Fetch an Invite */ | ||||||
|  |   async fetchInvite(id: string): Promise<Invite> { | ||||||
|  |     return await new Promise((resolve, reject) => { | ||||||
|  |       this.rest | ||||||
|  |         .get(INVITE(id)) | ||||||
|  |         .then((data) => { | ||||||
|  |           resolve(new Invite(this, data)) | ||||||
|  |         }) | ||||||
|  |         .catch((e) => reject(e)) | ||||||
|  |     }) | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|   /** |   /** | ||||||
|    * This function is used for connecting to discord. |    * This function is used for connecting to discord. | ||||||
|    * @param token Your token. This is required. |    * @param token Your token. This is required. | ||||||
|  | @ -233,17 +265,43 @@ export class Client extends EventEmitter { | ||||||
|     } else throw new Error('No Gateway Intents were provided') |     } else throw new Error('No Gateway Intents were provided') | ||||||
|     this.gateway = new Gateway(this, token, intents) |     this.gateway = new Gateway(this, token, intents) | ||||||
|   } |   } | ||||||
|  | 
 | ||||||
|  |   async waitFor<K extends keyof ClientEvents>( | ||||||
|  |     event: K, | ||||||
|  |     checkFunction: (...args: ClientEvents[K]) => boolean, | ||||||
|  |     timeout?: number | ||||||
|  |   ): Promise<ClientEvents[K] | []> { | ||||||
|  |     return await new Promise((resolve) => { | ||||||
|  |       let timeoutID: number | undefined | ||||||
|  |       if (timeout !== undefined) { | ||||||
|  |         timeoutID = setTimeout(() => { | ||||||
|  |           this.off(event, eventFunc) | ||||||
|  |           resolve([]) | ||||||
|  |         }, timeout) | ||||||
|  |       } | ||||||
|  |       const eventFunc = (...args: ClientEvents[K]): void => { | ||||||
|  |         if (checkFunction(...args)) { | ||||||
|  |           resolve(args) | ||||||
|  |           this.off(event, eventFunc) | ||||||
|  |           if (timeoutID !== undefined) clearTimeout(timeoutID) | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |       this.on(event, eventFunc) | ||||||
|  |     }) | ||||||
|  |   } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| export function event(name?: string) { | export function event(name?: keyof ClientEvents) { | ||||||
|   return function (client: Client | Extension, prop: string) { |   return function (client: Client | Extension, prop: keyof ClientEvents) { | ||||||
|     const listener = ((client as unknown) as { |     const listener = ((client as unknown) as { | ||||||
|       [name: string]: (...args: any[]) => any |       [name in keyof ClientEvents]: (...args: ClientEvents[name]) => any | ||||||
|     })[prop] |     })[prop] | ||||||
|     if (typeof listener !== 'function') |     if (typeof listener !== 'function') | ||||||
|       throw new Error('@event decorator requires a function') |       throw new Error('@event decorator requires a function') | ||||||
|     if (client._decoratedEvents === undefined) client._decoratedEvents = {} |     if (client._decoratedEvents === undefined) client._decoratedEvents = {} | ||||||
|     client._decoratedEvents[name === undefined ? prop : name] = listener |     const key = name === undefined ? prop : name | ||||||
|  | 
 | ||||||
|  |     client._decoratedEvents[key] = listener | ||||||
|   } |   } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,12 +1,14 @@ | ||||||
| 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 { 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 { User } from './user.ts' | import { User } from './user.ts' | ||||||
| 
 | 
 | ||||||
| export class Emoji extends Base { | export class Emoji extends Base { | ||||||
|   id: string | null |   id: string | null | ||||||
|   name: string |   name: string | null | ||||||
|   roles?: string[] |   roles?: string[] | ||||||
|   user?: User |   user?: User | ||||||
|   guild?: Guild |   guild?: Guild | ||||||
|  | @ -17,7 +19,7 @@ export class Emoji extends Base { | ||||||
| 
 | 
 | ||||||
|   get getEmojiString(): string { |   get getEmojiString(): string { | ||||||
|     if (this.id === null) { |     if (this.id === null) { | ||||||
|       return this.name |       return this.name as string | ||||||
|     } else { |     } else { | ||||||
|       if (this.animated === false) { |       if (this.animated === false) { | ||||||
|         return `<:${this.name}:${this.id}>` |         return `<:${this.name}:${this.id}>` | ||||||
|  | @ -41,6 +43,28 @@ export class Emoji extends Base { | ||||||
|     this.available = data.available |     this.available = data.available | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   /** Modify the given emoji. Requires the MANAGE_EMOJIS permission. Returns the updated emoji object on success. Fires a Guild Emojis Update Gateway event. */ | ||||||
|  |   async edit(data: ModifyGuildEmojiParams): Promise<Emoji> { | ||||||
|  |     if (this.id === null) throw new Error('Emoji ID is not valid.') | ||||||
|  |     if (this.guild === undefined) throw new Error('Guild is undefined') | ||||||
|  |     const roles = Array.isArray(data.roles) | ||||||
|  |       ? data.roles.map(role => (role instanceof Role ? role.id : role)) | ||||||
|  |       : [data.roles instanceof Role ? data.roles.id : data.roles] | ||||||
|  |     const res = await this.client.rest.patch(EMOJI(this.guild.id, this.id), { | ||||||
|  |       ...data, | ||||||
|  |       roles | ||||||
|  |     }) | ||||||
|  |     return new Emoji(this.client, res) | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   /** Delete the given emoji. Requires the MANAGE_EMOJIS permission. Returns `true` on success. Fires a Guild Emojis Update Gateway event. */ | ||||||
|  |   async delete(): Promise<boolean> { | ||||||
|  |     if (this.id === null) return false | ||||||
|  |     if (this.guild === undefined) return false | ||||||
|  |     await this.client.rest.delete(EMOJI(this.guild.id, this.id)) | ||||||
|  |     return true | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|   readFromData(data: EmojiPayload): void { |   readFromData(data: EmojiPayload): void { | ||||||
|     this.id = data.id ?? this.id |     this.id = data.id ?? this.id | ||||||
|     this.name = data.name ?? this.name |     this.name = data.name ?? this.name | ||||||
|  | @ -52,3 +76,11 @@ export class Emoji extends Base { | ||||||
|     if (data.user !== undefined) this.user = new User(this.client, data.user) |     if (data.user !== undefined) this.user = new User(this.client, data.user) | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | /** https://discord.com/developers/docs/resources/emoji#modify-guild-emoji-json-params */ | ||||||
|  | export interface ModifyGuildEmojiParams { | ||||||
|  |   /** Name of the emoji */ | ||||||
|  |   name?: string | ||||||
|  |   /** Roles to which this emoji will be whitelisted */ | ||||||
|  |   roles?: string | Role | Array<string | Role>; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -12,14 +12,7 @@ export class Role extends Base { | ||||||
|   permissions: Permissions |   permissions: Permissions | ||||||
|   managed: boolean |   managed: boolean | ||||||
|   mentionable: boolean |   mentionable: boolean | ||||||
| 
 |   tags?: RoleTags | ||||||
|   get mention(): string { |  | ||||||
|     return `<@&${this.id}>` |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   toString(): string { |  | ||||||
|     return this.mention |  | ||||||
|   } |  | ||||||
| 
 | 
 | ||||||
|   constructor(client: Client, data: RolePayload) { |   constructor(client: Client, data: RolePayload) { | ||||||
|     super(client, data) |     super(client, data) | ||||||
|  | @ -31,6 +24,14 @@ export class Role extends Base { | ||||||
|     this.permissions = new Permissions(data.permissions) |     this.permissions = new Permissions(data.permissions) | ||||||
|     this.managed = data.managed |     this.managed = data.managed | ||||||
|     this.mentionable = data.mentionable |     this.mentionable = data.mentionable | ||||||
|  |     this.tags = | ||||||
|  |       data.tags !== undefined | ||||||
|  |         ? { | ||||||
|  |             botID: data.tags?.bot_id, | ||||||
|  |             integrationID: data.tags?.integration_id, | ||||||
|  |             premiumSubscriber: 'premium_subscriber' in (data.tags ?? {}) | ||||||
|  |           } | ||||||
|  |         : undefined | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   readFromData(data: RolePayload): void { |   readFromData(data: RolePayload): void { | ||||||
|  | @ -46,3 +47,12 @@ export class Role extends Base { | ||||||
|     this.mentionable = data.mentionable ?? this.mentionable |     this.mentionable = data.mentionable ?? this.mentionable | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | export interface RoleTags { | ||||||
|  |   /** The id of the bot who has this role */ | ||||||
|  |   botID?: string | ||||||
|  |   /** Whether this is the premium subscriber role for this guild */ | ||||||
|  |   premiumSubscriber: boolean | ||||||
|  |   /** The id of the integration this role belongs to */ | ||||||
|  |   integrationID?: string | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -114,6 +114,14 @@ client.on('messageCreate', async (msg: Message) => { | ||||||
|     } |     } | ||||||
|   } else if (msg.content === '!react') { |   } else if (msg.content === '!react') { | ||||||
|     msg.addReaction('🤔') |     msg.addReaction('🤔') | ||||||
|  |   } else if (msg.content === '!wait_for') { | ||||||
|  |     msg.channel.send('Send anything!') | ||||||
|  |     const [receivedMsg] = await client.waitFor( | ||||||
|  |       'messageCreate', | ||||||
|  |       (message) => message.author.id === msg.author.id | ||||||
|  |     ) | ||||||
|  | 
 | ||||||
|  |     msg.channel.send(`Received: ${receivedMsg?.content}`) | ||||||
|   } |   } | ||||||
| }) | }) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -2,7 +2,7 @@ import { UserPayload } from './user.ts' | ||||||
| 
 | 
 | ||||||
| export interface EmojiPayload { | export interface EmojiPayload { | ||||||
|   id: string | null |   id: string | null | ||||||
|   name: string |   name: string | null | ||||||
|   roles?: string[] |   roles?: string[] | ||||||
|   user?: UserPayload |   user?: UserPayload | ||||||
|   require_colons?: boolean |   require_colons?: boolean | ||||||
|  |  | ||||||
|  | @ -7,4 +7,14 @@ export interface RolePayload { | ||||||
|   permissions: string |   permissions: string | ||||||
|   managed: boolean |   managed: boolean | ||||||
|   mentionable: boolean |   mentionable: boolean | ||||||
|  |   tags?: RoleTagsPayload | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | export interface RoleTagsPayload { | ||||||
|  |   /** The id of the bot who has this role */ | ||||||
|  |   bot_id?: string | ||||||
|  |   /** Whether this is the premium subscriber role for this guild */ | ||||||
|  |   premium_subscriber?: null | ||||||
|  |   /** The id of the integration this role belongs to */ | ||||||
|  |   integration_id?: string | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue