add channels.sendMessage
This commit is contained in:
		
							parent
							
								
									b94253284e
								
							
						
					
					
						commit
						711f78002e
					
				
					 5 changed files with 128 additions and 70 deletions
				
			
		|  | @ -1,10 +1,20 @@ | |||
| import { Client } from '../models/client.ts' | ||||
| import { Channel } from '../structures/channel.ts' | ||||
| import { ChannelPayload, GuildChannelPayload } from '../types/channel.ts' | ||||
| import { Embed } from '../structures/embed.ts' | ||||
| import { Message } from '../structures/message.ts' | ||||
| import { TextChannel } from '../structures/textChannel.ts' | ||||
| import { | ||||
|   ChannelPayload, | ||||
|   GuildChannelPayload, | ||||
|   MessageOptions, | ||||
|   MessageReference | ||||
| } from '../types/channel.ts' | ||||
| import { CHANNEL } from '../types/endpoint.ts' | ||||
| import getChannelByType from '../utils/getChannelByType.ts' | ||||
| import { BaseManager } from './base.ts' | ||||
| 
 | ||||
| export type AllMessageOptions = MessageOptions | Embed | ||||
| 
 | ||||
| export class ChannelsManager extends BaseManager<ChannelPayload, Channel> { | ||||
|   constructor(client: Client) { | ||||
|     super(client, 'channels', Channel) | ||||
|  | @ -66,4 +76,93 @@ export class ChannelsManager extends BaseManager<ChannelPayload, Channel> { | |||
|         .catch((e) => reject(e)) | ||||
|     }) | ||||
|   } | ||||
| 
 | ||||
|   async sendMessage( | ||||
|     channel: string | TextChannel, | ||||
|     content?: string | AllMessageOptions, | ||||
|     option?: AllMessageOptions, | ||||
|     reply?: Message | ||||
|   ): Promise<Message> { | ||||
|     const channelID = typeof channel === 'string' ? channel : channel.id | ||||
| 
 | ||||
|     if (typeof content === 'object') { | ||||
|       option = content | ||||
|       content = undefined | ||||
|     } | ||||
|     if (content === undefined && option === undefined) { | ||||
|       throw new Error('Either text or option is necessary.') | ||||
|     } | ||||
|     if (option instanceof Embed) { | ||||
|       option = { | ||||
|         embed: option | ||||
|       } | ||||
|     } | ||||
| 
 | ||||
|     const payload: any = { | ||||
|       content: content, | ||||
|       embed: option?.embed, | ||||
|       file: option?.file, | ||||
|       files: option?.files, | ||||
|       tts: option?.tts, | ||||
|       allowed_mentions: option?.allowedMentions | ||||
|     } | ||||
| 
 | ||||
|     if (reply !== undefined) { | ||||
|       const reference: MessageReference = { | ||||
|         message_id: reply.id, | ||||
|         channel_id: reply.channel.id, | ||||
|         guild_id: reply.guild?.id | ||||
|       } | ||||
|       payload.message_reference = reference | ||||
|     } | ||||
| 
 | ||||
|     const resp = await this.client.rest.api.channels[channelID].messages.post( | ||||
|       payload | ||||
|     ) | ||||
|     const chan = | ||||
|       typeof channel === 'string' | ||||
|         ? // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
 | ||||
|           (await this.get<TextChannel>(channel))! | ||||
|         : channel | ||||
|     const res = new Message(this.client, resp, chan, this.client.user as any) | ||||
|     await res.mentions.fromPayload(resp) | ||||
|     return res | ||||
|   } | ||||
| 
 | ||||
|   async editMessage( | ||||
|     channel: string | TextChannel, | ||||
|     message: Message | string, | ||||
|     text?: string, | ||||
|     option?: MessageOptions | ||||
|   ): Promise<Message> { | ||||
|     const channelID = typeof channel === 'string' ? channel : channel.id | ||||
| 
 | ||||
|     if (text === undefined && option === undefined) { | ||||
|       throw new Error('Either text or option is necessary.') | ||||
|     } | ||||
| 
 | ||||
|     if (this.client.user === undefined) { | ||||
|       throw new Error('Client user has not initialized.') | ||||
|     } | ||||
| 
 | ||||
|     const newMsg = await this.client.rest.api.channels[channelID].messages[ | ||||
|       typeof message === 'string' ? message : message.id | ||||
|     ].patch({ | ||||
|       content: text, | ||||
|       embed: option?.embed !== undefined ? option.embed.toJSON() : undefined, | ||||
|       // Cannot upload new files with Message
 | ||||
|       // file: option?.file,
 | ||||
|       tts: option?.tts, | ||||
|       allowed_mentions: option?.allowedMentions | ||||
|     }) | ||||
| 
 | ||||
|     const chan = | ||||
|       typeof channel === 'string' | ||||
|         ? // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
 | ||||
|           (await this.get<TextChannel>(channel))! | ||||
|         : channel | ||||
|     const res = new Message(this.client, newMsg, chan, this.client.user) | ||||
|     await res.mentions.fromPayload(newMsg) | ||||
|     return res | ||||
|   } | ||||
| } | ||||
|  |  | |||
|  | @ -92,6 +92,9 @@ export class Command implements CommandOptions { | |||
|   dmOnly?: boolean | ||||
|   ownerOnly?: boolean | ||||
| 
 | ||||
|   /** Method called when the command errors */ | ||||
|   onError(ctx: CommandContext, error: Error): any {} | ||||
| 
 | ||||
|   /** Method executed before executing actual command. Returns bool value - whether to continue or not (optional) */ | ||||
|   beforeExecute(ctx: CommandContext): boolean | Promise<boolean> { | ||||
|     return true | ||||
|  |  | |||
|  | @ -286,7 +286,8 @@ export class CommandClient extends Client implements CommandClientOptions { | |||
| 
 | ||||
|     if ( | ||||
|       (command.botPermissions !== undefined || | ||||
|         category?.permissions !== undefined) && | ||||
|         category?.botPermissions !== undefined || | ||||
|         allPermissions !== undefined) && | ||||
|       msg.guild !== undefined | ||||
|     ) { | ||||
|       // TODO: Check Overwrites too
 | ||||
|  | @ -315,7 +316,8 @@ export class CommandClient extends Client implements CommandClientOptions { | |||
| 
 | ||||
|     if ( | ||||
|       (command.userPermissions !== undefined || | ||||
|         category?.userPermissions !== undefined) && | ||||
|         category?.userPermissions !== undefined || | ||||
|         allPermissions !== undefined) && | ||||
|       msg.guild !== undefined | ||||
|     ) { | ||||
|       let permissions = | ||||
|  | @ -358,8 +360,11 @@ export class CommandClient extends Client implements CommandClientOptions { | |||
|       if (beforeExecute === false) return | ||||
| 
 | ||||
|       const result = await command.execute(ctx) | ||||
|       command.afterExecute(ctx, result) | ||||
|       await command.afterExecute(ctx, result) | ||||
|     } catch (e) { | ||||
|       await command | ||||
|         .onError(ctx, e) | ||||
|         .catch((e: Error) => this.emit('commandError', ctx, e)) | ||||
|       this.emit('commandError', ctx, e) | ||||
|     } | ||||
|   } | ||||
|  | @ -375,7 +380,7 @@ export function command(options?: CommandOptions) { | |||
|     })[name] | ||||
| 
 | ||||
|     if (typeof prop !== 'function') | ||||
|       throw new Error('@command decorator can only be used on functions') | ||||
|       throw new Error('@command decorator can only be used on class methods') | ||||
| 
 | ||||
|     const command = new Command() | ||||
| 
 | ||||
|  |  | |||
|  | @ -5,7 +5,6 @@ import { | |||
|   GuildTextChannelPayload, | ||||
|   MessageOptions, | ||||
|   MessagePayload, | ||||
|   MessageReference, | ||||
|   ModifyGuildTextChannelOption, | ||||
|   ModifyGuildTextChannelPayload, | ||||
|   Overwrite, | ||||
|  | @ -13,8 +12,6 @@ import { | |||
| } from '../types/channel.ts' | ||||
| import { | ||||
|   CHANNEL, | ||||
|   CHANNEL_MESSAGE, | ||||
|   CHANNEL_MESSAGES, | ||||
|   MESSAGE_REACTION_ME, | ||||
|   MESSAGE_REACTION_USER | ||||
| } from '../types/endpoint.ts' | ||||
|  | @ -62,42 +59,7 @@ export class TextChannel extends Channel { | |||
|     option?: AllMessageOptions, | ||||
|     reply?: Message | ||||
|   ): Promise<Message> { | ||||
|     if (typeof content === 'object') { | ||||
|       option = content | ||||
|       content = undefined | ||||
|     } | ||||
|     if (content === undefined && option === undefined) { | ||||
|       throw new Error('Either text or option is necessary.') | ||||
|     } | ||||
|     if (option instanceof Embed) { | ||||
|       option = { | ||||
|         embed: option | ||||
|       } | ||||
|     } | ||||
| 
 | ||||
|     const payload: any = { | ||||
|       content: content, | ||||
|       embed: option?.embed, | ||||
|       file: option?.file, | ||||
|       files: option?.files, | ||||
|       tts: option?.tts, | ||||
|       allowed_mentions: option?.allowedMentions | ||||
|     } | ||||
| 
 | ||||
|     if (reply !== undefined) { | ||||
|       const reference: MessageReference = { | ||||
|         message_id: reply.id, | ||||
|         channel_id: reply.channel.id, | ||||
|         guild_id: reply.guild?.id | ||||
|       } | ||||
|       payload.message_reference = reference | ||||
|     } | ||||
| 
 | ||||
|     const resp = await this.client.rest.post(CHANNEL_MESSAGES(this.id), payload) | ||||
| 
 | ||||
|     const res = new Message(this.client, resp, this, this.client.user as any) | ||||
|     await res.mentions.fromPayload(resp) | ||||
|     return res | ||||
|     return this.client.channels.sendMessage(this, content, option, reply) | ||||
|   } | ||||
| 
 | ||||
|   /** | ||||
|  | @ -111,32 +73,7 @@ export class TextChannel extends Channel { | |||
|     text?: string, | ||||
|     option?: MessageOptions | ||||
|   ): Promise<Message> { | ||||
|     if (text === undefined && option === undefined) { | ||||
|       throw new Error('Either text or option is necessary.') | ||||
|     } | ||||
| 
 | ||||
|     if (this.client.user === undefined) { | ||||
|       throw new Error('Client user has not initialized.') | ||||
|     } | ||||
| 
 | ||||
|     const newMsg = await this.client.rest.patch( | ||||
|       CHANNEL_MESSAGE( | ||||
|         this.id, | ||||
|         typeof message === 'string' ? message : message.id | ||||
|       ), | ||||
|       { | ||||
|         content: text, | ||||
|         embed: option?.embed !== undefined ? option.embed.toJSON() : undefined, | ||||
|         // Cannot upload new files with Message
 | ||||
|         // file: option?.file,
 | ||||
|         tts: option?.tts, | ||||
|         allowed_mentions: option?.allowedMentions | ||||
|       } | ||||
|     ) | ||||
| 
 | ||||
|     const res = new Message(this.client, newMsg, this, this.client.user) | ||||
|     await res.mentions.fromPayload(newMsg) | ||||
|     return res | ||||
|     return this.client.channels.editMessage(this, message, text, option) | ||||
|   } | ||||
| 
 | ||||
|   /** Add a reaction to a Message in this Channel */ | ||||
|  |  | |||
|  | @ -243,6 +243,20 @@ client.on('messageCreate', async (msg: Message) => { | |||
|       buf += `\n${role.name}` | ||||
|     } | ||||
|     msg.reply(buf) | ||||
|   } else if (msg.content === '!timer') { | ||||
|     msg.channel.send('3...').then((msg) => { | ||||
|       setTimeout(() => { | ||||
|         msg.edit('2...').then((msg) => { | ||||
|           setTimeout(() => { | ||||
|             msg.edit('1...').then((msg) => { | ||||
|               setTimeout(() => { | ||||
|                 msg.edit('ok wut') | ||||
|               }, 1000) | ||||
|             }) | ||||
|           }, 1000) | ||||
|         }) | ||||
|       }, 1000) | ||||
|     }) | ||||
|   } | ||||
| }) | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue