Ниже — несколько простых вариантов на discord.js (v14). Выберите тот, который вам подходит: переслать предыдущее своё сообщение в другой канал, либо переслать текст, который вы передаёте в команде.
Общие требования:
- В package.json discord.js v14.
- Включите Intent Message Content (в настройках бота в Developer Portal) и у клиента укажите GatewayIntentBits.MessageContent.
- У бота должны быть права на чтение/публикацию в целевом канале (VIEW_CHANNEL, SEND_MESSAGES).
1) Переслать предыдущее ваше сообщение (команда-перехватчик, префикс !)
```js
const { Client, GatewayIntentBits } = require('discord.js');
const client = new Client({
intents: [
GatewayIntentBits.Guilds,
GatewayIntentBits.GuildMessages,
GatewayIntentBits.MessageContent
]
});
const PREFIX = '!';
client.on('messageCreate', async message => {
if (message.author.bot) return;
if (!message.content.startsWith(PREFIX)) return;
const [cmd, targetChannelId] = message.content.slice(PREFIX.length).trim().split(/\s+/);
if (cmd === 'forward') {
// если не указан ID канала, используем текущий
const channelId = targetChannelId || message.channel.id;
// получаем канал-цель (попробуем кэш, иначе fetch)
let target = message.guild.channels.cache.get(channelId);
if (!target) {
try {
target = await client.channels.fetch(channelId);
} catch {
return message.reply('Не могу найти указанный канал.');
}
}
if (!target || !target.isTextBased()) return message.reply('Цель — не текстовый канал.');
// ищем предыдущее сообщение от автора в текущем канале (последние 10)
const msgs = await message.channel.messages.fetch({ limit: 10 });
const prev = msgs.filter(m => m.author.id === message.author.id && m.id !== message.id).first();
if (!prev) return message.reply('Не найдено предыдущего сообщения от вас в этом канале.');
// соберём файлы (attachments)
const files = Array.from(prev.attachments.values()).map(a => a.url);
// опционально добавим подпись, кто автор оригинала
const content = prev.content || '';
await target.send({ content: `Переслано от ${message.author.tag}:\n${content}`, files });
return message.reply('Сообщение переслано.');
}
});
client.login('ВАШ_ТОКЕН');
```
Пояснения:
- Команда: `!forward [channelId]`. Если channelId не указан — пересылает в тот же канал.
- Код ищет предыдущее сообщение от того же пользователя в текущем канале и отправляет его текст и вложения в целевой канал.
- Для пересылки embed'ов надо отдельно их копировать (prev.embeds).
2) Переслать текст, который вы передаёте командой (простая пересылка)
```js
// те же импорты и client
if (cmd === 'sendto') {
const channelId = targetChannelId || message.channel.id;
const text = message.content.split(/\s+/).slice(2).join(' '); // после !sendto <channelId> <текст>
if (!text) return message.reply('Укажите текст для пересылки.');
const target = await client.channels.fetch(channelId).catch(() => null);
if (!target || !target.isTextBased()) return message.reply('Неверный канал.');
await target.send({ content: `${message.author.tag} просил переслать:\n${text}` });
return message.reply('Переслано.');
}
```
3) Что делать, если нужно переслать конкретное сообщение по ID (в другом канале)
- Используйте client.channels.fetch(channelId).then(ch => ch.messages.fetch(messageId)) — получите сообщение и отправьте его содержимое/вложения в нужный канал.
Важно:
- Без включённого Message Content Intent бот не сможет читать содержание сообщений (если вы не используете только slash-команды и interaction options).
- При пересылке файлов можно передавать URL в files, но если вложение приватное — убедитесь, что бот может получить доступ.
- Копирование embed'ов: prev.embeds можно передать в send({ embeds: prev.embeds }) — но иногда нужно реконструировать embed, если он нестандартен.
Если скажете точнее:
- как вы вызываете команду (префикс или slash),
- куда пересылать (в тот же канал, другой канал, DM),
- что именно пересылать (только текст, с вложениями, embed),
— я дам готовый пример под ваш случай.