Estou desenvolvendo um bot pro Telegram para armazenar e exibir cartas virtuais mas estou tendo problemas para configurar a paginação corretamente.

21/05/2024

0

const { Telegraf } = require('telegraf');
const fs = require('fs');
const axios = require('axios');
const { Octokit } = require("@octokit/rest");

//Campos vazios por motivos óbvios mas devidamente preenchidos no arquivo. js
const BOT_TOKEN = '';
const GITHUB_TOKEN = '';
const GITHUB_REPO_OWNER = '';
const GITHUB_REPO_NAME = '';

const bot = new Telegraf(BOT_TOKEN);
const octokit = new Octokit({ auth: GITHUB_TOKEN });


Aqui está um dos comandos que usa o esquema de paginação que eu escrevi:

bot.command('clc', async (ctx) => {
  const input = ctx.message.text.split(' ');
  const userInputCategory = input.slice(1).join(' ');

  if (!userInputCategory) {
    ctx.reply('Por favor, forneça o nome ou ID de uma coleção.', { reply_to_message_id: ctx.message.message_id });
    return;
  }

  const categoryDetails = getCategoryByInput(userInputCategory);

  if (!categoryDetails) {
    ctx.reply('Categoria não encontrada.', { reply_to_message_id: ctx.message.message_id });
    return;
  }

  const category = categoryDetails.name;
  const categoryId = categoryDetails.id;

  const categoryCards = Object.values(cards)
    .filter((card) => card.category === category)
    .sort((a, b) => {
      const rarityOrder = {
        'Ouro': 3,
        'Prata': 2,
        'Bronze': 1
      };
      const rarityComparison = rarityOrder[b.rarity] - rarityOrder[a.rarity];
      if (rarityComparison !== 0) {
        return rarityComparison;
      }

      return a.name.localeCompare(b.name);
    });

  const pageSize = 20;
  const totalPages = Math.ceil(categoryCards.length / pageSize);

  let clcPage = 1;

  const sendPage = async (ctx, edit = false) => {
    const startIndex = (clcPage - 1) * pageSize;
    const endIndex = startIndex + pageSize;
    const currentCards = categoryCards.slice(startIndex, endIndex);

    let replyMessage = `${subcategoryEmojiMap[currentCards[0].subcategory]} \`$\`. *$*\n🎲 \`${categoryCards.length}\` cartas no total.\n\n`;
    currentCards.forEach((card) => {
      const maxIdLength = 2;
      const formattedId = formatCardId(card.id, maxIdLength);
      const rarityText = replaceRarityWithEmoji(card.rarity);
      replyMessage += `$ \`$\`. *${card.name}*\n`;
    });

    replyMessage += `\n📄 Página \`$\` de \`$\``;

    const buttons = [];
    if (clcPage > 1) buttons.push('⏪');
    if (clcPage > 1) buttons.push('⬅️');
    if (clcPage < totalPages) buttons.push('➡️');
    if (clcPage < totalPages) buttons.push('⏩');

    const categoryInfo = categories[categoryId] || {};
    const imageUrl = categoryInfo.imageUrl || '';

    if (edit) {
      await ctx.editMessageMedia({
        type: 'photo',
        media: imageUrl,
        caption: replyMessage,
        parse_mode: 'Markdown'
      }, {
        reply_markup: {
          inline_keyboard: [buttons.map(button => ({ text: button, callback_data: `clc-$` }))]
        }
      }).catch((err) => console.log("Edit message error:", err));
    } else {
      await ctx.replyWithPhoto({ url: imageUrl }, {
        caption: replyMessage,
        parse_mode: 'Markdown',
        reply_to_message_id: ctx.message.message_id,
        reply_markup: {
          inline_keyboard: [buttons.map(button => ({ text: button, callback_data: `clc-$` }))]
        }
      });
    }
  };

  sendPage(ctx);

  bot.action(['clc-⏪', 'clc-⬅️', 'clc-➡️', 'clc-⏩'], async (ctx) => {
    const action = ctx.callbackQuery.data;

    switch (action) {
      case 'clc-⏪':
        clcPage = 1;
        break;
      case 'clc-⬅️':
        if (clcPage > 1) clcPage--;
        break;
      case 'clc-➡️':
        if (clcPage < totalPages) clcPage++;
        break;
      case 'clc-⏩':
        clcPage = totalPages;
        break;
    }

    await sendPage(ctx, true);
    ctx.answerCbQuery();
  });
});


O problema é que se um usuário enviar o comando no Telegram e depois enviar o mesmo comando em seguida e passar de página, a mensagem do comando anterior é copiada para a mensagem da nova página.
Librious

Librious

Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar