Как отправить сообщение в личные сообщения из текстового канала с помощью Discord.js?

Как получить сообщения, написанные пользователем с "специальной ролью" в канале тикета и отправить их пользователю в личные сообщения?
  • 2 октября 2023 г. 17:07
Ответы на вопрос 2
Чтобы отправить сообщение в личные сообщения из текстового канала с помощью Discord.js, вам нужно получить объект пользователя и использовать его метод `send()`. Вот пример:

```javascript
// Предположим, что у вас есть объект "message" от события "message" приходящего события
// и пользователь, которому вы хотите отправить сообщение, имеет ID "userID"

const user = message.client.users.cache.get('userID'); // Получаем объект пользователя по его ID
if (!user) return console.log('Невозможно найти пользователя.');

const content = 'Привет! Это сообщение отправлено из текстового канала в личные сообщения.'; // Содержание сообщения

user.send(content)
  .then(() => console.log('Сообщение отправлено в личные сообщения пользователя.'))
  .catch(error => console.error(`Не удалось отправить сообщение в личные сообщения: ${error}`));
```

Чтобы получить сообщения, написанные пользователем с "специальной ролью" в канале тикета и отправить их пользователю в личные сообщения, вам нужно получить все сообщения из канала, пройти по ним и проверить роль каждого пользователя, который их написал. Вот пример:

```javascript
// Предположим, что у вас есть объект "message" от события "message" приходящего события
// и вы хотите отправить сообщения только пользователям с ролью "специальная роль"

const channel = message.guild.channels.cache.get('channelID'); // Получаем объект канала по его ID
if (!channel) return console.log('Невозможно найти канал.');

channel.messages.fetch()
  .then(messages => {
    messages.forEach(message => {
      if (message.member.roles.cache.some(role => role.name === 'специальная роль')) {
        const user = message.author;
        const content = message.content;
        // Отправляем сообщение пользователю в личные сообщения
        user.send(content)
          .then(() => console.log(`Сообщение от пользователя "${user.username}" отправлено в личные сообщения.`))
          .catch(error => console.error(`Не удалось отправить сообщение от пользователя "${user.username}" в личные сообщения: ${error}`));
      }
    });
  })
  .catch(error => console.error(`Не удалось получить сообщения из канала: ${error}`));
```

Примечание: Для использования `fetch()` метода необходимо, чтобы у бота были права на просмотр истории сообщений в канале. Также убедитесь, что у вас есть актуальная версия Discord.js для использования всех функций — `^12.5.1`.
Создание тикета реализуйте, отправляя сообщение в личные сообщения бота. Это позволит избежать ограничений на отправку сообщений в ответе. Обработку сообщений из личных сообщений и тикета можно осуществить с помощью события "messageCreate". Для работы с тикетами необходим интент "GuildMessages", а для работы с личными сообщениями - "DirectMessages" и частичное получение данных о канале ("Channel"). При первом отправлении сообщения боту (создание тикета), бот должен создать канал и сохранить идентификатор пользователя и канала тикета в базе данных, чтобы связать их и использовать в дальнейшем. При получении сообщения из личных сообщений бот должен получить идентификатор тикета по идентификатору пользователя и перенаправить сообщение в соответствующий тикет, а также наоборот.
Похожие вопросы