umbot
Version:
Universal bot(vk, telegram, viber) or skills for Yandex.Alisa, Маруся and sber
229 lines (228 loc) • 7.24 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Navigation = void 0;
const Text_1 = require("../../utils/standard/Text");
class Navigation {
STANDARD_NEXT_TEXT = ['дальше', 'вперед'];
STANDARD_OLD_TEXT = ['назад'];
isUsedStandardText;
nextText;
oldText;
elements;
maxVisibleElements;
thisPage;
constructor(maxVisibleElements = 5) {
this.isUsedStandardText = true;
this.nextText = [];
this.oldText = [];
this.elements = [];
this.maxVisibleElements = maxVisibleElements;
this.thisPage = 0;
}
isNext(text) {
let nextText;
if (this.isUsedStandardText) {
nextText = [...this.nextText, ...this.STANDARD_NEXT_TEXT];
}
else {
nextText = this.nextText;
}
return Text_1.Text.isSayText(nextText, text);
}
isOld(text) {
let oldText;
if (this.isUsedStandardText) {
oldText = [...this.oldText, ...this.STANDARD_OLD_TEXT];
}
else {
oldText = this.oldText;
}
return Text_1.Text.isSayText(oldText, text);
}
_validatePage(maxPage) {
if (typeof maxPage === 'undefined') {
maxPage = this.getMaxPage();
}
if (this.thisPage >= maxPage) {
this.thisPage = maxPage - 1;
}
if (this.thisPage < 0) {
this.thisPage = 0;
}
}
numberPage(text) {
const data = text.match(/((-|)\d) страни/imu);
if (data) {
this.thisPage = +data[1] - 1;
this._validatePage();
return true;
}
return false;
}
_nextPage(text) {
if (this.isNext(text)) {
this.thisPage++;
this._validatePage();
return true;
}
return false;
}
_oldPage(text) {
if (this.isOld(text)) {
this.thisPage--;
this._validatePage();
return true;
}
return false;
}
getPageElements(elements = null, text = '') {
const showElements = [];
if (elements) {
this.elements = elements;
}
this._nextPage(text);
this._oldPage(text);
const start = this.thisPage * this.maxVisibleElements;
const end = start + this.maxVisibleElements;
if (this.elements.length >= start) {
for (let i = start; i < end; i++) {
if (typeof this.elements[i] !== 'undefined') {
showElements.push(this.elements[i]);
}
}
}
return showElements;
}
selectedElement(elements = null, text = '', keys = null, thisPage = null) {
if (thisPage !== null) {
this.thisPage = thisPage;
}
if (elements) {
this.elements = elements;
}
let number = null;
const data = text.match(/(\d)/imu);
if (data) {
number = +data[0][0];
}
const start = this.thisPage * this.maxVisibleElements;
let index = 1;
let selectElement = null;
let maxPercent = 0;
const end = start + this.maxVisibleElements;
const setMaxElement = (index, res) => {
if (res.status && res.percent > maxPercent) {
selectElement = this.elements[index];
maxPercent = res.percent;
}
};
for (let i = start; i < end; i++) {
if (typeof this.elements[i] !== 'undefined') {
if (index === number) {
return this.elements[i];
}
const elementsTypeof = typeof this.elements[i];
if (keys === null || elementsTypeof === 'string') {
const r = Text_1.Text.textSimilarity(this.elements[i] + '', text, 75);
setMaxElement(i, r);
}
else {
if (elementsTypeof === 'object') {
if (typeof keys === 'object') {
keys.forEach((key) => {
const value = this.elements[i][key];
if (value) {
const r = Text_1.Text.textSimilarity(value, text, 75);
setMaxElement(i, r);
}
});
}
else {
const value = this.elements[i][keys];
if (value) {
const r = Text_1.Text.textSimilarity(value, text, 75);
setMaxElement(i, r);
}
}
}
}
index++;
if (maxPercent > 90) {
return selectElement;
}
}
}
return selectElement;
}
getPageNav(isNumber = false) {
const maxPage = this.getMaxPage();
this._validatePage(maxPage);
const buttons = [];
if (!isNumber) {
if (this.thisPage) {
buttons.push('👈 Назад');
}
if (this.thisPage + 1 < maxPage) {
buttons.push('Дальше 👉');
}
}
else {
let index = this.thisPage - 2;
if (index < 0) {
index = 0;
}
let count = 0;
if (index === 1) {
buttons.push('1');
}
else if (index) {
buttons.push('1 ...');
}
for (let i = index; i < maxPage; i++) {
if (i === this.thisPage) {
buttons.push(`[${i + 1}]`);
}
else {
buttons.push(`${i + 1}`);
}
count++;
if (count > 4) {
if (i === maxPage - 2) {
buttons.push(`${maxPage}`);
}
else if (i < maxPage - 2) {
buttons.push(`... ${maxPage}`);
}
break;
}
}
}
return buttons;
}
getPageInfo() {
if (typeof this.elements[this.thisPage * this.maxVisibleElements] === 'undefined' ||
this.thisPage < 0) {
this.thisPage = 0;
}
let pageInfo = this.thisPage + 1 + ' страница из ';
const maxPage = this.getMaxPage();
if (maxPage > 1) {
pageInfo += maxPage;
}
else {
pageInfo = '';
}
return pageInfo;
}
getMaxPage(elements = null) {
if (elements) {
this.elements = elements;
}
if (typeof this.elements === 'object') {
const countEl = this.elements.length;
return Math.ceil(countEl / this.maxVisibleElements);
}
return 0;
}
}
exports.Navigation = Navigation;