Задать вопрос
frumkin
@frumkin
Садовод на удаленке

В чем ошибка в пересылке сообщения через ТГ бот в личку?

у меня есть код, который отправляет сообщения через кнопку вызова техподдержки в личку сотруднику техподдержки. но он неправильно работает. если сообщение содержит только текст оно нормально пересыпается. если к тексту добавляется вложение то пересылаются только вложения а текст не пересылаются.
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("❌ Произошла ошибка при отправке вашего сообщения. Попробуйте снова.");
            }
        }
    }
}
  • Вопрос задан
  • 27 просмотров
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы