UNPKG

vvlad1973-telegram-framework

Version:
116 lines (95 loc) 4.06 kB
'use strict' import util from 'util'; let defaultMarker = ['☐', '☒']; function replaceAt(str, replacement, index = 0) { return String(str).slice(0, index) + replacement + String(str).slice(index + replacement.length); } function collectTexts(markup, optionPattern = '(^OPT_\\d+)\\D*', marker = defaultMarker, result = '') { if (Array.isArray(markup)) { for (let i = 0; i < markup.length; i++) { result = collectTexts(markup[i], optionPattern, marker, result); } } else if (markup?.text && markup?.callback_data.match(optionPattern)) { let spacer = marker.includes(String(markup.text).substring(0, 1)) ? '' : marker[0] + ' '; result = `${result}${spacer}${markup.text}\n`; } return result; } function toggleOption(markup, option, optionPattern = '(^OPT_\\d+)\\D*', marker = defaultMarker) { let re = RegExp(optionPattern); if (Array.isArray(markup)) { for (let i = 0; i < markup.length; i++) { markup[i] = toggleOption(markup[i], option, optionPattern, marker); } } else { if (markup?.text && markup?.callback_data === option) { if (markup.text.match(`^${marker[1]}`)) { if (marker[0] === '') markup.text = String(markup.text).slice(marker[1].length) else markup.text = replaceAt(markup.text, marker[0], 0); markup.callback_data = String(markup.callback_data).replace(re, '$1_FALSE'); } else { if (marker[0] === '' || !markup.text.match(`^${marker[0]}`)) markup.text = `${marker[1]} ${String(markup.text)/* .trim() */}` else markup.text = replaceAt(markup.text, marker[1], 0); markup.callback_data = String(markup.callback_data).replace(re, '$1_TRUE'); } return markup; } else return markup; } return markup; } export function multipleChoise(contents, options = {}, next, bot) { options.optionPattern = options.optionPattern ?? '(^OPT_\\d+)\\D*'; options.answerPattern = options.answerPattern ?? 'ANSWER(_.*)?'; options.marker = options.marker ?? defaultMarker; options.textTemplate = options.textTemplate ?? '%s\n\n%s'; let answer, callbackQueryId = contents?.callback_query.id, data = contents?.callback_query.data, messageId = contents?.callback_query?.message?.message_id, chatId = contents?.callback_query?.message?.chat?.id, markup = contents?.callback_query?.message?.reply_markup, text = contents?.callback_query?.message?.text, caption = contents?.callback_query?.message?.caption; if ( contents?.callback_query && contents?.callback_query?.message?.reply_markup?.inline_keyboard ) { bot.answerCallbackQuery(callbackQueryId); console.log(`This is the callback query. Data: ${contents?.callback_query.data}`); console.log(`Edit replay markup:\n\tMessageId: ${messageId}\n\tChatId: ${chatId}\n\tMarkup:\n${JSON.stringify(markup, '', '\t')}`); if (contents?.callback_query?.data?.match(options?.optionPattern)) { markup.inline_keyboard = toggleOption( markup.inline_keyboard, data, options.optionPattern, options.marker ); bot.editMessageReplyMarkup({ chat_id: chatId, message_id: messageId, reply_markup: markup }); } else if (contents?.callback_query?.data?.match(options?.answerPattern)) { console.log('This is an answer'); try { answer = collectTexts(markup.inline_keyboard); console.log(`Answer:\n${answer}`); } catch (error) { console.error(error); } text = util.format(options.textTemplate, text, answer); if (text) bot.editMessageText(text, { chat_id: chatId, message_id: messageId }) else if (caption) bot.editMessageCaption(text, { chat_id: chatId, message_id: messageId }) next(); } console.log(`Result markup:\n${JSON.stringify(markup, '', '\t')}`); } else next(); }