у меня есть код, который отправляет сообщения через кнопку вызова техподдержки в личку сотруднику техподдержки. но он неправильно работает. если сообщение содержит только текст оно нормально пересыпается. если к тексту добавляется вложение то пересылаются только вложения а текст не пересылаются.
import { BotService } from "./bot.service";
import { InjectBot, Start, Update, On } from "nestjs-telegraf";
import { Telegraf, Context } from "telegraf";
import { Message } from 'telegraf/typings/core/types/typegram';
interface SessionData {
waitingForSupportMessage?: boolean;
userMessageId?: number;
userId?: number;
}
interface MyContext extends Context {
session?: SessionData;
}
@Update()
export class BotController {
private readonly supportChatId = **********; // ID техподдержки
constructor(
@InjectBot() private readonly bot: Telegraf<MyContext>,
private readonly botService: BotService,
) {
console.log("Bot initialized");
}
@Start()
async startCommand(ctx: MyContext) {
console.log("Команда /start получена");
const photoUrl = "https://***orto.ru/images/Logo.png";
const caption =
"Все с доставкой";
const options = {
reply_markup: {
inline_keyboard: [
[{ text: "Site / Сайт", url: "https://***orto.ru/ru" }],
[{ text: "Technical support / Техническая поддержка", callback_data: "support_request" }],
],
},
};
await ctx.telegram.sendPhoto(ctx.chat.id, photoUrl, {
caption: caption,
...options,
});
}
// Обработчик кнопки "Техническая поддержка"
@On("callback_query")
async onCallbackQuery(ctx: MyContext) {
const query = ctx.callbackQuery as any;
if (query.data === "support_request") {
console.log("Кнопка 'Техническая поддержка' нажата");
await ctx.reply(" Пожалуйста, напишите ваш вопрос, и мы передадим его в техническую поддержку.");
if (!ctx.session) ctx.session = {};
ctx.session.waitingForSupportMessage = true;
}
}
// Обработчик любых сообщений (текст и вложения)
@On("message")
async onMessage(ctx: MyContext) {
console.log("Получено сообщение от пользователя");
if (ctx.session?.waitingForSupportMessage) {
const firstName = ctx.from.first_name || "Неизвестное имя";
const username = ctx.from.username ? `(@${ctx.from.username})` : "";
const userId = ctx.from.id;
const header = ` *Новое сообщение в техподдержку:*
*Пользователь:* ${firstName} ${username}
*ID:* ${userId}`;
const message = ctx.message as Message;
let isHeaderSent = false;
try {
// Отправляем текстовое сообщение отдельно, если есть
if ('text' in message && message.text) {
const messageText = `\n *Сообщение:*\n${message.text}`;
await this.bot.telegram.sendMessage(this.supportChatId, header + messageText, { parse_mode: "Markdown" });
isHeaderSent = true;
}
// Проверяем и отправляем вложения по одному
const sendAttachment = async (sendFunction: Function, fileId: string) => {
if (!isHeaderSent) {
await this.bot.telegram.sendMessage(this.supportChatId, header, { parse_mode: "Markdown" });
isHeaderSent = true;
}
await sendFunction(this.supportChatId, fileId);
};
if ("photo" in message) {
const photo = message.photo[message.photo.length - 1];
await sendAttachment(this.bot.telegram.sendPhoto.bind(this.bot.telegram), photo.file_id);
}
if ("video" in message) {
await sendAttachment(this.bot.telegram.sendVideo.bind(this.bot.telegram), message.video.file_id);
}
if ("document" in message) {
await sendAttachment(this.bot.telegram.sendDocument.bind(this.bot.telegram), message.document.file_id);
}
if ("voice" in message) {
await sendAttachment(this.bot.telegram.sendVoice.bind(this.bot.telegram), message.voice.file_id);
}
if ("audio" in message) {
await sendAttachment(this.bot.telegram.sendAudio.bind(this.bot.telegram), message.audio.file_id);
}
ctx.session.waitingForSupportMessage = false;
await ctx.reply("✅ Ваше сообщение отправлено в техподдержку.");
} catch (error) {
console.error("Ошибка при отправке сообщения в техподдержку:", error);
await ctx.reply("❌ Произошла ошибка при отправке вашего сообщения. Попробуйте снова.");
}
}
}
}