commit
ce444630d0
3 changed files with 38 additions and 26 deletions
|
@ -24,6 +24,10 @@ export interface RequestHeaders {
|
|||
[name: string]: string
|
||||
}
|
||||
|
||||
export class DiscordAPIError extends Error {
|
||||
name = 'DiscordAPIError'
|
||||
}
|
||||
|
||||
export interface QueuedItem {
|
||||
bucket?: string | null
|
||||
url: string
|
||||
|
@ -263,7 +267,7 @@ export class RESTManager {
|
|||
if (text === 'undefined') text = undefined
|
||||
|
||||
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
|
||||
let error = { url: response.url, status, method: data.method, body: data.body }
|
||||
|
@ -275,10 +279,10 @@ export class RESTManager {
|
|||
HttpResponseCode.Forbidden,
|
||||
HttpResponseCode.MethodNotAllowed
|
||||
].includes(status)) {
|
||||
throw new Error(Deno.inspect(error))
|
||||
throw new DiscordAPIError(Deno.inspect(error))
|
||||
} else if (status === HttpResponseCode.GatewayUnavailable) {
|
||||
throw new Error(Deno.inspect(error))
|
||||
} else throw new Error('Request - Unknown Error')
|
||||
throw new DiscordAPIError(Deno.inspect(error))
|
||||
} else throw new DiscordAPIError('Request - Unknown Error')
|
||||
}
|
||||
|
||||
async make(
|
||||
|
@ -327,8 +331,7 @@ export class RESTManager {
|
|||
if (response.status === 204) return resolve(undefined)
|
||||
|
||||
const json: any = await response.json()
|
||||
// eslint-disable-next-line @typescript-eslint/no-floating-promises
|
||||
this.handleStatusCode(response, json, requestData)
|
||||
await this.handleStatusCode(response, json, requestData)
|
||||
|
||||
if (
|
||||
json.retry_after !== undefined ||
|
||||
|
|
|
@ -16,7 +16,6 @@ import { Embed } from './embed.ts'
|
|||
import { CHANNEL_MESSAGE } from '../types/endpoint.ts'
|
||||
import { MessageMentions } from './messageMentions.ts'
|
||||
import { TextChannel } from './textChannel.ts'
|
||||
import { DMChannel } from './dmChannel.ts'
|
||||
import { Guild } from './guild.ts'
|
||||
|
||||
type AllMessageOptions = MessageOption | Embed
|
||||
|
@ -110,10 +109,9 @@ export class Message extends Base {
|
|||
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> {
|
||||
// TODO: Use inline replies once they're out
|
||||
if (this.channel instanceof DMChannel) return this.channel.send(text, option)
|
||||
return this.channel.send(`${this.author.mention}, ${text}`, option)
|
||||
return this.channel.send(text, option, this)
|
||||
}
|
||||
|
||||
async delete (): Promise<void> {
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import { MessagesManager } from "../../mod.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 } from './channel.ts'
|
||||
import { Embed } from './embed.ts'
|
||||
|
@ -14,20 +14,20 @@ export class TextChannel extends Channel {
|
|||
lastPinTimestamp?: string
|
||||
messages: MessagesManager
|
||||
|
||||
constructor (client: Client, data: TextChannelPayload) {
|
||||
constructor(client: Client, data: TextChannelPayload) {
|
||||
super(client, data)
|
||||
this.messages = new MessagesManager(this.client, this)
|
||||
this.lastMessageID = data.last_message_id
|
||||
this.lastPinTimestamp = data.last_pin_timestamp
|
||||
}
|
||||
|
||||
protected readFromData (data: TextChannelPayload): void {
|
||||
protected readFromData(data: TextChannelPayload): void {
|
||||
super.readFromData(data)
|
||||
this.lastMessageID = data.last_message_id ?? this.lastMessageID
|
||||
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") {
|
||||
option = text
|
||||
text = undefined
|
||||
|
@ -39,20 +39,31 @@ export class TextChannel extends Channel {
|
|||
embed: option
|
||||
}
|
||||
|
||||
const resp = await this.client.rest.post(CHANNEL_MESSAGES(this.id), {
|
||||
const payload: any = {
|
||||
content: text,
|
||||
embed: option?.embed,
|
||||
file: option?.file,
|
||||
tts: option?.tts,
|
||||
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)
|
||||
await res.mentions.fromPayload(resp)
|
||||
return res
|
||||
}
|
||||
|
||||
async editMessage (
|
||||
async editMessage(
|
||||
message: Message | string,
|
||||
text?: string,
|
||||
option?: MessageOption
|
||||
|
@ -96,7 +107,7 @@ export class GuildTextChannel extends TextChannel {
|
|||
topic?: string
|
||||
guild: Guild
|
||||
|
||||
get mention (): string {
|
||||
get mention(): string {
|
||||
return `<#${this.id}>`
|
||||
}
|
||||
|
||||
|
@ -104,7 +115,7 @@ export class GuildTextChannel extends TextChannel {
|
|||
return this.mention
|
||||
}
|
||||
|
||||
constructor (client: Client, data: GuildTextChannelPayload, guild: Guild) {
|
||||
constructor(client: Client, data: GuildTextChannelPayload, guild: Guild) {
|
||||
super(client, data)
|
||||
this.guildID = data.guild_id
|
||||
this.name = data.name
|
||||
|
@ -117,7 +128,7 @@ export class GuildTextChannel extends TextChannel {
|
|||
this.rateLimit = data.rate_limit_per_user
|
||||
}
|
||||
|
||||
protected readFromData (data: GuildTextChannelPayload): void {
|
||||
protected readFromData(data: GuildTextChannelPayload): void {
|
||||
super.readFromData(data)
|
||||
this.guildID = data.guild_id ?? this.guildID
|
||||
this.name = data.name ?? this.name
|
||||
|
|
Loading…
Reference in a new issue