feat(Message|TextChannel): inline replies

This commit is contained in:
DjDeveloperr 2020-11-17 08:46:32 +05:30
parent 8d4b8f5842
commit 86f82715ca
3 changed files with 31 additions and 21 deletions

View file

@ -16,7 +16,6 @@ import { Embed } from './embed.ts'
import { CHANNEL_MESSAGE } from '../types/endpoint.ts' import { CHANNEL_MESSAGE } from '../types/endpoint.ts'
import { MessageMentions } from './messageMentions.ts' import { MessageMentions } from './messageMentions.ts'
import { TextChannel } from './textChannel.ts' import { TextChannel } from './textChannel.ts'
import { DMChannel } from './dmChannel.ts'
import { Guild } from './guild.ts' import { Guild } from './guild.ts'
type AllMessageOptions = MessageOption | Embed type AllMessageOptions = MessageOption | Embed
@ -110,10 +109,9 @@ export class Message extends Base {
return this.channel.editMessage(this.id, text, option) return this.channel.editMessage(this.id, text, option)
} }
/** These will **not** work in all servers, as this feature is coming slowly. */
async reply(text?: string | AllMessageOptions, option?: AllMessageOptions): Promise<Message> { async reply(text?: string | AllMessageOptions, option?: AllMessageOptions): Promise<Message> {
// TODO: Use inline replies once they're out return this.channel.send(text, Object.assign(option, { reply: this }))
if (this.channel instanceof DMChannel) return this.channel.send(text, option)
return this.channel.send(`${this.author.mention}, ${text}`, option)
} }
async delete (): Promise<void> { async delete (): Promise<void> {

View file

@ -1,6 +1,6 @@
import { MessagesManager } from "../../mod.ts" import { MessagesManager } from "../../mod.ts"
import { Client } from '../models/client.ts' import { Client } from '../models/client.ts'
import { GuildTextChannelPayload, MessageOption, Overwrite, TextChannelPayload } from '../types/channel.ts' import { GuildTextChannelPayload, MessageOption, MessageReference, Overwrite, TextChannelPayload } from '../types/channel.ts'
import { CHANNEL_MESSAGE, CHANNEL_MESSAGES } from '../types/endpoint.ts' import { CHANNEL_MESSAGE, CHANNEL_MESSAGES } from '../types/endpoint.ts'
import { Channel } from './channel.ts' import { Channel } from './channel.ts'
import { Embed } from './embed.ts' import { Embed } from './embed.ts'
@ -14,20 +14,20 @@ export class TextChannel extends Channel {
lastPinTimestamp?: string lastPinTimestamp?: string
messages: MessagesManager messages: MessagesManager
constructor (client: Client, data: TextChannelPayload) { constructor(client: Client, data: TextChannelPayload) {
super(client, data) super(client, data)
this.messages = new MessagesManager(this.client, this) this.messages = new MessagesManager(this.client, this)
this.lastMessageID = data.last_message_id this.lastMessageID = data.last_message_id
this.lastPinTimestamp = data.last_pin_timestamp this.lastPinTimestamp = data.last_pin_timestamp
} }
protected readFromData (data: TextChannelPayload): void { protected readFromData(data: TextChannelPayload): void {
super.readFromData(data) super.readFromData(data)
this.lastMessageID = data.last_message_id ?? this.lastMessageID this.lastMessageID = data.last_message_id ?? this.lastMessageID
this.lastPinTimestamp = data.last_pin_timestamp ?? this.lastPinTimestamp this.lastPinTimestamp = data.last_pin_timestamp ?? this.lastPinTimestamp
} }
async send (text?: string | AllMessageOptions, option?: AllMessageOptions): Promise<Message> { async send(text?: string | AllMessageOptions, option?: AllMessageOptions): Promise<Message> {
if (typeof text === "object") { if (typeof text === "object") {
option = text option = text
text = undefined text = undefined
@ -38,21 +38,32 @@ export class TextChannel extends Channel {
if (option instanceof Embed) option = { if (option instanceof Embed) option = {
embed: option embed: option
} }
const resp = await this.client.rest.post(CHANNEL_MESSAGES(this.id), { const payload: any = {
content: text, content: text,
embed: option?.embed, embed: option?.embed,
file: option?.file, file: option?.file,
tts: option?.tts, tts: option?.tts,
allowed_mentions: option?.allowedMention allowed_mentions: option?.allowedMention
}) }
if (option?.reply !== undefined) {
const reference: MessageReference = {
message_id: option.reply.id,
channel_id: option.reply.channel.id,
guild_id: option.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) const res = new Message(this.client, resp, this, this.client.user as any)
await res.mentions.fromPayload(resp) await res.mentions.fromPayload(resp)
return res return res
} }
async editMessage ( async editMessage(
message: Message | string, message: Message | string,
text?: string, text?: string,
option?: MessageOption option?: MessageOption
@ -96,7 +107,7 @@ export class GuildTextChannel extends TextChannel {
topic?: string topic?: string
guild: Guild guild: Guild
get mention (): string { get mention(): string {
return `<#${this.id}>` return `<#${this.id}>`
} }
@ -104,7 +115,7 @@ export class GuildTextChannel extends TextChannel {
return this.mention return this.mention
} }
constructor (client: Client, data: GuildTextChannelPayload, guild: Guild) { constructor(client: Client, data: GuildTextChannelPayload, guild: Guild) {
super(client, data) super(client, data)
this.guildID = data.guild_id this.guildID = data.guild_id
this.name = data.name this.name = data.name
@ -117,7 +128,7 @@ export class GuildTextChannel extends TextChannel {
this.rateLimit = data.rate_limit_per_user this.rateLimit = data.rate_limit_per_user
} }
protected readFromData (data: GuildTextChannelPayload): void { protected readFromData(data: GuildTextChannelPayload): void {
super.readFromData(data) super.readFromData(data)
this.guildID = data.guild_id ?? this.guildID this.guildID = data.guild_id ?? this.guildID
this.name = data.name ?? this.name this.name = data.name ?? this.name

View file

@ -106,7 +106,8 @@ export interface MessageOption {
parse: ['everyone', 'users', 'roles'] parse: ['everyone', 'users', 'roles']
roles: string[] roles: string[]
users: string[] users: string[]
} },
reply?: Message
} }
export interface ChannelMention { export interface ChannelMention {