В первой части мы создали бота, настроили лог, написали основные функции для работы с нашим ботом. Если вдруг пропустили — она по ссылке: Телеграм бот конвертер регистров — 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, "Неверный формат")
}
}
}
}
Вот и все, наш бот готов!
Если у вас возникнут какие-то вопросы — пишите в Чатик, по возможности отвечу.
Здесь найдете весь код в одном файле для удобства.