vvlad1973-telegram-framework
Version:
Current version: *7.9.5*
116 lines (95 loc) • 4.06 kB
JavaScript
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();
}