Sample

Functions of the BarkPaws Telegram bot functionalities, handling of commands, integrating with external APIs for real-time data, error handling and user experience.

Step 1: Install Additional Dependencies

We'll need a few more dependencies for additional features like multi-language support and enhanced security.

npm install i18next i18next-node-fs-backend i18next-http-middleware dotenv

Step 2: Setup Environment Variables

Create a .env file to store sensitive data such as the Telegram bot token and MongoDB URI.

TELEGRAM_BOT_TOKEN=bark_telegram_bot_token
MONGO_URI=mongodb://localhost:27017/barkpaws

Step 3: Bot Sample Code

The version of the bot with added functionalities:

require('dotenv').config();
const TelegramBot = require('node-telegram-bot-api');
const express = require('express');
const axios = require('axios');
const { MongoClient } = require('mongodb');
const i18next = require('i18next');
const i18nextMiddleware = require('i18next-http-middleware');
const Backend = require('i18next-node-fs-backend');

i18next.use(Backend).use(i18nextMiddleware.LanguageDetector).init({
    backend: {
        loadPath: './locales/{{lng}}/translation.json',
    },
    fallbackLng: 'en',
    preload: ['en', 'es', 'fr'], // Add more languages as needed
    detection: {
        order: ['querystring', 'cookie'],
        caches: ['cookie'],
    }
});

// Replace 'BARK_TELEGRAM_BOT_TOKEN' with the token you get from BotFather
const token = process.env.TELEGRAM_BOT_TOKEN;
const bot = new TelegramBot(token, { polling: true });

// MongoDB setup
const mongoUri = process.env.MONGO_URI;
const client = new MongoClient(mongoUri, { useNewUrlParser: true, useUnifiedTopology: true });
let db;

client.connect(err => {
    if (err) {
        console.error('Failed to connect to MongoDB', err);
        process.exit(1);
    }
    db = client.db('barkpaws');
    console.log('Connected to MongoDB');
});

// Express setup for webhooks or other endpoints if needed
const app = express();
app.use(i18nextMiddleware.handle(i18next));
app.use(express.json());

// Define bot commands and responses
bot.onText(/\/start/, (msg) => {
    const chatId = msg.chat.id;
    const lang = msg.from.language_code;
    i18next.changeLanguage(lang);

    bot.sendMessage(chatId, i18next.t('welcome_message'), {
        reply_markup: {
            inline_keyboard: [
                [{ text: i18next.t('initiate_swap'), callback_data: 'swap' }],
                [{ text: i18next.t('monitor_trade'), callback_data: 'status' }],
                [{ text: i18next.t('support'), callback_data: 'support' }],
                [{ text: i18next.t('settings'), callback_data: 'settings' }],
                [{ text: i18next.t('resources'), callback_data: 'resources' }],
                [{ text: i18next.t('stake_tokens'), callback_data: 'stake' }],
                [{ text: i18next.t('governance'), callback_data: 'governance' }]
            ]
        }
    });
});

bot.on('callback_query', async (query) => {
    const chatId = query.message.chat.id;
    const data = query.data;

    if (data === 'swap') {
        await handleTokenSwap(chatId);
    } else if (data === 'status') {
        await handleTradeStatus(chatId);
    } else if (data === 'support') {
        bot.sendMessage(chatId, i18next.t('support_message'));
    } else if (data === 'settings') {
        bot.sendMessage(chatId, i18next.t('settings_message'));
    } else if (data === 'resources') {
        bot.sendMessage(chatId, i18next.t('resources_message'));
    } else if (data === 'stake') {
        bot.sendMessage(chatId, i18next.t('stake_message'));
    } else if (data === 'governance') {
        bot.sendMessage(chatId, i18next.t('governance_message'));
    }
});

async function handleTokenSwap(chatId) {
    bot.sendMessage(chatId, i18next.t('swap_prompt'))
        .then(() => {
            bot.once('message', async (msg) => {
                const details = msg.text.split(' ');
                const tokenFrom = details[0];
                const tokenTo = details[1];
                const amount = details[2];
                const walletAddress = details[3];

                try {
                    // Placeholder for actual swap logic
                    const response = await axios.post('https://api.solana.swap', { tokenFrom, tokenTo, amount, walletAddress });
                    bot.sendMessage(chatId, i18next.t('swap_success', { txId: response.data.txId }));
                } catch (error) {
                    bot.sendMessage(chatId, i18next.t('swap_failure', { error: error.message }));
                }
            });
        });
}

async function handleTradeStatus(chatId) {
    bot.sendMessage(chatId, i18next.t('status_prompt'))
        .then(() => {
            bot.once('message', async (msg) => {
                const tradeId = msg.text;

                try {
                    // Placeholder for actual status check logic
                    const response = await axios.get(`https://api.solana.trade/status/${tradeId}`);
                    bot.sendMessage(chatId, i18next.t('status_success', { status: response.data.status }));
                } catch (error) {
                    bot.sendMessage(chatId, i18next.t('status_failure', { error: error.message }));
                }
            });
        });
}

// Start the Express server
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
    console.log(`Server is running on port ${PORT}`);
});

Step 4: Creating Localization Files

Create a locales folder with subfolders for each language, such as en, es, fr, etc. Inside each folder, create a translation.json file with the necessary translations.

For example, locales/en/translation.json:

{
    "welcome_message": "Welcome to BarkPaws Bot! How can we assist you today?",
    "initiate_swap": "Initiate Token Swap",
    "monitor_trade": "Monitor Trade Status",
    "support": "Support",
    "settings": "Settings",
    "resources": "Educational Resources",
    "stake_tokens": "Stake BARK Tokens",
    "governance": "Governance",
    "swap_prompt": "Please provide the following details to initiate a token swap:\n1. Token to Swap From\n2. Token to Swap To\n3. Amount\n4. Confirm Wallet Address",
    "swap_success": "Swap initiated successfully. Transaction ID: {{txId}}",
    "swap_failure": "Failed to initiate swap: {{error}}",
    "status_prompt": "Please enter your Trade ID to check the status:",
    "status_success": "Trade status: {{status}}",
    "status_failure": "Failed to check trade status: {{error}}",
    "support_message": "How can we assist you? Please describe your issue, and our support team will get back to you shortly.",
    "settings_message": "Settings:\n- Change Language\n- Notification Preferences\n- Security Settings",
    "resources_message": "Choose a topic to learn more:\n- How to Use BarkPaws Bot\n- Understanding DeFi\n- FAQs",
    "stake_message": "Enter the amount of BARK Tokens you want to stake:",
    "governance_message": "View current proposals and vote using your BARK Tokens."
}

Step 5: Running the Bot

  1. Run the bot:

    node bot.js

Enhancements and Testing

  • Error Handling: Proper error messages and handling for invalid inputs and API failures.

  • Localization: Multi-language support using i18next.

  • User Experience: Improved user prompts and flow handling.

  • Security: Environment variables to securely store sensitive information.

This code provides a robust foundation for the BarkPaws Telegram bot, enhancing functionality and user experience. Test each functionality thoroughly to ensure smooth operation.

Last updated