Merge pull request #37 from DjDeveloperr/main

feature: Inline Replies
This commit is contained in:
Helloyunho 2020-11-19 23:05:05 +09:00 committed by GitHub
commit ce444630d0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 38 additions and 26 deletions

View file

@ -24,6 +24,10 @@ export interface RequestHeaders {
[name: string]: string [name: string]: string
} }
export class DiscordAPIError extends Error {
name = 'DiscordAPIError'
}
export interface QueuedItem { export interface QueuedItem {
bucket?: string | null bucket?: string | null
url: string url: string
@ -263,7 +267,7 @@ export class RESTManager {
if (text === 'undefined') text = undefined if (text === 'undefined') text = undefined
if (status === HttpResponseCode.Unauthorized) if (status === HttpResponseCode.Unauthorized)
throw new Error(`Request was not successful (Unauthorized). Invalid Token.\n${text}`) throw new DiscordAPIError(`Request was not successful (Unauthorized). Invalid Token.\n${text}`)
// At this point we know it is error // At this point we know it is error
let error = { url: response.url, status, method: data.method, body: data.body } let error = { url: response.url, status, method: data.method, body: data.body }
@ -275,10 +279,10 @@ export class RESTManager {
HttpResponseCode.Forbidden, HttpResponseCode.Forbidden,
HttpResponseCode.MethodNotAllowed HttpResponseCode.MethodNotAllowed
].includes(status)) { ].includes(status)) {
throw new Error(Deno.inspect(error)) throw new DiscordAPIError(Deno.inspect(error))
} else if (status === HttpResponseCode.GatewayUnavailable) { } else if (status === HttpResponseCode.GatewayUnavailable) {
throw new Error(Deno.inspect(error)) throw new DiscordAPIError(Deno.inspect(error))
} else throw new Error('Request - Unknown Error') } else throw new DiscordAPIError('Request - Unknown Error')
} }
async make( async make(
@ -327,8 +331,7 @@ export class RESTManager {
if (response.status === 204) return resolve(undefined) if (response.status === 204) return resolve(undefined)
const json: any = await response.json() const json: any = await response.json()
// eslint-disable-next-line @typescript-eslint/no-floating-promises await this.handleStatusCode(response, json, requestData)
this.handleStatusCode(response, json, requestData)
if ( if (
json.retry_after !== undefined || json.retry_after !== undefined ||

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, option, 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, reply?: Message): Promise<Message> {
if (typeof text === "object") { if (typeof text === "object") {
option = text option = text
text = undefined text = undefined
@ -39,20 +39,31 @@ export class TextChannel extends Channel {
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 (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) 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