Что делает приложение
Я пишу бот Telegram
, используя Telegraf JS, пока я мы создали класс с именем Bot
, который инициализирует бота middlewares
и запускает его:
const Telegraf = require('telegraf');
const session = require('telegraf/session');
// Commands
const { commands } = require('../commands');
class Bot {
constructor() {
this.bot = new Telegraf(process.env.BOT_TOKEN);
this.bot.catch(error => {
console.error(`Bot error: ${error}`);
});
}
// Init bot configuration
async init() {
// Set session
this.bot.use(session.middleware());
// Set commands
this.bot.use(commands);
}
// Start the bot
async start() {
// Start the bot
await this.init();
this.bot.startPolling();
}
}
exports.Bot = Bot;
входной файл app.js
создает экземпляр Bot
следующим образом:
const { Bot } = require('./logic/controllers/bot.controller');
let bot = new Bot();
await bot.start();
Проблема
Глядя на промежуточное ПО commands
, я связал команды Composer
с bot
, поэтому по сути у меня есть:
const Composer = require('telegraf/composer');
const { Message } = require('../controllers/message.controller');
let msgController = new Message();
let messageCommand = new Composer();
messageCommand.action(/message-delete.+/, msgController.delete);
module.exports = messageCommand;
По существу, когда пользователь нажимает кнопку с обратным вызовом message-delete.message_id
, запускается приведенная выше команда.
Проблема заключается в следующем:
Мне нужно использовать Telegram
экземпляр бота внутри контроллера msgController
, я фактически использовал контекст без передачи каких-либо параметров в .delete
метод, но предположим, что я хочу сохранить экземпляр бота Telegram
где-нибудь, который всегда должен быть доступен, как я могу это сделать?
Что я думал
Моя идея - передавать экземпляр бота Telegram
каждый раз, когда я создаю экземпляр класса, например:
const { Markup } = require('telegraf');
const moment = require('moment');
// Models
const { MessageModel } = require('../models/message.model');
class Message {
constructor(bot){
this.bot = bot;
}
}
, это хороший способ справиться с этим или есть лучшая практика?