commit
ce444630d0
3 changed files with 38 additions and 26 deletions
|
@ -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 ||
|
||||||
|
|
|
@ -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> {
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue