Пишем Telegram бота на JavaScript. Часть 3. Рефакторинг и логирование


 Первый пост: Пишем Telegram бота на JavaScript. Вводная 

 Второй пост:  Пишем Telegram бота на JavaScript. Часть 2. Курс биткоина

Рефакторинг

Всем привет, спасибо за голоса, в данной статье цикла хотелось бы рассмотреть замечательную вещь - логирование. Во-первых, это удобно, во-вторых, полезно. Удобно отлавливать ошибки, а полезно собирать данные для статистики, так можно отследить как люди чаще всего делают запросы, а для нашего бота это может быть вполне актуально, ведь он умеет получать сообщения о курсе криптовалюты в более свободном виде: вы можете указать валютные пары биржы в оригинальном виде, транслитом или по кнопке. Так мы сможем отловить частые опечатки и включить их в выдачу. Но для начала нам нужно привести код в порядок, если помните, то в прошлой статье я писал про оптимизацию обработки запросов, проблема в том, что код постоянно проверял все условия, даже если этого было не нужно, и у нас было много повторяющегося кода, и, хотя для освоения основ это не нужно, я решил всё же немного уделить этому внимания. Ниже приведу код из предыдущей статьи после небольшого рефакторинга:

var request = require('request');
var TelegramBot = require('node-telegram-bot-api');
 
var opts = {
  reply_markup: JSON.stringify({
    keyboard: [
      ['??','??']
    ],
    resize_keyboard: true
  })
};
 
var APPCONFIG = {
  url: 'https://btc-e.nz/api/3/ticker/',
  token: '271342174:AAFY4-V7TY7Ux5V7liK_TpdmFM7W87TzTuM',
  botConfig: {
    polling: true
  }
};
 
var bot = new TelegramBot(APPCONFIG.token, APPCONFIG.botConfig);
 
bot.on('text', function(msg) {
var messageChatId = msg.chat.id;
var messageText = msg.text;
 
  function exchange(pare, currency) {
    var url = 'https://btc-e.nz/api/3/ticker/' + pare;
    request(url, function (error, response, body) {
      if (!error && response.statusCode == 200) {
        var bodyJson = JSON.parse(body);
        var msg = 'Продажа 1 BTC: ' + bodyJson[pare].sell + ' ' + currency + '\r\n';
        msg += 'Покупка 1 BTC: ' + bodyJson[pare].buy + ' ' + currency;
        bot.sendMessage(messageChatId, msg, opts);
      }
    });
  };
 
  switch (messageText) {
    case '/start':
      bot.sendMessage(messageChatId, 'Добро пожаловать, ну hello world', opts);
      break;
    case 'btc usd':
      exchange('btc_usd', '??');
      break;
    case 'бтц юсд':
      exchange('btc_usd', '??');
      break;
    case '??':
      exchange('btc_usd', '??');
      break;
    case 'btc rub':
      exchange('btc_rur', '??');
      break;
    case 'бтц руб':
      exchange('btc_rur', '??');
      break;
    case '??':
      exchange('btc_rur', '??');
      break;
    default:
      bot.sendMessage(messageChatId, 'Я внимательно слушаю', opts);
  }
});
 

Итак, пару слов о том, что изменилось:

  1. Мы создали константу APPCONFIG, в которой собираем большинство настроек, включая часть URL, которая повторяется
  2. Мы написали функцию exchange, которая принимает два аргумента - имя валютной пары и обозначение валюты
  3. Убрали все условия if-else и заменили их на switch-case, в которой используем функцию exchange.
  4. Добавили значение "по-умолчанию", для сторонних сообщений

Можно было и продолжить, но...

Теперь приступим к логированию.

Логирование

Подключим модуль для взаимодействия с файловой системой:

var fs = require('fs');

Перед обработкой сообщений запишем функцию, которая будет принимать два параметра: путь до файла логов и данные, которые необходимо записать:

function writeLog(filename, data) {
  var dataString = JSON.stringify(data, null, 2);
  var curDate = new Date();
 
  fs.readFile(filename, function (err, logData) {
    var text = logData.toString();
    curDate = curDate.getDate() + '.' + curDate.getMonth() + '.' + curDate.getFullYear()
    + " " + curDate.getHours() + ":" + curDate.getMinutes() + ":" + curDate.getSeconds();
    text += "\r\n#-------------------------------\r\n" + curDate + "\r\n#-------------------------------\r\n" + dataString;
 
    fs.writeFile(filename, text, function(err) {
      if(err) throw err;
    });
  });
};

Первое, что мы в ней делаем - обрабатываем получаемые данные и превращаем строку в JSON. Затем считаем файл логов, чтобы можно было записать в конец новые данные. Обартите внимание, что в данной реализации файл уже должен быть создан. Далее воспользуемся стандартным объектом Date и сформируем строку заголовка с датой, после чего добавим новые данные и запишем всё в конец файла.

Так же нам необходимо немного дополнить наш конфиг:

var APPCONFIG = {
  url: 'https://btc-e.nz/api/3/ticker/',
  token: '271342174:AAFY4-V7TY7Ux5V7liK_TpdmFM7W87TzTuM',
  botConfig: {
    polling: true
  },
  logUrl: 'logs/all.log'
};

Не забудьте создать сам файл!

Все, теперь добавим вызов функции логирования  при каждом полученном сообщении,внутри метода bot.on('text'):

writeLog(APPCONFIG.logUrl, msg);

На этом пока всё! В следующих постах попробуем отойти от криптовалютной темы и добавить API VK .  Ставьте голос, подписывайтесь и всем Спасибо! 


Comments 4