Как создать функцию для отправки сообщений

У меня есть приложение 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);
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

«Я хотел бы, чтобы, если с моим приложением 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-адрес.

Другие вопросы по теме