diff --git a/bot-context/bot-context-main/pom.xml b/bot-context/bot-context-main/pom.xml new file mode 100644 index 0000000..0ea62f6 --- /dev/null +++ b/bot-context/bot-context-main/pom.xml @@ -0,0 +1,38 @@ + + + + godfather-bot + dev.struchkov.godfather + 0.0.25 + ../../pom.xml + + 4.0.0 + + bot-context-main + + + 17 + 17 + UTF-8 + + + + + dev.struchkov.godfather + bot-domain-main + + + + dev.struchkov.haiti + haiti-utils + + + + org.jetbrains + annotations + + + + \ No newline at end of file diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/utils/SimpleKeyBoards.java b/bot-context/bot-context-main/src/main/java/dev/struchkov/godfather/main/context/utils/SimpleKeyBoards.java similarity index 94% rename from bot-context/src/main/java/dev/struchkov/godfather/context/utils/SimpleKeyBoards.java rename to bot-context/bot-context-main/src/main/java/dev/struchkov/godfather/main/context/utils/SimpleKeyBoards.java index 3aee316..9b0555f 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/utils/SimpleKeyBoards.java +++ b/bot-context/bot-context-main/src/main/java/dev/struchkov/godfather/main/context/utils/SimpleKeyBoards.java @@ -1,8 +1,8 @@ -package dev.struchkov.godfather.context.utils; +package dev.struchkov.godfather.main.context.utils; -import dev.struchkov.godfather.context.domain.keyboard.button.SimpleButton; -import dev.struchkov.godfather.context.domain.keyboard.simple.SimpleKeyBoard; -import dev.struchkov.godfather.context.domain.keyboard.simple.SimpleKeyBoardLine; +import dev.struchkov.godfather.main.domain.keyboard.button.SimpleButton; +import dev.struchkov.godfather.main.domain.keyboard.simple.SimpleKeyBoard; +import dev.struchkov.godfather.main.domain.keyboard.simple.SimpleKeyBoardLine; import java.util.Arrays; import java.util.List; diff --git a/bot-context/bot-context-quarkus/pom.xml b/bot-context/bot-context-quarkus/pom.xml new file mode 100644 index 0000000..b3a3c76 --- /dev/null +++ b/bot-context/bot-context-quarkus/pom.xml @@ -0,0 +1,32 @@ + + + + dev.struchkov.godfather + bot-context + 0.0.25 + + 4.0.0 + + bot-context-quarkus + + + 17 + 17 + UTF-8 + + + + + dev.struchkov.godfather + bot-domain-main + + + + io.smallrye.reactive + smallrye-mutiny-vertx-core + + + + \ No newline at end of file diff --git a/bot-context/bot-context-quarkus/src/main/java/dev/struchkov/godfather/quarkus/context/service/Accessibility.java b/bot-context/bot-context-quarkus/src/main/java/dev/struchkov/godfather/quarkus/context/service/Accessibility.java new file mode 100644 index 0000000..229db8d --- /dev/null +++ b/bot-context/bot-context-quarkus/src/main/java/dev/struchkov/godfather/quarkus/context/service/Accessibility.java @@ -0,0 +1,10 @@ +package dev.struchkov.godfather.quarkus.context.service; + +import dev.struchkov.godfather.main.domain.content.Message; +import io.smallrye.mutiny.Uni; + +public interface Accessibility { + + Uni check(Message message); + +} diff --git a/bot-context/bot-context-quarkus/src/main/java/dev/struchkov/godfather/quarkus/context/service/ErrorHandler.java b/bot-context/bot-context-quarkus/src/main/java/dev/struchkov/godfather/quarkus/context/service/ErrorHandler.java new file mode 100644 index 0000000..8a4b986 --- /dev/null +++ b/bot-context/bot-context-quarkus/src/main/java/dev/struchkov/godfather/quarkus/context/service/ErrorHandler.java @@ -0,0 +1,18 @@ +package dev.struchkov.godfather.quarkus.context.service; + +import dev.struchkov.godfather.main.domain.content.Message; + +/** + * Используется для перехвата исключений, которые возникают при обработке юнитов. + */ +public interface ErrorHandler { + + /** + * Метод, который должен как-то обработать исключение. + * + * @param message Сообщение, после которого возникло исключение. + * @param e Объект исключения. + */ + void handle(Message message, Throwable e); + +} diff --git a/bot-context/bot-context-quarkus/src/main/java/dev/struchkov/godfather/quarkus/context/service/EventHandler.java b/bot-context/bot-context-quarkus/src/main/java/dev/struchkov/godfather/quarkus/context/service/EventHandler.java new file mode 100644 index 0000000..ac57bdc --- /dev/null +++ b/bot-context/bot-context-quarkus/src/main/java/dev/struchkov/godfather/quarkus/context/service/EventHandler.java @@ -0,0 +1,12 @@ +package dev.struchkov.godfather.quarkus.context.service; + +import dev.struchkov.godfather.main.domain.event.Event; +import io.smallrye.mutiny.Uni; + +public interface EventHandler { + + Uni handle(T event); + + String getEventType(); + +} diff --git a/bot-context/bot-context-quarkus/src/main/java/dev/struchkov/godfather/quarkus/context/service/Modifiable.java b/bot-context/bot-context-quarkus/src/main/java/dev/struchkov/godfather/quarkus/context/service/Modifiable.java new file mode 100644 index 0000000..f608f4c --- /dev/null +++ b/bot-context/bot-context-quarkus/src/main/java/dev/struchkov/godfather/quarkus/context/service/Modifiable.java @@ -0,0 +1,18 @@ +package dev.struchkov.godfather.quarkus.context.service; + +import dev.struchkov.godfather.main.domain.content.Message; +import io.smallrye.mutiny.Uni; +import org.jetbrains.annotations.NotNull; + +/** + * Интерфес для изменения запроса пользователя перед тем, как он попадет в подсистему обработки. + * Например можно исправить опечатки, перевести сообщение на другой язык и так далее. + * + * @author upagge [08/07/2019] + */ +@FunctionalInterface +public interface Modifiable { + + Uni change(@NotNull T content); + +} diff --git a/bot-context/bot-context-quarkus/src/main/java/dev/struchkov/godfather/quarkus/context/service/PersonSettingService.java b/bot-context/bot-context-quarkus/src/main/java/dev/struchkov/godfather/quarkus/context/service/PersonSettingService.java new file mode 100644 index 0000000..d979fc4 --- /dev/null +++ b/bot-context/bot-context-quarkus/src/main/java/dev/struchkov/godfather/quarkus/context/service/PersonSettingService.java @@ -0,0 +1,18 @@ +package dev.struchkov.godfather.quarkus.context.service; + +import io.smallrye.mutiny.Uni; +import org.jetbrains.annotations.NotNull; + +import java.util.Set; + +public interface PersonSettingService { + + Uni> getAllPersonIdDisableMessages(@NotNull Set personIds); + + Uni getStateProcessingByPersonId(@NotNull Long personId); + + Uni disableMessageProcessing(@NotNull Long personId); + + Uni enableMessageProcessing(@NotNull Long personId); + +} diff --git a/bot-context/bot-context-quarkus/src/main/java/dev/struchkov/godfather/quarkus/context/service/Pusher.java b/bot-context/bot-context-quarkus/src/main/java/dev/struchkov/godfather/quarkus/context/service/Pusher.java new file mode 100644 index 0000000..e219865 --- /dev/null +++ b/bot-context/bot-context-quarkus/src/main/java/dev/struchkov/godfather/quarkus/context/service/Pusher.java @@ -0,0 +1,17 @@ +package dev.struchkov.godfather.quarkus.context.service; + +import io.smallrye.mutiny.Uni; + +import java.util.Map; + +/** + * TODO: Добавить описание класса. + * + * @author upagge [13/07/2019] + */ +@FunctionalInterface +public interface Pusher { + + Uni push(Long personId, Map saveElement); + +} diff --git a/bot-context/bot-context-quarkus/src/main/java/dev/struchkov/godfather/quarkus/context/service/Sending.java b/bot-context/bot-context-quarkus/src/main/java/dev/struchkov/godfather/quarkus/context/service/Sending.java new file mode 100644 index 0000000..8c28e7d --- /dev/null +++ b/bot-context/bot-context-quarkus/src/main/java/dev/struchkov/godfather/quarkus/context/service/Sending.java @@ -0,0 +1,29 @@ +package dev.struchkov.godfather.quarkus.context.service; + +import dev.struchkov.godfather.main.domain.BoxAnswer; +import dev.struchkov.godfather.main.domain.SendType; +import io.smallrye.mutiny.Uni; +import org.jetbrains.annotations.NotNull; + +/** + * Интерфейс для отправки ответов пользователю. + * + * @author upagge [08/07/2019] + */ +public interface Sending { + + /** + * Отрпавляет ответ пользователю + * + * @param personId Идентификатор пользователя + * @param boxAnswer Объект с данными, которые необходимо отправить + */ + Uni send(@NotNull Long personId, @NotNull BoxAnswer boxAnswer); + + /** + * Возвращает тип объекта отправляющего ответ пользователя. В зависимости от типа ответ будет отправлен с помощью + * разных методов. + */ + SendType getType(); + +} diff --git a/bot-context/bot-context-quarkus/src/main/java/dev/struchkov/godfather/quarkus/context/service/UnitPointerService.java b/bot-context/bot-context-quarkus/src/main/java/dev/struchkov/godfather/quarkus/context/service/UnitPointerService.java new file mode 100644 index 0000000..9f652b1 --- /dev/null +++ b/bot-context/bot-context-quarkus/src/main/java/dev/struchkov/godfather/quarkus/context/service/UnitPointerService.java @@ -0,0 +1,20 @@ +package dev.struchkov.godfather.quarkus.context.service; + +import dev.struchkov.godfather.main.domain.UnitPointer; +import io.smallrye.mutiny.Uni; +import org.jetbrains.annotations.NotNull; + +/** + * Сервис для взаимодействия с сущностью {@link UnitPointer}. + * + * @author upagge [07/07/2019] + */ +public interface UnitPointerService { + + Uni save(@NotNull UnitPointer unitPointer); + + Uni getUnitNameByPersonId(@NotNull Long personId); + + Uni removeByPersonId(@NotNull Long personId); + +} diff --git a/bot-context/bot-context-simple/pom.xml b/bot-context/bot-context-simple/pom.xml new file mode 100644 index 0000000..a651bf3 --- /dev/null +++ b/bot-context/bot-context-simple/pom.xml @@ -0,0 +1,27 @@ + + + + dev.struchkov.godfather + bot-context + 0.0.25 + + 4.0.0 + + bot-context-simple + + + 17 + 17 + UTF-8 + + + + + dev.struchkov.godfather + bot-domain-main + + + + \ No newline at end of file diff --git a/bot-context/bot-context-simple/src/main/java/dev/struchkov/godfather/simple/context/service/Accessibility.java b/bot-context/bot-context-simple/src/main/java/dev/struchkov/godfather/simple/context/service/Accessibility.java new file mode 100644 index 0000000..6bae13e --- /dev/null +++ b/bot-context/bot-context-simple/src/main/java/dev/struchkov/godfather/simple/context/service/Accessibility.java @@ -0,0 +1,9 @@ +package dev.struchkov.godfather.simple.context.service; + +import dev.struchkov.godfather.main.domain.content.Message; + +public interface Accessibility { + + boolean check(Message message); + +} diff --git a/bot-core/src/main/java/dev/struchkov/godfather/core/service/ErrorHandler.java b/bot-context/bot-context-simple/src/main/java/dev/struchkov/godfather/simple/context/service/ErrorHandler.java similarity index 82% rename from bot-core/src/main/java/dev/struchkov/godfather/core/service/ErrorHandler.java rename to bot-context/bot-context-simple/src/main/java/dev/struchkov/godfather/simple/context/service/ErrorHandler.java index 1c20c19..1486a6c 100644 --- a/bot-core/src/main/java/dev/struchkov/godfather/core/service/ErrorHandler.java +++ b/bot-context/bot-context-simple/src/main/java/dev/struchkov/godfather/simple/context/service/ErrorHandler.java @@ -1,6 +1,6 @@ -package dev.struchkov.godfather.core.service; +package dev.struchkov.godfather.simple.context.service; -import dev.struchkov.godfather.context.domain.content.Message; +import dev.struchkov.godfather.main.domain.content.Message; /** * Используется для перехвата исключений, которые возникают при обработке юнитов. diff --git a/bot-context/bot-context-simple/src/main/java/dev/struchkov/godfather/simple/context/service/EventHandler.java b/bot-context/bot-context-simple/src/main/java/dev/struchkov/godfather/simple/context/service/EventHandler.java new file mode 100644 index 0000000..be87522 --- /dev/null +++ b/bot-context/bot-context-simple/src/main/java/dev/struchkov/godfather/simple/context/service/EventHandler.java @@ -0,0 +1,11 @@ +package dev.struchkov.godfather.simple.context.service; + +import dev.struchkov.godfather.main.domain.event.Event; + +public interface EventHandler { + + void handle(T event); + + String getEventType(); + +} diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/service/Modifiable.java b/bot-context/bot-context-simple/src/main/java/dev/struchkov/godfather/simple/context/service/Modifiable.java similarity index 81% rename from bot-context/src/main/java/dev/struchkov/godfather/context/service/Modifiable.java rename to bot-context/bot-context-simple/src/main/java/dev/struchkov/godfather/simple/context/service/Modifiable.java index dd4231c..020edda 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/service/Modifiable.java +++ b/bot-context/bot-context-simple/src/main/java/dev/struchkov/godfather/simple/context/service/Modifiable.java @@ -1,6 +1,6 @@ -package dev.struchkov.godfather.context.service; +package dev.struchkov.godfather.simple.context.service; -import dev.struchkov.godfather.context.domain.content.Message; +import dev.struchkov.godfather.main.domain.content.Message; import org.jetbrains.annotations.NotNull; /** diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/service/PersonSettingService.java b/bot-context/bot-context-simple/src/main/java/dev/struchkov/godfather/simple/context/service/PersonSettingService.java similarity index 87% rename from bot-context/src/main/java/dev/struchkov/godfather/context/service/PersonSettingService.java rename to bot-context/bot-context-simple/src/main/java/dev/struchkov/godfather/simple/context/service/PersonSettingService.java index 972d0ae..887ce55 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/service/PersonSettingService.java +++ b/bot-context/bot-context-simple/src/main/java/dev/struchkov/godfather/simple/context/service/PersonSettingService.java @@ -1,4 +1,4 @@ -package dev.struchkov.godfather.context.service; +package dev.struchkov.godfather.simple.context.service; import org.jetbrains.annotations.NotNull; diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/service/save/Pusher.java b/bot-context/bot-context-simple/src/main/java/dev/struchkov/godfather/simple/context/service/Pusher.java similarity index 80% rename from bot-context/src/main/java/dev/struchkov/godfather/context/service/save/Pusher.java rename to bot-context/bot-context-simple/src/main/java/dev/struchkov/godfather/simple/context/service/Pusher.java index fcc9781..590df81 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/service/save/Pusher.java +++ b/bot-context/bot-context-simple/src/main/java/dev/struchkov/godfather/simple/context/service/Pusher.java @@ -1,4 +1,4 @@ -package dev.struchkov.godfather.context.service.save; +package dev.struchkov.godfather.simple.context.service; import java.util.Map; diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/service/sender/Sending.java b/bot-context/bot-context-simple/src/main/java/dev/struchkov/godfather/simple/context/service/Sending.java similarity index 83% rename from bot-context/src/main/java/dev/struchkov/godfather/context/service/sender/Sending.java rename to bot-context/bot-context-simple/src/main/java/dev/struchkov/godfather/simple/context/service/Sending.java index 038c933..9113ff1 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/service/sender/Sending.java +++ b/bot-context/bot-context-simple/src/main/java/dev/struchkov/godfather/simple/context/service/Sending.java @@ -1,6 +1,7 @@ -package dev.struchkov.godfather.context.service.sender; +package dev.struchkov.godfather.simple.context.service; -import dev.struchkov.godfather.context.domain.BoxAnswer; +import dev.struchkov.godfather.main.domain.BoxAnswer; +import dev.struchkov.godfather.main.domain.SendType; import org.jetbrains.annotations.NotNull; /** diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/service/UnitPointerService.java b/bot-context/bot-context-simple/src/main/java/dev/struchkov/godfather/simple/context/service/UnitPointerService.java similarity index 79% rename from bot-context/src/main/java/dev/struchkov/godfather/context/service/UnitPointerService.java rename to bot-context/bot-context-simple/src/main/java/dev/struchkov/godfather/simple/context/service/UnitPointerService.java index 404429f..d21241e 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/service/UnitPointerService.java +++ b/bot-context/bot-context-simple/src/main/java/dev/struchkov/godfather/simple/context/service/UnitPointerService.java @@ -1,6 +1,6 @@ -package dev.struchkov.godfather.context.service; +package dev.struchkov.godfather.simple.context.service; -import dev.struchkov.godfather.context.domain.UnitPointer; +import dev.struchkov.godfather.main.domain.UnitPointer; import org.jetbrains.annotations.NotNull; import java.util.Optional; diff --git a/bot-context/pom.xml b/bot-context/pom.xml index 5e82316..80608ce 100644 --- a/bot-context/pom.xml +++ b/bot-context/pom.xml @@ -10,6 +10,13 @@ bot-context + pom + + bot-context-main + bot-context-simple + bot-context-quarkus + + Bot Context Доменные сущности, интерфейсы, для библиотеки Godfather diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/BasicEntity.java b/bot-context/src/main/java/dev/struchkov/godfather/context/domain/BasicEntity.java deleted file mode 100644 index f175800..0000000 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/BasicEntity.java +++ /dev/null @@ -1,27 +0,0 @@ -package dev.struchkov.godfather.context.domain; - -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.MappedSuperclass; - -/** - * Основная сущность для сокрытия id у других сущностей. - * - * @author upagge [28/07/2019] - */ -@MappedSuperclass -public class BasicEntity { - - @Id - @GeneratedValue - protected Long id; - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - -} diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/Clarification.java b/bot-context/src/main/java/dev/struchkov/godfather/context/domain/Clarification.java deleted file mode 100644 index 9af7946..0000000 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/Clarification.java +++ /dev/null @@ -1,21 +0,0 @@ -package dev.struchkov.godfather.context.domain; - -public class Clarification { - - private BoxAnswer question; - private String value; - - public Clarification(BoxAnswer question, String value) { - this.question = question; - this.value = value; - } - - public BoxAnswer getQuestion() { - return question; - } - - public String getValue() { - return value; - } - -} diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/content/attachment/Attachment.java b/bot-context/src/main/java/dev/struchkov/godfather/context/domain/content/attachment/Attachment.java deleted file mode 100644 index 453c9cb..0000000 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/content/attachment/Attachment.java +++ /dev/null @@ -1,17 +0,0 @@ -package dev.struchkov.godfather.context.domain.content.attachment; - -import dev.struchkov.godfather.context.domain.BasicEntity; - -import javax.persistence.Entity; - -/** - * Абстрактная сущность, для всех вложений к сообщениям от пользователей. - * - * @author upagge [08/07/2019] - */ -@Entity -public abstract class Attachment extends BasicEntity { - - public abstract String getType(); - -} diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/exception/TimerSettingException.java b/bot-context/src/main/java/dev/struchkov/godfather/context/exception/TimerSettingException.java deleted file mode 100644 index ab30bdd..0000000 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/exception/TimerSettingException.java +++ /dev/null @@ -1,14 +0,0 @@ -package dev.struchkov.godfather.context.exception; - -/** - * Ошибка таймера. - * - * @author upagge [08/07/2019] - */ -public class TimerSettingException extends AppBotException { - - public TimerSettingException(String message) { - super(message); - } - -} diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/service/Accessibility.java b/bot-context/src/main/java/dev/struchkov/godfather/context/service/Accessibility.java deleted file mode 100644 index f76fc5c..0000000 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/service/Accessibility.java +++ /dev/null @@ -1,9 +0,0 @@ -package dev.struchkov.godfather.context.service; - -import dev.struchkov.godfather.context.domain.content.Message; - -public interface Accessibility { - - boolean check(Message message); - -} diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/service/ClarificationQuestion.java b/bot-context/src/main/java/dev/struchkov/godfather/context/service/ClarificationQuestion.java deleted file mode 100644 index 18bc266..0000000 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/service/ClarificationQuestion.java +++ /dev/null @@ -1,11 +0,0 @@ -package dev.struchkov.godfather.context.service; - -import dev.struchkov.godfather.context.domain.Clarification; -import dev.struchkov.godfather.context.domain.content.Message; - -@FunctionalInterface -public interface ClarificationQuestion { - - Clarification getClarification(C message); - -} diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/service/EventHandler.java b/bot-context/src/main/java/dev/struchkov/godfather/context/service/EventHandler.java deleted file mode 100644 index 5eb9923..0000000 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/service/EventHandler.java +++ /dev/null @@ -1,11 +0,0 @@ -package dev.struchkov.godfather.context.service; - -import dev.struchkov.godfather.context.domain.event.Event; - -public interface EventHandler { - - void handle(T event); - - String getEventType(); - -} diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/service/MailService.java b/bot-context/src/main/java/dev/struchkov/godfather/context/service/MailService.java deleted file mode 100644 index 4fe5f5f..0000000 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/service/MailService.java +++ /dev/null @@ -1,12 +0,0 @@ -package dev.struchkov.godfather.context.service; - -import dev.struchkov.godfather.context.domain.content.Mail; - -/** - * Интерфейс для взаимодействия с личными сообщениями. - * - * @author upagge [08/07/2019] - */ -public interface MailService extends MessageService { - -} diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/service/MessageService.java b/bot-context/src/main/java/dev/struchkov/godfather/context/service/MessageService.java deleted file mode 100644 index 7293f23..0000000 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/service/MessageService.java +++ /dev/null @@ -1,49 +0,0 @@ -package dev.struchkov.godfather.context.service; - -import dev.struchkov.godfather.context.domain.content.Message; -import org.jetbrains.annotations.NotNull; - -import java.time.LocalDateTime; -import java.util.List; - -/** - * Интерфейс взаимодйствия с наследниками текстовых сообщений пользователей. - * - * @author upagge [08/07/2019] - */ -public interface MessageService { - - void add(@NotNull T event); - - /** - * Получить список сообщений за заданный временной интервал - * - * @param dateFrom Начало интервала - * @param dateTo Конец интервала - * @return Список сообщений - */ - List getByAddDateTime(@NotNull LocalDateTime dateFrom, @NotNull LocalDateTime dateTo); - - /** - * Получить список ПОСЛЕДНИХ сообщений для каждого пользователя за заданных временной интервал - * - * @param dateFrom Начало интервала - * @param dateTo Конец интервала - * @return Список сообщений - */ - List getLastEventByCreateDateTime(@NotNull LocalDateTime dateFrom, @NotNull LocalDateTime dateTo); - - List getLastEventByAddDateTime(@NotNull LocalDateTime dateFrom, @NotNull LocalDateTime dateTo); - - /** - * Возвращает новые сообщения от последнего запроса. - */ - List getNewMessage(); - - void deleteAllByAddDateBetween(@NotNull LocalDateTime dateFrom, @NotNull LocalDateTime dateTo); - - void deleteAllByAddDateBefore(@NotNull LocalDateTime date); - - void deleteAllByAddDateAfter(@NotNull LocalDateTime date); - -} diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/service/UnitContextFactory.java b/bot-context/src/main/java/dev/struchkov/godfather/context/service/UnitContextFactory.java deleted file mode 100644 index d33aba7..0000000 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/service/UnitContextFactory.java +++ /dev/null @@ -1,10 +0,0 @@ -package dev.struchkov.godfather.context.service; - -import dev.struchkov.godfather.context.domain.content.Message; -import dev.struchkov.godfather.context.domain.unit.AnswerText; - -public interface UnitContextFactory { - - AnswerText.Builder createAnswerText(); - -} diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/service/save/PreservableData.java b/bot-context/src/main/java/dev/struchkov/godfather/context/service/save/PreservableData.java deleted file mode 100644 index ec210d7..0000000 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/service/save/PreservableData.java +++ /dev/null @@ -1,10 +0,0 @@ -package dev.struchkov.godfather.context.service.save; - -import dev.struchkov.godfather.context.domain.content.Message; - -@FunctionalInterface -public interface PreservableData { - - D getData(M content); - -} diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/service/usercode/CheckData.java b/bot-context/src/main/java/dev/struchkov/godfather/context/service/usercode/CheckData.java deleted file mode 100644 index f153164..0000000 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/service/usercode/CheckData.java +++ /dev/null @@ -1,10 +0,0 @@ -package dev.struchkov.godfather.context.service.usercode; - -import dev.struchkov.godfather.context.domain.content.Message; - -@FunctionalInterface -public interface CheckData { - - boolean checked(C content); - -} diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/utils/MessageUtils.java b/bot-context/src/main/java/dev/struchkov/godfather/context/utils/MessageUtils.java deleted file mode 100644 index 1e00301..0000000 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/utils/MessageUtils.java +++ /dev/null @@ -1,19 +0,0 @@ -package dev.struchkov.godfather.context.utils; - -import dev.struchkov.godfather.context.domain.content.EmptyMessage; -import dev.struchkov.godfather.context.domain.content.Message; - -/** - * Класс для хранения объекта заглушки для {@link Message}. - * - * @author upagge [08/07/2019] - */ -public class MessageUtils { - - public static final EmptyMessage EMPTY_MESSAGE = new EmptyMessage(); - - private MessageUtils() { - throw new IllegalStateException(Messages.UTILITY_CLASS); - } - -} diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/utils/Messages.java b/bot-context/src/main/java/dev/struchkov/godfather/context/utils/Messages.java deleted file mode 100644 index 4e9d7ab..0000000 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/utils/Messages.java +++ /dev/null @@ -1,16 +0,0 @@ -package dev.struchkov.godfather.context.utils; - -/** - * Класс утилита, содержащий сообщения об ошибках, и сообщения логирования. - * - * @author upagge [15/08/2019] - */ -public class Messages { - - public static final String UTILITY_CLASS = "Класс утилита"; - - private Messages() { - throw new IllegalStateException(UTILITY_CLASS); - } - -} diff --git a/bot-core/bot-core-main/pom.xml b/bot-core/bot-core-main/pom.xml new file mode 100644 index 0000000..23cae53 --- /dev/null +++ b/bot-core/bot-core-main/pom.xml @@ -0,0 +1,27 @@ + + + + dev.struchkov.godfather + bot-core + 0.0.25 + + 4.0.0 + + bot-core-main + + + 17 + 17 + UTF-8 + + + + + dev.struchkov.godfather + bot-domain-main + + + + \ No newline at end of file diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/TypeUnit.java b/bot-core/bot-core-main/src/main/java/dev/struchkov/godfather/main/core/unit/TypeUnit.java similarity index 77% rename from bot-context/src/main/java/dev/struchkov/godfather/context/domain/TypeUnit.java rename to bot-core/bot-core-main/src/main/java/dev/struchkov/godfather/main/core/unit/TypeUnit.java index bfd9f39..367728b 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/TypeUnit.java +++ b/bot-core/bot-core-main/src/main/java/dev/struchkov/godfather/main/core/unit/TypeUnit.java @@ -1,4 +1,4 @@ -package dev.struchkov.godfather.context.domain; +package dev.struchkov.godfather.main.core.unit; import static dev.struchkov.haiti.utils.Exceptions.utilityClass; @@ -13,10 +13,8 @@ public class TypeUnit { public static final String SAVE = "SAVE"; public static final String TIMER = "TIMER"; public static final String CHECK = "CHECK"; - public static final String VALIDITY = "VALIDITY"; public static final String BACK_CMD = "BACK_CMD"; - public static final String TELEPORT_CMD = "TELEPORT_CMD"; public static final String REPLACE_CMD = "REPLACE_CMD"; private TypeUnit() { diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/unit/UnitActiveType.java b/bot-core/bot-core-main/src/main/java/dev/struchkov/godfather/main/core/unit/UnitActiveType.java similarity index 78% rename from bot-context/src/main/java/dev/struchkov/godfather/context/domain/unit/UnitActiveType.java rename to bot-core/bot-core-main/src/main/java/dev/struchkov/godfather/main/core/unit/UnitActiveType.java index 569317f..76a70c9 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/unit/UnitActiveType.java +++ b/bot-core/bot-core-main/src/main/java/dev/struchkov/godfather/main/core/unit/UnitActiveType.java @@ -1,4 +1,4 @@ -package dev.struchkov.godfather.context.domain.unit; +package dev.struchkov.godfather.main.core.unit; /** * Тип активации Unit-а. Определяет порядок обработки Unit. diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/utils/InsertWords.java b/bot-core/bot-core-main/src/main/java/dev/struchkov/godfather/main/core/utils/InsertWords.java similarity index 96% rename from bot-context/src/main/java/dev/struchkov/godfather/context/utils/InsertWords.java rename to bot-core/bot-core-main/src/main/java/dev/struchkov/godfather/main/core/utils/InsertWords.java index fa120ae..6a0b49f 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/utils/InsertWords.java +++ b/bot-core/bot-core-main/src/main/java/dev/struchkov/godfather/main/core/utils/InsertWords.java @@ -1,4 +1,4 @@ -package dev.struchkov.godfather.context.utils; +package dev.struchkov.godfather.main.core.utils; import org.jetbrains.annotations.NotNull; diff --git a/bot-core/bot-core-main/src/main/java/dev/struchkov/godfather/main/core/utils/MessageUtils.java b/bot-core/bot-core-main/src/main/java/dev/struchkov/godfather/main/core/utils/MessageUtils.java new file mode 100644 index 0000000..b25457c --- /dev/null +++ b/bot-core/bot-core-main/src/main/java/dev/struchkov/godfather/main/core/utils/MessageUtils.java @@ -0,0 +1,21 @@ +package dev.struchkov.godfather.main.core.utils; + +import dev.struchkov.godfather.main.domain.content.EmptyMessage; +import dev.struchkov.godfather.main.domain.content.Message; + +import static dev.struchkov.haiti.utils.Exceptions.utilityClass; + +/** + * Класс для хранения объекта заглушки для {@link Message}. + * + * @author upagge [08/07/2019] + */ +public final class MessageUtils { + + public static final EmptyMessage EMPTY_MESSAGE = new EmptyMessage(); + + private MessageUtils() { + utilityClass(); + } + +} diff --git a/bot-core/bot-core-quarkus/pom.xml b/bot-core/bot-core-quarkus/pom.xml new file mode 100644 index 0000000..c13f6bf --- /dev/null +++ b/bot-core/bot-core-quarkus/pom.xml @@ -0,0 +1,41 @@ + + + + dev.struchkov.godfather + bot-core + 0.0.25 + + 4.0.0 + + bot-core-quarkus + + + 17 + 17 + UTF-8 + + + + + dev.struchkov.godfather + bot-core-main + + + dev.struchkov.godfather + bot-context-quarkus + + + dev.struchkov.godfather + bot-data-quarkus + + + + io.smallrye.reactive + smallrye-mutiny-vertx-core + true + + + + \ No newline at end of file diff --git a/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/GeneralAutoResponder.java b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/GeneralAutoResponder.java new file mode 100644 index 0000000..65d2d23 --- /dev/null +++ b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/GeneralAutoResponder.java @@ -0,0 +1,221 @@ +package dev.struchkov.godfather.quarkus.core; + +import dev.struchkov.autoresponder.Responder; +import dev.struchkov.godfather.exception.ConfigAppException; +import dev.struchkov.godfather.main.core.unit.TypeUnit; +import dev.struchkov.godfather.main.core.unit.UnitActiveType; +import dev.struchkov.godfather.main.domain.content.Message; +import dev.struchkov.godfather.quarkus.context.service.ErrorHandler; +import dev.struchkov.godfather.quarkus.context.service.Modifiable; +import dev.struchkov.godfather.quarkus.context.service.PersonSettingService; +import dev.struchkov.godfather.quarkus.context.service.Sending; +import dev.struchkov.godfather.quarkus.core.action.ActionUnit; +import dev.struchkov.godfather.quarkus.core.action.AnswerCheckAction; +import dev.struchkov.godfather.quarkus.core.action.AnswerSaveAction; +import dev.struchkov.godfather.quarkus.core.action.AnswerTextAction; +import dev.struchkov.godfather.quarkus.core.action.cmd.ReplaceCmdAction; +import dev.struchkov.godfather.quarkus.core.service.StorylineService; +import dev.struchkov.godfather.quarkus.core.unit.MainUnit; +import dev.struchkov.godfather.quarkus.core.unit.UnitRequest; +import dev.struchkov.haiti.context.exception.NotFoundException; +import io.smallrye.mutiny.Multi; +import io.smallrye.mutiny.Uni; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; + +import static dev.struchkov.haiti.utils.Checker.checkNotEmpty; +import static dev.struchkov.haiti.utils.Checker.checkNotNull; +import static dev.struchkov.haiti.utils.Checker.checkNull; + +public class GeneralAutoResponder { + + private final PersonSettingService personSettingService; + private final StorylineService storyLineService; + protected Map actionUnitMap = new HashMap<>(); + protected List> modifiable; + private ErrorHandler errorHandler; + + protected GeneralAutoResponder( + Sending sending, + PersonSettingService personSettingService, + StorylineService storyLineService + ) { + this.personSettingService = personSettingService; + this.storyLineService = storyLineService; + init(sending); + } + + private void init(Sending sending) { + actionUnitMap.put(TypeUnit.CHECK, new AnswerCheckAction<>()); + actionUnitMap.put(TypeUnit.TEXT, new AnswerTextAction(sending)); + actionUnitMap.put(TypeUnit.REPLACE_CMD, new ReplaceCmdAction()); + } + + public void initModifiable(List> modifiable) { + this.modifiable = modifiable; + } + + public void initActionUnit(String typeUnit, ActionUnit, M> actionUnit) { + if (!actionUnitMap.containsKey(typeUnit)) { + actionUnitMap.put(typeUnit, actionUnit); + } else { + throw new ConfigAppException("Обработка такого типа юнита уже зарегистрирована"); + } + } + + public void initSaveAction(AnswerSaveAction answerSaveAction) { + actionUnitMap.put(TypeUnit.SAVE, answerSaveAction); + } + + /** + * Позволяет установить перехватчик и обработчик исключений, возникающих при обработке юнитов. + */ + public void setErrorHandler(ErrorHandler errorHandler) { + this.errorHandler = errorHandler; + } + + public void setDefaultUnit(String unitName) { + storyLineService.setDefaultUnit(unitName); + } + + public Uni processingNewMessage(M newMessage) { + if (newMessage != null) { + return personSettingService.getStateProcessingByPersonId(newMessage.getPersonId()) + .onItem().transformToUni( + state -> { + if (checkNull(state) || state) { + return processing(newMessage); + } + return Uni.createFrom().voidItem(); + } + ); + } + return Uni.createFrom().voidItem(); + } + + public Uni processingNewMessages(List newMessages) { + if (newMessages != null && !newMessages.isEmpty()) { + final Set personIds = newMessages.stream() + .map(Message::getPersonId) + .collect(Collectors.toSet()); + return personSettingService.getAllPersonIdDisableMessages(personIds) + .onItem().transformToMulti( + disableIds -> { + final List allowedMessages = newMessages.stream() + .filter(message -> !disableIds.contains(message.getPersonId())) + .toList(); + return Multi.createFrom().iterable(allowedMessages); + } + ) + .onItem().transform(this::processing) + .toUni().replaceWithVoid(); + } + return Uni.createFrom().voidItem(); + } + + private Uni processing(M message) { + return Uni.createFrom().item(message) + .onItem().transformToUni( + mail -> { + if (checkNotEmpty(modifiable)) { + return Multi.createFrom().iterable(modifiable) + .onItem().transformToUni(m -> m.change(mail)) + .concatenate().toUni().replaceWith(mail); + } + return Uni.createFrom().item(mail); + } + ).onItem().transformToUni( + mail -> { + final Uni>> uniUnits = storyLineService.getNextUnitByPersonId(mail.getPersonId()); + return Uni.combine().all().unis(uniUnits, Uni.createFrom().item(mail)).asTuple(); + } + ).onItem().transformToUni( + t -> { + final Set> units = t.getItem1(); + final M mail = t.getItem2(); + final Optional> optAnswer = Responder.nextUnit(mail, units).or(storyLineService::getDefaultUnit); + if (optAnswer.isPresent()) { + final MainUnit answer = optAnswer.get(); + //TODO [05.08.2022]: нужно ли проверку встраивать в поток? +// if (checkPermission(answer.getAccessibility(), message)) { + return answer(UnitRequest.of(answer, message)); +// } + } + return Uni.createFrom().voidItem(); + } + ); + } + +// private boolean checkPermission(Optional accessibility, M message) { +// return accessibility.isEmpty() || accessibility.get().check(message); +// } + + public Uni answer(UnitRequest unitRequest) { + return getAction(unitRequest) + .onItem().transformToUni( + request -> activeUnitAfter(unitRequest) + ) + .onFailure().invoke( + throwable -> { + if (errorHandler != null) { + errorHandler.handle(unitRequest.getMessage(), throwable); + } + } + ) + .replaceWithVoid(); + } + + private Uni> activeUnitAfter(UnitRequest unitRequest) { + final Set> nextUnits = unitRequest.getUnit().getNextUnits(); + if (checkNotNull(nextUnits)) { + Optional> first = nextUnits.stream() + .filter(unit -> UnitActiveType.AFTER.equals(unit.getActiveType())) + .findFirst(); + if (first.isPresent()) { + return Uni.createFrom().voidItem().onItem().transformToUni( + v-> getAction(UnitRequest.of(first.get(), unitRequest.getMessage())) + ) + .onItem().transformToUni( + uR -> activeUnitAfter(UnitRequest.of(first.get(), unitRequest.getMessage())) + ); + } + } + return Uni.createFrom().item(unitRequest); + } + + private Uni> getAction(UnitRequest unitRequest) { + final MainUnit unit = unitRequest.getUnit(); + final M message = unitRequest.getMessage(); + final String typeUnit = unit.getType(); + if (actionUnitMap.containsKey(typeUnit)) { + ActionUnit actionUnit = actionUnitMap.get(typeUnit); + return actionUnit.action(unitRequest) + .onItem().transformToUni( + newUnitRequest -> { + final Optional> optDefaultUnit = storyLineService.getDefaultUnit(); + if (!unit.isNotSaveHistory() && (optDefaultUnit.isEmpty() || !optDefaultUnit.get().equals(unit))) { + return Uni.combine().all().unis( + Uni.createFrom().item(newUnitRequest), + storyLineService.save(message.getPersonId(), unit.getName(), message) + ).asTuple(); + } + return Uni.combine().all().unis(Uni.createFrom().item(newUnitRequest), Uni.createFrom().voidItem()).asTuple(); + } + ).onItem().transformToUni( + t -> { + final UnitRequest newUnitRequest = t.getItem1(); + final MainUnit newUnit = newUnitRequest.getUnit(); + return !unit.equals(newUnit) ? getAction(newUnitRequest) : Uni.createFrom().item(unitRequest); + } + ); + } else { + throw new NotFoundException("ActionUnit для типа {0} не зарегистрирован", unit.getType()); + } + } + +} diff --git a/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/Storyline.java b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/Storyline.java new file mode 100644 index 0000000..d6ebf95 --- /dev/null +++ b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/Storyline.java @@ -0,0 +1,61 @@ +package dev.struchkov.godfather.quarkus.core; + +import dev.struchkov.godfather.main.domain.content.Message; +import dev.struchkov.godfather.quarkus.core.unit.MainUnit; +import org.jetbrains.annotations.NotNull; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Optional; +import java.util.Set; + +import static dev.struchkov.haiti.utils.Checker.checkNull; +import static dev.struchkov.haiti.utils.Inspector.isNotNull; + +public class Storyline { + + private final Set> startingUnits = new HashSet<>(); + private final Set> globalUnits = new HashSet<>(); + private final Map> units = new HashMap<>(); + + public Storyline(Set> startingUnits, Map> units) { + this.startingUnits.addAll(startingUnits); + this.units.putAll(units); + } + + public void addGlobalUnits(Set> globalUnits) { + this.globalUnits.addAll(globalUnits); + } + + public Set> getGlobalUnits() { + return globalUnits; + } + + /** + * Получить юнит по названию. + * + * @param unitName Название юнита. + */ + public Optional> getUnit(String unitName) { + isNotNull(unitName); + return Optional.ofNullable(units.get(unitName)); + } + + public Set> getStartingUnits() { + return startingUnits; + } + + //TODO [22.06.2022]: Временное решение ленивой связки юнитов, пока не будет реализован нормальный механизм. + public void link(@NotNull String firstName, @NotNull String secondName) { + isNotNull(firstName, secondName); + final MainUnit firstUnit = units.get(firstName); + final MainUnit secondUnit = units.get(secondName); + isNotNull(firstUnit, secondUnit); + if (checkNull(firstUnit.getNextUnits())) { + firstUnit.setNextUnits(new HashSet<>()); + } + firstUnit.getNextUnits().add(secondUnit); + } + +} diff --git a/bot-core/src/main/java/dev/struchkov/godfather/core/StorylineFactory.java b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/StorylineFactory.java similarity index 93% rename from bot-core/src/main/java/dev/struchkov/godfather/core/StorylineFactory.java rename to bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/StorylineFactory.java index d2f1cbb..d03e309 100644 --- a/bot-core/src/main/java/dev/struchkov/godfather/core/StorylineFactory.java +++ b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/StorylineFactory.java @@ -1,10 +1,10 @@ -package dev.struchkov.godfather.core; +package dev.struchkov.godfather.quarkus.core; -import dev.struchkov.godfather.context.domain.UnitDefinition; -import dev.struchkov.godfather.context.domain.annotation.Unit; -import dev.struchkov.godfather.context.domain.content.Message; -import dev.struchkov.godfather.context.domain.unit.MainUnit; -import dev.struchkov.godfather.context.exception.UnitConfigException; +import dev.struchkov.godfather.exception.UnitConfigException; +import dev.struchkov.godfather.main.domain.UnitDefinition; +import dev.struchkov.godfather.main.domain.annotation.Unit; +import dev.struchkov.godfather.main.domain.content.Message; +import dev.struchkov.godfather.quarkus.core.unit.MainUnit; import dev.struchkov.haiti.utils.Inspector; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -21,7 +21,7 @@ import java.util.Map; import java.util.Set; import java.util.stream.Collectors; -import static dev.struchkov.godfather.context.exception.UnitConfigException.unitConfigException; +import static dev.struchkov.godfather.exception.UnitConfigException.unitConfigException; public class StorylineFactory { diff --git a/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/action/ActionUnit.java b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/action/ActionUnit.java new file mode 100644 index 0000000..a1f8a36 --- /dev/null +++ b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/action/ActionUnit.java @@ -0,0 +1,23 @@ +package dev.struchkov.godfather.quarkus.core.action; + +import dev.struchkov.godfather.main.domain.content.Message; +import dev.struchkov.godfather.quarkus.core.unit.MainUnit; +import dev.struchkov.godfather.quarkus.core.unit.UnitRequest; +import io.smallrye.mutiny.Uni; + +/** + * Интерфейс для обработки Unit-ов. + * + * @author upagge [11/07/2019] + */ +@FunctionalInterface +public interface ActionUnit { + + /** + * Метод обработки Unit-а. + * + * @return Новый Unit, который может нуждаться в обработке + */ + Uni> action(UnitRequest unitRequest); + +} diff --git a/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/action/AnswerCheckAction.java b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/action/AnswerCheckAction.java new file mode 100644 index 0000000..d2cb4d6 --- /dev/null +++ b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/action/AnswerCheckAction.java @@ -0,0 +1,36 @@ +package dev.struchkov.godfather.quarkus.core.action; + +import dev.struchkov.godfather.main.domain.content.Message; +import dev.struchkov.godfather.quarkus.core.unit.AnswerCheck; +import dev.struchkov.godfather.quarkus.core.unit.MainUnit; +import dev.struchkov.godfather.quarkus.core.unit.UnitRequest; +import io.smallrye.mutiny.Uni; + +import java.util.Objects; + +import static dev.struchkov.haiti.utils.Checker.checkNotNull; + +/** + * Обработчик Unit-а {@link AnswerCheck}. + * + * @author upagge [11/07/2019] + */ +public class AnswerCheckAction implements ActionUnit, M> { + + @Override + public Uni> action(UnitRequest, M> unitRequest) { + final AnswerCheck unit = unitRequest.getUnit(); + final M message = unitRequest.getMessage(); + + return unit.getCheck().checked(message) + .onItem().transform( + checkValue -> { + if (checkNotNull(checkValue) && checkValue) { + return UnitRequest.of(Objects.requireNonNullElse(unit.getUnitTrue(), unit), message); + } else { + return UnitRequest.of(Objects.requireNonNullElse(unit.getUnitFalse(), unit), message); + } + } + ); + } +} diff --git a/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/action/AnswerSaveAction.java b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/action/AnswerSaveAction.java new file mode 100644 index 0000000..996c7e3 --- /dev/null +++ b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/action/AnswerSaveAction.java @@ -0,0 +1,75 @@ +package dev.struchkov.godfather.quarkus.core.action; + +import dev.struchkov.godfather.main.domain.content.Message; +import dev.struchkov.godfather.quarkus.context.service.Pusher; +import dev.struchkov.godfather.quarkus.core.unit.AnswerSave; +import dev.struchkov.godfather.quarkus.core.unit.MainUnit; +import dev.struchkov.godfather.quarkus.core.unit.UnitRequest; +import dev.struchkov.godfather.quarkus.core.unit.func.CheckSave; +import dev.struchkov.godfather.quarkus.core.unit.func.PreservableData; +import dev.struchkov.godfather.quarkus.data.preser.AnswerSavePreservable; +import io.smallrye.mutiny.Uni; + +import static dev.struchkov.haiti.utils.Checker.checkNotNull; + +/** + * Обработчик Unit-а {@link AnswerSave}. + * + * @author upagge [11/07/2019] + */ +public class AnswerSaveAction implements ActionUnit, M> { + + @Override + public Uni> action(UnitRequest, M> unitRequest) { + final AnswerSave answerSave = unitRequest.getUnit(); + final M message = unitRequest.getMessage(); + + final AnswerSavePreservable preservable = answerSave.getPreservable(); + final Long personId = message.getPersonId(); + + final CheckSave checkSave = answerSave.getCheckSave(); + if (checkNotNull(checkSave)) { + return Uni.createFrom().voidItem() + .onItem().transformToUni( + v -> checkSave.check(message) + .onItem().transform( + unit -> { + if (checkNotNull(unit)) { + return UnitRequest.of(unit, message); + } + return UnitRequest.of(answerSave, message); + } + ) + ); + } + + final PreservableData preservableData = answerSave.getPreservableData(); + final Pusher pusher = answerSave.getPusher(); + + return Uni.createFrom().voidItem() + .onItem().transformToUni( + v -> { + if (checkNotNull(preservableData)) { + return preservableData.getData(message); + } + return Uni.createFrom().nullItem(); + } + ).onItem().transformToUni( + dataFromSave -> { + if (checkNotNull(dataFromSave)) { + return preservable.save(personId, answerSave.getKey(), dataFromSave); + } + return Uni.createFrom().nullItem(); + } + ).onItem().transformToUni( + v -> { + if (checkNotNull(pusher)) { + return preservable.push(personId, pusher); + } + return Uni.createFrom().nullItem(); + } + ).onItem().transform( + v -> UnitRequest.of(answerSave, message) + ); + } +} diff --git a/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/action/AnswerTextAction.java b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/action/AnswerTextAction.java new file mode 100644 index 0000000..e1a9adc --- /dev/null +++ b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/action/AnswerTextAction.java @@ -0,0 +1,75 @@ +package dev.struchkov.godfather.quarkus.core.action; + +import dev.struchkov.godfather.main.core.utils.InsertWords; +import dev.struchkov.godfather.main.domain.BoxAnswer; +import dev.struchkov.godfather.main.domain.content.Message; +import dev.struchkov.godfather.quarkus.context.service.Sending; +import dev.struchkov.godfather.quarkus.core.unit.AnswerText; +import dev.struchkov.godfather.quarkus.core.unit.MainUnit; +import dev.struchkov.godfather.quarkus.core.unit.UnitRequest; +import dev.struchkov.godfather.quarkus.core.utils.Sender; +import io.smallrye.mutiny.Uni; + +import static dev.struchkov.haiti.utils.Checker.checkNotEmpty; +import static dev.struchkov.haiti.utils.Checker.checkNotNull; + +/** + * Обработчик Unit-а {@link AnswerText}. + * + * @author upagge [11/07/2019] + */ +public class AnswerTextAction implements ActionUnit, Message> { + + private final Sending sending; + + public AnswerTextAction(Sending sending) { + this.sending = sending; + } + + @Override + public Uni> action(UnitRequest, Message> unitRequest) { + final AnswerText unit = unitRequest.getUnit(); + final Message message = unitRequest.getMessage(); + + return unit.getAnswer().processing(message) + .onItem().transformToUni( + boxAnswer -> { + if (checkNotNull(boxAnswer)) { + return replaceMarkers(unit, message, boxAnswer); + } + return Uni.createFrom().nullItem(); + } + ).onItem().transformToUni( + boxAnswer -> { + if (checkNotNull(boxAnswer)) { + final Sending answerTextSending = unit.getSending(); + if (answerTextSending != null) { + return Sender.sends(message, boxAnswer, answerTextSending); + } else { + return Sender.sends(message, boxAnswer, this.sending); + } + } + return Uni.createFrom().nullItem(); + } + ).onItem().transform( + v -> UnitRequest.of(unit, message) + ); + } + + private Uni replaceMarkers(AnswerText answerText, Message message, BoxAnswer boxAnswer) { + if (answerText.getInsert() != null) { + return answerText.getInsert().insert(message.getPersonId()) + .onItem().transformToUni( + words -> { + if (checkNotEmpty(words)) { + final String newMessage = InsertWords.insert(boxAnswer.getMessage(), words); + boxAnswer.setMessage(newMessage); + } + return Uni.createFrom().item(boxAnswer); + } + ); + } + return Uni.createFrom().item(boxAnswer); + } + +} diff --git a/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/action/cmd/ReplaceCmdAction.java b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/action/cmd/ReplaceCmdAction.java new file mode 100644 index 0000000..c29dfb0 --- /dev/null +++ b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/action/cmd/ReplaceCmdAction.java @@ -0,0 +1,19 @@ +package dev.struchkov.godfather.quarkus.core.action.cmd; + +import dev.struchkov.godfather.main.domain.content.Message; +import dev.struchkov.godfather.quarkus.core.action.ActionUnit; +import dev.struchkov.godfather.quarkus.core.unit.MainUnit; +import dev.struchkov.godfather.quarkus.core.unit.UnitRequest; +import dev.struchkov.godfather.quarkus.core.unit.cmd.ReplaceCmd; +import io.smallrye.mutiny.Uni; + +public class ReplaceCmdAction implements ActionUnit, Message> { + + @Override + public Uni> action(UnitRequest, Message> unitRequest) { + final ReplaceCmd unit = unitRequest.getUnit(); + final Message message = unitRequest.getMessage(); + return Uni.createFrom().item(UnitRequest.of(unit.getThisUnit(), message)); + } + +} diff --git a/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/action/cmd/RollBackCmdAction.java b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/action/cmd/RollBackCmdAction.java new file mode 100644 index 0000000..e20f218 --- /dev/null +++ b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/action/cmd/RollBackCmdAction.java @@ -0,0 +1,45 @@ +package dev.struchkov.godfather.quarkus.core.action.cmd; + +import dev.struchkov.godfather.main.domain.StorylineHistory; +import dev.struchkov.godfather.main.domain.content.Message; +import dev.struchkov.godfather.quarkus.core.action.ActionUnit; +import dev.struchkov.godfather.quarkus.core.service.StorylineService; +import dev.struchkov.godfather.quarkus.core.unit.MainUnit; +import dev.struchkov.godfather.quarkus.core.unit.UnitRequest; +import dev.struchkov.godfather.quarkus.core.unit.cmd.RollBackCmd; +import io.smallrye.mutiny.Uni; + +import static dev.struchkov.godfather.exception.RollBackException.rollBackException; + +public class RollBackCmdAction implements ActionUnit, M> { + + private final StorylineService storyLineService; + + public RollBackCmdAction(StorylineService storyLineService) { + this.storyLineService = storyLineService; + } + + @Override + public Uni> action(UnitRequest, M> unitRequest) { + final RollBackCmd unit = unitRequest.getUnit(); + final M message = unitRequest.getMessage(); + + final int countToBack = unit.getCountBack(); + final String rollbackUnitName = unit.getRollbackUnitName(); + + final Uni uniHistory = (rollbackUnitName != null) + ? storyLineService.replaceUserToBack(message.getPersonId(), rollbackUnitName).onItem().ifNull().failWith(rollBackException("Юнит для возвращения не был найден")) + : storyLineService.replaceUserToBack(message.getPersonId(), countToBack).onItem().ifNull().failWith(rollBackException("Юнит для возвращения не был найден")); + + return uniHistory + .onItem().transform( + history -> { + final String unitName = history.getUnitName(); + final MainUnit nextUnit = storyLineService.getUnitByName(unitName).orElse(unit); + final M oldMessage = (M) history.getMessage(); + return UnitRequest.of(nextUnit, oldMessage); + } + ); + } + +} diff --git a/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/provider/StoryLineHandler.java b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/provider/StoryLineHandler.java new file mode 100644 index 0000000..691629a --- /dev/null +++ b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/provider/StoryLineHandler.java @@ -0,0 +1,26 @@ +package dev.struchkov.godfather.quarkus.core.provider; + +import dev.struchkov.godfather.main.domain.content.Mail; +import dev.struchkov.godfather.quarkus.context.service.EventHandler; +import dev.struchkov.godfather.quarkus.core.GeneralAutoResponder; +import io.smallrye.mutiny.Uni; + +public class StoryLineHandler implements EventHandler { + + private final GeneralAutoResponder generalAutoResponder; + + public StoryLineHandler(GeneralAutoResponder generalAutoResponder) { + this.generalAutoResponder = generalAutoResponder; + } + + @Override + public Uni handle(Mail message) { + return generalAutoResponder.processingNewMessage(message); + } + + @Override + public String getEventType() { + return Mail.TYPE; + } + +} diff --git a/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/service/PersonSettingServiceImpl.java b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/service/PersonSettingServiceImpl.java new file mode 100644 index 0000000..3ca3572 --- /dev/null +++ b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/service/PersonSettingServiceImpl.java @@ -0,0 +1,42 @@ +package dev.struchkov.godfather.quarkus.core.service; + +import dev.struchkov.godfather.quarkus.context.service.PersonSettingService; +import dev.struchkov.godfather.quarkus.data.repository.PersonSettingRepository; +import dev.struchkov.haiti.utils.Inspector; +import io.smallrye.mutiny.Uni; +import org.jetbrains.annotations.NotNull; + +import java.util.Set; + +public class PersonSettingServiceImpl implements PersonSettingService { + + private final PersonSettingRepository personSettingRepository; + + public PersonSettingServiceImpl(PersonSettingRepository personSettingRepository) { + this.personSettingRepository = personSettingRepository; + } + + @Override + public Uni> getAllPersonIdDisableMessages(@NotNull Set personIds) { + Inspector.isNotNull(personIds); + return personSettingRepository.findAllByAllowedProcessing(personIds); + } + + @Override + public Uni getStateProcessingByPersonId(@NotNull Long personId) { + return personSettingRepository.findStateByPersonId(personId); + } + + @Override + public Uni disableMessageProcessing(@NotNull Long personId) { + Inspector.isNotNull(personId); + return personSettingRepository.disableMessageProcessing(personId); + } + + @Override + public Uni enableMessageProcessing(@NotNull Long personId) { + Inspector.isNotNull(personId); + return personSettingRepository.enableMessageProcessing(personId); + } + +} diff --git a/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/service/StorylineContextMapImpl.java b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/service/StorylineContextMapImpl.java new file mode 100644 index 0000000..54585f8 --- /dev/null +++ b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/service/StorylineContextMapImpl.java @@ -0,0 +1,59 @@ +package dev.struchkov.godfather.quarkus.core.service; + +import dev.struchkov.godfather.main.domain.ContextKey; +import dev.struchkov.godfather.quarkus.data.StorylineContext; +import io.smallrye.mutiny.Uni; +import org.jetbrains.annotations.NotNull; + +import java.util.HashMap; +import java.util.Map; + +import static dev.struchkov.haiti.context.exception.NotFoundException.notFoundException; +import static dev.struchkov.haiti.utils.Inspector.isNotNull; + +public class StorylineContextMapImpl implements StorylineContext { + + private final Map> map = new HashMap<>(); + + public Uni save(@NotNull Long personId, @NotNull ContextKey key, Object objectForSave) { + isNotNull(personId, key); + map.computeIfAbsent(personId, k -> new HashMap<>()).put(key.getValue(), objectForSave); + return Uni.createFrom().voidItem(); + } + + public Uni getByKey(@NotNull Long personId, @NotNull ContextKey key) { + isNotNull(personId, key); + if (map.containsKey(personId)) { + final Map storage = map.get(personId); + final T object = (T) storage.get(key.getValue()); + if (object != null && object.getClass().equals(key.getType())) { + return Uni.createFrom().item(object); + } + } + return Uni.createFrom().nullItem(); + } + + @Override + public Uni getByKeyOrThrow(@NotNull Long personId, @NotNull ContextKey key) { + return getByKey(personId, key) + .onItem().ifNull().failWith(notFoundException("Не найдено значение ключа {0}, для пользователя {1}", key.getValue(), personId)); + } + + public Uni> getAllSaveElement(@NotNull Long personId) { + isNotNull(personId); + return Uni.createFrom().item(map.get(personId)); + } + + public Uni removeAll(@NotNull Long personId) { + isNotNull(personId); + map.remove(personId); + return Uni.createFrom().voidItem(); + } + + public Uni removeByKey(@NotNull Long personId, @NotNull ContextKey key) { + isNotNull(personId, key); + map.computeIfAbsent(personId, k -> new HashMap<>()).remove(key.getValue()); + return Uni.createFrom().voidItem(); + } + +} diff --git a/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/service/StorylineMailService.java b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/service/StorylineMailService.java new file mode 100644 index 0000000..3ff1c2d --- /dev/null +++ b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/service/StorylineMailService.java @@ -0,0 +1,133 @@ +package dev.struchkov.godfather.quarkus.core.service; + +import dev.struchkov.godfather.main.domain.StorylineHistory; +import dev.struchkov.godfather.main.domain.UnitPointer; +import dev.struchkov.godfather.main.domain.content.Mail; +import dev.struchkov.godfather.quarkus.context.service.UnitPointerService; +import dev.struchkov.godfather.quarkus.core.Storyline; +import dev.struchkov.godfather.quarkus.core.StorylineFactory; +import dev.struchkov.godfather.quarkus.core.unit.MainUnit; +import dev.struchkov.godfather.quarkus.data.repository.StorylineRepository; +import io.smallrye.mutiny.Uni; +import org.jetbrains.annotations.NotNull; + +import java.util.List; +import java.util.Optional; +import java.util.Set; + +import static dev.struchkov.haiti.utils.Checker.checkEmpty; +import static dev.struchkov.haiti.utils.Checker.checkNotEmpty; +import static dev.struchkov.haiti.utils.Checker.checkNotNull; +import static dev.struchkov.haiti.utils.Inspector.isNotNull; + +/** + * Отвечает за работу со сценарием в личных сообщениях с пользователем. + */ +public class StorylineMailService implements StorylineService { + + private final UnitPointerService unitPointerService; + private final StorylineRepository storylineRepository; + private final Storyline storyLine; + private String defaultUnitName; + + public StorylineMailService( + UnitPointerService unitPointerService, + StorylineRepository storylineRepository, + List unitConfigurations + ) { + this.storyLine = new StorylineFactory(unitConfigurations).createStoryLine(); + this.unitPointerService = unitPointerService; + this.storylineRepository = storylineRepository; + } + + @Override + public Uni save(@NotNull StorylineHistory storylineHistory) { + isNotNull(storylineHistory); + return storylineRepository.save(storylineHistory); + } + + @Override + public Uni> getUnitNameByPersonId(@NotNull Long personId) { + isNotNull(personId); + return unitPointerService.getUnitNameByPersonId(personId) + .onItem().transform( + unitName -> { + if (checkNotNull(unitName)) { + return storyLine.getUnit(unitName).orElse(null); + } else { + return null; + } + } + ); + } + + @Override + public Uni>> getNextUnitByPersonId(@NotNull Long personId) { + return getUnitNameByPersonId(personId) + .flatMap( + unit -> { + if (checkNotNull(unit) && checkNotEmpty(unit.getNextUnits())) { + return Uni.createFrom().item(unit.getNextUnits()); + } else { + return storylineRepository.cleanHistoryByPersonId(personId) + .onItem().transform(v -> storyLine.getStartingUnits()); + } + } + ).map( + nextUnits -> { + if (checkEmpty(nextUnits)) { + return storyLine.getGlobalUnits(); + } else { + nextUnits.addAll(storyLine.getGlobalUnits()); + return nextUnits; + } + } + ); + } + + @Override + public Uni save(Long personId, String unitName, Mail mail) { + isNotNull(personId, unitName, mail); + return unitPointerService.save(new UnitPointer(personId, unitName)) + .map(u -> { + final StorylineHistory storylineHistory = new StorylineHistory(); + storylineHistory.setPersonId(personId); + storylineHistory.setUnitName(unitName); + storylineHistory.setMessage(mail); + return storylineRepository.save(storylineHistory); + }).replaceWithVoid(); + } + + @Override + public Uni replaceUserToBack(long personId, int countUnitsToBack) { + return storylineRepository.findByCountLast(personId, countUnitsToBack); + } + + @Override + public Uni replaceUserToBack(long personId, String unitName) { + return storylineRepository.findByCountLast(personId, unitName); + } + + @Override + public Optional> getDefaultUnit() { + if (defaultUnitName == null) return Optional.empty(); + return storyLine.getUnit(defaultUnitName); + } + + @Override + public void setDefaultUnit(String defaultUnit) { + defaultUnitName = defaultUnit; + } + + //TODO [22.06.2022]: Временное решение для ленивой инициализации + @Override + public void lazyLink(String firstName, String secondName) { + storyLine.link(firstName, secondName); + } + + @Override + public Optional> getUnitByName(String unitName) { + return storyLine.getUnit(unitName); + } + +} diff --git a/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/service/StorylineService.java b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/service/StorylineService.java new file mode 100644 index 0000000..f8fe243 --- /dev/null +++ b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/service/StorylineService.java @@ -0,0 +1,37 @@ +package dev.struchkov.godfather.quarkus.core.service; + +import dev.struchkov.godfather.main.domain.StorylineHistory; +import dev.struchkov.godfather.main.domain.content.Message; +import dev.struchkov.godfather.quarkus.core.unit.MainUnit; +import io.smallrye.mutiny.Uni; +import org.jetbrains.annotations.NotNull; + +import java.util.Optional; +import java.util.Set; + +public interface StorylineService { + + Uni save(@NotNull StorylineHistory storylineHistory); + + Uni> getUnitNameByPersonId(@NotNull Long personId); + + Uni>> getNextUnitByPersonId(@NotNull Long personId); + + Uni save(Long personId, String name, M message); + + Uni replaceUserToBack(long personId, int countUnitsToBack); + + Uni replaceUserToBack(long personId, String unitName); + + Optional> getDefaultUnit(); + + /** + * Ленивая (поздняя) связка юнитов между собой. Осуществляется уже после создания сценария. С помощью данного подхода можно реализовать циклические зависимости юнитов. + */ + void lazyLink(String firstName, String secondName); + + Optional> getUnitByName(String unitName); + + void setDefaultUnit(String unitName); + +} diff --git a/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/service/UnitPointerServiceImpl.java b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/service/UnitPointerServiceImpl.java new file mode 100644 index 0000000..fae6119 --- /dev/null +++ b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/service/UnitPointerServiceImpl.java @@ -0,0 +1,32 @@ +package dev.struchkov.godfather.quarkus.core.service; + +import dev.struchkov.godfather.main.domain.UnitPointer; +import dev.struchkov.godfather.quarkus.context.service.UnitPointerService; +import dev.struchkov.godfather.quarkus.data.repository.UnitPointerRepository; +import io.smallrye.mutiny.Uni; +import org.jetbrains.annotations.NotNull; + +public class UnitPointerServiceImpl implements UnitPointerService { + + private final UnitPointerRepository unitPointerRepository; + + public UnitPointerServiceImpl(UnitPointerRepository unitPointerRepository) { + this.unitPointerRepository = unitPointerRepository; + } + + @Override + public Uni save(@NotNull UnitPointer unitPointer) { + return unitPointerRepository.save(unitPointer); + } + + @Override + public Uni getUnitNameByPersonId(@NotNull Long personId) { + return unitPointerRepository.findUnitNameByPersonId(personId); + } + + @Override + public Uni removeByPersonId(@NotNull Long personId) { + return unitPointerRepository.removeByPersonId(personId); + } + +} diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/unit/AnswerCheck.java b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/unit/AnswerCheck.java similarity index 90% rename from bot-context/src/main/java/dev/struchkov/godfather/context/domain/unit/AnswerCheck.java rename to bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/unit/AnswerCheck.java index 8805bdf..dbc4f4c 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/unit/AnswerCheck.java +++ b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/unit/AnswerCheck.java @@ -1,10 +1,11 @@ -package dev.struchkov.godfather.context.domain.unit; +package dev.struchkov.godfather.quarkus.core.unit; import dev.struchkov.autoresponder.entity.KeyWord; -import dev.struchkov.godfather.context.domain.TypeUnit; -import dev.struchkov.godfather.context.domain.content.Message; -import dev.struchkov.godfather.context.service.Accessibility; -import dev.struchkov.godfather.context.service.usercode.CheckData; +import dev.struchkov.godfather.main.core.unit.TypeUnit; +import dev.struchkov.godfather.main.core.unit.UnitActiveType; +import dev.struchkov.godfather.main.domain.content.Message; +import dev.struchkov.godfather.quarkus.context.service.Accessibility; +import dev.struchkov.godfather.quarkus.core.unit.func.CheckData; import java.util.HashSet; import java.util.Set; @@ -13,9 +14,8 @@ import java.util.function.Predicate; import java.util.regex.Pattern; import java.util.stream.Collectors; -import static dev.struchkov.godfather.context.exception.UnitConfigException.unitConfigException; +import static dev.struchkov.godfather.exception.UnitConfigException.unitConfigException; import static dev.struchkov.haiti.utils.Inspector.isAnyNotNull; -import static dev.struchkov.haiti.utils.Inspector.isNotNull; /** * Обработчик запроса, который реализует конструкцию IF в сценарии. @@ -213,7 +213,7 @@ public class AnswerCheck extends MainUnit { } public AnswerCheck build() { - isNotNull(check, unitConfigException("Необходимо установить параметр проверки.")); +// isNotNull(check, unitConfigException("Необходимо установить параметр проверки.")); isAnyNotNull(unitConfigException("Необходимо задать хотя бы один unit результата проверки.")); return new AnswerCheck<>(this); } diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/unit/AnswerSave.java b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/unit/AnswerSave.java similarity index 88% rename from bot-context/src/main/java/dev/struchkov/godfather/context/domain/unit/AnswerSave.java rename to bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/unit/AnswerSave.java index 41a4196..221618f 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/unit/AnswerSave.java +++ b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/unit/AnswerSave.java @@ -1,13 +1,14 @@ -package dev.struchkov.godfather.context.domain.unit; +package dev.struchkov.godfather.quarkus.core.unit; import dev.struchkov.autoresponder.entity.KeyWord; -import dev.struchkov.godfather.context.domain.TypeUnit; -import dev.struchkov.godfather.context.domain.content.Message; -import dev.struchkov.godfather.context.repository.preser.AnswerSavePreservable; -import dev.struchkov.godfather.context.service.Accessibility; -import dev.struchkov.godfather.context.service.save.CheckSave; -import dev.struchkov.godfather.context.service.save.PreservableData; -import dev.struchkov.godfather.context.service.save.Pusher; +import dev.struchkov.godfather.main.core.unit.TypeUnit; +import dev.struchkov.godfather.main.core.unit.UnitActiveType; +import dev.struchkov.godfather.main.domain.content.Message; +import dev.struchkov.godfather.quarkus.context.service.Accessibility; +import dev.struchkov.godfather.quarkus.context.service.Pusher; +import dev.struchkov.godfather.quarkus.core.unit.func.CheckSave; +import dev.struchkov.godfather.quarkus.core.unit.func.PreservableData; +import dev.struchkov.godfather.quarkus.data.preser.AnswerSavePreservable; import java.util.Collection; import java.util.HashSet; @@ -18,7 +19,6 @@ import java.util.regex.Pattern; import java.util.stream.Collectors; import static dev.struchkov.haiti.utils.Checker.checkNull; -import static dev.struchkov.haiti.utils.Inspector.isNotNull; /** * Обработчик для сохранения ответов пользователя. Так же допускается скрытое сохранение. @@ -271,11 +271,11 @@ public class AnswerSave extends MainUnit { } public AnswerSave build() { - isNotNull(preservable, "Не указан репозиторий для сохранения формы пользователя"); - if (checkNull(pusher)) { - isNotNull(preservableData, "Не указаны данные для сохранения"); - isNotNull(key, "Не указан ключ для сохранения"); - } +// isNotNull(preservable, "Не указан репозиторий для сохранения формы пользователя"); +// if (checkNull(pusher)) { +// isNotNull(preservableData, "Не указаны данные для сохранения"); +// Inspector.isNotNull(key, "Не указан ключ для сохранения"); +// } return new AnswerSave<>(this); } diff --git a/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/unit/AnswerText.java b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/unit/AnswerText.java new file mode 100644 index 0000000..ab6e56c --- /dev/null +++ b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/unit/AnswerText.java @@ -0,0 +1,261 @@ +package dev.struchkov.godfather.quarkus.core.unit; + +import dev.struchkov.autoresponder.entity.KeyWord; +import dev.struchkov.godfather.main.core.unit.TypeUnit; +import dev.struchkov.godfather.main.core.unit.UnitActiveType; +import dev.struchkov.godfather.main.domain.BoxAnswer; +import dev.struchkov.godfather.main.domain.content.Message; +import dev.struchkov.godfather.quarkus.context.service.Accessibility; +import dev.struchkov.godfather.quarkus.context.service.Sending; +import dev.struchkov.godfather.quarkus.core.unit.func.Insert; +import dev.struchkov.godfather.quarkus.core.unit.func.ProcessingData; +import io.smallrye.mutiny.Uni; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.UUID; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.function.Supplier; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +/** + * Используется для отправки ответа пользователю. + * + * @author upagge [08/07/2019] + */ +public class AnswerText extends MainUnit { + + /** + * Объект, который необходимо отправить пользователю. + */ + private final ProcessingData answer; + + /** + * Информация, которую необходимо вставить вместо маркеров в строку ответа. + */ + private final Insert insert; + + /** + * Объект нестандартной отправки ответа. + */ + private final Sending sender; + + private AnswerText(Builder builder) { + super( + builder.name, + builder.description, + builder.triggerWords, + builder.triggerPhrases, + builder.triggerCheck, + builder.triggerPatterns, + builder.matchThreshold, + builder.priority, + builder.nextUnits, + builder.activeType, + builder.notSaveHistory, + builder.accessibility, + TypeUnit.TEXT + ); + answer = builder.boxAnswer; + insert = builder.insert; + sender = builder.sending; + } + + public static AnswerText of(String message) { + return AnswerText.builder().answer(BoxAnswer.boxAnswer(message)).build(); + } + + public static AnswerText of(BoxAnswer boxAnswer) { + return AnswerText.builder().answer(boxAnswer).build(); + } + + public static Builder builder() { + return new Builder<>(); + } + + public ProcessingData getAnswer() { + return answer; + } + + public Insert getInsert() { + return insert; + } + + public Sending getSending() { + return sender; + } + + public static final class Builder { + private String name = UUID.randomUUID().toString(); + private String description; + private Set> nextUnits; + + private Set triggerWords; + private Set triggerPhrases; + private Predicate triggerCheck; + private Set triggerPatterns; + + private Integer matchThreshold; + private Integer priority; + + private UnitActiveType activeType; + private Accessibility accessibility; + private boolean notSaveHistory; + + private ProcessingData boxAnswer; + private Insert insert; + private Sending sending; + + private Builder() { + } + + public Builder name(String name) { + this.name = name; + return this; + } + + public Builder description(String description) { + this.description = description; + return this; + } + + public Builder processing(Consumer answer) { + this.boxAnswer = message -> { + answer.accept(message); + return null; + }; + return this; + } + + public Builder answer(Function> answer) { + this.boxAnswer = answer::apply; + return this; + } + + public Builder answer(BoxAnswer answer) { + this.boxAnswer = message -> Uni.createFrom().item(answer); + return this; + } + + public Builder answer(Supplier answer) { + this.boxAnswer = message -> Uni.createFrom().item(answer.get()); + return this; + } + + public Builder insert(Insert insert) { + this.insert = insert; + return this; + } + + public Builder sending(Sending sending) { + this.sending = sending; + return this; + } + + public Builder triggerWords(Set val) { + if (triggerWords == null) { + triggerWords = new HashSet<>(); + } + triggerWords.addAll(val); + return this; + } + + public Builder triggerWord(KeyWord val) { + if (triggerWords == null) { + triggerWords = new HashSet<>(); + } + triggerWords.add(val); + return this; + } + + public Builder triggerStringWords(Set val) { + if (triggerWords == null) { + triggerWords = new HashSet<>(); + } + triggerWords.addAll(val.stream().map(KeyWord::of).collect(Collectors.toSet())); + return this; + } + + public Builder triggerWord(String val) { + if (triggerWords == null) { + triggerWords = new HashSet<>(); + } + triggerWords.add(KeyWord.of(val)); + return this; + } + + public Builder triggerPhrase(String... val) { + if (triggerPhrases == null) { + triggerPhrases = new HashSet<>(); + } + if (val.length == 1) { + triggerPhrases.add(val[0]); + } else { + triggerPhrases.addAll(Set.of(val)); + } + triggerPhrases.addAll(List.of(val)); + return this; + } + + public Builder triggerPattern(Pattern... val) { + if (triggerPatterns == null) { + triggerPatterns = new HashSet<>(); + } + if (val.length == 1) { + triggerPatterns.add(val[0]); + } else { + triggerPatterns.addAll(Set.of(val)); + } + triggerPatterns.addAll(Set.of(val)); + return this; + } + + public Builder triggerCheck(Predicate trigger) { + triggerCheck = trigger; + return this; + } + + public Builder matchThreshold(Integer val) { + matchThreshold = val; + return this; + } + + public Builder priority(Integer val) { + priority = val; + return this; + } + + public Builder next(MainUnit val) { + if (nextUnits == null) { + nextUnits = new HashSet<>(); + } + nextUnits.add(val); + return this; + } + + public Builder accessibility(Accessibility val) { + accessibility = val; + return this; + } + + public Builder notSaveHistory() { + notSaveHistory = true; + return this; + } + + public Builder activeType(UnitActiveType val) { + activeType = val; + return this; + } + + public AnswerText build() { +// isNotNull(boxAnswer, UnitConfigException.unitConfigException("BoxAnswer обязательный параметр юнита")); + return new AnswerText<>(this); + } + + } +} diff --git a/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/unit/MainUnit.java b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/unit/MainUnit.java new file mode 100644 index 0000000..0cbc19c --- /dev/null +++ b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/unit/MainUnit.java @@ -0,0 +1,118 @@ +package dev.struchkov.godfather.quarkus.core.unit; + +import dev.struchkov.autoresponder.entity.KeyWord; +import dev.struchkov.autoresponder.entity.Unit; +import dev.struchkov.godfather.main.core.unit.UnitActiveType; +import dev.struchkov.godfather.main.domain.content.Message; +import dev.struchkov.godfather.quarkus.context.service.Accessibility; + +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.function.Predicate; +import java.util.regex.Pattern; + +/** + * Главный обработчик {@link Unit}, от него наследуются все остальные Unit-ы. + * + * @author upagge [08/07/2019] + */ +public abstract class MainUnit extends Unit, M> { + + /** + * Уникальное имя юнита + */ + private String name; + + /** + * Описание юнита, что он делает. Никак не влияет на работу юнита и не участвует в ней. Возможно отображение этого текста в логах. + */ + private final String description; + + /** + * Тип Unit-а. + */ + protected final String type; + + /** + * Режим срабатывания Unit-а. + */ + protected UnitActiveType activeType; + + /** + * Проверка доступа пользователя к юниту. + */ + private final Accessibility accessibility; + + private final boolean notSaveHistory; + + protected MainUnit( + String name, + String description, + Set keyWords, + Set phrases, + Predicate triggerCheck, + Set patterns, + Integer matchThreshold, + Integer priority, + Set> nextUnits, + UnitActiveType activeType, + boolean notSaveHistory, + Accessibility accessibility, + String type + ) { + super(keyWords, phrases, triggerCheck, patterns, matchThreshold, priority, nextUnits); + this.name = name; + this.description = description; + this.activeType = Optional.ofNullable(activeType).orElse(UnitActiveType.DEFAULT); + this.accessibility = accessibility; + this.type = type; + this.notSaveHistory = notSaveHistory; + } + + public String getType() { + return type; + } + + public UnitActiveType getActiveType() { + return activeType; + } + + public void setActiveType(UnitActiveType activeType) { + this.activeType = activeType; + } + + public void setName(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public boolean isNotSaveHistory() { + return notSaveHistory; + } + + public Optional getAccessibility() { + return Optional.ofNullable(accessibility); + } + + public String getDescription() { + return description; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + MainUnit unit = (MainUnit) o; + return name.equals(unit.name); + } + + @Override + public int hashCode() { + return Objects.hash(name); + } + +} diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/UnitRequest.java b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/unit/UnitRequest.java similarity index 81% rename from bot-context/src/main/java/dev/struchkov/godfather/context/domain/UnitRequest.java rename to bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/unit/UnitRequest.java index 35ec569..30b36d6 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/UnitRequest.java +++ b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/unit/UnitRequest.java @@ -1,7 +1,6 @@ -package dev.struchkov.godfather.context.domain; +package dev.struchkov.godfather.quarkus.core.unit; -import dev.struchkov.godfather.context.domain.content.Message; -import dev.struchkov.godfather.context.domain.unit.MainUnit; +import dev.struchkov.godfather.main.domain.content.Message; /** * Сущность инкапсулирует в себе данные, необходимые для обработки сценария. diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/unit/cmd/ReplaceCmd.java b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/unit/cmd/ReplaceCmd.java similarity index 93% rename from bot-context/src/main/java/dev/struchkov/godfather/context/domain/unit/cmd/ReplaceCmd.java rename to bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/unit/cmd/ReplaceCmd.java index 792c2bb..84c2431 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/unit/cmd/ReplaceCmd.java +++ b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/unit/cmd/ReplaceCmd.java @@ -1,10 +1,10 @@ -package dev.struchkov.godfather.context.domain.unit.cmd; +package dev.struchkov.godfather.quarkus.core.unit.cmd; import dev.struchkov.autoresponder.entity.KeyWord; -import dev.struchkov.godfather.context.domain.TypeUnit; -import dev.struchkov.godfather.context.domain.content.Message; -import dev.struchkov.godfather.context.domain.unit.MainUnit; -import dev.struchkov.godfather.context.domain.unit.UnitActiveType; +import dev.struchkov.godfather.main.core.unit.TypeUnit; +import dev.struchkov.godfather.main.core.unit.UnitActiveType; +import dev.struchkov.godfather.main.domain.content.Message; +import dev.struchkov.godfather.quarkus.core.unit.MainUnit; import dev.struchkov.haiti.utils.Checker; import java.util.HashSet; diff --git a/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/unit/cmd/RollBackCmd.java b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/unit/cmd/RollBackCmd.java new file mode 100644 index 0000000..6330e76 --- /dev/null +++ b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/unit/cmd/RollBackCmd.java @@ -0,0 +1,212 @@ +package dev.struchkov.godfather.quarkus.core.unit.cmd; + +import dev.struchkov.autoresponder.entity.KeyWord; +import dev.struchkov.godfather.exception.UnitConfigException; +import dev.struchkov.godfather.main.core.unit.TypeUnit; +import dev.struchkov.godfather.main.core.unit.UnitActiveType; +import dev.struchkov.godfather.main.domain.content.Message; +import dev.struchkov.godfather.quarkus.core.unit.MainUnit; + +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; +import java.util.function.Predicate; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +import static dev.struchkov.haiti.utils.Checker.checkNull; + +/** + * Юнит, который позволяет откатить пользователя на предыдущие юниты в сценарии с сохранением ранее введенной информации в сообщениях. + */ +public class RollBackCmd extends MainUnit { + + /** + * Количество юнитов, на которые можно откатиться назад. + */ + private final int countBack; + + /** + * Имя юнита, на который нужно вернуть пользователя. + */ + private final String rollbackUnitName; + + private RollBackCmd(Builder builder) { + super( + builder.name, + builder.description, + builder.triggerWords, + builder.triggerPhrases, + builder.triggerCheck, + builder.triggerPatterns, + builder.matchThreshold, + builder.priority, + new HashSet<>(), + builder.activeType, + true, + null, + TypeUnit.BACK_CMD + ); + this.countBack = builder.countBack; + this.rollbackUnitName = builder.rollbackUnitName; + } + + public static Builder builder() { + return new Builder<>(); + } + + public static RollBackCmd rollBack(int countToBack) { + return RollBackCmd.builder().countBack(countToBack).build(); + } + + public static RollBackCmd singleRollBack() { + return RollBackCmd.builder().countBack(1).build(); + } + + public static RollBackCmd doubleRollBack() { + return RollBackCmd.builder().countBack(2).build(); + } + + public static RollBackCmd rollBack(String unitName) { + return RollBackCmd.builder().rollbackUnitName(unitName).build(); + } + + public static RollBackCmd rollBack(String phrase, String unitName) { + return RollBackCmd.builder().triggerPhrase(phrase).rollbackUnitName(unitName).build(); + } + + public int getCountBack() { + return countBack; + } + + public String getRollbackUnitName() { + return rollbackUnitName; + } + + public static final class Builder { + private String name = UUID.randomUUID().toString(); + private String description; + + private Set triggerPhrases; + private Predicate triggerCheck; + private Set triggerPatterns; + private Set triggerWords; + private Integer matchThreshold; + + private Integer priority; + private UnitActiveType activeType = UnitActiveType.DEFAULT; + + private int countBack; + private String rollbackUnitName; + + private Builder() { + } + + public Builder name(String name) { + this.name = name; + return this; + } + + public Builder description(String description) { + this.description = description; + return this; + } + + public Builder triggerWords(Set val) { + if (checkNull(triggerWords)) { + triggerWords = new HashSet<>(); + } + triggerWords.addAll(val); + return this; + } + + public Builder triggerWord(KeyWord val) { + if (checkNull(triggerWords)) { + triggerWords = new HashSet<>(); + } + triggerWords.add(val); + return this; + } + + public Builder triggerStringWords(Set val) { + if (checkNull(triggerWords)) { + triggerWords = new HashSet<>(); + } + triggerWords.addAll(val.stream().map(KeyWord::of).collect(Collectors.toSet())); + return this; + } + + public Builder triggerWord(String val) { + if (checkNull(triggerWords)) { + triggerWords = new HashSet<>(); + } + triggerWords.add(KeyWord.of(val)); + return this; + } + + public Builder triggerPhrase(String... val) { + if (checkNull(triggerPhrases)) { + triggerPhrases = new HashSet<>(); + } + if (val.length == 1) { + triggerPhrases.add(val[0]); + } else { + triggerPhrases.addAll(Set.of(val)); + } + triggerPhrases.addAll(Set.of(val)); + return this; + } + + public Builder triggerCheck(Predicate trigger) { + triggerCheck = trigger; + return this; + } + + public Builder triggerPattern(Pattern... val) { + if (checkNull(triggerPatterns)) { + triggerPatterns = new HashSet<>(); + } + if (val.length == 1) { + triggerPatterns.add(val[0]); + } else { + triggerPatterns.addAll(Set.of(val)); + } + triggerPatterns.addAll(Set.of(val)); + return this; + } + + public Builder matchThreshold(Integer val) { + matchThreshold = val; + return this; + } + + public Builder priority(Integer val) { + priority = val; + return this; + } + + public Builder activeType(UnitActiveType val) { + activeType = val; + return this; + } + + public Builder countBack(int val) { + countBack = val + 1; + return this; + } + + public Builder rollbackUnitName(String val) { + rollbackUnitName = val; + return this; + } + + public RollBackCmd build() { + if (rollbackUnitName == null && countBack < 2) { + throw new UnitConfigException("Ошибка конфигурирования юнита {0}: Количество юнитов для отката не должно быть меньше 1.", name); + } + return new RollBackCmd(this); + } + + } + +} diff --git a/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/unit/func/CheckData.java b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/unit/func/CheckData.java new file mode 100644 index 0000000..73d6251 --- /dev/null +++ b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/unit/func/CheckData.java @@ -0,0 +1,11 @@ +package dev.struchkov.godfather.quarkus.core.unit.func; + +import dev.struchkov.godfather.main.domain.content.Message; +import io.smallrye.mutiny.Uni; + +@FunctionalInterface +public interface CheckData { + + Uni checked(C content); + +} diff --git a/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/unit/func/CheckSave.java b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/unit/func/CheckSave.java new file mode 100644 index 0000000..b4931fc --- /dev/null +++ b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/unit/func/CheckSave.java @@ -0,0 +1,17 @@ +package dev.struchkov.godfather.quarkus.core.unit.func; + +import dev.struchkov.godfather.main.domain.content.Message; +import dev.struchkov.godfather.quarkus.core.unit.MainUnit; +import io.smallrye.mutiny.Uni; + +/** + * TODO: Добавить описание интерфейса. + * + * @author upagge [04/08/2019] + */ +@FunctionalInterface +public interface CheckSave { + + Uni> check(M content); + +} diff --git a/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/unit/func/Insert.java b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/unit/func/Insert.java new file mode 100644 index 0000000..0f7fe1a --- /dev/null +++ b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/unit/func/Insert.java @@ -0,0 +1,12 @@ +package dev.struchkov.godfather.quarkus.core.unit.func; + +import io.smallrye.mutiny.Uni; + +import java.util.List; + +@FunctionalInterface +public interface Insert { + + Uni> insert(Long personId); + +} diff --git a/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/unit/func/PreservableData.java b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/unit/func/PreservableData.java new file mode 100644 index 0000000..9004497 --- /dev/null +++ b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/unit/func/PreservableData.java @@ -0,0 +1,11 @@ +package dev.struchkov.godfather.quarkus.core.unit.func; + +import dev.struchkov.godfather.main.domain.content.Message; +import io.smallrye.mutiny.Uni; + +@FunctionalInterface +public interface PreservableData { + + Uni getData(M content); + +} diff --git a/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/unit/func/ProcessingData.java b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/unit/func/ProcessingData.java new file mode 100644 index 0000000..610db6a --- /dev/null +++ b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/unit/func/ProcessingData.java @@ -0,0 +1,11 @@ +package dev.struchkov.godfather.quarkus.core.unit.func; + +import dev.struchkov.godfather.main.domain.BoxAnswer; +import io.smallrye.mutiny.Uni; + +@FunctionalInterface +public interface ProcessingData { + + Uni processing(C content); + +} diff --git a/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/utils/Sender.java b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/utils/Sender.java new file mode 100644 index 0000000..4c862c5 --- /dev/null +++ b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/utils/Sender.java @@ -0,0 +1,35 @@ +package dev.struchkov.godfather.quarkus.core.utils; + +import dev.struchkov.godfather.main.domain.BoxAnswer; +import dev.struchkov.godfather.main.domain.content.Message; +import dev.struchkov.godfather.quarkus.context.service.Sending; +import io.smallrye.mutiny.Uni; + +import static dev.struchkov.haiti.utils.Exceptions.utilityClass; + +/** + * Используется для отправки сообщений определенного типа. + * + * @author upagge + */ +public class Sender { + + private Sender() { + utilityClass(); + } + + public static Uni sends(Message message, BoxAnswer boxAnswer, Sending sending) { + switch (sending.getType()) { + case PUBLIC: + break; + case PRIVATE: + return privateSend(message, boxAnswer, sending); + } + return Uni.createFrom().voidItem(); + } + + private static Uni privateSend(Message message, BoxAnswer boxAnswer, Sending sending) { + return sending.send(message.getPersonId(), boxAnswer); + } + +} diff --git a/bot-core/bot-core-simple/pom.xml b/bot-core/bot-core-simple/pom.xml new file mode 100644 index 0000000..27821d8 --- /dev/null +++ b/bot-core/bot-core-simple/pom.xml @@ -0,0 +1,35 @@ + + + + bot-core + dev.struchkov.godfather + 0.0.25 + + 4.0.0 + + bot-core-simple + + + 17 + 17 + UTF-8 + + + + + dev.struchkov.godfather + bot-core-main + + + dev.struchkov.godfather + bot-context-simple + + + dev.struchkov.godfather + bot-data-simple + + + + \ No newline at end of file diff --git a/bot-core/src/main/java/dev/struchkov/godfather/core/GeneralAutoResponder.java b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/GeneralAutoResponder.java similarity index 81% rename from bot-core/src/main/java/dev/struchkov/godfather/core/GeneralAutoResponder.java rename to bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/GeneralAutoResponder.java index 92de264..824be40 100644 --- a/bot-core/src/main/java/dev/struchkov/godfather/core/GeneralAutoResponder.java +++ b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/GeneralAutoResponder.java @@ -1,25 +1,23 @@ -package dev.struchkov.godfather.core; +package dev.struchkov.godfather.simple.core; import dev.struchkov.autoresponder.Responder; -import dev.struchkov.godfather.context.domain.TypeUnit; -import dev.struchkov.godfather.context.domain.UnitRequest; -import dev.struchkov.godfather.context.domain.content.Message; -import dev.struchkov.godfather.context.domain.unit.MainUnit; -import dev.struchkov.godfather.context.domain.unit.UnitActiveType; -import dev.struchkov.godfather.context.exception.ConfigAppException; -import dev.struchkov.godfather.context.service.Accessibility; -import dev.struchkov.godfather.context.service.Modifiable; -import dev.struchkov.godfather.context.service.PersonSettingService; -import dev.struchkov.godfather.context.service.StorylineService; -import dev.struchkov.godfather.context.service.sender.Sending; -import dev.struchkov.godfather.core.service.ErrorHandler; -import dev.struchkov.godfather.core.service.action.ActionUnit; -import dev.struchkov.godfather.core.service.action.AnswerCheckAction; -import dev.struchkov.godfather.core.service.action.AnswerSaveAction; -import dev.struchkov.godfather.core.service.action.AnswerTextAction; -import dev.struchkov.godfather.core.service.action.AnswerTimerAction; -import dev.struchkov.godfather.core.service.action.cmd.ReplaceCmdAction; -import dev.struchkov.godfather.core.service.timer.TimerService; +import dev.struchkov.godfather.exception.ConfigAppException; +import dev.struchkov.godfather.main.core.unit.TypeUnit; +import dev.struchkov.godfather.main.core.unit.UnitActiveType; +import dev.struchkov.godfather.main.domain.content.Message; +import dev.struchkov.godfather.simple.context.service.Accessibility; +import dev.struchkov.godfather.simple.context.service.ErrorHandler; +import dev.struchkov.godfather.simple.context.service.Modifiable; +import dev.struchkov.godfather.simple.context.service.PersonSettingService; +import dev.struchkov.godfather.simple.context.service.Sending; +import dev.struchkov.godfather.simple.core.action.ActionUnit; +import dev.struchkov.godfather.simple.core.action.AnswerCheckAction; +import dev.struchkov.godfather.simple.core.action.AnswerSaveAction; +import dev.struchkov.godfather.simple.core.action.AnswerTextAction; +import dev.struchkov.godfather.simple.core.action.cmd.ReplaceCmdAction; +import dev.struchkov.godfather.simple.core.service.StorylineService; +import dev.struchkov.godfather.simple.core.unit.MainUnit; +import dev.struchkov.godfather.simple.core.unit.UnitRequest; import dev.struchkov.haiti.context.exception.NotFoundException; import java.util.HashMap; @@ -69,10 +67,6 @@ public class GeneralAutoResponder { actionUnitMap.put(TypeUnit.SAVE, answerSaveAction); } - public void initTimerAction(TimerService timerService) { - actionUnitMap.put(TypeUnit.TIMER, new AnswerTimerAction(timerService, this)); - } - /** * Позволяет установить перехватчик и обработчик исключений, возникающих при обработке юнитов. */ diff --git a/bot-core/src/main/java/dev/struchkov/godfather/core/Storyline.java b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/Storyline.java similarity index 92% rename from bot-core/src/main/java/dev/struchkov/godfather/core/Storyline.java rename to bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/Storyline.java index bfa0e99..54ade5a 100644 --- a/bot-core/src/main/java/dev/struchkov/godfather/core/Storyline.java +++ b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/Storyline.java @@ -1,7 +1,7 @@ -package dev.struchkov.godfather.core; +package dev.struchkov.godfather.simple.core; -import dev.struchkov.godfather.context.domain.content.Message; -import dev.struchkov.godfather.context.domain.unit.MainUnit; +import dev.struchkov.godfather.main.domain.content.Message; +import dev.struchkov.godfather.simple.core.unit.MainUnit; import dev.struchkov.haiti.utils.Inspector; import org.jetbrains.annotations.NotNull; diff --git a/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/StorylineFactory.java b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/StorylineFactory.java new file mode 100644 index 0000000..ebfc3cc --- /dev/null +++ b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/StorylineFactory.java @@ -0,0 +1,167 @@ +package dev.struchkov.godfather.simple.core; + +import dev.struchkov.godfather.exception.UnitConfigException; +import dev.struchkov.godfather.main.domain.UnitDefinition; +import dev.struchkov.godfather.main.domain.annotation.Unit; +import dev.struchkov.godfather.main.domain.content.Message; +import dev.struchkov.godfather.simple.core.unit.MainUnit; +import dev.struchkov.haiti.utils.Inspector; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.Parameter; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +import static dev.struchkov.godfather.exception.UnitConfigException.unitConfigException; + +public class StorylineFactory { + + private static final Logger log = LoggerFactory.getLogger(StorylineFactory.class); + + private final List configurations = new ArrayList<>(); + + private final Map unitDefinitions = new HashMap<>(); + private final Map> unitMap = new HashMap<>(); + + private final Set mainUnits = new HashSet<>(); + private final Set globalUnits = new HashSet<>(); + + public StorylineFactory(List unitConfigurations) { + this.configurations.addAll(unitConfigurations); + } + + public Map getUnitDefinitions() { + return unitDefinitions; + } + + public Map> getUnitMap() { + return unitMap; + } + + public Storyline createStoryLine() { + generateUnitDefinitions(); + try { + createUnitMap(); + final Set> mainUnit = getMainUnit(); + final Set> globalUnit = getGlobalUnit(); + final Storyline storyline = new Storyline<>(mainUnit, unitMap); + storyline.addGlobalUnits(globalUnit); + return storyline; + } catch (IllegalAccessException | InvocationTargetException e) { + log.error(e.getMessage(), e); + } + throw new UnitConfigException("Ошибка построения StoryLine"); + } + + private Set> getMainUnit() { + Inspector.isNotEmpty(mainUnits, unitConfigException("Не задан ни один mainUnit. Установите хотя бы для одного Unit флаг mainUnit")); + return mainUnits.stream() + .map(unitMap::get) + .collect(Collectors.toSet()); + } + + private Set> getGlobalUnit() { + return globalUnits.stream() + .map(unitMap::get) + .collect(Collectors.toSet()); + } + + private void createUnitMap() throws IllegalAccessException, InvocationTargetException { + for (UnitDefinition unitDefinition : unitDefinitions.values()) { + if (!unitMap.containsKey(unitDefinition.getName())) { + final Set nextUnitNames = unitDefinition.getNextUnitNames(); + if (nextUnitNames.isEmpty() || unitMap.keySet().containsAll(nextUnitNames)) { + createUnit(unitDefinition); + } + } + } + } + + private MainUnit createUnit(UnitDefinition unitDefinition) throws IllegalAccessException, InvocationTargetException { + final Object objectConfig = unitDefinition.getObjectConfig(); + final String currentUnitName = unitDefinition.getName(); + final Method method = unitDefinition.getMethod(); + final Object[] nextUnits = Arrays.stream(method.getParameters()) + .filter(parameter -> parameter.isAnnotationPresent(Unit.class)) + .map(parameter -> parameter.getAnnotation(Unit.class)) + .map(Unit::value) + .map(unitMap::get) + .toArray(); + MainUnit newUnit = (MainUnit) method.invoke(objectConfig, nextUnits); + newUnit.setName(currentUnitName); + + unitMap.put(currentUnitName, newUnit); + + final Set dependentUnitsName = unitDefinition.getDependentUnits(); + for (String dependentUnitName : dependentUnitsName) { + final Set dependentNextUnitNames = unitDefinitions.get(dependentUnitName).getNextUnitNames(); + if (unitMap.keySet().containsAll(dependentNextUnitNames)) { + createUnit(unitDefinitions.get(dependentUnitName)); + } + } + + return newUnit; + } + + private void generateUnitDefinitions() { + final Map> dependentUnits = new HashMap<>(); + + for (Object config : configurations) { + final Class classUnitConfig = config.getClass(); + + for (Method method : classUnitConfig.getDeclaredMethods()) { + if (method.isAnnotationPresent(Unit.class)) { + final Unit unitConfig = method.getAnnotation(Unit.class); + + final String unitName = unitConfig.value(); + + final UnitDefinition unitDefinition = new UnitDefinition(); + unitDefinition.setName(unitName); + unitDefinition.setMethod(method); + unitDefinition.setObjectConfig(config); + + if (unitConfig.main()) { + mainUnits.add(unitName); + } + if (unitConfig.global()) { + globalUnits.add(unitName); + } + + final Parameter[] nextUnits = method.getParameters(); + if (nextUnits.length > 0) { + for (Parameter nextUnit : nextUnits) { + if (nextUnit.isAnnotationPresent(Unit.class)) { + final Unit nextUnitConfig = nextUnit.getAnnotation(Unit.class); + final String nextUnitName = nextUnitConfig.value(); + unitDefinition.setNextUnitName(nextUnitName); + dependentUnits.computeIfAbsent(nextUnitName, k -> new HashSet<>()); + dependentUnits.get(nextUnitName).add(unitName); + } + } + } + + unitDefinitions.put(unitDefinition.getName(), unitDefinition); + } + } + } + + for (Map.Entry> entry : dependentUnits.entrySet()) { + final UnitDefinition unitDefinition = unitDefinitions.get(entry.getKey()); + if (unitDefinition != null) { + unitDefinition.setDependentUnits(entry.getValue()); + } else { + throw new UnitConfigException("Ошибка связи юнитов. Проблема с описанием {0} юнита. Возможно вы не указали класс конфигурации для этого юнита.", entry.getKey()); + } + } + } + +} diff --git a/bot-core/src/main/java/dev/struchkov/godfather/core/service/action/ActionUnit.java b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/action/ActionUnit.java similarity index 64% rename from bot-core/src/main/java/dev/struchkov/godfather/core/service/action/ActionUnit.java rename to bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/action/ActionUnit.java index 6281ab4..3f7a931 100644 --- a/bot-core/src/main/java/dev/struchkov/godfather/core/service/action/ActionUnit.java +++ b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/action/ActionUnit.java @@ -1,8 +1,8 @@ -package dev.struchkov.godfather.core.service.action; +package dev.struchkov.godfather.simple.core.action; -import dev.struchkov.godfather.context.domain.UnitRequest; -import dev.struchkov.godfather.context.domain.content.Message; -import dev.struchkov.godfather.context.domain.unit.MainUnit; +import dev.struchkov.godfather.main.domain.content.Message; +import dev.struchkov.godfather.simple.core.unit.MainUnit; +import dev.struchkov.godfather.simple.core.unit.UnitRequest; /** * Интерфейс для обработки Unit-ов. diff --git a/bot-core/src/main/java/dev/struchkov/godfather/core/service/action/AnswerCheckAction.java b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/action/AnswerCheckAction.java similarity index 76% rename from bot-core/src/main/java/dev/struchkov/godfather/core/service/action/AnswerCheckAction.java rename to bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/action/AnswerCheckAction.java index 4f2e43d..b57575b 100644 --- a/bot-core/src/main/java/dev/struchkov/godfather/core/service/action/AnswerCheckAction.java +++ b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/action/AnswerCheckAction.java @@ -1,9 +1,9 @@ -package dev.struchkov.godfather.core.service.action; +package dev.struchkov.godfather.simple.core.action; -import dev.struchkov.godfather.context.domain.UnitRequest; -import dev.struchkov.godfather.context.domain.content.Message; -import dev.struchkov.godfather.context.domain.unit.AnswerCheck; -import dev.struchkov.godfather.context.domain.unit.MainUnit; +import dev.struchkov.godfather.main.domain.content.Message; +import dev.struchkov.godfather.simple.core.unit.AnswerCheck; +import dev.struchkov.godfather.simple.core.unit.MainUnit; +import dev.struchkov.godfather.simple.core.unit.UnitRequest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/bot-core/src/main/java/dev/struchkov/godfather/core/service/action/AnswerSaveAction.java b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/action/AnswerSaveAction.java similarity index 71% rename from bot-core/src/main/java/dev/struchkov/godfather/core/service/action/AnswerSaveAction.java rename to bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/action/AnswerSaveAction.java index 19efb76..c5ffde0 100644 --- a/bot-core/src/main/java/dev/struchkov/godfather/core/service/action/AnswerSaveAction.java +++ b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/action/AnswerSaveAction.java @@ -1,13 +1,13 @@ -package dev.struchkov.godfather.core.service.action; +package dev.struchkov.godfather.simple.core.action; -import dev.struchkov.godfather.context.domain.UnitRequest; -import dev.struchkov.godfather.context.domain.content.Message; -import dev.struchkov.godfather.context.domain.unit.AnswerSave; -import dev.struchkov.godfather.context.domain.unit.MainUnit; -import dev.struchkov.godfather.context.repository.preser.AnswerSavePreservable; -import dev.struchkov.godfather.context.service.save.CheckSave; -import dev.struchkov.godfather.context.service.save.PreservableData; -import dev.struchkov.godfather.context.service.save.Pusher; +import dev.struchkov.godfather.main.domain.content.Message; +import dev.struchkov.godfather.simple.context.service.Pusher; +import dev.struchkov.godfather.simple.core.unit.AnswerSave; +import dev.struchkov.godfather.simple.core.unit.MainUnit; +import dev.struchkov.godfather.simple.core.unit.UnitRequest; +import dev.struchkov.godfather.simple.core.unit.func.CheckSave; +import dev.struchkov.godfather.simple.core.unit.func.PreservableData; +import dev.struchkov.godfather.simple.data.preser.AnswerSavePreservable; import static dev.struchkov.haiti.utils.Checker.checkNotNull; diff --git a/bot-core/src/main/java/dev/struchkov/godfather/core/service/action/AnswerTextAction.java b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/action/AnswerTextAction.java similarity index 74% rename from bot-core/src/main/java/dev/struchkov/godfather/core/service/action/AnswerTextAction.java rename to bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/action/AnswerTextAction.java index 11aa50e..0b3f570 100644 --- a/bot-core/src/main/java/dev/struchkov/godfather/core/service/action/AnswerTextAction.java +++ b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/action/AnswerTextAction.java @@ -1,13 +1,13 @@ -package dev.struchkov.godfather.core.service.action; +package dev.struchkov.godfather.simple.core.action; -import dev.struchkov.godfather.context.domain.BoxAnswer; -import dev.struchkov.godfather.context.domain.UnitRequest; -import dev.struchkov.godfather.context.domain.content.Message; -import dev.struchkov.godfather.context.domain.unit.AnswerText; -import dev.struchkov.godfather.context.domain.unit.MainUnit; -import dev.struchkov.godfather.context.service.sender.Sending; -import dev.struchkov.godfather.context.utils.InsertWords; -import dev.struchkov.godfather.context.utils.Sender; +import dev.struchkov.godfather.main.core.utils.InsertWords; +import dev.struchkov.godfather.main.domain.BoxAnswer; +import dev.struchkov.godfather.main.domain.content.Message; +import dev.struchkov.godfather.simple.context.service.Sending; +import dev.struchkov.godfather.simple.core.unit.AnswerText; +import dev.struchkov.godfather.simple.core.unit.MainUnit; +import dev.struchkov.godfather.simple.core.unit.UnitRequest; +import dev.struchkov.godfather.simple.core.utils.Sender; import java.util.List; import java.util.Optional; diff --git a/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/action/cmd/ReplaceCmdAction.java b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/action/cmd/ReplaceCmdAction.java new file mode 100644 index 0000000..2c83ae1 --- /dev/null +++ b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/action/cmd/ReplaceCmdAction.java @@ -0,0 +1,18 @@ +package dev.struchkov.godfather.simple.core.action.cmd; + +import dev.struchkov.godfather.main.domain.content.Message; +import dev.struchkov.godfather.simple.core.action.ActionUnit; +import dev.struchkov.godfather.simple.core.unit.MainUnit; +import dev.struchkov.godfather.simple.core.unit.UnitRequest; +import dev.struchkov.godfather.simple.core.unit.cmd.ReplaceCmd; + +public class ReplaceCmdAction implements ActionUnit, Message> { + + @Override + public UnitRequest action(UnitRequest, Message> unitRequest) { + final ReplaceCmd unit = unitRequest.getUnit(); + final Message message = unitRequest.getMessage(); + return UnitRequest.of(unit.getThisUnit(), message); + } + +} diff --git a/bot-core/src/main/java/dev/struchkov/godfather/core/service/action/cmd/RollBackCmdAction.java b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/action/cmd/RollBackCmdAction.java similarity index 69% rename from bot-core/src/main/java/dev/struchkov/godfather/core/service/action/cmd/RollBackCmdAction.java rename to bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/action/cmd/RollBackCmdAction.java index 0c79f0d..c1eb94d 100644 --- a/bot-core/src/main/java/dev/struchkov/godfather/core/service/action/cmd/RollBackCmdAction.java +++ b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/action/cmd/RollBackCmdAction.java @@ -1,14 +1,14 @@ -package dev.struchkov.godfather.core.service.action.cmd; +package dev.struchkov.godfather.simple.core.action.cmd; -import dev.struchkov.godfather.context.domain.StorylineHistory; -import dev.struchkov.godfather.context.domain.UnitRequest; -import dev.struchkov.godfather.context.domain.content.Message; -import dev.struchkov.godfather.context.domain.unit.MainUnit; -import dev.struchkov.godfather.context.domain.unit.cmd.RollBackCmd; -import dev.struchkov.godfather.context.service.StorylineService; -import dev.struchkov.godfather.core.service.action.ActionUnit; +import dev.struchkov.godfather.main.domain.StorylineHistory; +import dev.struchkov.godfather.main.domain.content.Message; +import dev.struchkov.godfather.simple.core.action.ActionUnit; +import dev.struchkov.godfather.simple.core.service.StorylineService; +import dev.struchkov.godfather.simple.core.unit.MainUnit; +import dev.struchkov.godfather.simple.core.unit.UnitRequest; +import dev.struchkov.godfather.simple.core.unit.cmd.RollBackCmd; -import static dev.struchkov.godfather.context.exception.RollBackException.rollBackException; +import static dev.struchkov.godfather.exception.RollBackException.rollBackException; public class RollBackCmdAction implements ActionUnit, M> { diff --git a/bot-core/src/main/java/dev/struchkov/godfather/core/service/provider/StoryLineHandler.java b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/provider/StoryLineHandler.java similarity index 66% rename from bot-core/src/main/java/dev/struchkov/godfather/core/service/provider/StoryLineHandler.java rename to bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/provider/StoryLineHandler.java index 08ad559..8fa3423 100644 --- a/bot-core/src/main/java/dev/struchkov/godfather/core/service/provider/StoryLineHandler.java +++ b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/provider/StoryLineHandler.java @@ -1,8 +1,8 @@ -package dev.struchkov.godfather.core.service.provider; +package dev.struchkov.godfather.simple.core.provider; -import dev.struchkov.godfather.context.domain.content.Mail; -import dev.struchkov.godfather.context.service.EventHandler; -import dev.struchkov.godfather.core.GeneralAutoResponder; +import dev.struchkov.godfather.main.domain.content.Mail; +import dev.struchkov.godfather.simple.context.service.EventHandler; +import dev.struchkov.godfather.simple.core.GeneralAutoResponder; public class StoryLineHandler implements EventHandler { diff --git a/bot-core/src/main/java/dev/struchkov/godfather/core/service/save/push/UserSanderPusher.java b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/pusher/UserSanderPusher.java similarity index 69% rename from bot-core/src/main/java/dev/struchkov/godfather/core/service/save/push/UserSanderPusher.java rename to bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/pusher/UserSanderPusher.java index 472c053..a163cf5 100644 --- a/bot-core/src/main/java/dev/struchkov/godfather/core/service/save/push/UserSanderPusher.java +++ b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/pusher/UserSanderPusher.java @@ -1,11 +1,12 @@ -package dev.struchkov.godfather.core.service.save.push; +package dev.struchkov.godfather.simple.core.pusher; -import dev.struchkov.godfather.context.domain.BoxAnswer; -import dev.struchkov.godfather.context.service.save.Pusher; -import dev.struchkov.godfather.context.service.sender.Sending; +import dev.struchkov.godfather.simple.context.service.Pusher; +import dev.struchkov.godfather.simple.context.service.Sending; import java.util.Map; +import static dev.struchkov.godfather.main.domain.BoxAnswer.boxAnswer; + public class UserSanderPusher implements Pusher { private final Long personId; @@ -24,7 +25,7 @@ public class UserSanderPusher implements Pusher { stringBuilder.append("========= ").append(nameForm).append(" =========\n"); saveElement.forEach((key, value) -> stringBuilder.append(key).append(": ").append(value).append("\n")); stringBuilder.append("===================="); - sending.send(this.personId, BoxAnswer.builder().message(stringBuilder.toString()).build()); + sending.send(this.personId, boxAnswer(stringBuilder.toString())); } } diff --git a/bot-core/src/main/java/dev/struchkov/godfather/core/service/PersonSettingServiceImpl.java b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/service/PersonSettingServiceImpl.java similarity index 85% rename from bot-core/src/main/java/dev/struchkov/godfather/core/service/PersonSettingServiceImpl.java rename to bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/service/PersonSettingServiceImpl.java index 1a1a0cf..58ec00a 100644 --- a/bot-core/src/main/java/dev/struchkov/godfather/core/service/PersonSettingServiceImpl.java +++ b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/service/PersonSettingServiceImpl.java @@ -1,7 +1,7 @@ -package dev.struchkov.godfather.core.service; +package dev.struchkov.godfather.simple.core.service; -import dev.struchkov.godfather.context.repository.PersonSettingRepository; -import dev.struchkov.godfather.context.service.PersonSettingService; +import dev.struchkov.godfather.simple.context.service.PersonSettingService; +import dev.struchkov.godfather.simple.data.repository.PersonSettingRepository; import dev.struchkov.haiti.utils.Inspector; import org.jetbrains.annotations.NotNull; diff --git a/bot-core/src/main/java/dev/struchkov/godfather/core/service/StorylineContextMapImpl.java b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/service/StorylineContextMapImpl.java similarity index 91% rename from bot-core/src/main/java/dev/struchkov/godfather/core/service/StorylineContextMapImpl.java rename to bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/service/StorylineContextMapImpl.java index b28c807..cf15366 100644 --- a/bot-core/src/main/java/dev/struchkov/godfather/core/service/StorylineContextMapImpl.java +++ b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/service/StorylineContextMapImpl.java @@ -1,7 +1,7 @@ -package dev.struchkov.godfather.core.service; +package dev.struchkov.godfather.simple.core.service; -import dev.struchkov.godfather.context.domain.ContextKey; -import dev.struchkov.godfather.context.service.StorylineContext; +import dev.struchkov.godfather.main.domain.ContextKey; +import dev.struchkov.godfather.simple.data.StorylineContext; import org.jetbrains.annotations.NotNull; import java.util.HashMap; diff --git a/bot-core/src/main/java/dev/struchkov/godfather/core/service/StorylineMailService.java b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/service/StorylineMailService.java similarity index 81% rename from bot-core/src/main/java/dev/struchkov/godfather/core/service/StorylineMailService.java rename to bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/service/StorylineMailService.java index adbce03..98576b5 100644 --- a/bot-core/src/main/java/dev/struchkov/godfather/core/service/StorylineMailService.java +++ b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/service/StorylineMailService.java @@ -1,16 +1,14 @@ -package dev.struchkov.godfather.core.service; +package dev.struchkov.godfather.simple.core.service; import dev.struchkov.autoresponder.entity.Unit; -import dev.struchkov.godfather.context.domain.StorylineHistory; -import dev.struchkov.godfather.context.domain.UnitPointer; -import dev.struchkov.godfather.context.domain.content.Mail; -import dev.struchkov.godfather.context.domain.unit.MainUnit; -import dev.struchkov.godfather.context.repository.StorylineRepository; -import dev.struchkov.godfather.context.service.StorylineService; -import dev.struchkov.godfather.context.service.UnitPointerService; -import dev.struchkov.godfather.core.Storyline; -import dev.struchkov.godfather.core.StorylineFactory; -import dev.struchkov.haiti.utils.Inspector; +import dev.struchkov.godfather.main.domain.StorylineHistory; +import dev.struchkov.godfather.main.domain.UnitPointer; +import dev.struchkov.godfather.main.domain.content.Mail; +import dev.struchkov.godfather.simple.context.service.UnitPointerService; +import dev.struchkov.godfather.simple.core.Storyline; +import dev.struchkov.godfather.simple.core.StorylineFactory; +import dev.struchkov.godfather.simple.core.unit.MainUnit; +import dev.struchkov.godfather.simple.data.repository.StorylineRepository; import org.jetbrains.annotations.NotNull; import java.util.List; @@ -42,13 +40,12 @@ public class StorylineMailService implements StorylineService { @Override public void save(@NotNull StorylineHistory storylineHistory) { isNotNull(storylineHistory); - storylineHistory.setId(null); storylineRepository.save(storylineHistory); } @Override public Optional> getUnitNameByPersonId(@NotNull Long personId) { - Inspector.isNotNull(personId); + isNotNull(personId); return unitPointerService.getUnitNameByPersonId(personId) .flatMap(storyLine::getUnit); } @@ -68,7 +65,7 @@ public class StorylineMailService implements StorylineService { @Override public void save(Long personId, String unitName, Mail mail) { - Inspector.isNotNull(personId, unitName, mail); + isNotNull(personId, unitName, mail); unitPointerService.save(new UnitPointer(personId, unitName)); final StorylineHistory storylineHistory = new StorylineHistory(); diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/service/StorylineService.java b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/service/StorylineService.java similarity index 82% rename from bot-context/src/main/java/dev/struchkov/godfather/context/service/StorylineService.java rename to bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/service/StorylineService.java index a330a30..b1daaf0 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/service/StorylineService.java +++ b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/service/StorylineService.java @@ -1,8 +1,8 @@ -package dev.struchkov.godfather.context.service; +package dev.struchkov.godfather.simple.core.service; -import dev.struchkov.godfather.context.domain.StorylineHistory; -import dev.struchkov.godfather.context.domain.content.Message; -import dev.struchkov.godfather.context.domain.unit.MainUnit; +import dev.struchkov.godfather.main.domain.StorylineHistory; +import dev.struchkov.godfather.main.domain.content.Message; +import dev.struchkov.godfather.simple.core.unit.MainUnit; import org.jetbrains.annotations.NotNull; import java.util.Optional; diff --git a/bot-core/src/main/java/dev/struchkov/godfather/core/service/UnitPointerServiceImpl.java b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/service/UnitPointerServiceImpl.java similarity index 75% rename from bot-core/src/main/java/dev/struchkov/godfather/core/service/UnitPointerServiceImpl.java rename to bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/service/UnitPointerServiceImpl.java index c43bc36..448d9a1 100644 --- a/bot-core/src/main/java/dev/struchkov/godfather/core/service/UnitPointerServiceImpl.java +++ b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/service/UnitPointerServiceImpl.java @@ -1,8 +1,8 @@ -package dev.struchkov.godfather.core.service; +package dev.struchkov.godfather.simple.core.service; -import dev.struchkov.godfather.context.domain.UnitPointer; -import dev.struchkov.godfather.context.repository.UnitPointerRepository; -import dev.struchkov.godfather.context.service.UnitPointerService; +import dev.struchkov.godfather.main.domain.UnitPointer; +import dev.struchkov.godfather.simple.context.service.UnitPointerService; +import dev.struchkov.godfather.simple.data.repository.UnitPointerRepository; import org.jetbrains.annotations.NotNull; import java.util.Optional; diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/unit/AnswerTimer.java b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/unit/AnswerCheck.java similarity index 62% rename from bot-context/src/main/java/dev/struchkov/godfather/context/domain/unit/AnswerTimer.java rename to bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/unit/AnswerCheck.java index eeda9ed..b25f309 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/unit/AnswerTimer.java +++ b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/unit/AnswerCheck.java @@ -1,10 +1,11 @@ -package dev.struchkov.godfather.context.domain.unit; +package dev.struchkov.godfather.simple.core.unit; import dev.struchkov.autoresponder.entity.KeyWord; -import dev.struchkov.godfather.context.domain.TypeUnit; -import dev.struchkov.godfather.context.domain.content.Message; -import dev.struchkov.godfather.context.service.Accessibility; -import dev.struchkov.godfather.context.service.usercode.CheckData; +import dev.struchkov.godfather.main.core.unit.TypeUnit; +import dev.struchkov.godfather.main.core.unit.UnitActiveType; +import dev.struchkov.godfather.main.domain.content.Message; +import dev.struchkov.godfather.simple.context.service.Accessibility; +import dev.struchkov.godfather.simple.core.unit.func.CheckData; import java.util.HashSet; import java.util.Set; @@ -13,37 +14,29 @@ import java.util.function.Predicate; import java.util.regex.Pattern; import java.util.stream.Collectors; -import static dev.struchkov.godfather.context.exception.UnitConfigException.unitConfigException; -import static dev.struchkov.haiti.utils.Inspector.isNotNull; - /** - * Обработчик таймер, позволяющий отложить обработку других Unit-ов. + * Обработчик запроса, который реализует конструкцию IF в сценарии. * * @author upagge [08/07/2019] */ -public class AnswerTimer extends MainUnit { +public class AnswerCheck extends MainUnit { /** - * Unit обработку которого необходимо отложить. + * Unit для true. */ - private final MainUnit unitAnswer; + private final MainUnit unitTrue; /** - * Задержка обработки в секундах. + * Unit для false. */ - private final Integer timeDelaySec; + private final MainUnit unitFalse; /** - * Время, через которое таймер будет удален в секундах. + * Условие проверки. */ - private final Integer timeDeathSec; + private final CheckData check; - /** - * Условие срабатывания отложенного Unit. - */ - private final CheckData checkLoop; - - private AnswerTimer(Builder builder) { + private AnswerCheck(Builder builder) { super( builder.name, builder.description, @@ -53,36 +46,31 @@ public class AnswerTimer extends MainUnit { builder.triggerPatterns, builder.matchThreshold, builder.priority, - null, + new HashSet<>(), builder.activeType, builder.notSaveHistory, builder.accessibility, - TypeUnit.TIMER + TypeUnit.CHECK ); - unitAnswer = builder.unitAnswer; - timeDelaySec = builder.timeDelaySec; - timeDeathSec = builder.timeDeathSec; - checkLoop = builder.checkLoop; + unitTrue = builder.unitTrue; + unitFalse = builder.unitFalse; + check = builder.check; } public static Builder builder() { return new Builder<>(); } - public MainUnit getUnitAnswer() { - return unitAnswer; + public MainUnit getUnitTrue() { + return unitTrue; } - public Integer getTimeDelaySec() { - return timeDelaySec; + public MainUnit getUnitFalse() { + return unitFalse; } - public Integer getTimeDeathSec() { - return timeDeathSec; - } - - public CheckData getCheckLoop() { - return checkLoop; + public CheckData getCheck() { + return check; } public static final class Builder { @@ -96,14 +84,14 @@ public class AnswerTimer extends MainUnit { private Integer matchThreshold; private Integer priority; - private UnitActiveType activeType = UnitActiveType.AFTER; + private UnitActiveType activeType; + private Accessibility accessibility; private boolean notSaveHistory; - private MainUnit unitAnswer; - private Integer timeDelaySec; - private Integer timeDeathSec; - private CheckData checkLoop; + private MainUnit unitTrue; + private MainUnit unitFalse; + private CheckData check; private Builder() { } @@ -118,26 +106,6 @@ public class AnswerTimer extends MainUnit { return this; } - public Builder unitAnswer(MainUnit val) { - unitAnswer = val; - return this; - } - - public Builder timeDelaySec(Integer val) { - timeDelaySec = val; - return this; - } - - public Builder timeDeathSec(Integer val) { - timeDeathSec = val; - return this; - } - - public Builder checkLoop(CheckData val) { - checkLoop = val; - return this; - } - public Builder triggerWords(Set val) { if (triggerWords == null) { triggerWords = new HashSet<>(); @@ -196,7 +164,7 @@ public class AnswerTimer extends MainUnit { return this; } - public Builder triggerCheck(Predicate trigger) { + private Builder triggerCheck(Predicate trigger) { triggerCheck = trigger; return this; } @@ -211,13 +179,23 @@ public class AnswerTimer extends MainUnit { return this; } - public Builder accessibility(Accessibility val) { - accessibility = val; + public Builder unitTrue(MainUnit unitTrue) { + this.unitTrue = unitTrue; return this; } - public Builder notSaveHistory() { - notSaveHistory = true; + public Builder unitFalse(MainUnit unitFalse) { + this.unitFalse = unitFalse; + return this; + } + + public Builder check(CheckData check) { + this.check = check; + return this; + } + + public Builder accessibility(Accessibility val) { + accessibility = val; return this; } @@ -226,9 +204,15 @@ public class AnswerTimer extends MainUnit { return this; } - public AnswerTimer build() { - isNotNull(unitAnswer, unitConfigException("Необходимо указать юнит, обработка которого будет отложена.")); - return new AnswerTimer<>(this); + public Builder notSaveHistory() { + notSaveHistory = true; + return this; + } + + public AnswerCheck build() { +// isNotNull(check, unitConfigException("Необходимо установить параметр проверки.")); +// Inspector.isAnyNotNull(unitConfigException("Необходимо задать хотя бы один unit результата проверки.")); + return new AnswerCheck<>(this); } } diff --git a/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/unit/AnswerSave.java b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/unit/AnswerSave.java new file mode 100644 index 0000000..86f5d38 --- /dev/null +++ b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/unit/AnswerSave.java @@ -0,0 +1,283 @@ +package dev.struchkov.godfather.simple.core.unit; + +import dev.struchkov.autoresponder.entity.KeyWord; +import dev.struchkov.godfather.main.core.unit.TypeUnit; +import dev.struchkov.godfather.main.core.unit.UnitActiveType; +import dev.struchkov.godfather.main.domain.content.Message; +import dev.struchkov.godfather.simple.context.service.Accessibility; +import dev.struchkov.godfather.simple.context.service.Pusher; +import dev.struchkov.godfather.simple.core.unit.func.CheckSave; +import dev.struchkov.godfather.simple.core.unit.func.PreservableData; +import dev.struchkov.godfather.simple.data.preser.AnswerSavePreservable; +import dev.struchkov.haiti.utils.Checker; + +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; +import java.util.function.Predicate; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +/** + * Обработчик для сохранения ответов пользователя. Так же допускается скрытое сохранение. + * + * @author upagge [08/07/2019] + */ +public class AnswerSave extends MainUnit { + + /** + * Объект отвечающий за сохранение - репозиторий. + */ + private final AnswerSavePreservable preservable; + + /** + * Ключ для данных. + */ + private final String key; + + /** + * Отправка результатов. + */ + private final Pusher pusher; + + /** + * Данные для скрытого сохранения. + */ + private final PreservableData preservableData; + + /** + * Скрытое сохранение. + */ + private final boolean hidden; + + private final CheckSave checkSave; + + private AnswerSave(Builder builder) { + super( + builder.name, + builder.description, + builder.triggerWords, + builder.triggerPhrases, + builder.triggerCheck, + builder.triggerPatterns, + builder.matchThreshold, + builder.priority, + builder.nextUnits, + (builder.hidden) ? UnitActiveType.AFTER : UnitActiveType.DEFAULT, + builder.notSaveHistory, + builder.accessibility, + TypeUnit.SAVE + ); + maintenanceNextUnit(nextUnits); + preservable = builder.preservable; + key = builder.key; + pusher = builder.pusher; + preservableData = builder.preservableData; + hidden = builder.hidden; + checkSave = builder.checkSave; + } + + public static Builder builder() { + return new Builder<>(); + } + + private void maintenanceNextUnit(Collection> units) { + if (units != null) { + units.forEach(mainUnit -> mainUnit.setActiveType(UnitActiveType.AFTER)); + } + } + + public AnswerSavePreservable getPreservable() { + return preservable; + } + + public String getKey() { + return key; + } + + public Pusher getPusher() { + return pusher; + } + + public PreservableData getPreservableData() { + return preservableData; + } + + public boolean isHidden() { + return hidden; + } + + public CheckSave getCheckSave() { + return checkSave; + } + + public static final class Builder { + private String name = UUID.randomUUID().toString(); + private String description; + private Set> nextUnits; + + private Set triggerWords; + private Set triggerPhrases; + private Set triggerPatterns; + private Predicate triggerCheck; + + private Integer matchThreshold; + private Integer priority; + + private Accessibility accessibility; + private boolean notSaveHistory; + + private AnswerSavePreservable preservable; + private String key; + private Pusher pusher; + private PreservableData preservableData; + private boolean hidden; + private CheckSave checkSave; + + private Builder() { + } + + public Builder name(String name) { + this.name = name; + return this; + } + + public Builder description(String description) { + this.description = description; + return this; + } + + public Builder triggerWords(Set val) { + if (Checker.checkNull(triggerWords)) { + triggerWords = new HashSet<>(); + } + triggerWords.addAll(val); + return this; + } + + public Builder triggerWord(KeyWord val) { + if (Checker.checkNull(triggerWords)) { + triggerWords = new HashSet<>(); + } + triggerWords.add(val); + return this; + } + + public Builder triggerStringWords(Set val) { + if (Checker.checkNull(triggerWords)) { + triggerWords = new HashSet<>(); + } + triggerWords.addAll(val.stream().map(KeyWord::of).collect(Collectors.toSet())); + return this; + } + + public Builder triggerWord(String val) { + if (Checker.checkNull(triggerWords)) { + triggerWords = new HashSet<>(); + } + triggerWords.add(KeyWord.of(val)); + return this; + } + + public Builder triggerPhrase(String... val) { + if (Checker.checkNull(triggerPhrases)) { + triggerPhrases = new HashSet<>(); + } + if (val.length == 1) { + triggerPhrases.add(val[0]); + } else { + triggerPhrases.addAll(Set.of(val)); + } + triggerPhrases.addAll(Set.of(val)); + return this; + } + + public Builder triggerPattern(Pattern... val) { + if (Checker.checkNull(triggerPatterns)) { + triggerPatterns = new HashSet<>(); + } + if (val.length == 1) { + triggerPatterns.add(val[0]); + } else { + triggerPatterns.addAll(Set.of(val)); + } + triggerPatterns.addAll(Set.of(val)); + return this; + } + + public Builder triggerCheck(Predicate trigger) { + triggerCheck = trigger; + return this; + } + + public Builder matchThreshold(Integer val) { + matchThreshold = val; + return this; + } + + public Builder priority(Integer val) { + priority = val; + return this; + } + + public Builder next(MainUnit val) { + if (Checker.checkNull(nextUnits)) { + nextUnits = new HashSet<>(); + } + nextUnits.add(val); + return this; + } + + public Builder preservable(AnswerSavePreservable val) { + this.preservable = val; + return this; + } + + public Builder key(String val) { + this.key = val; + return this; + } + + public Builder pusher(Pusher val) { + this.pusher = val; + return this; + } + + public Builder preservableData(PreservableData val) { + this.preservableData = val; + return this; + } + + public Builder hidden(boolean val) { + this.hidden = val; + return this; + } + + public Builder checkSave(CheckSave val) { + this.checkSave = val; + return this; + } + + public Builder accessibility(Accessibility val) { + accessibility = val; + return this; + } + + public Builder notSaveHistory() { + notSaveHistory = true; + return this; + } + + public AnswerSave build() { +// Inspector.isNotNull(preservable, "Не указан репозиторий для сохранения формы пользователя"); +// if (Checker.checkNull(pusher)) { +// Inspector.isNotNull(preservableData, "Не указаны данные для сохранения"); +// isNotNull(key, "Не указан ключ для сохранения"); +// } + return new AnswerSave<>(this); + } + + } + +} diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/unit/AnswerText.java b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/unit/AnswerText.java similarity index 87% rename from bot-context/src/main/java/dev/struchkov/godfather/context/domain/unit/AnswerText.java rename to bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/unit/AnswerText.java index 1d1f0a2..04caa7b 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/unit/AnswerText.java +++ b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/unit/AnswerText.java @@ -1,14 +1,14 @@ -package dev.struchkov.godfather.context.domain.unit; +package dev.struchkov.godfather.simple.core.unit; import dev.struchkov.autoresponder.entity.KeyWord; -import dev.struchkov.godfather.context.domain.BoxAnswer; -import dev.struchkov.godfather.context.domain.TypeUnit; -import dev.struchkov.godfather.context.domain.content.Message; -import dev.struchkov.godfather.context.exception.UnitConfigException; -import dev.struchkov.godfather.context.service.Accessibility; -import dev.struchkov.godfather.context.service.sender.Sending; -import dev.struchkov.godfather.context.service.usercode.Insert; -import dev.struchkov.godfather.context.service.usercode.ProcessingData; +import dev.struchkov.godfather.main.core.unit.TypeUnit; +import dev.struchkov.godfather.main.core.unit.UnitActiveType; +import dev.struchkov.godfather.main.domain.BoxAnswer; +import dev.struchkov.godfather.main.domain.content.Message; +import dev.struchkov.godfather.simple.context.service.Accessibility; +import dev.struchkov.godfather.simple.context.service.Sending; +import dev.struchkov.godfather.simple.core.unit.func.Insert; +import dev.struchkov.godfather.simple.core.unit.func.ProcessingData; import java.util.HashSet; import java.util.List; @@ -22,8 +22,6 @@ import java.util.function.Supplier; import java.util.regex.Pattern; import java.util.stream.Collectors; -import static dev.struchkov.haiti.utils.Inspector.isNotNull; - /** * Используется для отправки ответа пользователю. * @@ -128,23 +126,23 @@ public class AnswerText extends MainUnit { public Builder processing(Consumer answer) { this.boxAnswer = message -> { answer.accept(message); - return Optional.empty(); + return null; }; return this; } public Builder answer(Function answer) { - this.boxAnswer = message -> Optional.of(answer.apply(message)); + this.boxAnswer = message -> Optional.ofNullable(answer.apply(message)); return this; } public Builder answer(BoxAnswer answer) { - this.boxAnswer = message -> Optional.of(answer); + this.boxAnswer = message -> Optional.ofNullable(answer); return this; } public Builder answer(Supplier answer) { - this.boxAnswer = message -> Optional.of(answer.get()); + this.boxAnswer = message -> Optional.ofNullable(answer.get()); return this; } @@ -255,7 +253,7 @@ public class AnswerText extends MainUnit { } public AnswerText build() { - isNotNull(boxAnswer, UnitConfigException.unitConfigException("BoxAnswer обязательный параметр юнита")); +// isNotNull(boxAnswer, UnitConfigException.unitConfigException("BoxAnswer обязательный параметр юнита")); return new AnswerText<>(this); } diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/unit/MainUnit.java b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/unit/MainUnit.java similarity index 92% rename from bot-context/src/main/java/dev/struchkov/godfather/context/domain/unit/MainUnit.java rename to bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/unit/MainUnit.java index b1e2dce..5542f75 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/unit/MainUnit.java +++ b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/unit/MainUnit.java @@ -1,9 +1,10 @@ -package dev.struchkov.godfather.context.domain.unit; +package dev.struchkov.godfather.simple.core.unit; import dev.struchkov.autoresponder.entity.KeyWord; import dev.struchkov.autoresponder.entity.Unit; -import dev.struchkov.godfather.context.domain.content.Message; -import dev.struchkov.godfather.context.service.Accessibility; +import dev.struchkov.godfather.main.core.unit.UnitActiveType; +import dev.struchkov.godfather.main.domain.content.Message; +import dev.struchkov.godfather.simple.context.service.Accessibility; import java.util.Objects; import java.util.Optional; diff --git a/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/unit/UnitRequest.java b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/unit/UnitRequest.java new file mode 100644 index 0000000..303303c --- /dev/null +++ b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/unit/UnitRequest.java @@ -0,0 +1,33 @@ +package dev.struchkov.godfather.simple.core.unit; + +import dev.struchkov.godfather.main.domain.content.Message; + +/** + * Сущность инкапсулирует в себе данные, необходимые для обработки сценария. + * + * @param Тип юнита + * @param Тип сообщения + */ +public class UnitRequest { + + private final U unit; + private final M message; + + private UnitRequest(U unit, M message) { + this.unit = unit; + this.message = message; + } + + public static , M extends Message> UnitRequest of(U mainUnit, M message) { + return new UnitRequest<>(mainUnit, message); + } + + public U getUnit() { + return unit; + } + + public M getMessage() { + return message; + } + +} diff --git a/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/unit/cmd/ReplaceCmd.java b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/unit/cmd/ReplaceCmd.java new file mode 100644 index 0000000..191c58d --- /dev/null +++ b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/unit/cmd/ReplaceCmd.java @@ -0,0 +1,164 @@ +package dev.struchkov.godfather.simple.core.unit.cmd; + +import dev.struchkov.autoresponder.entity.KeyWord; +import dev.struchkov.godfather.main.core.unit.TypeUnit; +import dev.struchkov.godfather.main.core.unit.UnitActiveType; +import dev.struchkov.godfather.main.domain.content.Message; +import dev.struchkov.godfather.simple.core.unit.MainUnit; +import dev.struchkov.haiti.utils.Checker; + +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; +import java.util.function.Predicate; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +public class ReplaceCmd extends MainUnit { + + private final MainUnit thisUnit; + + private ReplaceCmd(Builder builder) { + super( + builder.name, + builder.description, + builder.triggerWords, + builder.triggerPhrases, + builder.triggerCheck, + builder.triggerPatterns, + builder.matchThreshold, + builder.priority, + new HashSet<>(), + builder.activeType, + true, + null, + TypeUnit.REPLACE_CMD + ); + this.thisUnit = builder.thisUnit; + } + + public static Builder builder() { + return new Builder<>(); + } + + public MainUnit getThisUnit() { + return thisUnit; + } + + public static final class Builder { + private String name = UUID.randomUUID().toString(); + private String description; + + private Set triggerPhrases; + private Predicate triggerCheck; + private Set triggerPatterns; + private Set triggerWords; + private Integer matchThreshold; + + private Integer priority; + private UnitActiveType activeType = UnitActiveType.AFTER; + + private MainUnit thisUnit; + + private Builder() { + } + + public Builder name(String name) { + this.name = name; + return this; + } + + public Builder description(String description) { + this.description = description; + return this; + } + + public Builder triggerWords(Set val) { + if (Checker.checkNull(triggerWords)) { + triggerWords = new HashSet<>(); + } + triggerWords.addAll(val); + return this; + } + + public Builder triggerWord(KeyWord val) { + if (Checker.checkNull(triggerWords)) { + triggerWords = new HashSet<>(); + } + triggerWords.add(val); + return this; + } + + public Builder triggerStringWords(Set val) { + if (Checker.checkNull(triggerWords)) { + triggerWords = new HashSet<>(); + } + triggerWords.addAll(val.stream().map(KeyWord::of).collect(Collectors.toSet())); + return this; + } + + public Builder triggerWord(String val) { + if (Checker.checkNull(triggerWords)) { + triggerWords = new HashSet<>(); + } + triggerWords.add(KeyWord.of(val)); + return this; + } + + public Builder triggerPhrase(String... val) { + if (Checker.checkNull(triggerPhrases)) { + triggerPhrases = new HashSet<>(); + } + if (val.length == 1) { + triggerPhrases.add(val[0]); + } else { + triggerPhrases.addAll(Set.of(val)); + } + return this; + } + + public Builder triggerPattern(Pattern... val) { + if (Checker.checkNull(triggerPatterns)) { + triggerPatterns = new HashSet<>(); + } + if (val.length == 1) { + triggerPatterns.add(val[0]); + } else { + triggerPatterns.addAll(Set.of(val)); + } + triggerPatterns.addAll(Set.of(val)); + return this; + } + + public Builder triggerCheck(Predicate trigger) { + triggerCheck = trigger; + return this; + } + + public Builder matchThreshold(Integer val) { + matchThreshold = val; + return this; + } + + public Builder priority(Integer val) { + priority = val; + return this; + } + + public Builder activeType(UnitActiveType val) { + activeType = val; + return this; + } + + public Builder thisUnit(MainUnit val) { + thisUnit = val; + return this; + } + + public ReplaceCmd build() { + return new ReplaceCmd<>(this); + } + + } + +} diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/unit/cmd/RollBackCmd.java b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/unit/cmd/RollBackCmd.java similarity index 94% rename from bot-context/src/main/java/dev/struchkov/godfather/context/domain/unit/cmd/RollBackCmd.java rename to bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/unit/cmd/RollBackCmd.java index 3bb6e30..5cd421b 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/unit/cmd/RollBackCmd.java +++ b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/unit/cmd/RollBackCmd.java @@ -1,11 +1,11 @@ -package dev.struchkov.godfather.context.domain.unit.cmd; +package dev.struchkov.godfather.simple.core.unit.cmd; import dev.struchkov.autoresponder.entity.KeyWord; -import dev.struchkov.godfather.context.domain.TypeUnit; -import dev.struchkov.godfather.context.domain.content.Message; -import dev.struchkov.godfather.context.domain.unit.MainUnit; -import dev.struchkov.godfather.context.domain.unit.UnitActiveType; -import dev.struchkov.godfather.context.exception.UnitConfigException; +import dev.struchkov.godfather.exception.UnitConfigException; +import dev.struchkov.godfather.main.core.unit.TypeUnit; +import dev.struchkov.godfather.main.core.unit.UnitActiveType; +import dev.struchkov.godfather.main.domain.content.Message; +import dev.struchkov.godfather.simple.core.unit.MainUnit; import java.util.HashSet; import java.util.Set; diff --git a/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/unit/func/CheckData.java b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/unit/func/CheckData.java new file mode 100644 index 0000000..b2f8d8f --- /dev/null +++ b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/unit/func/CheckData.java @@ -0,0 +1,10 @@ +package dev.struchkov.godfather.simple.core.unit.func; + +import dev.struchkov.godfather.main.domain.content.Message; + +@FunctionalInterface +public interface CheckData { + + boolean checked(C content); + +} diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/service/save/CheckSave.java b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/unit/func/CheckSave.java similarity index 54% rename from bot-context/src/main/java/dev/struchkov/godfather/context/service/save/CheckSave.java rename to bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/unit/func/CheckSave.java index a16560c..53b2480 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/service/save/CheckSave.java +++ b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/unit/func/CheckSave.java @@ -1,7 +1,7 @@ -package dev.struchkov.godfather.context.service.save; +package dev.struchkov.godfather.simple.core.unit.func; -import dev.struchkov.godfather.context.domain.content.Message; -import dev.struchkov.godfather.context.domain.unit.MainUnit; +import dev.struchkov.godfather.main.domain.content.Message; +import dev.struchkov.godfather.simple.core.unit.MainUnit; /** * TODO: Добавить описание интерфейса. diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/service/usercode/Insert.java b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/unit/func/Insert.java similarity index 66% rename from bot-context/src/main/java/dev/struchkov/godfather/context/service/usercode/Insert.java rename to bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/unit/func/Insert.java index 6d4e3f2..86f491a 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/service/usercode/Insert.java +++ b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/unit/func/Insert.java @@ -1,4 +1,4 @@ -package dev.struchkov.godfather.context.service.usercode; +package dev.struchkov.godfather.simple.core.unit.func; import java.util.List; diff --git a/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/unit/func/PreservableData.java b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/unit/func/PreservableData.java new file mode 100644 index 0000000..ceb3d78 --- /dev/null +++ b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/unit/func/PreservableData.java @@ -0,0 +1,10 @@ +package dev.struchkov.godfather.simple.core.unit.func; + +import dev.struchkov.godfather.main.domain.content.Message; + +@FunctionalInterface +public interface PreservableData { + + D getData(M content); + +} diff --git a/bot-core/src/main/java/dev/struchkov/godfather/core/service/save/data/PreservableDataSimple.java b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/unit/func/PreservableDataSimple.java similarity index 72% rename from bot-core/src/main/java/dev/struchkov/godfather/core/service/save/data/PreservableDataSimple.java rename to bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/unit/func/PreservableDataSimple.java index b857e8e..bd15abc 100644 --- a/bot-core/src/main/java/dev/struchkov/godfather/core/service/save/data/PreservableDataSimple.java +++ b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/unit/func/PreservableDataSimple.java @@ -1,7 +1,6 @@ -package dev.struchkov.godfather.core.service.save.data; +package dev.struchkov.godfather.simple.core.unit.func; -import dev.struchkov.godfather.context.domain.content.Message; -import dev.struchkov.godfather.context.service.save.PreservableData; +import dev.struchkov.godfather.main.domain.content.Message; import dev.struchkov.haiti.utils.Pair; /** diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/service/usercode/ProcessingData.java b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/unit/func/ProcessingData.java similarity index 54% rename from bot-context/src/main/java/dev/struchkov/godfather/context/service/usercode/ProcessingData.java rename to bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/unit/func/ProcessingData.java index 622b2c0..520458a 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/service/usercode/ProcessingData.java +++ b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/unit/func/ProcessingData.java @@ -1,6 +1,6 @@ -package dev.struchkov.godfather.context.service.usercode; +package dev.struchkov.godfather.simple.core.unit.func; -import dev.struchkov.godfather.context.domain.BoxAnswer; +import dev.struchkov.godfather.main.domain.BoxAnswer; import java.util.Optional; diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/utils/Sender.java b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/utils/Sender.java similarity index 76% rename from bot-context/src/main/java/dev/struchkov/godfather/context/utils/Sender.java rename to bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/utils/Sender.java index eb7b518..265d8ea 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/utils/Sender.java +++ b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/utils/Sender.java @@ -1,8 +1,8 @@ -package dev.struchkov.godfather.context.utils; +package dev.struchkov.godfather.simple.core.utils; -import dev.struchkov.godfather.context.domain.BoxAnswer; -import dev.struchkov.godfather.context.domain.content.Message; -import dev.struchkov.godfather.context.service.sender.Sending; +import dev.struchkov.godfather.main.domain.BoxAnswer; +import dev.struchkov.godfather.main.domain.content.Message; +import dev.struchkov.godfather.simple.context.service.Sending; import static dev.struchkov.haiti.utils.Exceptions.utilityClass; diff --git a/bot-core/pom.xml b/bot-core/pom.xml index 95058fb..16cfb0d 100644 --- a/bot-core/pom.xml +++ b/bot-core/pom.xml @@ -10,15 +10,14 @@ bot-core + pom + + bot-core-quarkus + bot-core-main + bot-core-simple + Bot Core Реализация основной логики для создания ботов без привязки к конкретным социальным сетям. - - - dev.struchkov.godfather - bot-context - - - \ No newline at end of file diff --git a/bot-core/src/main/java/dev/struchkov/godfather/core/domain/Timer.java b/bot-core/src/main/java/dev/struchkov/godfather/core/domain/Timer.java deleted file mode 100644 index bd08ada..0000000 --- a/bot-core/src/main/java/dev/struchkov/godfather/core/domain/Timer.java +++ /dev/null @@ -1,191 +0,0 @@ -package dev.struchkov.godfather.core.domain; - -import dev.struchkov.godfather.context.service.usercode.CheckData; -import dev.struchkov.godfather.context.domain.unit.MainUnit; - -import java.time.LocalDateTime; - -/** - * Используется для отложенной активации обработки Unit-ов. - * - * @author upagge [11/07/2019] - */ -public class Timer { - - /** - * Идентификатор таймера. - */ - private Integer id; - - /** - * Unit, обработка которого откладывается. - */ - private MainUnit unitAnswer; - - /** - * Unit, который будет обработан после удаления таймера. - */ - private MainUnit unitDeath; - - /** - * Идентификатор пользователя. - */ - private Long personId; - - /** - * Время активации таймера. - */ - private LocalDateTime timeActive; - - /** - * Время смерти таймера. - */ - private LocalDateTime timeDeath; - - /** - * Интервал срабатывания таймера. - */ - private Integer periodSec; - - /** - * Условие срабатывания таймера. - */ - private CheckData checkLoop; - - private Timer(Builder builder) { - id = builder.id; - unitAnswer = builder.unitAnswer; - unitDeath = builder.unitDeath; - personId = builder.personId; - timeActive = builder.timeActive; - timeDeath = builder.timeDeath; - periodSec = builder.periodSec; - checkLoop = builder.checkLoop; - } - - public static Builder builder() { - return new Builder(); - } - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public MainUnit getUnitAnswer() { - return unitAnswer; - } - - public void setUnitAnswer(MainUnit unitAnswer) { - this.unitAnswer = unitAnswer; - } - - public MainUnit getUnitDeath() { - return unitDeath; - } - - public void setUnitDeath(MainUnit unitDeath) { - this.unitDeath = unitDeath; - } - - public Long getPersonId() { - return personId; - } - - public void setPersonId(Long personId) { - this.personId = personId; - } - - public LocalDateTime getTimeActive() { - return timeActive; - } - - public void setTimeActive(LocalDateTime timeActive) { - this.timeActive = timeActive; - } - - public LocalDateTime getTimeDeath() { - return timeDeath; - } - - public void setTimeDeath(LocalDateTime timeDeath) { - this.timeDeath = timeDeath; - } - - public Integer getPeriodSec() { - return periodSec; - } - - public void setPeriodSec(Integer periodSec) { - this.periodSec = periodSec; - } - - public CheckData getCheckLoop() { - return checkLoop; - } - - public void setCheckLoop(CheckData checkLoop) { - this.checkLoop = checkLoop; - } - - public static final class Builder { - private Integer id; - private MainUnit unitAnswer; - private MainUnit unitDeath; - private Long personId; - private LocalDateTime timeActive; - private LocalDateTime timeDeath; - private Integer periodSec; - private CheckData checkLoop; - - private Builder() { - } - - public Builder id(Integer val) { - id = val; - return this; - } - - public Builder unitAnswer(MainUnit val) { - unitAnswer = val; - return this; - } - - public Builder unitDeath(MainUnit val) { - unitDeath = val; - return this; - } - - public Builder personId(Long val) { - personId = val; - return this; - } - - public Builder timeActive(LocalDateTime val) { - timeActive = val; - return this; - } - - public Builder timeDeath(LocalDateTime val) { - timeDeath = val; - return this; - } - - public Builder periodSec(Integer val) { - periodSec = val; - return this; - } - - public Builder checkLoop(CheckData val) { - checkLoop = val; - return this; - } - - public Timer build() { - return new Timer(this); - } - } -} diff --git a/bot-core/src/main/java/dev/struchkov/godfather/core/repository/TimerRepository.java b/bot-core/src/main/java/dev/struchkov/godfather/core/repository/TimerRepository.java deleted file mode 100644 index 1a34f69..0000000 --- a/bot-core/src/main/java/dev/struchkov/godfather/core/repository/TimerRepository.java +++ /dev/null @@ -1,29 +0,0 @@ -package dev.struchkov.godfather.core.repository; - -import dev.struchkov.godfather.core.domain.Timer; - -import java.time.LocalDateTime; -import java.util.Collection; - -/** - * Репозиторий для работы с хранилищем таймеров {@link Timer}. - * - * @author upagge [11/07/2019] - */ -public interface TimerRepository { - - Integer add(Timer timer); - - /** - * Получить все таймеры, время активации которых меньше, чем переданное время - * - * @param time Время - * @return Коллекция таймеров - */ - Collection getTimerActive(LocalDateTime time); - - void remove(Integer id); - - void edit(Timer timer); - -} diff --git a/bot-core/src/main/java/dev/struchkov/godfather/core/repository/TimerRepositoryMap.java b/bot-core/src/main/java/dev/struchkov/godfather/core/repository/TimerRepositoryMap.java deleted file mode 100644 index 4958fe6..0000000 --- a/bot-core/src/main/java/dev/struchkov/godfather/core/repository/TimerRepositoryMap.java +++ /dev/null @@ -1,42 +0,0 @@ -package dev.struchkov.godfather.core.repository; - -import dev.struchkov.godfather.core.domain.Timer; - -import java.time.LocalDateTime; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; -import java.util.stream.Collectors; - -/** - * Локальная реализация репозитория {@link TimerRepository} на основе HashMap. - * - * @author upagge [11/07/2019] - */ -public class TimerRepositoryMap implements TimerRepository { - - private final Map map = new HashMap<>(); - private Integer count = 0; - - public Integer add(Timer timer) { - timer.setId(count); - map.put(count, timer); - return count++; - } - - @Override - public Collection getTimerActive(LocalDateTime time) { - return map.values().parallelStream().filter(timer -> time.isAfter(timer.getTimeActive())).collect(Collectors.toSet()); - } - - @Override - public void remove(Integer id) { - map.remove(id); - } - - @Override - public void edit(Timer timer) { - map.put(timer.getId(), timer); - } - -} diff --git a/bot-core/src/main/java/dev/struchkov/godfather/core/service/action/AnswerTimerAction.java b/bot-core/src/main/java/dev/struchkov/godfather/core/service/action/AnswerTimerAction.java deleted file mode 100644 index 2f4659d..0000000 --- a/bot-core/src/main/java/dev/struchkov/godfather/core/service/action/AnswerTimerAction.java +++ /dev/null @@ -1,72 +0,0 @@ -package dev.struchkov.godfather.core.service.action; - -import dev.struchkov.godfather.context.domain.UnitRequest; -import dev.struchkov.godfather.context.domain.content.Message; -import dev.struchkov.godfather.context.domain.unit.AnswerTimer; -import dev.struchkov.godfather.context.domain.unit.MainUnit; -import dev.struchkov.godfather.context.exception.TimerSettingException; -import dev.struchkov.godfather.core.GeneralAutoResponder; -import dev.struchkov.godfather.core.domain.Timer; -import dev.struchkov.godfather.core.service.timer.TimerActionTask; -import dev.struchkov.godfather.core.service.timer.TimerService; - -import java.time.Clock; -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.util.Optional; - -/** - * Обработчик Unit-а {@link AnswerTimer}. - * - * @author upagge [11/07/2019] - */ -public class AnswerTimerAction implements ActionUnit, M> { - - private final TimerService timerService; - private Long verificationPeriodSec = 15L; - - public AnswerTimerAction(TimerService timerService, GeneralAutoResponder generalAutoresponder) { - this.timerService = timerService; - TimerActionTask timerActionTask = new TimerActionTask(timerService, generalAutoresponder); - java.util.Timer timer = new java.util.Timer(true); - timer.schedule(timerActionTask, 0, 1000L * verificationPeriodSec); - } - - public Long getVerificationPeriodSec() { - return verificationPeriodSec; - } - - public void setVerificationPeriodSec(Long verificationPeriodSec) { - this.verificationPeriodSec = verificationPeriodSec; - } - - @Override - public UnitRequest action(UnitRequest, M> unitRequest) { - final AnswerTimer unit = unitRequest.getUnit(); - final M message = unitRequest.getMessage(); - - final LocalDateTime timeActive = LocalDateTime - .now(Clock.tickSeconds(ZoneId.systemDefault())) - .plusSeconds(Optional - .ofNullable(unit.getTimeDelaySec()) - .orElseThrow(() -> new TimerSettingException("Не установлена временная задержка таймера"))); - - final Timer.Builder timer = Timer.builder() - .personId(message.getPersonId()) - .unitAnswer(unit.getUnitAnswer()) - .timeActive(timeActive) - .periodSec(unit.getTimeDelaySec()) - .checkLoop(unit.getCheckLoop()); - - if (unit.getTimeDeathSec() != null) { - timer.timeDeath(LocalDateTime - .now(Clock.tickSeconds(ZoneId.systemDefault())) - .plusSeconds(unit.getTimeDeathSec())); - } else if (unit.getCheckLoop() == null) { - timer.timeDeath(timeActive); - } - - timerService.add(timer.build()); - return UnitRequest.of(unit, message); - } -} diff --git a/bot-core/src/main/java/dev/struchkov/godfather/core/service/action/cmd/ReplaceCmdAction.java b/bot-core/src/main/java/dev/struchkov/godfather/core/service/action/cmd/ReplaceCmdAction.java deleted file mode 100644 index c8db08f..0000000 --- a/bot-core/src/main/java/dev/struchkov/godfather/core/service/action/cmd/ReplaceCmdAction.java +++ /dev/null @@ -1,18 +0,0 @@ -package dev.struchkov.godfather.core.service.action.cmd; - -import dev.struchkov.godfather.context.domain.UnitRequest; -import dev.struchkov.godfather.context.domain.content.Message; -import dev.struchkov.godfather.context.domain.unit.MainUnit; -import dev.struchkov.godfather.context.domain.unit.cmd.ReplaceCmd; -import dev.struchkov.godfather.core.service.action.ActionUnit; - -public class ReplaceCmdAction implements ActionUnit { - - @Override - public UnitRequest action(UnitRequest unitRequest) { - final ReplaceCmd unit = unitRequest.getUnit(); - final Message message = unitRequest.getMessage(); - return UnitRequest.of(unit.getThisUnit(), message); - } - -} diff --git a/bot-core/src/main/java/dev/struchkov/godfather/core/service/timer/TimerActionTask.java b/bot-core/src/main/java/dev/struchkov/godfather/core/service/timer/TimerActionTask.java deleted file mode 100644 index c3ac230..0000000 --- a/bot-core/src/main/java/dev/struchkov/godfather/core/service/timer/TimerActionTask.java +++ /dev/null @@ -1,87 +0,0 @@ -package dev.struchkov.godfather.core.service.timer; - -import dev.struchkov.godfather.context.domain.UnitRequest; -import dev.struchkov.godfather.context.domain.content.Message; -import dev.struchkov.godfather.context.service.usercode.CheckData; -import dev.struchkov.godfather.context.utils.MessageUtils; -import dev.struchkov.godfather.core.GeneralAutoResponder; -import dev.struchkov.godfather.core.domain.Timer; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.time.Clock; -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.util.TimerTask; - -/** - * Обслуживание таймеров. Отвечает за активацию, удаление, перенастройку таймеров. - * - * @author upagge [11/07/2019] - */ -public class TimerActionTask extends TimerTask { - - private static final Logger log = LoggerFactory.getLogger(TimerActionTask.class); - - private final TimerService timerService; - private final GeneralAutoResponder generalAutoresponder; - - public TimerActionTask(TimerService timerService, GeneralAutoResponder generalAutoresponder) { - this.generalAutoresponder = generalAutoresponder; - log.info("Инициализация сервиса по активации таймеров"); - this.timerService = timerService; - } - - @Override - public void run() { - LocalDateTime nowDate = LocalDateTime.now(Clock.tickSeconds(ZoneId.systemDefault())); - log.info("Сервис таймеров сработал. Время: {}", nowDate); - - timerService.getTimerActive() - .parallelStream() - .forEach(timer -> processingTimer(timer, nowDate)); - - } - - private void processingTimer(Timer timer, LocalDateTime nowDate) { - Message emptyMessage = MessageUtils.EMPTY_MESSAGE; - emptyMessage.setPersonId(timer.getPersonId()); - CheckData checkLoop = timer.getCheckLoop(); - - if (!timeDeath(nowDate, timer.getTimeDeath())) { - if (checkLoop != null) { - if (checkLoop.checked(emptyMessage)) { - generalAutoresponder.answer(UnitRequest.of(timer.getUnitAnswer(), emptyMessage)); - timerService.remove(timer.getId()); - } else { - reinstallation(timer); - } - } else { - generalAutoresponder.answer(UnitRequest.of(timer.getUnitAnswer(), emptyMessage)); - reinstallation(timer); - } - } else { - generalAutoresponder.answer(UnitRequest.of(timer.getUnitAnswer(), emptyMessage)); - death(timer, emptyMessage); - } - } - - private void reinstallation(Timer timer) { - if (timer.getPeriodSec() != null) { - timer.setTimeActive(timer.getTimeActive().plusSeconds(timer.getPeriodSec())); - timerService.edit(timer.getId(), timer); - } - } - - private void death(Timer timer, Message emptyMessage) { - if (timer.getUnitDeath() != null) { - generalAutoresponder.answer(UnitRequest.of(timer.getUnitDeath(), emptyMessage)); - } - timerService.remove(timer.getId()); - } - - private boolean timeDeath(LocalDateTime nowTime, LocalDateTime timeDeath) { - return timeDeath != null && nowTime.isAfter(timeDeath); - } - -} diff --git a/bot-core/src/main/java/dev/struchkov/godfather/core/service/timer/TimerService.java b/bot-core/src/main/java/dev/struchkov/godfather/core/service/timer/TimerService.java deleted file mode 100644 index da5cc35..0000000 --- a/bot-core/src/main/java/dev/struchkov/godfather/core/service/timer/TimerService.java +++ /dev/null @@ -1,17 +0,0 @@ -package dev.struchkov.godfather.core.service.timer; - -import dev.struchkov.godfather.core.domain.Timer; - -import java.util.List; - -public interface TimerService { - - List getTimerActive(); - - Integer add(Timer timer); - - void remove(Integer id); - - void edit(Integer id, Timer timer); - -} diff --git a/bot-core/src/main/java/dev/struchkov/godfather/core/service/timer/TimerServiceImpl.java b/bot-core/src/main/java/dev/struchkov/godfather/core/service/timer/TimerServiceImpl.java deleted file mode 100644 index 83914f2..0000000 --- a/bot-core/src/main/java/dev/struchkov/godfather/core/service/timer/TimerServiceImpl.java +++ /dev/null @@ -1,46 +0,0 @@ -package dev.struchkov.godfather.core.service.timer; - -import dev.struchkov.godfather.core.domain.Timer; -import dev.struchkov.godfather.core.repository.TimerRepository; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; - -public class TimerServiceImpl implements TimerService { - - private static final Logger log = LoggerFactory.getLogger(TimerServiceImpl.class); - - private final TimerRepository timerRepository; - - public TimerServiceImpl(TimerRepository timerRepository) { - this.timerRepository = timerRepository; - } - - public TimerRepository getTimerRepository() { - return timerRepository; - } - - @Override - public List getTimerActive() { - return new ArrayList<>(timerRepository.getTimerActive(LocalDateTime.now())); - } - - public Integer add(Timer timer) { - log.info("Таймер установлен: {}", timer); - return timerRepository.add(timer); - } - - public void remove(Integer id) { - log.info("Таймер удален"); - timerRepository.remove(id); - } - - public void edit(Integer id, Timer timer) { - timer.setId(id); - timerRepository.edit(timer); - } - -} diff --git a/bot-data/bot-data-main/pom.xml b/bot-data/bot-data-main/pom.xml new file mode 100644 index 0000000..502d9ca --- /dev/null +++ b/bot-data/bot-data-main/pom.xml @@ -0,0 +1,20 @@ + + + + bot-data + dev.struchkov.godfather + 0.0.25 + + 4.0.0 + + bot-data-main + + + 17 + 17 + UTF-8 + + + \ No newline at end of file diff --git a/bot-data/bot-data-quarkus/pom.xml b/bot-data/bot-data-quarkus/pom.xml new file mode 100644 index 0000000..16f4883 --- /dev/null +++ b/bot-data/bot-data-quarkus/pom.xml @@ -0,0 +1,33 @@ + + + + dev.struchkov.godfather + bot-data + 0.0.25 + + 4.0.0 + + bot-data-quarkus + + + 17 + 17 + UTF-8 + + + + + dev.struchkov.godfather + bot-context-quarkus + + + + io.smallrye.reactive + smallrye-mutiny-vertx-core + true + + + + \ No newline at end of file diff --git a/bot-data/bot-data-quarkus/src/main/java/dev/struchkov/godfather/quarkus/data/StorylineContext.java b/bot-data/bot-data-quarkus/src/main/java/dev/struchkov/godfather/quarkus/data/StorylineContext.java new file mode 100644 index 0000000..3828bf9 --- /dev/null +++ b/bot-data/bot-data-quarkus/src/main/java/dev/struchkov/godfather/quarkus/data/StorylineContext.java @@ -0,0 +1,23 @@ +package dev.struchkov.godfather.quarkus.data; + +import dev.struchkov.godfather.main.domain.ContextKey; +import io.smallrye.mutiny.Uni; +import org.jetbrains.annotations.NotNull; + +import java.util.Map; + +public interface StorylineContext { + + Uni save(@NotNull Long telegramId, @NotNull ContextKey key, Object objectForSave); + + Uni getByKey(@NotNull Long telegramId, @NotNull ContextKey key); + + Uni getByKeyOrThrow(@NotNull Long telegramId, @NotNull ContextKey key); + + Uni> getAllSaveElement(@NotNull Long telegramId); + + Uni removeAll(@NotNull Long telegramId); + + Uni removeByKey(@NotNull Long telegramId, @NotNull ContextKey key); + +} diff --git a/bot-data/bot-data-quarkus/src/main/java/dev/struchkov/godfather/quarkus/data/preser/AnswerSavePreservable.java b/bot-data/bot-data-quarkus/src/main/java/dev/struchkov/godfather/quarkus/data/preser/AnswerSavePreservable.java new file mode 100644 index 0000000..c7d3579 --- /dev/null +++ b/bot-data/bot-data-quarkus/src/main/java/dev/struchkov/godfather/quarkus/data/preser/AnswerSavePreservable.java @@ -0,0 +1,15 @@ +package dev.struchkov.godfather.quarkus.data.preser; + +import dev.struchkov.godfather.quarkus.context.service.Pusher; +import io.smallrye.mutiny.Uni; + +public interface AnswerSavePreservable extends Preservable { + + /** + * Финальное сохранение, можно реализовать как отправку данных куда-то + * + * @param personId Идентификатор пользователя + */ + Uni push(Long personId, Pusher pusher); + +} diff --git a/bot-data/bot-data-quarkus/src/main/java/dev/struchkov/godfather/quarkus/data/preser/Preservable.java b/bot-data/bot-data-quarkus/src/main/java/dev/struchkov/godfather/quarkus/data/preser/Preservable.java new file mode 100644 index 0000000..eb5b6a2 --- /dev/null +++ b/bot-data/bot-data-quarkus/src/main/java/dev/struchkov/godfather/quarkus/data/preser/Preservable.java @@ -0,0 +1,26 @@ +package dev.struchkov.godfather.quarkus.data.preser; + +import io.smallrye.mutiny.Uni; + +import java.util.Map; + +/** + * Интерфейс для сохранения и взаимодейтсвия с ответами прав пользователя. + * + * @author upagge [11/07/2019] + */ +public interface Preservable { + + /** + * Сохранение данных для пользователя + * + * @param personId Идентификатор пользователя + * @param save Объект данных + */ + Uni save(Long personId, String key, S save); + + Uni getByKey(Long personId, String key); + + Uni> getAllSaveElement(Long personId); + +} diff --git a/bot-data/bot-data-quarkus/src/main/java/dev/struchkov/godfather/quarkus/data/repository/PersonSettingRepository.java b/bot-data/bot-data-quarkus/src/main/java/dev/struchkov/godfather/quarkus/data/repository/PersonSettingRepository.java new file mode 100644 index 0000000..058aa5a --- /dev/null +++ b/bot-data/bot-data-quarkus/src/main/java/dev/struchkov/godfather/quarkus/data/repository/PersonSettingRepository.java @@ -0,0 +1,17 @@ +package dev.struchkov.godfather.quarkus.data.repository; + +import io.smallrye.mutiny.Uni; + +import java.util.Set; + +public interface PersonSettingRepository { + + Uni> findAllByAllowedProcessing(Set personIds); + + Uni disableMessageProcessing(Long personId); + + Uni enableMessageProcessing(Long personId); + + Uni findStateByPersonId(Long personId); + +} diff --git a/bot-data/bot-data-quarkus/src/main/java/dev/struchkov/godfather/quarkus/data/repository/StorylineRepository.java b/bot-data/bot-data-quarkus/src/main/java/dev/struchkov/godfather/quarkus/data/repository/StorylineRepository.java new file mode 100644 index 0000000..29a0196 --- /dev/null +++ b/bot-data/bot-data-quarkus/src/main/java/dev/struchkov/godfather/quarkus/data/repository/StorylineRepository.java @@ -0,0 +1,17 @@ +package dev.struchkov.godfather.quarkus.data.repository; + +import dev.struchkov.godfather.main.domain.StorylineHistory; +import io.smallrye.mutiny.Uni; +import org.jetbrains.annotations.NotNull; + +public interface StorylineRepository { + + Uni save(@NotNull StorylineHistory storylineHistory); + + Uni findByCountLast(long personId, int countUnitsToBack); + + Uni findByCountLast(long personId, String unitName); + + Uni cleanHistoryByPersonId(@NotNull Long personId); + +} diff --git a/bot-data/bot-data-quarkus/src/main/java/dev/struchkov/godfather/quarkus/data/repository/UnitPointerRepository.java b/bot-data/bot-data-quarkus/src/main/java/dev/struchkov/godfather/quarkus/data/repository/UnitPointerRepository.java new file mode 100644 index 0000000..9776ff5 --- /dev/null +++ b/bot-data/bot-data-quarkus/src/main/java/dev/struchkov/godfather/quarkus/data/repository/UnitPointerRepository.java @@ -0,0 +1,18 @@ +package dev.struchkov.godfather.quarkus.data.repository; + +import dev.struchkov.godfather.main.domain.UnitPointer; +import io.smallrye.mutiny.Uni; +import org.jetbrains.annotations.NotNull; + +/** + * Контракт для сохранения позиции пользователя в сценарии. + */ +public interface UnitPointerRepository { + + Uni save(@NotNull UnitPointer unitPointer); + + Uni findUnitNameByPersonId(@NotNull Long personId); + + Uni removeByPersonId(@NotNull Long personId); + +} diff --git a/bot-data/bot-data-quarkus/src/main/java/dev/struchkov/godfather/quarkus/data/repository/impl/AnswerSaveMapPreservable.java b/bot-data/bot-data-quarkus/src/main/java/dev/struchkov/godfather/quarkus/data/repository/impl/AnswerSaveMapPreservable.java new file mode 100644 index 0000000..8590f41 --- /dev/null +++ b/bot-data/bot-data-quarkus/src/main/java/dev/struchkov/godfather/quarkus/data/repository/impl/AnswerSaveMapPreservable.java @@ -0,0 +1,53 @@ +package dev.struchkov.godfather.quarkus.data.repository.impl; + +import dev.struchkov.godfather.quarkus.context.service.Pusher; +import dev.struchkov.godfather.quarkus.data.preser.AnswerSavePreservable; +import io.smallrye.mutiny.Uni; + +import java.util.HashMap; +import java.util.Map; + +import static dev.struchkov.haiti.utils.Checker.checkNotEmpty; +import static dev.struchkov.haiti.utils.Checker.checkNotNull; + +public class AnswerSaveMapPreservable implements AnswerSavePreservable { + + private final Map> saveMap = new HashMap<>(); + + @Override + public Uni save(Long personId, String key, S save) { + saveMap.computeIfAbsent(personId, k -> new HashMap<>()).put(key, save); + return Uni.createFrom().voidItem(); + } + + @Override + public Uni getByKey(Long personId, String key) { + if (saveMap.containsKey(personId) + && saveMap.get(personId).containsKey(key)) { + return Uni.createFrom().item(saveMap.get(personId).get(key)); + } + return Uni.createFrom().nullItem(); + } + + @Override + public Uni> getAllSaveElement(Long personId) { + return Uni.createFrom().item(saveMap.get(personId)); + } + + @Override + public Uni push(Long personId, Pusher pusher) { + if (checkNotNull(pusher)) { + return getAllSaveElement(personId).onItem() + .transformToUni( + allItems -> { + if (checkNotEmpty(allItems)) { + return pusher.push(personId, allItems); + } + return Uni.createFrom().nullItem(); + } + ); + } + return Uni.createFrom().voidItem(); + } + +} diff --git a/bot-data/bot-data-quarkus/src/main/java/dev/struchkov/godfather/quarkus/data/repository/impl/PersonSettingLocalRepository.java b/bot-data/bot-data-quarkus/src/main/java/dev/struchkov/godfather/quarkus/data/repository/impl/PersonSettingLocalRepository.java new file mode 100644 index 0000000..92ac04f --- /dev/null +++ b/bot-data/bot-data-quarkus/src/main/java/dev/struchkov/godfather/quarkus/data/repository/impl/PersonSettingLocalRepository.java @@ -0,0 +1,41 @@ +package dev.struchkov.godfather.quarkus.data.repository.impl; + +import dev.struchkov.godfather.quarkus.data.repository.PersonSettingRepository; +import io.smallrye.mutiny.Uni; + +import java.util.HashMap; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +public class PersonSettingLocalRepository implements PersonSettingRepository { + + private final Map map = new HashMap<>(); + + @Override + public Uni> findAllByAllowedProcessing(Set personIds) { + return Uni.createFrom().item( + personIds.stream() + .filter(map::get) + .collect(Collectors.toSet()) + ); + } + + @Override + public Uni disableMessageProcessing(Long personId) { + map.put(personId, false); + return Uni.createFrom().voidItem(); + } + + @Override + public Uni enableMessageProcessing(Long personId) { + map.put(personId, true); + return Uni.createFrom().voidItem(); + } + + @Override + public Uni findStateByPersonId(Long personId) { + return Uni.createFrom().item(map.get(personId)); + } + +} diff --git a/bot-data/bot-data-quarkus/src/main/java/dev/struchkov/godfather/quarkus/data/repository/impl/StorylineMapRepository.java b/bot-data/bot-data-quarkus/src/main/java/dev/struchkov/godfather/quarkus/data/repository/impl/StorylineMapRepository.java new file mode 100644 index 0000000..dd9de19 --- /dev/null +++ b/bot-data/bot-data-quarkus/src/main/java/dev/struchkov/godfather/quarkus/data/repository/impl/StorylineMapRepository.java @@ -0,0 +1,70 @@ +package dev.struchkov.godfather.quarkus.data.repository.impl; + +import dev.struchkov.godfather.main.domain.StorylineHistory; +import dev.struchkov.godfather.quarkus.data.repository.StorylineRepository; +import io.smallrye.mutiny.Uni; +import org.jetbrains.annotations.NotNull; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.Stack; + +public class StorylineMapRepository implements StorylineRepository { + + private final Map> map = new HashMap<>(); + private final Map> historyUnitName = new HashMap<>(); + + @Override + public Uni save(@NotNull StorylineHistory history) { + final Long personId = history.getPersonId(); + map.computeIfAbsent(personId, k -> new Stack<>()).push(history); + historyUnitName.computeIfAbsent(personId, k -> new HashSet<>()).add(history.getUnitName()); + return Uni.createFrom().voidItem(); + } + + @Override + public Uni findByCountLast(long personId, int countUnitsToBack) { + if (map.containsKey(personId)) { + final Stack stack = map.get(personId); + if (stack.size() < countUnitsToBack) { + countUnitsToBack = stack.size(); + } + StorylineHistory storylineHistory = null; + for (int i = 0; i < countUnitsToBack; i++) { + storylineHistory = stack.pop(); + historyUnitName.get(personId).remove(storylineHistory.getUnitName()); + } + return Uni.createFrom().item(storylineHistory); + } + return Uni.createFrom().nullItem(); + } + + @Override + public Uni findByCountLast(long personId, String unitName) { + if (map.containsKey(personId)) { + final Stack stack = map.get(personId); + StorylineHistory storylineHistory; + while (!stack.isEmpty() && historyUnitName.get(personId).contains(unitName)) { + storylineHistory = stack.pop(); + historyUnitName.get(personId).remove(storylineHistory.getUnitName()); + if (unitName.equals(storylineHistory.getUnitName())) { + return Uni.createFrom().item(storylineHistory); + } + } + } + return Uni.createFrom().nullItem(); + } + + @Override + public Uni cleanHistoryByPersonId(@NotNull Long personId) { + if (map.containsKey(personId)) { + map.get(personId).clear(); + } else { + map.put(personId, new Stack<>()); + } + return Uni.createFrom().voidItem(); + } + +} diff --git a/bot-data/bot-data-quarkus/src/main/java/dev/struchkov/godfather/quarkus/data/repository/impl/UnitPointLocalRepository.java b/bot-data/bot-data-quarkus/src/main/java/dev/struchkov/godfather/quarkus/data/repository/impl/UnitPointLocalRepository.java new file mode 100644 index 0000000..b490903 --- /dev/null +++ b/bot-data/bot-data-quarkus/src/main/java/dev/struchkov/godfather/quarkus/data/repository/impl/UnitPointLocalRepository.java @@ -0,0 +1,32 @@ +package dev.struchkov.godfather.quarkus.data.repository.impl; + +import dev.struchkov.godfather.main.domain.UnitPointer; +import dev.struchkov.godfather.quarkus.data.repository.UnitPointerRepository; +import io.smallrye.mutiny.Uni; +import org.jetbrains.annotations.NotNull; + +import java.util.HashMap; +import java.util.Map; + +public class UnitPointLocalRepository implements UnitPointerRepository { + + public final Map map = new HashMap<>(); + + @Override + public Uni save(@NotNull UnitPointer unitPointer) { + map.put(unitPointer.getPersonId(), unitPointer.getUnitName()); + return Uni.createFrom().item(unitPointer); + } + + @Override + public Uni findUnitNameByPersonId(@NotNull Long personId) { + return Uni.createFrom().item(map.get(personId)); + } + + @Override + public Uni removeByPersonId(@NotNull Long personId) { + map.remove(personId); + return Uni.createFrom().voidItem(); + } + +} diff --git a/bot-data/bot-data-simple/pom.xml b/bot-data/bot-data-simple/pom.xml new file mode 100644 index 0000000..717b945 --- /dev/null +++ b/bot-data/bot-data-simple/pom.xml @@ -0,0 +1,27 @@ + + + + dev.struchkov.godfather + bot-data + 0.0.25 + + 4.0.0 + + bot-data-simple + + + 17 + 17 + UTF-8 + + + + + dev.struchkov.godfather + bot-context-simple + + + + \ No newline at end of file diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/service/StorylineContext.java b/bot-data/bot-data-simple/src/main/java/dev/struchkov/godfather/simple/data/StorylineContext.java similarity index 84% rename from bot-context/src/main/java/dev/struchkov/godfather/context/service/StorylineContext.java rename to bot-data/bot-data-simple/src/main/java/dev/struchkov/godfather/simple/data/StorylineContext.java index 13c2623..4db7e29 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/service/StorylineContext.java +++ b/bot-data/bot-data-simple/src/main/java/dev/struchkov/godfather/simple/data/StorylineContext.java @@ -1,6 +1,6 @@ -package dev.struchkov.godfather.context.service; +package dev.struchkov.godfather.simple.data; -import dev.struchkov.godfather.context.domain.ContextKey; +import dev.struchkov.godfather.main.domain.ContextKey; import org.jetbrains.annotations.NotNull; import java.util.Map; diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/repository/preser/AnswerSavePreservable.java b/bot-data/bot-data-simple/src/main/java/dev/struchkov/godfather/simple/data/preser/AnswerSavePreservable.java similarity index 74% rename from bot-context/src/main/java/dev/struchkov/godfather/context/repository/preser/AnswerSavePreservable.java rename to bot-data/bot-data-simple/src/main/java/dev/struchkov/godfather/simple/data/preser/AnswerSavePreservable.java index 526fff1..723f804 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/repository/preser/AnswerSavePreservable.java +++ b/bot-data/bot-data-simple/src/main/java/dev/struchkov/godfather/simple/data/preser/AnswerSavePreservable.java @@ -1,6 +1,6 @@ -package dev.struchkov.godfather.context.repository.preser; +package dev.struchkov.godfather.simple.data.preser; -import dev.struchkov.godfather.context.service.save.Pusher; +import dev.struchkov.godfather.simple.context.service.Pusher; public interface AnswerSavePreservable extends Preservable { diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/repository/preser/Preservable.java b/bot-data/bot-data-simple/src/main/java/dev/struchkov/godfather/simple/data/preser/Preservable.java similarity index 91% rename from bot-context/src/main/java/dev/struchkov/godfather/context/repository/preser/Preservable.java rename to bot-data/bot-data-simple/src/main/java/dev/struchkov/godfather/simple/data/preser/Preservable.java index 8910c80..ce4a31a 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/repository/preser/Preservable.java +++ b/bot-data/bot-data-simple/src/main/java/dev/struchkov/godfather/simple/data/preser/Preservable.java @@ -1,4 +1,4 @@ -package dev.struchkov.godfather.context.repository.preser; +package dev.struchkov.godfather.simple.data.preser; import java.util.Map; import java.util.Optional; diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/repository/PersonSettingRepository.java b/bot-data/bot-data-simple/src/main/java/dev/struchkov/godfather/simple/data/repository/PersonSettingRepository.java similarity index 85% rename from bot-context/src/main/java/dev/struchkov/godfather/context/repository/PersonSettingRepository.java rename to bot-data/bot-data-simple/src/main/java/dev/struchkov/godfather/simple/data/repository/PersonSettingRepository.java index c6883d0..20e0645 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/repository/PersonSettingRepository.java +++ b/bot-data/bot-data-simple/src/main/java/dev/struchkov/godfather/simple/data/repository/PersonSettingRepository.java @@ -1,4 +1,4 @@ -package dev.struchkov.godfather.context.repository; +package dev.struchkov.godfather.simple.data.repository; import java.util.Optional; import java.util.Set; diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/repository/StorylineRepository.java b/bot-data/bot-data-simple/src/main/java/dev/struchkov/godfather/simple/data/repository/StorylineRepository.java similarity index 77% rename from bot-context/src/main/java/dev/struchkov/godfather/context/repository/StorylineRepository.java rename to bot-data/bot-data-simple/src/main/java/dev/struchkov/godfather/simple/data/repository/StorylineRepository.java index be1459c..9c2b4e8 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/repository/StorylineRepository.java +++ b/bot-data/bot-data-simple/src/main/java/dev/struchkov/godfather/simple/data/repository/StorylineRepository.java @@ -1,6 +1,6 @@ -package dev.struchkov.godfather.context.repository; +package dev.struchkov.godfather.simple.data.repository; -import dev.struchkov.godfather.context.domain.StorylineHistory; +import dev.struchkov.godfather.main.domain.StorylineHistory; import org.jetbrains.annotations.NotNull; import java.util.Optional; diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/repository/UnitPointerRepository.java b/bot-data/bot-data-simple/src/main/java/dev/struchkov/godfather/simple/data/repository/UnitPointerRepository.java similarity index 78% rename from bot-context/src/main/java/dev/struchkov/godfather/context/repository/UnitPointerRepository.java rename to bot-data/bot-data-simple/src/main/java/dev/struchkov/godfather/simple/data/repository/UnitPointerRepository.java index d261962..58122ac 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/repository/UnitPointerRepository.java +++ b/bot-data/bot-data-simple/src/main/java/dev/struchkov/godfather/simple/data/repository/UnitPointerRepository.java @@ -1,6 +1,6 @@ -package dev.struchkov.godfather.context.repository; +package dev.struchkov.godfather.simple.data.repository; -import dev.struchkov.godfather.context.domain.UnitPointer; +import dev.struchkov.godfather.main.domain.UnitPointer; import org.jetbrains.annotations.NotNull; import java.util.Optional; diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/repository/preser/AnswerSaveMapPreservable.java b/bot-data/bot-data-simple/src/main/java/dev/struchkov/godfather/simple/data/repository/impl/AnswerSaveMapPreservable.java similarity index 83% rename from bot-context/src/main/java/dev/struchkov/godfather/context/repository/preser/AnswerSaveMapPreservable.java rename to bot-data/bot-data-simple/src/main/java/dev/struchkov/godfather/simple/data/repository/impl/AnswerSaveMapPreservable.java index a17effd..a09cf96 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/repository/preser/AnswerSaveMapPreservable.java +++ b/bot-data/bot-data-simple/src/main/java/dev/struchkov/godfather/simple/data/repository/impl/AnswerSaveMapPreservable.java @@ -1,6 +1,7 @@ -package dev.struchkov.godfather.context.repository.preser; +package dev.struchkov.godfather.simple.data.repository.impl; -import dev.struchkov.godfather.context.service.save.Pusher; +import dev.struchkov.godfather.simple.context.service.Pusher; +import dev.struchkov.godfather.simple.data.preser.AnswerSavePreservable; import java.util.HashMap; import java.util.Map; diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/repository/impl/local/PersonSettingLocalRepository.java b/bot-data/bot-data-simple/src/main/java/dev/struchkov/godfather/simple/data/repository/impl/PersonSettingLocalRepository.java similarity index 85% rename from bot-context/src/main/java/dev/struchkov/godfather/context/repository/impl/local/PersonSettingLocalRepository.java rename to bot-data/bot-data-simple/src/main/java/dev/struchkov/godfather/simple/data/repository/impl/PersonSettingLocalRepository.java index 0b301f6..8587803 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/repository/impl/local/PersonSettingLocalRepository.java +++ b/bot-data/bot-data-simple/src/main/java/dev/struchkov/godfather/simple/data/repository/impl/PersonSettingLocalRepository.java @@ -1,6 +1,6 @@ -package dev.struchkov.godfather.context.repository.impl.local; +package dev.struchkov.godfather.simple.data.repository.impl; -import dev.struchkov.godfather.context.repository.PersonSettingRepository; +import dev.struchkov.godfather.simple.data.repository.PersonSettingRepository; import java.util.HashMap; import java.util.Map; diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/repository/impl/local/StorylineMapRepository.java b/bot-data/bot-data-simple/src/main/java/dev/struchkov/godfather/simple/data/repository/impl/StorylineMapRepository.java similarity index 92% rename from bot-context/src/main/java/dev/struchkov/godfather/context/repository/impl/local/StorylineMapRepository.java rename to bot-data/bot-data-simple/src/main/java/dev/struchkov/godfather/simple/data/repository/impl/StorylineMapRepository.java index f3355a6..7128269 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/repository/impl/local/StorylineMapRepository.java +++ b/bot-data/bot-data-simple/src/main/java/dev/struchkov/godfather/simple/data/repository/impl/StorylineMapRepository.java @@ -1,7 +1,7 @@ -package dev.struchkov.godfather.context.repository.impl.local; +package dev.struchkov.godfather.simple.data.repository.impl; -import dev.struchkov.godfather.context.domain.StorylineHistory; -import dev.struchkov.godfather.context.repository.StorylineRepository; +import dev.struchkov.godfather.main.domain.StorylineHistory; +import dev.struchkov.godfather.simple.data.repository.StorylineRepository; import org.jetbrains.annotations.NotNull; import java.util.HashMap; diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/repository/impl/local/UnitPointLocalRepository.java b/bot-data/bot-data-simple/src/main/java/dev/struchkov/godfather/simple/data/repository/impl/UnitPointLocalRepository.java similarity index 78% rename from bot-context/src/main/java/dev/struchkov/godfather/context/repository/impl/local/UnitPointLocalRepository.java rename to bot-data/bot-data-simple/src/main/java/dev/struchkov/godfather/simple/data/repository/impl/UnitPointLocalRepository.java index 5a5d17a..70f07bc 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/repository/impl/local/UnitPointLocalRepository.java +++ b/bot-data/bot-data-simple/src/main/java/dev/struchkov/godfather/simple/data/repository/impl/UnitPointLocalRepository.java @@ -1,7 +1,7 @@ -package dev.struchkov.godfather.context.repository.impl.local; +package dev.struchkov.godfather.simple.data.repository.impl; -import dev.struchkov.godfather.context.domain.UnitPointer; -import dev.struchkov.godfather.context.repository.UnitPointerRepository; +import dev.struchkov.godfather.main.domain.UnitPointer; +import dev.struchkov.godfather.simple.data.repository.UnitPointerRepository; import org.jetbrains.annotations.NotNull; import java.util.HashMap; diff --git a/bot-data/pom.xml b/bot-data/pom.xml new file mode 100644 index 0000000..d371d92 --- /dev/null +++ b/bot-data/pom.xml @@ -0,0 +1,27 @@ + + + + dev.struchkov.godfather + godfather-bot + 0.0.25 + + 4.0.0 + + bot-data + pom + + + bot-data-main + bot-data-quarkus + bot-data-simple + + + + 17 + 17 + UTF-8 + + + \ No newline at end of file diff --git a/bot-domain/bot-domain-main/pom.xml b/bot-domain/bot-domain-main/pom.xml new file mode 100644 index 0000000..2d117e3 --- /dev/null +++ b/bot-domain/bot-domain-main/pom.xml @@ -0,0 +1,32 @@ + + + + bot-domain + dev.struchkov.godfather + 0.0.25 + + 4.0.0 + + bot-domain-main + + + 17 + 17 + UTF-8 + + + + + dev.struchkov.godfather + bot-exception + + + + dev.struchkov + autoresponder + + + + \ No newline at end of file diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/BoxAnswer.java b/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/BoxAnswer.java similarity index 96% rename from bot-context/src/main/java/dev/struchkov/godfather/context/domain/BoxAnswer.java rename to bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/BoxAnswer.java index 5392893..9e4f426 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/BoxAnswer.java +++ b/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/BoxAnswer.java @@ -1,6 +1,6 @@ -package dev.struchkov.godfather.context.domain; +package dev.struchkov.godfather.main.domain; -import dev.struchkov.godfather.context.domain.keyboard.KeyBoard; +import dev.struchkov.godfather.main.domain.keyboard.KeyBoard; /** * Контейнер, которые содержит данные, которые будут отправлены пользователю как ответ на его запрос. diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/ContextKey.java b/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/ContextKey.java similarity index 89% rename from bot-context/src/main/java/dev/struchkov/godfather/context/domain/ContextKey.java rename to bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/ContextKey.java index e6ac5cf..6e4f32a 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/ContextKey.java +++ b/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/ContextKey.java @@ -1,4 +1,4 @@ -package dev.struchkov.godfather.context.domain; +package dev.struchkov.godfather.main.domain; public interface ContextKey { diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/service/sender/SendType.java b/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/SendType.java similarity index 76% rename from bot-context/src/main/java/dev/struchkov/godfather/context/service/sender/SendType.java rename to bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/SendType.java index 405a7d5..ca257bc 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/service/sender/SendType.java +++ b/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/SendType.java @@ -1,4 +1,4 @@ -package dev.struchkov.godfather.context.service.sender; +package dev.struchkov.godfather.main.domain; /** * Тип объекта отправляющего ответы пользователю. diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/StorylineHistory.java b/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/StorylineHistory.java similarity index 76% rename from bot-context/src/main/java/dev/struchkov/godfather/context/domain/StorylineHistory.java rename to bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/StorylineHistory.java index 54494df..9c05920 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/StorylineHistory.java +++ b/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/StorylineHistory.java @@ -1,8 +1,9 @@ -package dev.struchkov.godfather.context.domain; +package dev.struchkov.godfather.main.domain; -import dev.struchkov.godfather.context.domain.content.Message; -public class StorylineHistory extends BasicEntity { +import dev.struchkov.godfather.main.domain.content.Message; + +public class StorylineHistory { private Long personId; private String unitName; diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/UnitDefinition.java b/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/UnitDefinition.java similarity index 97% rename from bot-context/src/main/java/dev/struchkov/godfather/context/domain/UnitDefinition.java rename to bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/UnitDefinition.java index a361bbc..50cb80b 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/UnitDefinition.java +++ b/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/UnitDefinition.java @@ -1,4 +1,4 @@ -package dev.struchkov.godfather.context.domain; +package dev.struchkov.godfather.main.domain; import java.lang.reflect.Method; import java.util.HashSet; diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/UnitPointer.java b/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/UnitPointer.java similarity index 94% rename from bot-context/src/main/java/dev/struchkov/godfather/context/domain/UnitPointer.java rename to bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/UnitPointer.java index 882adfc..647655e 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/UnitPointer.java +++ b/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/UnitPointer.java @@ -1,4 +1,4 @@ -package dev.struchkov.godfather.context.domain; +package dev.struchkov.godfather.main.domain; import java.util.Objects; diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/annotation/Unit.java b/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/annotation/Unit.java similarity index 87% rename from bot-context/src/main/java/dev/struchkov/godfather/context/domain/annotation/Unit.java rename to bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/annotation/Unit.java index 65b895c..143432a 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/annotation/Unit.java +++ b/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/annotation/Unit.java @@ -1,4 +1,4 @@ -package dev.struchkov.godfather.context.domain.annotation; +package dev.struchkov.godfather.main.domain.annotation; import java.lang.annotation.Retention; import java.lang.annotation.Target; diff --git a/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/content/Attachment.java b/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/content/Attachment.java new file mode 100644 index 0000000..a10dfb2 --- /dev/null +++ b/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/content/Attachment.java @@ -0,0 +1,7 @@ +package dev.struchkov.godfather.main.domain.content; + +public abstract class Attachment { + + public abstract String getType(); + +} diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/content/ContentType.java b/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/content/ContentType.java similarity index 77% rename from bot-context/src/main/java/dev/struchkov/godfather/context/domain/content/ContentType.java rename to bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/content/ContentType.java index 0f304b5..072d529 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/content/ContentType.java +++ b/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/content/ContentType.java @@ -1,4 +1,4 @@ -package dev.struchkov.godfather.context.domain.content; +package dev.struchkov.godfather.main.domain.content; /** * Тип сообщения от пользователя {@link Message}. diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/content/EmptyMessage.java b/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/content/EmptyMessage.java similarity index 78% rename from bot-context/src/main/java/dev/struchkov/godfather/context/domain/content/EmptyMessage.java rename to bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/content/EmptyMessage.java index 15bb442..92e799b 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/content/EmptyMessage.java +++ b/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/content/EmptyMessage.java @@ -1,6 +1,6 @@ -package dev.struchkov.godfather.context.domain.content; +package dev.struchkov.godfather.main.domain.content; -import dev.struchkov.godfather.context.exception.AppBotException; +import dev.struchkov.godfather.exception.AppBotException; /** * Заглушка для сообщения от пользователя. diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/content/Mail.java b/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/content/Mail.java similarity index 74% rename from bot-context/src/main/java/dev/struchkov/godfather/context/domain/content/Mail.java rename to bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/content/Mail.java index 5cab808..fde02b1 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/content/Mail.java +++ b/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/content/Mail.java @@ -1,13 +1,7 @@ -package dev.struchkov.godfather.context.domain.content; +package dev.struchkov.godfather.main.domain.content; -import dev.struchkov.godfather.context.domain.content.attachment.Attachment; -import dev.struchkov.godfather.context.domain.event.Event; +import dev.struchkov.godfather.main.domain.event.Event; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.OneToMany; -import javax.persistence.Table; import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -17,8 +11,7 @@ import java.util.List; * * @author upagge [08/07/2019] */ -@Entity -@Table(name = "mail") + public class Mail extends Message implements Event { public static final String TYPE = "MAIL"; @@ -26,27 +19,21 @@ public class Mail extends Message implements Event { /** * Имя отправителя. */ - @Column(name = "first_name") private String firstName; /** * Фамилия отправителя. */ - @Column(name = "last_name") private String lastName; /** * Вложения к сообщению. */ - @Column(name = "attachment") - @OneToMany(fetch = FetchType.LAZY) private List attachments = new ArrayList<>(); /** * Пересланные сообщения. */ - @OneToMany - @Column(name = "forward_mail") private List forwardMail; public Mail() { diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/content/Message.java b/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/content/Message.java similarity index 59% rename from bot-context/src/main/java/dev/struchkov/godfather/context/domain/content/Message.java rename to bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/content/Message.java index 3e9d336..d85a72a 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/content/Message.java +++ b/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/content/Message.java @@ -1,13 +1,7 @@ -package dev.struchkov.godfather.context.domain.content; +package dev.struchkov.godfather.main.domain.content; import dev.struchkov.autoresponder.entity.DeliverableText; -import dev.struchkov.godfather.context.domain.BasicEntity; -import javax.persistence.Column; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.MappedSuperclass; -import javax.validation.constraints.NotNull; import java.time.LocalDateTime; import java.util.Objects; @@ -16,51 +10,36 @@ import java.util.Objects; * * @author upagge [08/07/2019] */ -@MappedSuperclass -public abstract class Message extends BasicEntity implements DeliverableText { +public abstract class Message implements DeliverableText { /** * Тип сообщения. */ - @Column(name = "type") - @Enumerated(value = EnumType.STRING) protected ContentType contentType; /** * Дата создания. */ - @NotNull - @Column(name = "create_date") private LocalDateTime createDate; - /** - * Дата добавления в базу. - */ - @Column(name = "add_date") - private LocalDateTime addDate; - /** * Идентификатор пользователя, отправившего сообщение. */ - @NotNull - @Column(name = "person_id") private Long personId; /** * Текстовое сообщение. */ - @Column(name = "text") private String text; - public Message(Message source) { + protected Message(Message source) { this.personId = source.getPersonId(); this.text = source.getText(); this.createDate = source.getCreateDate(); - this.id = source.getPersonId(); this.contentType = source.getContentType(); } - public Message() { + protected Message() { } public ContentType getContentType() { @@ -79,14 +58,6 @@ public abstract class Message extends BasicEntity implements DeliverableText { this.createDate = createDate; } - public LocalDateTime getAddDate() { - return addDate; - } - - public void setAddDate(LocalDateTime addDate) { - this.addDate = addDate; - } - public Long getPersonId() { return personId; } @@ -108,12 +79,11 @@ public abstract class Message extends BasicEntity implements DeliverableText { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Message message = (Message) o; - return contentType == message.contentType && Objects.equals(createDate, message.createDate) && Objects.equals(addDate, message.addDate) && Objects.equals(personId, message.personId) && Objects.equals(text, message.text); + return contentType == message.contentType && Objects.equals(createDate, message.createDate) && Objects.equals(personId, message.personId) && Objects.equals(text, message.text); } @Override public int hashCode() { - return Objects.hash(contentType, createDate, addDate, personId, text); + return Objects.hash(contentType, createDate, personId, text); } - } diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/event/Event.java b/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/event/Event.java similarity index 51% rename from bot-context/src/main/java/dev/struchkov/godfather/context/domain/event/Event.java rename to bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/event/Event.java index 8394969..808e7ea 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/event/Event.java +++ b/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/event/Event.java @@ -1,4 +1,4 @@ -package dev.struchkov.godfather.context.domain.event; +package dev.struchkov.godfather.main.domain.event; public interface Event { diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/keyboard/KeyBoard.java b/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/keyboard/KeyBoard.java similarity index 66% rename from bot-context/src/main/java/dev/struchkov/godfather/context/domain/keyboard/KeyBoard.java rename to bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/keyboard/KeyBoard.java index 12c6413..8c537b1 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/keyboard/KeyBoard.java +++ b/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/keyboard/KeyBoard.java @@ -1,4 +1,4 @@ -package dev.struchkov.godfather.context.domain.keyboard; +package dev.struchkov.godfather.main.domain.keyboard; import java.util.List; diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/keyboard/KeyBoardButton.java b/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/keyboard/KeyBoardButton.java similarity index 51% rename from bot-context/src/main/java/dev/struchkov/godfather/context/domain/keyboard/KeyBoardButton.java rename to bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/keyboard/KeyBoardButton.java index 4d6e5c7..c172c1a 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/keyboard/KeyBoardButton.java +++ b/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/keyboard/KeyBoardButton.java @@ -1,4 +1,4 @@ -package dev.struchkov.godfather.context.domain.keyboard; +package dev.struchkov.godfather.main.domain.keyboard; public interface KeyBoardButton { diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/keyboard/KeyBoardLine.java b/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/keyboard/KeyBoardLine.java similarity index 65% rename from bot-context/src/main/java/dev/struchkov/godfather/context/domain/keyboard/KeyBoardLine.java rename to bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/keyboard/KeyBoardLine.java index e5c79d5..83a6d6c 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/keyboard/KeyBoardLine.java +++ b/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/keyboard/KeyBoardLine.java @@ -1,4 +1,4 @@ -package dev.struchkov.godfather.context.domain.keyboard; +package dev.struchkov.godfather.main.domain.keyboard; import java.util.List; diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/keyboard/button/SimpleButton.java b/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/keyboard/button/SimpleButton.java similarity index 92% rename from bot-context/src/main/java/dev/struchkov/godfather/context/domain/keyboard/button/SimpleButton.java rename to bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/keyboard/button/SimpleButton.java index 1dfcbee..dac645d 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/keyboard/button/SimpleButton.java +++ b/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/keyboard/button/SimpleButton.java @@ -1,6 +1,6 @@ -package dev.struchkov.godfather.context.domain.keyboard.button; +package dev.struchkov.godfather.main.domain.keyboard.button; -import dev.struchkov.godfather.context.domain.keyboard.KeyBoardButton; +import dev.struchkov.godfather.main.domain.keyboard.KeyBoardButton; import org.jetbrains.annotations.NotNull; import java.util.Objects; diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/keyboard/simple/SimpleKeyBoard.java b/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/keyboard/simple/SimpleKeyBoard.java similarity index 85% rename from bot-context/src/main/java/dev/struchkov/godfather/context/domain/keyboard/simple/SimpleKeyBoard.java rename to bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/keyboard/simple/SimpleKeyBoard.java index 1b32b53..430002d 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/keyboard/simple/SimpleKeyBoard.java +++ b/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/keyboard/simple/SimpleKeyBoard.java @@ -1,8 +1,8 @@ -package dev.struchkov.godfather.context.domain.keyboard.simple; +package dev.struchkov.godfather.main.domain.keyboard.simple; -import dev.struchkov.godfather.context.domain.keyboard.KeyBoard; -import dev.struchkov.godfather.context.domain.keyboard.KeyBoardButton; -import dev.struchkov.godfather.context.domain.keyboard.KeyBoardLine; +import dev.struchkov.godfather.main.domain.keyboard.KeyBoard; +import dev.struchkov.godfather.main.domain.keyboard.KeyBoardButton; +import dev.struchkov.godfather.main.domain.keyboard.KeyBoardLine; import java.util.ArrayList; import java.util.List; diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/keyboard/simple/SimpleKeyBoardLine.java b/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/keyboard/simple/SimpleKeyBoardLine.java similarity index 87% rename from bot-context/src/main/java/dev/struchkov/godfather/context/domain/keyboard/simple/SimpleKeyBoardLine.java rename to bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/keyboard/simple/SimpleKeyBoardLine.java index 30638ab..4894287 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/keyboard/simple/SimpleKeyBoardLine.java +++ b/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/keyboard/simple/SimpleKeyBoardLine.java @@ -1,7 +1,7 @@ -package dev.struchkov.godfather.context.domain.keyboard.simple; +package dev.struchkov.godfather.main.domain.keyboard.simple; -import dev.struchkov.godfather.context.domain.keyboard.KeyBoardButton; -import dev.struchkov.godfather.context.domain.keyboard.KeyBoardLine; +import dev.struchkov.godfather.main.domain.keyboard.KeyBoardButton; +import dev.struchkov.godfather.main.domain.keyboard.KeyBoardLine; import java.util.ArrayList; import java.util.Arrays; diff --git a/bot-domain/pom.xml b/bot-domain/pom.xml new file mode 100644 index 0000000..f44a2ff --- /dev/null +++ b/bot-domain/pom.xml @@ -0,0 +1,24 @@ + + + + godfather-bot + dev.struchkov.godfather + 0.0.25 + + 4.0.0 + + bot-domain + pom + + bot-domain-main + + + + 17 + 17 + UTF-8 + + + \ No newline at end of file diff --git a/bot-exception/pom.xml b/bot-exception/pom.xml new file mode 100644 index 0000000..c10ac7c --- /dev/null +++ b/bot-exception/pom.xml @@ -0,0 +1,20 @@ + + + + dev.struchkov.godfather + godfather-bot + 0.0.25 + + 4.0.0 + + bot-exception + + + 17 + 17 + UTF-8 + + + \ No newline at end of file diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/exception/AccessException.java b/bot-exception/src/main/java/dev/struchkov/godfather/exception/AccessException.java similarity index 81% rename from bot-context/src/main/java/dev/struchkov/godfather/context/exception/AccessException.java rename to bot-exception/src/main/java/dev/struchkov/godfather/exception/AccessException.java index f89587c..2412c1d 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/exception/AccessException.java +++ b/bot-exception/src/main/java/dev/struchkov/godfather/exception/AccessException.java @@ -1,4 +1,4 @@ -package dev.struchkov.godfather.context.exception; +package dev.struchkov.godfather.exception; /** * Ошибка доступа к чему-либо. diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/exception/AppBotException.java b/bot-exception/src/main/java/dev/struchkov/godfather/exception/AppBotException.java similarity index 91% rename from bot-context/src/main/java/dev/struchkov/godfather/context/exception/AppBotException.java rename to bot-exception/src/main/java/dev/struchkov/godfather/exception/AppBotException.java index f5ac30b..ff19086 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/exception/AppBotException.java +++ b/bot-exception/src/main/java/dev/struchkov/godfather/exception/AppBotException.java @@ -1,4 +1,4 @@ -package dev.struchkov.godfather.context.exception; +package dev.struchkov.godfather.exception; import java.time.LocalDateTime; diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/exception/ConfigAppException.java b/bot-exception/src/main/java/dev/struchkov/godfather/exception/ConfigAppException.java similarity index 82% rename from bot-context/src/main/java/dev/struchkov/godfather/context/exception/ConfigAppException.java rename to bot-exception/src/main/java/dev/struchkov/godfather/exception/ConfigAppException.java index cb31393..7779a51 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/exception/ConfigAppException.java +++ b/bot-exception/src/main/java/dev/struchkov/godfather/exception/ConfigAppException.java @@ -1,4 +1,4 @@ -package dev.struchkov.godfather.context.exception; +package dev.struchkov.godfather.exception; /** * Исключения настройки бота. diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/exception/MailSendException.java b/bot-exception/src/main/java/dev/struchkov/godfather/exception/MailSendException.java similarity index 84% rename from bot-context/src/main/java/dev/struchkov/godfather/context/exception/MailSendException.java rename to bot-exception/src/main/java/dev/struchkov/godfather/exception/MailSendException.java index 067a553..4389c41 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/exception/MailSendException.java +++ b/bot-exception/src/main/java/dev/struchkov/godfather/exception/MailSendException.java @@ -1,4 +1,4 @@ -package dev.struchkov.godfather.context.exception; +package dev.struchkov.godfather.exception; /** * Ошибки при отправке сообщений. diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/exception/PaymentException.java b/bot-exception/src/main/java/dev/struchkov/godfather/exception/PaymentException.java similarity index 80% rename from bot-context/src/main/java/dev/struchkov/godfather/context/exception/PaymentException.java rename to bot-exception/src/main/java/dev/struchkov/godfather/exception/PaymentException.java index 2d65297..ad5ec04 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/exception/PaymentException.java +++ b/bot-exception/src/main/java/dev/struchkov/godfather/exception/PaymentException.java @@ -1,4 +1,4 @@ -package dev.struchkov.godfather.context.exception; +package dev.struchkov.godfather.exception; /** * Ошибка оплаты. diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/exception/RollBackException.java b/bot-exception/src/main/java/dev/struchkov/godfather/exception/RollBackException.java similarity index 88% rename from bot-context/src/main/java/dev/struchkov/godfather/context/exception/RollBackException.java rename to bot-exception/src/main/java/dev/struchkov/godfather/exception/RollBackException.java index f6d29f2..cb2155a 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/exception/RollBackException.java +++ b/bot-exception/src/main/java/dev/struchkov/godfather/exception/RollBackException.java @@ -1,4 +1,4 @@ -package dev.struchkov.godfather.context.exception; +package dev.struchkov.godfather.exception; import java.util.function.Supplier; diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/exception/UnitConfigException.java b/bot-exception/src/main/java/dev/struchkov/godfather/exception/UnitConfigException.java similarity index 54% rename from bot-context/src/main/java/dev/struchkov/godfather/context/exception/UnitConfigException.java rename to bot-exception/src/main/java/dev/struchkov/godfather/exception/UnitConfigException.java index 6f7c4e3..6f92d10 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/exception/UnitConfigException.java +++ b/bot-exception/src/main/java/dev/struchkov/godfather/exception/UnitConfigException.java @@ -1,6 +1,4 @@ -package dev.struchkov.godfather.context.exception; - -import dev.struchkov.haiti.context.exception.NotFoundException; +package dev.struchkov.godfather.exception; import java.text.MessageFormat; import java.util.function.Supplier; @@ -10,7 +8,7 @@ import java.util.function.Supplier; * * @author upagge 28.04.2022 */ -public class UnitConfigException extends AppBotException{ +public class UnitConfigException extends AppBotException { public UnitConfigException(String message) { super(message); @@ -20,8 +18,8 @@ public class UnitConfigException extends AppBotException{ super(MessageFormat.format(message, objects)); } - public static Supplier unitConfigException(String message, Object... objects) { - return () -> new NotFoundException(message, objects); + public static Supplier unitConfigException(String message, Object... objects) { + return () -> new UnitConfigException(message, objects); } } diff --git a/pom.xml b/pom.xml index a0d8aef..809961f 100644 --- a/pom.xml +++ b/pom.xml @@ -12,6 +12,9 @@ bot-context bot-core + bot-data + bot-exception + bot-domain GodFather Bot @@ -54,8 +57,61 @@ dev.struchkov.godfather - bot-context - ${godfather.core.ver} + bot-exception + ${project.version} + + + dev.struchkov.godfather + bot-domain-main + ${project.version} + + + + dev.struchkov.godfather + bot-context-main + ${project.version} + + + dev.struchkov.godfather + bot-context-quarkus + ${project.version} + + + dev.struchkov.godfather + bot-context-simple + ${project.version} + + + + dev.struchkov.godfather + bot-core-main + ${project.version} + + + dev.struchkov.godfather + bot-core-simple + ${project.version} + + + dev.struchkov.godfather + bot-core-quarkus + ${project.version} + + + + dev.struchkov.godfather + bot-data-main + ${project.version} + + + dev.struchkov.godfather + bot-data-simple + ${project.version} + + + dev.struchkov.godfather + bot-data-quarkus + ${project.version} @@ -63,6 +119,7 @@ autoresponder ${autoresponder.ver} + dev.struchkov.haiti haiti-utils @@ -85,6 +142,12 @@ ${jetbrains.annotations.ver} + + io.smallrye.reactive + smallrye-mutiny-vertx-core + 2.24.1 + + org.slf4j slf4j-api