add channels.sendMessage

This commit is contained in:
DjDeveloperr 2021-03-19 16:20:16 +05:30
parent b94253284e
commit 711f78002e
5 changed files with 128 additions and 70 deletions

View File

@ -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
}
}

View File

@ -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

View File

@ -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()

View File

@ -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 */

View File

@ -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)
})
}
})