Телеграм бот конвертер регистров — Google Apps Script. Часть 2 из 2.

В первой части мы создали бота, настроили лог, написали основные функции для работы с нашим ботом. Если вдруг пропустили — она по ссылке: Телеграм бот конвертер регистров — Google Apps Script. Часть 1 из 2.

Ну, а мы продолжаем.

Управление развертываниями

Важно: после каждого изменения в коде, чтобы протестировать бота, необходимо сделать новую версию развертывание веб-приложения.

Кликаем по кнопке Начать развертываниеУправление развертываниями.

Кликаем по иконке Редактирование и выбираем из списка Новая версия.

Вернемся к файлу bot.gs

Для удобства комментировать буду внутри кода.

bot.gs — Apps Script
function doPost(e) {
  // Вебхуком получаем событие от Телеграм
  const ctx = JSON.parse(e.postData.contents);
  // Записываем его в лист log нашей таблицы
  const ss = SpreadsheetApp.openById(config.spreadsheet);
  const sheetLog = ss.getSheetByName(config.sheets.sheetLog);
  sheetLog.getRange(1, 1).setValue(JSON.stringify(ctx, null, 5));
  
  /*
  * ОБРАБОТКА СООБЩЕНИЙ
  */
  
  // Проверяем, действительно ли пользователь отправил сообщение
  if (ctx.hasOwnProperty('message')) {
    const ctxMessage = ctx.message;
    
    // Создаем объект пользователя и записываем основные значения
    // Без id пользователя не может быть, поэтому проверки на существование там нет.
    // Остальные значения, в случае отсутствия, записываются пустой строкой.
    const user = {
      uid: ctxMessage.from.id,
      firstName: ctxMessage.from.first_name ? ctxMessage.from.first_name : "",
      lastName: ctxMessage.from.last_name ? ctxMessage.from.last_name : "",
      userName: ctxMessage.from.username ? ctxMessage.from.username : "",
    }

    // Создаем объект сообщения и записываем основные значения
    const message = {
      id: ctxMessage.message_id,
      date: ctxMessage.date,
      text: ctxMessage.text,
    }

    // Перед обработкой введенного текста необходимо проверить сообщение на наличие команды боту.
    // Если сообщение имеет свойство 'entities' и тип равен значению 'bot_command'
    if (ctxMessage.hasOwnProperty('entities') && ctxMessage.entities[0].type == 'bot_command') {
      // Проверяем, равно ли сообщение команде '/start'
      if (ctxMessage.text == config.botCommands.start) {
        saveUser(user) // Сохраняем пользователя в таблицу
        sendMessage(user.uid, `Привет, ${user.firstName}! 👋\n\nЯ могу конвертировать регистр.`); // Отправляем приветственное сообщение
      }
    } else { // Если мы не обнаружили команд боту
      deleteMessage(user.uid, message.id) // Удаляем введенное сообщение
      //Отправляем сообщение с тем же текстом, но уже с нашей клавиатурой
      sendMessage(user.uid, `<code>${message.text}</code>`, inlineKeyboard)
    }
  }
  
  /*
  * ОБРАБОТКА НАЖАТИЙ ИНЛАЙН КНОПОК
  */
  
  // Если кнопка нажата, нам приходит callback_query
  if (ctx.callback_query) {
    // Собираем все данные с ответа
    const queryMessage = ctx.callback_query.message;
    const cbqData = ctx.callback_query.data;
    const cbqFromId = ctx.callback_query.from.id;
    const cbqId = ctx.callback_query.id;
    const cbqMessage = {
      id: queryMessage.message_id,
      date: queryMessage.date,
      text: queryMessage.text,
    }
    const doneTextCopy = `<b>Готово!</b>\n<i>Можете скопировать результат 👇</i>`;
    
    // Сравниваем ctx.callback_query.data с нашими кнопками
    if (cbqData === 'formatUpper') {
      // Отправляем сообщение о готовности
      sendMessage(cbqFromId, doneTextCopy)
      // Отправляем сообщение с конвертированным текстом и клавиатурой
      sendMessage(cbqFromId, `<code>${formatUpper(cbqMessage.text)}</code>`, inlineKeyboard)
    }

    if (cbqData === 'formatLower') {
      sendMessage(cbqFromId, doneTextCopy)
      sendMessage(cbqFromId, `<code>${formatLower(cbqMessage.text)}</code>`, inlineKeyboard)
    }

    if (cbqData === 'formatTitle') {
      sendMessage(cbqFromId, doneTextCopy)
      sendMessage(cbqFromId, `<code>${formatTitle(cbqMessage.text)}</code>`, inlineKeyboard)
    }

    if (cbqData === 'formatInverse') {
      sendMessage(cbqFromId, doneTextCopy)
      sendMessage(cbqFromId, `<code>${formatInverse(cbqMessage.text)}</code>`, inlineKeyboard)
    }

    if (cbqData === 'formatSentence') {
      let result = "";
      // Здесь я обернул в try catch из-за того, что обнаружил баг:
      // когда строка начинается с emoji, функция не срабатывает.
      // Пока что оставил так, в будущем буду думать, как пофиксить.
      try {
        result = formatSentence(cbqMessage.text);
        sendMessage(cbqFromId, doneTextCopy)
        sendMessage(cbqFromId, `<code>${result}</code>`, inlineKeyboard)
      } catch (e) {
        toastMessage(cbqId, "Неверный формат")
      }
    }
  }  
}

Вот и все, наш бот готов!

Если у вас возникнут какие-то вопросы — пишите в Чатик, по возможности отвечу.

Здесь найдете весь код в одном файле для удобства.

Читать: Телеграм бот конвертер регистров — Google Apps Script. Часть 1 из 2.