webhok
Version:
An under-maintenance webhook client for discord to assist you into sending requests to webhooks.
76 lines (73 loc) • 3.54 kB
text/typescript
import Axios, {AxiosResponse, AxiosError} from "axios"
import axios from "axios";
import {Options, webhookOptions, webhookExecution, webhookError} from "./types"
import {Helper} from "./helper";
interface webhookController {
readonly options : Options
executeWebhook: (url: string, data: webhookOptions) => Promise<webhookExecution>
}
export namespace webhookClient {
export class WebhookController implements webhookController {
readonly options: Options
public constructor(options: Options) {
this.options = options
}
public async executeWebhook(url: string, data: webhookOptions): Promise<webhookExecution> {
return new Promise<webhookExecution>(async(resolve, reject) => {
await axios.post(url, data, {
headers: {
"Content-Type": "application/json",
"User-Agent": "EasyWebhook_V1"
},
responseType: "json"
}).then((response: AxiosResponse) => {
if (response.status === 204){
resolve({
response : {
data: {
message: "Successfully sent",
payloadType: data.embeds == undefined || null ? "content" : "Embed",
input: JSON.stringify(data)
}
} /* Soontm */
})
}
}).catch((errorResponse: AxiosError) => {
const errorData : webhookError = errorResponse.response?.data as unknown as webhookError
/* Just to be safe */
if (errorData.retry_after && errorResponse.response?.headers?.["x-ratelimit-reset-after"] && errorResponse.status == 429){
/* We know the individual is ratelimited 50% */
reject({
error: {
data: {
message: errorData.message,
ratelimitType: !errorData.global ? "Local" : "Global",
duration: Helper.formatTime(errorResponse.response?.headers?.["x-ratelimit-reset-after"])
}
}
})
/* We know the individual is ratelimited 100% */
} else if (errorData.code !== undefined && errorData.code === 0 && errorData.message.includes("blocked")){
reject({
error: {
data: {
message: errorData.message,
ratelimitType: "Global + Aggressive (IP Ban mode)",
duration: "Unknown"
}
}
})
} else {
reject({
error: {
data: {
message: errorData.message,
}
}
})
}
})
})
}
}
}