All Downloads are FREE. Search and download functionalities are using the official Maven repository.

dev.struchkov.godfather.telegram.quarkus.domain.UnitPage Maven / Gradle / Ivy

There is a newer version: 1.5.2
Show newest version
package dev.struchkov.godfather.telegram.quarkus.domain;

import dev.struchkov.godfather.main.domain.keyboard.KeyBoardButton;
import dev.struchkov.godfather.main.domain.keyboard.KeyBoardLine;
import dev.struchkov.godfather.quarkus.domain.BoxAnswer;
import dev.struchkov.godfather.telegram.domain.keyboard.InlineKeyBoard;
import dev.struchkov.haiti.utils.Inspector;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;

import static dev.struchkov.godfather.telegram.domain.UnitPaginationUtil.navigableLine;
import static dev.struchkov.godfather.telegram.domain.keyboard.SimpleKeyBoardLine.keyBoardLine;

public class UnitPage {

    /**
     * Дополнительные линии клавиатуры. Выводятся после кнопок навигации.
     */
    private final List additionalLines = new ArrayList<>();

    /**
     * Элементы, которые будут выводиться.
     */
    private List elements;

    /**
     * Номер текущей страницы.
     */
    private Integer currentOffset;

    /**
     * Общее количество элементов на всех страницах.
     */
    private Integer countAllElements;

    /**
     * Функция преобразования элементов с линии.
     */
    private Function function;

    /**
     * Сообщение, которое выводится над результатами
     */
    private String message;

    /**
     * Флаг, определяющий нужно ли заменить старое сообщение или вывести новое (по умолчанию заменять)
     */
    private boolean replace;

    /**
     * Флаг, исключающий добавление строки с навигацией
     */
    private boolean removeDefaultNavigableLine;

    /**
     * Сообщение, которое будет отправлено, если коллекция элементов пустая.
     */
    private BoxAnswer emptyElements;

    public static  UnitPage builder() {
        return new UnitPage<>();
    }

    public UnitPage elements(List elements) {
        this.elements = elements;
        return this;
    }

    public UnitPage countAllElements(Integer countAllElements) {
        this.countAllElements = countAllElements;
        return this;
    }

    public UnitPage currentOffset(Integer currentOffset) {
        this.currentOffset = currentOffset;
        return this;
    }

    public UnitPage additionLine(KeyBoardLine line) {
        additionalLines.add(line);
        return this;
    }

    public UnitPage additionLine(KeyBoardButton button) {
        additionalLines.add(keyBoardLine(button));
        return this;
    }

    public UnitPage mapper(Function function) {
        this.function = function;
        return this;
    }

    public UnitPage message(String message) {
        this.message = message;
        return this;
    }

    public UnitPage replace(boolean replace) {
        this.replace = replace;
        return this;
    }

    public UnitPage emptyElements(BoxAnswer boxAnswer) {
        this.emptyElements = boxAnswer;
        return this;
    }

    public UnitPage removeDefaultNavigableLine() {
        this.removeDefaultNavigableLine = true;
        return this;
    }

    public BoxAnswer build() {
        Inspector.isNotNull(currentOffset, countAllElements, function);
        if (elements.isEmpty()) {
            return emptyElements != null ? emptyElements : BoxAnswer.boxAnswer("Данные не найдены.");
        } else {
            final List lines = elements.stream()
                    .map(function)
                    .toList();
            final InlineKeyBoard.InlineKeyBoardBuilder builder = InlineKeyBoard.builder();

            lines.forEach(builder::line);
            if (!removeDefaultNavigableLine) {
                navigableLine(currentOffset, countAllElements).ifPresent(builder::line);
            }
            additionalLines.forEach(builder::line);

            final InlineKeyBoard keyBoard = builder.build();

            final BoxAnswer.Builder boxAnswer = BoxAnswer.builder()
                    .keyBoard(keyBoard)
                    .replace(true);
            if (message != null) {
                boxAnswer.message(message);
            }

            boxAnswer.replace(replace);
            return boxAnswer.build();
        }
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy