Merge pull request #113 from DjDeveloperr/fixes
fix(rest): addReaction and removeReaction not working with custom emojis
This commit is contained in:
		
						commit
						b94253284e
					
				
					 6 changed files with 88 additions and 45 deletions
				
			
		|  | @ -27,6 +27,11 @@ export const guildCreate: GatewayEventHandler = async ( | ||||||
|   if (d.voice_states !== undefined) |   if (d.voice_states !== undefined) | ||||||
|     await guild.voiceStates.fromPayload(d.voice_states) |     await guild.voiceStates.fromPayload(d.voice_states) | ||||||
| 
 | 
 | ||||||
|  |   for (const emojiPayload of d.emojis) { | ||||||
|  |     if (emojiPayload.id === null) continue | ||||||
|  |     await gateway.client.emojis.set(emojiPayload.id, emojiPayload) | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|   if (hasGuild === undefined) { |   if (hasGuild === undefined) { | ||||||
|     // It wasn't lazy load, so emit event
 |     // It wasn't lazy load, so emit event
 | ||||||
|     gateway.client.emit('guildCreate', guild) |     gateway.client.emit('guildCreate', guild) | ||||||
|  |  | ||||||
|  | @ -13,6 +13,7 @@ export const guildDelete: GatewayEventHandler = async ( | ||||||
|     await guild.channels.flush() |     await guild.channels.flush() | ||||||
|     await guild.roles.flush() |     await guild.roles.flush() | ||||||
|     await guild.presences.flush() |     await guild.presences.flush() | ||||||
|  |     await guild.emojis.flush() | ||||||
|     await gateway.client.guilds._delete(d.id) |     await gateway.client.guilds._delete(d.id) | ||||||
| 
 | 
 | ||||||
|     gateway.client.emit('guildDelete', guild) |     gateway.client.emit('guildDelete', guild) | ||||||
|  |  | ||||||
|  | @ -3,6 +3,7 @@ import { Embed } from '../structures/embed.ts' | ||||||
| import { MessageAttachment } from '../structures/message.ts' | import { MessageAttachment } from '../structures/message.ts' | ||||||
| import { Collection } from '../utils/collection.ts' | import { Collection } from '../utils/collection.ts' | ||||||
| import { Client } from './client.ts' | import { Client } from './client.ts' | ||||||
|  | import { simplifyAPIError } from '../utils/err_fmt.ts' | ||||||
| 
 | 
 | ||||||
| export type RequestMethods = | export type RequestMethods = | ||||||
|   | 'get' |   | 'get' | ||||||
|  | @ -44,9 +45,29 @@ export class DiscordAPIError extends Error { | ||||||
|   name = 'DiscordAPIError' |   name = 'DiscordAPIError' | ||||||
|   error?: DiscordAPIErrorPayload |   error?: DiscordAPIErrorPayload | ||||||
| 
 | 
 | ||||||
|   constructor(message?: string, error?: DiscordAPIErrorPayload) { |   constructor(error: string | DiscordAPIErrorPayload) { | ||||||
|     super(message) |     super() | ||||||
|     this.error = error |     const fmt = Object.entries( | ||||||
|  |       typeof error === 'object' ? simplifyAPIError(error.errors) : {} | ||||||
|  |     ) | ||||||
|  |     this.message = | ||||||
|  |       typeof error === 'string' | ||||||
|  |         ? `${error} ` | ||||||
|  |         : `\n${error.method} ${error.url.slice(7)} returned ${error.status}\n(${ | ||||||
|  |             error.code ?? 'unknown' | ||||||
|  |           }) ${error.message}${ | ||||||
|  |             fmt.length === 0 | ||||||
|  |               ? '' | ||||||
|  |               : `\n${fmt | ||||||
|  |                   .map( | ||||||
|  |                     (e) => | ||||||
|  |                       `  at ${e[0]}:\n${e[1] | ||||||
|  |                         .map((e) => `   - ${e}`) | ||||||
|  |                         .join('\n')}` | ||||||
|  |                   ) | ||||||
|  |                   .join('\n')}\n` | ||||||
|  |           }` | ||||||
|  |     if (typeof error === 'object') this.error = error | ||||||
|   } |   } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -451,43 +472,20 @@ export class RESTManager { | ||||||
|         new DiscordAPIError(`Request was Unauthorized. Invalid Token.\n${text}`) |         new DiscordAPIError(`Request was Unauthorized. Invalid Token.\n${text}`) | ||||||
|       ) |       ) | ||||||
| 
 | 
 | ||||||
|  |     const _data = { ...data } | ||||||
|  |     if (_data?.headers !== undefined) delete _data.headers | ||||||
|  |     if (_data?.method !== undefined) delete _data.method | ||||||
|  | 
 | ||||||
|     // At this point we know it is error
 |     // At this point we know it is error
 | ||||||
|     const error: DiscordAPIErrorPayload = { |     const error: DiscordAPIErrorPayload = { | ||||||
|       url: response.url, |       url: new URL(response.url).pathname, | ||||||
|       status, |       status, | ||||||
|       method: data.method, |       method: data.method, | ||||||
|       code: body?.code, |       code: body?.code, | ||||||
|       message: body?.message, |       message: body?.message, | ||||||
|       errors: Object.fromEntries( |       errors: body?.errors ?? {}, | ||||||
|         Object.entries( |       requestData: _data | ||||||
|           (body?.errors as { |  | ||||||
|             [name: string]: { |  | ||||||
|               _errors: Array<{ code: string; message: string }> |  | ||||||
|     } |     } | ||||||
|           }) ?? {} |  | ||||||
|         ).map((entry) => { |  | ||||||
|           return [entry[0], entry[1]._errors ?? []] |  | ||||||
|         }) |  | ||||||
|       ), |  | ||||||
|       requestData: data |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     // if (typeof error.errors === 'object') {
 |  | ||||||
|     //   const errors = error.errors as {
 |  | ||||||
|     //     [name: string]: { _errors: Array<{ code: string; message: string }> }
 |  | ||||||
|     //   }
 |  | ||||||
|     //   console.log(`%cREST Error:`, 'color: #F14C39;')
 |  | ||||||
|     //   Object.entries(errors).forEach((entry) => {
 |  | ||||||
|     //     console.log(`  %c${entry[0]}:`, 'color: #12BC79;')
 |  | ||||||
|     //     entry[1]._errors.forEach((e) => {
 |  | ||||||
|     //       console.log(
 |  | ||||||
|     //         `    %c${e.code}: %c${e.message}`,
 |  | ||||||
|     //         'color: skyblue;',
 |  | ||||||
|     //         'color: #CECECE;'
 |  | ||||||
|     //       )
 |  | ||||||
|     //     })
 |  | ||||||
|     //   })
 |  | ||||||
|     // }
 |  | ||||||
| 
 | 
 | ||||||
|     if ( |     if ( | ||||||
|       [ |       [ | ||||||
|  | @ -497,9 +495,9 @@ export class RESTManager { | ||||||
|         HttpResponseCode.MethodNotAllowed |         HttpResponseCode.MethodNotAllowed | ||||||
|       ].includes(status) |       ].includes(status) | ||||||
|     ) { |     ) { | ||||||
|       reject(new DiscordAPIError(Deno.inspect(error), error)) |       reject(new DiscordAPIError(error)) | ||||||
|     } else if (status === HttpResponseCode.GatewayUnavailable) { |     } else if (status === HttpResponseCode.GatewayUnavailable) { | ||||||
|       reject(new DiscordAPIError(Deno.inspect(error), error)) |       reject(new DiscordAPIError(error)) | ||||||
|     } else reject(new DiscordAPIError('Request - Unknown Error')) |     } else reject(new DiscordAPIError('Request - Unknown Error')) | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -145,12 +145,15 @@ export class TextChannel extends Channel { | ||||||
|     emoji: Emoji | string |     emoji: Emoji | string | ||||||
|   ): Promise<void> { |   ): Promise<void> { | ||||||
|     if (emoji instanceof Emoji) { |     if (emoji instanceof Emoji) { | ||||||
|       emoji = emoji.getEmojiString |       emoji = `${emoji.name}:${emoji.id}` | ||||||
|  |     } else if (emoji.length > 4) { | ||||||
|  |       if (!isNaN(Number(emoji))) { | ||||||
|  |         const findEmoji = await this.client.emojis.get(emoji) | ||||||
|  |         if (findEmoji !== undefined) emoji = `${findEmoji.name}:${findEmoji.id}` | ||||||
|  |         else throw new Error(`Emoji not found: ${emoji}`) | ||||||
|       } |       } | ||||||
|     if (message instanceof Message) { |  | ||||||
|       message = message.id |  | ||||||
|     } |     } | ||||||
| 
 |     if (message instanceof Message) message = message.id | ||||||
|     const encodedEmoji = encodeURI(emoji) |     const encodedEmoji = encodeURI(emoji) | ||||||
| 
 | 
 | ||||||
|     await this.client.rest.put( |     await this.client.rest.put( | ||||||
|  | @ -165,11 +168,15 @@ export class TextChannel extends Channel { | ||||||
|     user?: User | Member | string |     user?: User | Member | string | ||||||
|   ): Promise<void> { |   ): Promise<void> { | ||||||
|     if (emoji instanceof Emoji) { |     if (emoji instanceof Emoji) { | ||||||
|       emoji = emoji.getEmojiString |       emoji = `${emoji.name}:${emoji.id}` | ||||||
|  |     } else if (emoji.length > 4) { | ||||||
|  |       if (!isNaN(Number(emoji))) { | ||||||
|  |         const findEmoji = await this.client.emojis.get(emoji) | ||||||
|  |         if (findEmoji !== undefined) emoji = `${findEmoji.name}:${findEmoji.id}` | ||||||
|  |         else throw new Error(`Emoji not found: ${emoji}`) | ||||||
|       } |       } | ||||||
|     if (message instanceof Message) { |  | ||||||
|       message = message.id |  | ||||||
|     } |     } | ||||||
|  |     if (message instanceof Message) message = message.id | ||||||
|     if (user !== undefined) { |     if (user !== undefined) { | ||||||
|       if (typeof user !== 'string') { |       if (typeof user !== 'string') { | ||||||
|         user = user.id |         user = user.id | ||||||
|  |  | ||||||
|  | @ -117,7 +117,16 @@ client.on('messageCreate', async (msg: Message) => { | ||||||
|       msg.channel.send('Failed...') |       msg.channel.send('Failed...') | ||||||
|     } |     } | ||||||
|   } else if (msg.content === '!react') { |   } else if (msg.content === '!react') { | ||||||
|     msg.addReaction('🤔') |     // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
 | ||||||
|  |     msg.addReaction('😂') | ||||||
|  |     msg.channel.send('x'.repeat(6969), { | ||||||
|  |       embed: new Embed() | ||||||
|  |         .setTitle('pepega'.repeat(6969)) | ||||||
|  |         .setDescription('pepega'.repeat(6969)) | ||||||
|  |         .addField('uwu', 'uwu'.repeat(6969)) | ||||||
|  |         .addField('uwu', 'uwu'.repeat(6969)) | ||||||
|  |         .setFooter('uwu'.repeat(6969)) | ||||||
|  |     }) | ||||||
|   } else if (msg.content === '!wait_for') { |   } else if (msg.content === '!wait_for') { | ||||||
|     msg.channel.send('Send anything!') |     msg.channel.send('Send anything!') | ||||||
|     const [receivedMsg] = await client.waitFor( |     const [receivedMsg] = await client.waitFor( | ||||||
|  |  | ||||||
							
								
								
									
										23
									
								
								src/utils/err_fmt.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								src/utils/err_fmt.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,23 @@ | ||||||
|  | export interface SimplifiedError { | ||||||
|  |   [name: string]: string[] | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | export function simplifyAPIError(errors: any): SimplifiedError { | ||||||
|  |   const res: SimplifiedError = {} | ||||||
|  |   function fmt(obj: any, acum: string = ''): void { | ||||||
|  |     if (typeof obj._errors === 'object' && Array.isArray(obj._errors)) | ||||||
|  |       res[acum] = obj._errors.map((e: any) => `${e.code}: ${e.message}`) | ||||||
|  |     else { | ||||||
|  |       Object.entries(obj).forEach((obj: [string, any]) => { | ||||||
|  |         const arrayIndex = !isNaN(Number(obj[0])) | ||||||
|  |         if (arrayIndex) obj[0] = `[${obj[0]}]` | ||||||
|  |         if (acum !== '' && !arrayIndex) acum += '.' | ||||||
|  |         fmt(obj[1], (acum += obj[0])) | ||||||
|  |       }) | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |   Object.entries(errors).forEach((obj: [string, any]) => { | ||||||
|  |     fmt(obj[1], obj[0]) | ||||||
|  |   }) | ||||||
|  |   return res | ||||||
|  | } | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue