Fix
- Message Send and Edit (Using REST, not patch Axios) - Send Attachment Fix
This commit is contained in:
		@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
  "name": "discord.js-selfbot-v13",
 | 
			
		||||
  "version": "0.2.4",
 | 
			
		||||
  "version": "0.3.0",
 | 
			
		||||
  "description": "A unofficial discord.js fork for creating selfbots [Based on discord.js v13]",
 | 
			
		||||
  "main": "./src/index.js",
 | 
			
		||||
  "types": "./typings/index.d.ts",
 | 
			
		||||
 
 | 
			
		||||
@@ -9,49 +9,6 @@ const MessagePayload = require('../structures/MessagePayload');
 | 
			
		||||
const Util = require('../util/Util');
 | 
			
		||||
const DiscordAPIError = require('../rest/DiscordAPIError');
 | 
			
		||||
 | 
			
		||||
const _edit = (client, channelID, messageID, data, files) => {
 | 
			
		||||
	return new Promise((resolve, reject) => {
 | 
			
		||||
		require('axios')({
 | 
			
		||||
			method: 'patch',
 | 
			
		||||
			url: `${client.options.http.api}/v${client.options.http.version}/channels/${channelID}/messages/${messageID}`,
 | 
			
		||||
			headers: {
 | 
			
		||||
				authorization: client.token,
 | 
			
		||||
				Accept: '*/*',
 | 
			
		||||
				'Accept-Language': 'en-US,en;q=0.9',
 | 
			
		||||
				'Cache-Control': 'no-cache',
 | 
			
		||||
				Pragma: 'no-cache',
 | 
			
		||||
				Referer: 'https://discord.com/channels/@me',
 | 
			
		||||
				'Sec-Ch-Ua': '" Not A;Brand";v="99" "',
 | 
			
		||||
				'Sec-Ch-Ua-Mobile': '?0',
 | 
			
		||||
				'Sec-Ch-Ua-Platform': '"iOS"',
 | 
			
		||||
				'Sec-Fetch-Dest': 'empty',
 | 
			
		||||
				'Sec-Fetch-Mode': 'cors',
 | 
			
		||||
				'Sec-Fetch-Site': 'same-origin',
 | 
			
		||||
				'X-Debug-Options': 'bugReporterEnabled',
 | 
			
		||||
				'X-Discord-Locale': 'en-US',
 | 
			
		||||
				Origin: 'https://discord.com',
 | 
			
		||||
			},
 | 
			
		||||
			data,
 | 
			
		||||
			files,
 | 
			
		||||
		})
 | 
			
		||||
			.then((res) => resolve(res.data))
 | 
			
		||||
			.catch((err) => {
 | 
			
		||||
				err.request.options = {
 | 
			
		||||
					data,
 | 
			
		||||
					files,
 | 
			
		||||
				};
 | 
			
		||||
				return reject(
 | 
			
		||||
					new DiscordAPIError(
 | 
			
		||||
						err.response.data,
 | 
			
		||||
						err.response.status,
 | 
			
		||||
						err.request,
 | 
			
		||||
					),
 | 
			
		||||
				);
 | 
			
		||||
			});
 | 
			
		||||
	});
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Manages API methods for Messages and holds their cache.
 | 
			
		||||
 * @extends {CachedManager}
 | 
			
		||||
@@ -174,8 +131,7 @@ class MessageManager extends CachedManager {
 | 
			
		||||
    )
 | 
			
		||||
      .resolveBody()
 | 
			
		||||
      .resolveFiles();
 | 
			
		||||
    // const d = await this.client.api.channels(this.channel.id).messages(messageId).patch({ body, files });
 | 
			
		||||
    const d = await _edit(this.client, this.channel.id, messageId, body, files);
 | 
			
		||||
    const d = await this.client.api.channels(this.channel.id).messages(messageId).patch({ body, files });
 | 
			
		||||
    const existing = this.cache.get(messageId);
 | 
			
		||||
    if (existing) {
 | 
			
		||||
      const clone = existing._clone();
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,6 @@
 | 
			
		||||
 | 
			
		||||
const https = require('node:https');
 | 
			
		||||
const { setTimeout } = require('node:timers');
 | 
			
		||||
const FormData = require('form-data');
 | 
			
		||||
const fetch = (...args) => import('node-fetch').then(({default: fetch}) => fetch(...args));
 | 
			
		||||
const { UserAgent } = require('../util/Constants');
 | 
			
		||||
 | 
			
		||||
@@ -49,13 +48,19 @@ class APIRequest {
 | 
			
		||||
    if (this.options.files?.length) {
 | 
			
		||||
			body = new FormData();
 | 
			
		||||
			for (const [index, file] of this.options.files.entries()) {
 | 
			
		||||
        if (file?.file) body.append(file.key ?? `files[${index}]`, file.file, file.name);
 | 
			
		||||
				if (file?.file)
 | 
			
		||||
					body.append(file.key ?? `files[${index}]`, file.file, file.name);
 | 
			
		||||
			}
 | 
			
		||||
      if (typeof this.options.data !== 'undefined') {
 | 
			
		||||
			if (
 | 
			
		||||
				typeof this.options.data !== 'undefined' ||
 | 
			
		||||
				typeof this.options.body !== 'undefined'
 | 
			
		||||
			) {
 | 
			
		||||
				if (this.options.dontUsePayloadJSON) {
 | 
			
		||||
          for (const [key, value] of Object.entries(this.options.data)) body.append(key, value);
 | 
			
		||||
					for (const [key, value] of Object.entries(this.options.data || this.options.body)) {
 | 
			
		||||
						body.append(key, value);
 | 
			
		||||
          }
 | 
			
		||||
				} else {
 | 
			
		||||
          body.append('payload_json', JSON.stringify(this.options.data));
 | 
			
		||||
					body.append('payload_json', JSON.stringify(this.options.data || this.options.body));
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			headers = Object.assign(headers, body.getHeaders());
 | 
			
		||||
@@ -63,6 +68,9 @@ class APIRequest {
 | 
			
		||||
		} else if (this.options.data != null) {
 | 
			
		||||
			body = JSON.stringify(this.options.data);
 | 
			
		||||
			headers['Content-Type'] = 'application/json';
 | 
			
		||||
		} else if (this.options.body != null) {
 | 
			
		||||
			body = JSON.stringify(this.options.body);
 | 
			
		||||
			headers['Content-Type'] = 'application/json';
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
    const controller = new AbortController();
 | 
			
		||||
 
 | 
			
		||||
@@ -50,7 +50,9 @@ class MessagePayload {
 | 
			
		||||
	get isWebhook() {
 | 
			
		||||
		const Webhook = require('./Webhook');
 | 
			
		||||
		const WebhookClient = require('../client/WebhookClient');
 | 
			
		||||
    return this.target instanceof Webhook || this.target instanceof WebhookClient;
 | 
			
		||||
		return (
 | 
			
		||||
			this.target instanceof Webhook || this.target instanceof WebhookClient
 | 
			
		||||
		);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
@@ -92,7 +94,10 @@ class MessagePayload {
 | 
			
		||||
	get isInteraction() {
 | 
			
		||||
		const Interaction = require('./Interaction');
 | 
			
		||||
		const InteractionWebhook = require('./InteractionWebhook');
 | 
			
		||||
    return this.target instanceof Interaction || this.target instanceof InteractionWebhook;
 | 
			
		||||
		return (
 | 
			
		||||
			this.target instanceof Interaction ||
 | 
			
		||||
			this.target instanceof InteractionWebhook
 | 
			
		||||
		);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
@@ -104,7 +109,12 @@ class MessagePayload {
 | 
			
		||||
		if (this.options.content === null) {
 | 
			
		||||
			content = '';
 | 
			
		||||
		} else if (typeof this.options.content !== 'undefined') {
 | 
			
		||||
      content = Util.verifyString(this.options.content, RangeError, 'MESSAGE_CONTENT_TYPE', false);
 | 
			
		||||
			content = Util.verifyString(
 | 
			
		||||
				this.options.content,
 | 
			
		||||
				RangeError,
 | 
			
		||||
				'MESSAGE_CONTENT_TYPE',
 | 
			
		||||
				false,
 | 
			
		||||
			);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return content;
 | 
			
		||||
@@ -125,7 +135,11 @@ class MessagePayload {
 | 
			
		||||
		if (typeof this.options.nonce !== 'undefined') {
 | 
			
		||||
			nonce = this.options.nonce;
 | 
			
		||||
			// eslint-disable-next-line max-len
 | 
			
		||||
      if (typeof nonce === 'number' ? !Number.isInteger(nonce) : typeof nonce !== 'string') {
 | 
			
		||||
			if (
 | 
			
		||||
				typeof nonce === 'number'
 | 
			
		||||
					? !Number.isInteger(nonce)
 | 
			
		||||
					: typeof nonce !== 'string'
 | 
			
		||||
			) {
 | 
			
		||||
				throw new RangeError('MESSAGE_NONCE_TYPE');
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
@@ -172,11 +186,15 @@ class MessagePayload {
 | 
			
		||||
		let message_reference;
 | 
			
		||||
		if (typeof this.options.reply === 'object') {
 | 
			
		||||
			const reference = this.options.reply.messageReference;
 | 
			
		||||
      const message_id = this.isMessage ? reference.id ?? reference : this.target.messages.resolveId(reference);
 | 
			
		||||
			const message_id = this.isMessage
 | 
			
		||||
				? reference.id ?? reference
 | 
			
		||||
				: this.target.messages.resolveId(reference);
 | 
			
		||||
			if (message_id) {
 | 
			
		||||
				message_reference = {
 | 
			
		||||
					message_id,
 | 
			
		||||
          fail_if_not_exists: this.options.reply.failIfNotExists ?? this.target.client.options.failIfNotExists,
 | 
			
		||||
					fail_if_not_exists:
 | 
			
		||||
						this.options.reply.failIfNotExists ??
 | 
			
		||||
						this.target.client.options.failIfNotExists,
 | 
			
		||||
				};
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
@@ -223,7 +241,10 @@ class MessagePayload {
 | 
			
		||||
	async resolveFiles() {
 | 
			
		||||
		if (this.files) return this;
 | 
			
		||||
 | 
			
		||||
    this.files = await Promise.all(this.options.files?.map(file => this.constructor.resolveFile(file)) ?? []);
 | 
			
		||||
		this.files = await Promise.all(
 | 
			
		||||
			this.options.files?.map((file) => this.constructor.resolveFile(file)) ??
 | 
			
		||||
				[],
 | 
			
		||||
		);
 | 
			
		||||
		return this;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -236,7 +257,7 @@ class MessagePayload {
 | 
			
		||||
		let attachment;
 | 
			
		||||
		let name;
 | 
			
		||||
 | 
			
		||||
    const findName = thing => {
 | 
			
		||||
		const findName = (thing) => {
 | 
			
		||||
			if (typeof thing === 'string') {
 | 
			
		||||
				return Util.basename(thing);
 | 
			
		||||
			}
 | 
			
		||||
@@ -249,7 +270,9 @@ class MessagePayload {
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
		const ownAttachment =
 | 
			
		||||
      typeof fileLike === 'string' || fileLike instanceof Buffer || typeof fileLike.pipe === 'function';
 | 
			
		||||
			typeof fileLike === 'string' ||
 | 
			
		||||
			fileLike instanceof Buffer ||
 | 
			
		||||
			typeof fileLike.pipe === 'function';
 | 
			
		||||
		if (ownAttachment) {
 | 
			
		||||
			attachment = fileLike;
 | 
			
		||||
			name = findName(attachment);
 | 
			
		||||
@@ -258,10 +281,9 @@ class MessagePayload {
 | 
			
		||||
			name = fileLike.name ?? findName(attachment);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
    const data = await DataResolver.resolveFile(attachment);
 | 
			
		||||
    return { data, name };
 | 
			
		||||
		const resource = await DataResolver.resolveFile(attachment);
 | 
			
		||||
		return { attachment, name, file: resource };
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Creates a {@link MessagePayload} from user-level arguments.
 | 
			
		||||
	 * @param {MessageTarget} target Target to send to
 | 
			
		||||
@@ -272,7 +294,9 @@ class MessagePayload {
 | 
			
		||||
	static create(target, options, extra = {}) {
 | 
			
		||||
		return new this(
 | 
			
		||||
			target,
 | 
			
		||||
      typeof options !== 'object' || options === null ? { content: options, ...extra } : { ...options, ...extra },
 | 
			
		||||
			typeof options !== 'object' || options === null
 | 
			
		||||
				? { content: options, ...extra }
 | 
			
		||||
				: { ...options, ...extra },
 | 
			
		||||
		);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -7,109 +7,6 @@ const { Error } = require('../errors');
 | 
			
		||||
const DataResolver = require('../util/DataResolver');
 | 
			
		||||
const DiscordAPIError = require('../rest/DiscordAPIError');
 | 
			
		||||
 | 
			
		||||
const _send = (
 | 
			
		||||
	client,
 | 
			
		||||
	webhookID,
 | 
			
		||||
	webhookToken,
 | 
			
		||||
	data,
 | 
			
		||||
	files,
 | 
			
		||||
	query,
 | 
			
		||||
	auth = false,
 | 
			
		||||
) => {
 | 
			
		||||
	return new Promise((resolve, reject) => {
 | 
			
		||||
		require('axios')({
 | 
			
		||||
			method: 'post',
 | 
			
		||||
			url: `${client.options.http.api}/v${
 | 
			
		||||
				client.options.http.version
 | 
			
		||||
			}/webhooks/${webhookID}/${webhookToken}${query ? `?${query}` : ''}`,
 | 
			
		||||
			headers: {
 | 
			
		||||
				authorization: client.token,
 | 
			
		||||
				Accept: '*/*',
 | 
			
		||||
				'Accept-Language': 'en-US,en;q=0.9',
 | 
			
		||||
				'Cache-Control': 'no-cache',
 | 
			
		||||
				Pragma: 'no-cache',
 | 
			
		||||
				Referer: 'https://discord.com/channels/@me',
 | 
			
		||||
				'Sec-Ch-Ua': '" Not A;Brand";v="99" "',
 | 
			
		||||
				'Sec-Ch-Ua-Mobile': '?0',
 | 
			
		||||
				'Sec-Ch-Ua-Platform': '"iOS"',
 | 
			
		||||
				'Sec-Fetch-Dest': 'empty',
 | 
			
		||||
				'Sec-Fetch-Mode': 'cors',
 | 
			
		||||
				'Sec-Fetch-Site': 'same-origin',
 | 
			
		||||
				'X-Debug-Options': 'bugReporterEnabled',
 | 
			
		||||
				'X-Discord-Locale': 'en-US',
 | 
			
		||||
				Origin: 'https://discord.com',
 | 
			
		||||
			},
 | 
			
		||||
			data,
 | 
			
		||||
			files,
 | 
			
		||||
			auth,
 | 
			
		||||
		})
 | 
			
		||||
			.then((res) => resolve(res.data))
 | 
			
		||||
			.catch((err) => {
 | 
			
		||||
				err.request.options = {
 | 
			
		||||
					data,
 | 
			
		||||
					files,
 | 
			
		||||
				};
 | 
			
		||||
				return reject(
 | 
			
		||||
					new DiscordAPIError(
 | 
			
		||||
						err.response.data,
 | 
			
		||||
						err.response.status,
 | 
			
		||||
						err.request,
 | 
			
		||||
					),
 | 
			
		||||
				);
 | 
			
		||||
			});
 | 
			
		||||
	});
 | 
			
		||||
};
 | 
			
		||||
const _edit = (
 | 
			
		||||
	client,
 | 
			
		||||
	webhookID,
 | 
			
		||||
	webhookToken,
 | 
			
		||||
  messageID,
 | 
			
		||||
	data,
 | 
			
		||||
	files,
 | 
			
		||||
	query,
 | 
			
		||||
	auth = false,
 | 
			
		||||
) => {
 | 
			
		||||
	return new Promise((resolve, reject) => {
 | 
			
		||||
		require('axios')({
 | 
			
		||||
			method: 'patch',
 | 
			
		||||
			url: `${client.options.http.api}/v${client.options.http.version}/webhooks/${webhookID}/${webhookToken}/messages/${messageID}${query ? `?${query}` : ''}`,
 | 
			
		||||
			headers: {
 | 
			
		||||
				authorization: client.token,
 | 
			
		||||
				Accept: '*/*',
 | 
			
		||||
				'Accept-Language': 'en-US,en;q=0.9',
 | 
			
		||||
				'Cache-Control': 'no-cache',
 | 
			
		||||
				Pragma: 'no-cache',
 | 
			
		||||
				Referer: 'https://discord.com/channels/@me',
 | 
			
		||||
				'Sec-Ch-Ua': '" Not A;Brand";v="99" "',
 | 
			
		||||
				'Sec-Ch-Ua-Mobile': '?0',
 | 
			
		||||
				'Sec-Ch-Ua-Platform': '"iOS"',
 | 
			
		||||
				'Sec-Fetch-Dest': 'empty',
 | 
			
		||||
				'Sec-Fetch-Mode': 'cors',
 | 
			
		||||
				'Sec-Fetch-Site': 'same-origin',
 | 
			
		||||
				'X-Debug-Options': 'bugReporterEnabled',
 | 
			
		||||
				'X-Discord-Locale': 'en-US',
 | 
			
		||||
				Origin: 'https://discord.com',
 | 
			
		||||
			},
 | 
			
		||||
			data,
 | 
			
		||||
			files,
 | 
			
		||||
			auth,
 | 
			
		||||
		})
 | 
			
		||||
			.then((res) => resolve(res.data))
 | 
			
		||||
			.catch((err) => {
 | 
			
		||||
				err.request.options = {
 | 
			
		||||
					data,
 | 
			
		||||
					files,
 | 
			
		||||
				};
 | 
			
		||||
				return reject(
 | 
			
		||||
					new DiscordAPIError(
 | 
			
		||||
						err.response.data,
 | 
			
		||||
						err.response.status,
 | 
			
		||||
						err.request,
 | 
			
		||||
					),
 | 
			
		||||
				);
 | 
			
		||||
			});
 | 
			
		||||
	});
 | 
			
		||||
};
 | 
			
		||||
/**
 | 
			
		||||
 * Represents a webhook.
 | 
			
		||||
 */
 | 
			
		||||
@@ -139,7 +36,11 @@ class Webhook {
 | 
			
		||||
		 * @name Webhook#token
 | 
			
		||||
		 * @type {?string}
 | 
			
		||||
		 */
 | 
			
		||||
    Object.defineProperty(this, 'token', { value: data.token ?? null, writable: true, configurable: true });
 | 
			
		||||
		Object.defineProperty(this, 'token', {
 | 
			
		||||
			value: data.token ?? null,
 | 
			
		||||
			writable: true,
 | 
			
		||||
			configurable: true,
 | 
			
		||||
		});
 | 
			
		||||
 | 
			
		||||
		if ('avatar' in data) {
 | 
			
		||||
			/**
 | 
			
		||||
@@ -204,7 +105,8 @@ class Webhook {
 | 
			
		||||
			 * The source guild of the webhook
 | 
			
		||||
			 * @type {?(Guild|APIGuild)}
 | 
			
		||||
			 */
 | 
			
		||||
      this.sourceGuild = this.client.guilds?.resolve(data.source_guild.id) ?? data.source_guild;
 | 
			
		||||
			this.sourceGuild =
 | 
			
		||||
				this.client.guilds?.resolve(data.source_guild.id) ?? data.source_guild;
 | 
			
		||||
		} else {
 | 
			
		||||
			this.sourceGuild ??= null;
 | 
			
		||||
		}
 | 
			
		||||
@@ -214,7 +116,9 @@ class Webhook {
 | 
			
		||||
			 * The source channel of the webhook
 | 
			
		||||
			 * @type {?(NewsChannel|APIChannel)}
 | 
			
		||||
			 */
 | 
			
		||||
      this.sourceChannel = this.client.channels?.resolve(data.source_channel?.id) ?? data.source_channel;
 | 
			
		||||
			this.sourceChannel =
 | 
			
		||||
				this.client.channels?.resolve(data.source_channel?.id) ??
 | 
			
		||||
				data.source_channel;
 | 
			
		||||
		} else {
 | 
			
		||||
			this.sourceChannel ??= null;
 | 
			
		||||
		}
 | 
			
		||||
@@ -310,8 +214,16 @@ class Webhook {
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		const { body, files } = await messagePayload.resolveFiles();
 | 
			
		||||
    const d = await _send(this.client, this.id, this.token, body, files, query, false);
 | 
			
		||||
    return this.client.channels?.cache.get(d.channel_id)?.messages._add(d, false) ?? d;
 | 
			
		||||
		const d = await this.client.api.webhooks(this.id, this.token).post({
 | 
			
		||||
			body,
 | 
			
		||||
			files,
 | 
			
		||||
			query,
 | 
			
		||||
			auth: false,
 | 
			
		||||
		});
 | 
			
		||||
		return (
 | 
			
		||||
			this.client.channels?.cache.get(d.channel_id)?.messages._add(d, false) ??
 | 
			
		||||
			d
 | 
			
		||||
		);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
@@ -335,7 +247,9 @@ class Webhook {
 | 
			
		||||
	async sendSlackMessage(body) {
 | 
			
		||||
		if (!this.token) throw new Error('WEBHOOK_TOKEN_UNAVAILABLE');
 | 
			
		||||
 | 
			
		||||
    const data = await this.client.api.webhooks(this.id, this.token).slack.post({
 | 
			
		||||
		const data = await this.client.api
 | 
			
		||||
			.webhooks(this.id, this.token)
 | 
			
		||||
			.slack.post({
 | 
			
		||||
				query: new URLSearchParams({ wait: true }),
 | 
			
		||||
				auth: false,
 | 
			
		||||
				body,
 | 
			
		||||
@@ -362,7 +276,9 @@ class Webhook {
 | 
			
		||||
			avatar = await DataResolver.resolveImage(avatar);
 | 
			
		||||
		}
 | 
			
		||||
		channel &&= channel.id ?? channel;
 | 
			
		||||
    const data = await this.client.api.webhooks(this.id, channel ? undefined : this.token).patch({
 | 
			
		||||
		const data = await this.client.api
 | 
			
		||||
			.webhooks(this.id, channel ? undefined : this.token)
 | 
			
		||||
			.patch({
 | 
			
		||||
				data: { name, avatar, channel_id: channel },
 | 
			
		||||
				reason,
 | 
			
		||||
				auth: !this.token || Boolean(channel),
 | 
			
		||||
@@ -392,15 +308,22 @@ class Webhook {
 | 
			
		||||
	async fetchMessage(message, { cache = true, threadId } = {}) {
 | 
			
		||||
		if (!this.token) throw new Error('WEBHOOK_TOKEN_UNAVAILABLE');
 | 
			
		||||
 | 
			
		||||
    const data = await this.client.api.webhooks(this.id, this.token).messages(message).get({
 | 
			
		||||
		const data = await this.client.api
 | 
			
		||||
			.webhooks(this.id, this.token)
 | 
			
		||||
			.messages(message)
 | 
			
		||||
			.get({
 | 
			
		||||
				query: threadId
 | 
			
		||||
					? new URLSearchParams({
 | 
			
		||||
							thread_id: threadId,
 | 
			
		||||
					  })
 | 
			
		||||
					: undefined,
 | 
			
		||||
      auth: false
 | 
			
		||||
				auth: false,
 | 
			
		||||
			});
 | 
			
		||||
    return this.client.channels?.cache.get(data.channel_id)?.messages._add(data, cache) ?? data;
 | 
			
		||||
		return (
 | 
			
		||||
			this.client.channels?.cache
 | 
			
		||||
				.get(data.channel_id)
 | 
			
		||||
				?.messages._add(data, cache) ?? data
 | 
			
		||||
		);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
@@ -420,26 +343,21 @@ class Webhook {
 | 
			
		||||
 | 
			
		||||
		const { body, files } = await messagePayload.resolveBody().resolveFiles();
 | 
			
		||||
 | 
			
		||||
    /*
 | 
			
		||||
    const d = await this.client.api.webhooks(this.id, this.token).messages(typeof message === 'string' ? message : message.id).patch({
 | 
			
		||||
      body, files, query: messagePayload.options.threadId ? new URLSearchParams({ thread_id: messagePayload.options.threadId }) : undefined, auth: false
 | 
			
		||||
    });
 | 
			
		||||
    */
 | 
			
		||||
 | 
			
		||||
    const d = await _edit(
 | 
			
		||||
			this.client,
 | 
			
		||||
			this.id,
 | 
			
		||||
			this.token,
 | 
			
		||||
			typeof message === 'string' ? message : message.id,
 | 
			
		||||
		const d = await this.client.api
 | 
			
		||||
			.webhooks(this.id, this.token)
 | 
			
		||||
			.messages(typeof message === 'string' ? message : message.id)
 | 
			
		||||
			.patch({
 | 
			
		||||
				body,
 | 
			
		||||
				files,
 | 
			
		||||
			messagePayload.options.threadId
 | 
			
		||||
				query: messagePayload.options.threadId
 | 
			
		||||
					? new URLSearchParams({ thread_id: messagePayload.options.threadId })
 | 
			
		||||
					: undefined,
 | 
			
		||||
      false
 | 
			
		||||
		);
 | 
			
		||||
				auth: false,
 | 
			
		||||
			});
 | 
			
		||||
 | 
			
		||||
    const messageManager = this.client.channels?.cache.get(d.channel_id)?.messages;
 | 
			
		||||
		const messageManager = this.client.channels?.cache.get(
 | 
			
		||||
			d.channel_id,
 | 
			
		||||
		)?.messages;
 | 
			
		||||
		if (!messageManager) return d;
 | 
			
		||||
 | 
			
		||||
		const existing = messageManager.cache.get(d.id);
 | 
			
		||||
@@ -456,7 +374,9 @@ class Webhook {
 | 
			
		||||
	 * @returns {Promise<void>}
 | 
			
		||||
	 */
 | 
			
		||||
	async delete(reason) {
 | 
			
		||||
    await this.client.api.webhooks(this.id, this.token).delete({ reason, auth: !this.token });
 | 
			
		||||
		await this.client.api
 | 
			
		||||
			.webhooks(this.id, this.token)
 | 
			
		||||
			.delete({ reason, auth: !this.token });
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
@@ -468,14 +388,17 @@ class Webhook {
 | 
			
		||||
	async deleteMessage(message, threadId) {
 | 
			
		||||
		if (!this.token) throw new Error('WEBHOOK_TOKEN_UNAVAILABLE');
 | 
			
		||||
 | 
			
		||||
    await this.client.api.webhooks(this.id, this.token).messages(typeof message === 'string' ? message : message.id ).delete({
 | 
			
		||||
		await this.client.api
 | 
			
		||||
			.webhooks(this.id, this.token)
 | 
			
		||||
			.messages(typeof message === 'string' ? message : message.id)
 | 
			
		||||
			.delete({
 | 
			
		||||
				query: threadId
 | 
			
		||||
					? new URLSearchParams({
 | 
			
		||||
							thread_id: threadId,
 | 
			
		||||
					  })
 | 
			
		||||
					: undefined,
 | 
			
		||||
				auth: false,
 | 
			
		||||
    })
 | 
			
		||||
			});
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
@@ -511,7 +434,9 @@ class Webhook {
 | 
			
		||||
	 * @returns {?string}
 | 
			
		||||
	 */
 | 
			
		||||
	avatarURL(options = {}) {
 | 
			
		||||
    return this.avatar && this.client.rest.cdn.avatar(this.id, this.avatar, options);
 | 
			
		||||
		return (
 | 
			
		||||
			this.avatar && this.client.rest.cdn.avatar(this.id, this.avatar, options)
 | 
			
		||||
		);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
@@ -519,7 +444,9 @@ class Webhook {
 | 
			
		||||
	 * @returns {boolean}
 | 
			
		||||
	 */
 | 
			
		||||
	isUserCreated() {
 | 
			
		||||
    return Boolean(this.type === WebhookType.Incoming && this.owner && !this.owner.bot);
 | 
			
		||||
		return Boolean(
 | 
			
		||||
			this.type === WebhookType.Incoming && this.owner && !this.owner.bot,
 | 
			
		||||
		);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
@@ -560,7 +487,11 @@ class Webhook {
 | 
			
		||||
			'url',
 | 
			
		||||
		]) {
 | 
			
		||||
			if (ignore.includes(prop)) continue;
 | 
			
		||||
      Object.defineProperty(structure.prototype, prop, Object.getOwnPropertyDescriptor(Webhook.prototype, prop));
 | 
			
		||||
			Object.defineProperty(
 | 
			
		||||
				structure.prototype,
 | 
			
		||||
				prop,
 | 
			
		||||
				Object.getOwnPropertyDescriptor(Webhook.prototype, prop),
 | 
			
		||||
			);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
'use strict';
 | 
			
		||||
 | 
			
		||||
const FormData = require('form-data');
 | 
			
		||||
const { Collection } = require('@discordjs/collection');
 | 
			
		||||
const { DiscordSnowflake } = require('@sapphire/snowflake');
 | 
			
		||||
const { InteractionType, Routes } = require('discord-api-types/v9');
 | 
			
		||||
@@ -9,47 +9,6 @@ const MessageCollector = require('../MessageCollector');
 | 
			
		||||
const MessagePayload = require('../MessagePayload');
 | 
			
		||||
const DiscordAPIError = require('../../rest/DiscordAPIError');
 | 
			
		||||
 | 
			
		||||
const _send = (client, channelID, data, files) => {
 | 
			
		||||
  return new Promise((resolve, reject) => {
 | 
			
		||||
		require('axios')({
 | 
			
		||||
			method: 'post',
 | 
			
		||||
			url: `${client.options.http.api}/v${client.options.http.version}/channels/${channelID}/messages`,
 | 
			
		||||
			headers: {
 | 
			
		||||
				authorization: client.token,
 | 
			
		||||
				Accept: '*/*',
 | 
			
		||||
				'Accept-Language': 'en-US,en;q=0.9',
 | 
			
		||||
				'Cache-Control': 'no-cache',
 | 
			
		||||
				Pragma: 'no-cache',
 | 
			
		||||
				Referer: 'https://discord.com/channels/@me',
 | 
			
		||||
				'Sec-Ch-Ua': '" Not A;Brand";v="99" "',
 | 
			
		||||
				'Sec-Ch-Ua-Mobile': '?0',
 | 
			
		||||
				'Sec-Ch-Ua-Platform': '"iOS"',
 | 
			
		||||
				'Sec-Fetch-Dest': 'empty',
 | 
			
		||||
				'Sec-Fetch-Mode': 'cors',
 | 
			
		||||
				'Sec-Fetch-Site': 'same-origin',
 | 
			
		||||
				'X-Debug-Options': 'bugReporterEnabled',
 | 
			
		||||
				'X-Discord-Locale': 'en-US',
 | 
			
		||||
				Origin: 'https://discord.com',
 | 
			
		||||
			},
 | 
			
		||||
			data,
 | 
			
		||||
			files,
 | 
			
		||||
		})
 | 
			
		||||
			.then((res) => resolve(res.data))
 | 
			
		||||
			.catch((err) => {
 | 
			
		||||
        err.request.options = {
 | 
			
		||||
          data,
 | 
			
		||||
          files,
 | 
			
		||||
        };
 | 
			
		||||
        return reject(
 | 
			
		||||
					new DiscordAPIError(
 | 
			
		||||
						err.response.data,
 | 
			
		||||
						err.response.status,
 | 
			
		||||
						err.request,
 | 
			
		||||
					),
 | 
			
		||||
				);
 | 
			
		||||
      });
 | 
			
		||||
	});
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * Interface for classes that have text-channel-like features.
 | 
			
		||||
 * @interface
 | 
			
		||||
@@ -215,8 +174,8 @@ class TextBasedChannel {
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		const { body, files } = await messagePayload.resolveFiles();
 | 
			
		||||
		// const d = await this.client.api.channels[this.id].messages.post({ body, files });
 | 
			
		||||
		const d = await _send(this.client, this.id, body, files);
 | 
			
		||||
		console.log(body)
 | 
			
		||||
		const d = await this.client.api.channels[this.id].messages.post({ body, files });
 | 
			
		||||
		return this.messages.cache.get(d.id) ?? this.messages._add(d);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -109,7 +109,7 @@ class Options extends null {
 | 
			
		||||
					// 'Accept-Encoding': 'gzip, deflate, br',
 | 
			
		||||
					'Accept-Language': 'en-US,en;q=0.9',
 | 
			
		||||
					'Cache-Control': 'no-cache',
 | 
			
		||||
          'Content-Type': 'application/json',
 | 
			
		||||
          // 'Content-Type': 'application/json',
 | 
			
		||||
					Pragma: 'no-cache',
 | 
			
		||||
					Referer: 'https://discord.com/channels/@me',
 | 
			
		||||
					'Sec-Ch-Ua': '" Not A;Brand";v="99" "',
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user