У меня есть приложение node.js, в котором я создал бота для разногласий, с которым взаимодействую. Я бы хотел, чтобы, если с моим приложением node.js произошло определенное событие, оно отправило сообщение на определенный канал на моем сервере разногласий.
Я впервые использую discord.js. Однако моя мысль заключалась в том, чтобы создать функцию, которую я мог бы вызвать для отправки своих сообщений. Однако, похоже, мне нужно сначала дождаться готовности моего клиента.
В качестве альтернативы, мне просто нужно будет создавать экземпляр нового клиента каждый раз, когда я хочу отправить сообщение, и ждать, пока он станет доступным, прежде чем я отправлю сообщение, которое хочу?
Я чувствую, что должен быть лучший способ... Есть ли чистый способ настроить этого базового бота разногласий, чтобы я мог просто вызвать функцию для отправки сообщения из любого места в моем приложении?
Вот код, который у меня есть сейчас:
import { Client, Events, GatewayIntentBits } from "discord.js";
import { botToken, CHANNEL_ID } from "../../config.js";
const client = new Client({ intents: [GatewayIntentBits.Guilds] }); // Create a new client instance
// When the client is ready, run this code (only once)
// We use 'c' for the event parameter to keep it separate from the already defined 'client'
client.once(Events.ClientReady, c => {
console.info(`Ready! Logged in as ${c.user.tag}`);
client.channels.cache.get(CHANNEL_ID).send("Hello!");
});
// Log in to Discord with your client's token
client.login(botToken);



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


«Я хотел бы, чтобы, если с моим приложением node.js произойдет определенное событие, оно отправило сообщение на определенный канал на моем сервере разногласий».
Похоже, вы ищете вебхуки. Веб-перехватчики — это способ для внешнего источника, такого как ваше приложение Node.js, отправлять сообщения на канал Discord без необходимости входа в систему в качестве бота. Вместо использования бота Discord вы можете использовать веб-перехватчик для отправки сообщений на канал, как если бы они были опубликованы ботом.
Использовать веб-перехватчик просто; вам просто нужно сделать HTTP-запрос POST на URL-адрес, предоставленный Discord, с сообщением, которое вы хотите отправить, в теле запроса. Затем Discord опубликует это сообщение на указанном канале.
Это полезно в тех случаях, когда вы хотите получать уведомления от своего приложения на канале Discord или просто хотите отправлять сообщения на канал без необходимости входа в систему в качестве бота. Это чистый и эффективный способ интеграции вашего приложения с Discord.
Вот пример функции sendMessage. Он принимает два аргумента, payload и webhookUrl. Если payload не является строкой, предполагается, что это объект, который соответствует формату веб-перехватчика Discord и будет использоваться как есть.
function sendMessage(payload, webhookUrl) {
const data = typeof payload === 'string' ? { content: payload } : payload;
return new Promise((resolve, reject) => {
fetch(webhookUrl, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(data),
})
.then((response) => {
if (!response.ok) {
reject(new Error(`Could not send message: ${response.status}`));
}
resolve();
})
.catch((error) => {
console.error(error);
reject(error);
});
});
}
Если вы используете node.js v18+, вы можете использовать встроенный fetch, если нет, вам нужно установить библиотеку, например node-fetch, axios или что-то еще.
Вот пример того, как вы можете его использовать:
// send a simple message
sendMessage('Hello from my app!', WEBHOOK_URL).catch((error) =>
console.error(error),
);
// send a message, but change the username and the avatar
sendMessage(
{
content: 'Hello from my app!',
avatar_url: 'https://i.imgur.com/KEungv8.png',
username: 'Test Hook',
},
WEBHOOK_URL,
).catch((error) => console.error(error));
// send an embed and change the user again
sendMessage(
{
avatar_url: 'https://i.imgur.com/ofPowdD.png',
username: 'Cattian Hook',
embeds: [
{
title: 'Cats, cats, cats',
color: 0xe7d747,
thumbnail: {
url: 'https://i.imgur.com/2bvab7y.jpeg',
},
},
],
},
WEBHOOK_URL,
).catch((error) => console.error(error));
И вот результат:
Если вы уже используете discord.js, вы можете использовать WebhookClient:
import { WebhookClient } from 'discord.js';
const webhookClient = new WebhookClient({
url: WEBHOOK_URL,
});
webhookClient.send({
content: 'Discord.js webhook test',
username: 'DJS Webhook',
avatarURL: 'https://i.imgur.com/KEungv8.png',
});
Чтобы создать вебхук, вам нужно зайти в настройки вашего сервера Discord и нажать APPS => Integrations. Затем нажмите на кнопку Create Webhook. Там вы можете выбрать канал, на который вы хотите отправлять сообщения.
После создания веб-перехватчика вы можете нажать кнопку Copy webhook URL и использовать этот URL-адрес.