From cd01b078a9b21230db94360fa6cb12aee2639b37 Mon Sep 17 00:00:00 2001 From: Struchkov Mark Date: Sun, 26 Mar 2023 17:37:34 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D1=80=D0=B0=D0=B1?= =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=B0=20=D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D1=81=D0=BE=D0=B1=D1=8B=D1=82=D0=B8=D0=B9?= =?UTF-8?q?=20=D0=BE=D1=82=20=D1=82=D0=B5=D0=BB=D0=B5=D0=B3=D1=80=D0=B0?= =?UTF-8?q?=D0=BC=D0=B0=20=D0=B4=D0=BB=D1=8F=20=D0=BF=D0=BE=D0=B4=D0=B4?= =?UTF-8?q?=D0=B5=D1=80=D0=B6=D0=BA=D0=B8=20=D0=BC=D0=B8=D0=BA=D1=80=D0=BE?= =?UTF-8?q?=D1=81=D0=B5=D1=80=D0=B2=D0=B8=D1=81=D0=BD=D0=BE=D0=B9=20=D0=B0?= =?UTF-8?q?=D1=80=D1=85=D0=B8=D1=82=D0=B5=D0=BA=D1=82=D1=83=D1=80=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../context/service/EventDispatching.java | 11 ++ .../quarkus/context/service/EventHandler.java | 5 +- .../context/service/EventDispatching.java | 9 ++ .../simple/context/service/EventHandler.java | 6 +- bot-context/pom.xml | 4 - .../godfather/main/core/utils/Parser.java | 41 +++++ .../quarkus/core/EventDispatchingImpl.java | 49 ++++++ .../quarkus/core/GeneralAutoResponder.java | 9 +- .../godfather/quarkus/core/Responder.java | 148 +++++++++++++++++ .../core/provider/StoryLineHandler.java | 9 +- .../core/util/UnitPriorityComparator.java | 19 +++ .../simple/core/EventDispatchingImpl.java | 37 +++++ .../simple/core/GeneralAutoResponder.java | 1 - .../godfather/simple/core/Responder.java | 149 ++++++++++++++++++ .../core/provider/ChatStoryLineHandler.java | 9 +- .../core/provider/PersonStoryLineHandler.java | 9 +- .../core/service/StorylineMailService.java | 3 +- .../core/util/UnitPriorityComparator.java | 19 +++ bot-domain/bot-domain-main/pom.xml | 12 +- .../godfather/main/domain/EventContainer.java | 20 +++ .../main/domain/content/Attachment.java | 12 +- .../godfather/main/domain/content/Mail.java | 5 +- .../main/domain/content/Message.java | 32 ++-- .../TelegramEventContainerDeserializer.java | 36 +++++ .../jackson/TelegramPayloadDeserializer.java | 58 +++++++ .../jackson/TelegramPayloadSerializer.java | 38 +++++ .../godfather/main/domain/unit/KeyWord.java | 35 ++++ .../quarkus/domain/unit/AnswerCheck.java | 16 +- .../quarkus/domain/unit/AnswerSave.java | 16 +- .../quarkus/domain/unit/AnswerText.java | 16 +- .../quarkus/domain/unit/MainUnit.java | 116 ++++++++------ .../quarkus/domain/unit/cmd/ReplaceCmd.java | 17 +- .../quarkus/domain/unit/cmd/RollBackCmd.java | 16 +- .../domain/unit/func/UniPredicate.java | 9 ++ .../simple/domain/unit/AnswerCheck.java | 10 +- .../simple/domain/unit/AnswerSave.java | 10 +- .../simple/domain/unit/AnswerText.java | 10 +- .../simple/domain/unit/MainUnit.java | 112 +++++++------ .../simple/domain/unit/cmd/ReplaceCmd.java | 11 +- .../simple/domain/unit/cmd/RollBackCmd.java | 10 +- pom.xml | 16 +- 41 files changed, 943 insertions(+), 227 deletions(-) create mode 100644 bot-context/bot-context-quarkus/src/main/java/dev/struchkov/godfather/quarkus/context/service/EventDispatching.java create mode 100644 bot-context/bot-context-simple/src/main/java/dev/struchkov/godfather/simple/context/service/EventDispatching.java create mode 100644 bot-core/bot-core-main/src/main/java/dev/struchkov/godfather/main/core/utils/Parser.java create mode 100644 bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/EventDispatchingImpl.java create mode 100644 bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/Responder.java create mode 100644 bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/util/UnitPriorityComparator.java create mode 100644 bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/EventDispatchingImpl.java create mode 100644 bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/Responder.java create mode 100644 bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/util/UnitPriorityComparator.java create mode 100644 bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/EventContainer.java create mode 100644 bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/jackson/TelegramEventContainerDeserializer.java create mode 100644 bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/jackson/TelegramPayloadDeserializer.java create mode 100644 bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/jackson/TelegramPayloadSerializer.java create mode 100644 bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/unit/KeyWord.java create mode 100644 bot-domain/bot-domain-quarkus/src/main/java/dev/struchkov/godfather/quarkus/domain/unit/func/UniPredicate.java diff --git a/bot-context/bot-context-quarkus/src/main/java/dev/struchkov/godfather/quarkus/context/service/EventDispatching.java b/bot-context/bot-context-quarkus/src/main/java/dev/struchkov/godfather/quarkus/context/service/EventDispatching.java new file mode 100644 index 0000000..3f3aa73 --- /dev/null +++ b/bot-context/bot-context-quarkus/src/main/java/dev/struchkov/godfather/quarkus/context/service/EventDispatching.java @@ -0,0 +1,11 @@ +package dev.struchkov.godfather.quarkus.context.service; + +import dev.struchkov.godfather.main.domain.EventContainer; +import io.smallrye.mutiny.Uni; + +public interface EventDispatching { + + Uni dispatch(EventContainer event); + +} + 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 index 9ccdc71..369dec6 100644 --- 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 @@ -1,11 +1,12 @@ package dev.struchkov.godfather.quarkus.context.service; +import dev.struchkov.godfather.main.domain.EventContainer; import io.smallrye.mutiny.Uni; public interface EventHandler { - Uni handle(T event); + Uni handle(EventContainer event); - String getEventType(); + Class getEventClass(); } diff --git a/bot-context/bot-context-simple/src/main/java/dev/struchkov/godfather/simple/context/service/EventDispatching.java b/bot-context/bot-context-simple/src/main/java/dev/struchkov/godfather/simple/context/service/EventDispatching.java new file mode 100644 index 0000000..4a8ebc9 --- /dev/null +++ b/bot-context/bot-context-simple/src/main/java/dev/struchkov/godfather/simple/context/service/EventDispatching.java @@ -0,0 +1,9 @@ +package dev.struchkov.godfather.simple.context.service; + +import dev.struchkov.godfather.main.domain.EventContainer; + +public interface EventDispatching { + + void dispatch(EventContainer event); + +} 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 index b537a3f..01f545e 100644 --- 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 @@ -1,9 +1,11 @@ package dev.struchkov.godfather.simple.context.service; +import dev.struchkov.godfather.main.domain.EventContainer; + public interface EventHandler { - void handle(T event); + void handle(EventContainer event); - String getEventType(); + Class getEventClass(); } diff --git a/bot-context/pom.xml b/bot-context/pom.xml index 6b0be30..84357d7 100644 --- a/bot-context/pom.xml +++ b/bot-context/pom.xml @@ -20,10 +20,6 @@ Доменные сущности, интерфейсы, для библиотеки Godfather - - dev.struchkov - autoresponder - dev.struchkov.haiti haiti-utils diff --git a/bot-core/bot-core-main/src/main/java/dev/struchkov/godfather/main/core/utils/Parser.java b/bot-core/bot-core-main/src/main/java/dev/struchkov/godfather/main/core/utils/Parser.java new file mode 100644 index 0000000..478d0f8 --- /dev/null +++ b/bot-core/bot-core-main/src/main/java/dev/struchkov/godfather/main/core/utils/Parser.java @@ -0,0 +1,41 @@ +package dev.struchkov.godfather.main.core.utils; + +import java.util.Arrays; +import java.util.Set; +import java.util.stream.Collectors; + +import static dev.struchkov.haiti.utils.Exceptions.utilityClass; + +/** + * Разбивает строку на множество слов, удаляя предлоги. + * + * @author upagge [07/07/2019] + */ +public class Parser { + + /** + * Множество предлогов. + */ + private static final Set pretexts = Set.of( + "в", "без", "до", "из", "к", "на", "по", "о", "от", "перед", "при", "с", "у", "за", "над", "об", + "под", "про", "для" + ); + + private Parser() { + utilityClass(); + } + + /** + * Метод по разбиению строки на множество слов. + * + * @param text Строка + * @return Множество слов + */ + public static Set splitWords(String text) { + final String[] split = text.split("\\P{L}+"); + final Set words = Arrays.stream(split).map(String::toLowerCase).collect(Collectors.toSet()); + words.removeAll(pretexts); + return words; + } + +} diff --git a/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/EventDispatchingImpl.java b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/EventDispatchingImpl.java new file mode 100644 index 0000000..5872705 --- /dev/null +++ b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/EventDispatchingImpl.java @@ -0,0 +1,49 @@ +package dev.struchkov.godfather.quarkus.core; + +import dev.struchkov.godfather.main.domain.EventContainer; +import dev.struchkov.godfather.quarkus.context.service.EventDispatching; +import dev.struchkov.godfather.quarkus.context.service.EventHandler; +import io.smallrye.mutiny.Multi; +import io.smallrye.mutiny.Uni; + +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.stream.Collectors; + +import static dev.struchkov.haiti.utils.Checker.checkNotNull; + +public class EventDispatchingImpl implements EventDispatching { + + private final Map> eventHandlerMap; + + public EventDispatchingImpl(List eventProviders) { + this.eventHandlerMap = eventProviders.stream().collect(Collectors.groupingBy(EventHandler::getEventClass)); + } + + @Override + public Uni dispatch(EventContainer event) { + if (checkNotNull(event)) { + return Uni.createFrom().voidItem() + .onItem().transformToUni( + v -> { + // запросы к боту из чатов: https://core.telegram.org/bots/inline + final Optional> optHandlers = getHandler(event.getType()); + if (optHandlers.isPresent()) { + return Multi.createFrom().iterable(optHandlers.get()) + .onItem().transformToUni( + eventHandler -> eventHandler.handle(event) + ).concatenate().collect().asList().replaceWithVoid(); + } + return Uni.createFrom().voidItem(); + } + ); + } + return Uni.createFrom().voidItem(); + } + + private Optional> getHandler(Class type) { + return Optional.ofNullable(eventHandlerMap.get(type)); + } + +} 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 index 0205972..3a7270e 100644 --- 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 @@ -1,6 +1,5 @@ package dev.struchkov.godfather.quarkus.core; -import dev.struchkov.autoresponder.Responder; import dev.struchkov.godfather.main.domain.content.Message; import dev.struchkov.godfather.main.domain.unit.UnitActiveType; import dev.struchkov.godfather.quarkus.context.service.ErrorHandler; @@ -112,11 +111,9 @@ public class GeneralAutoResponder { .onItem().transformToUni(mModifiable -> mModifiable.change(message)) .concatenate().toUni().replaceWith( storyLineService.getNextUnitByPersonId(message.getFromPersonId()) - .onItem().ifNotNull().transformToUni( - nextUnits -> Uni.createFrom().optional( - Responder.nextUnit(message, nextUnits).or(storyLineService::getDefaultUnit) - ) - ).onItem().ifNotNull().transformToUni(answerUnit -> answer(UnitRequest.of(answerUnit, message))) + .onItem().ifNotNull().transformToUni(nextUnits -> Responder.nextUnit(message, nextUnits)) + .onItem().ifNull().switchTo(Uni.createFrom().optional(storyLineService.getDefaultUnit())) + .onItem().ifNotNull().transformToUni(answerUnit -> answer(UnitRequest.of(answerUnit, message))) ); } diff --git a/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/Responder.java b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/Responder.java new file mode 100644 index 0000000..acc5da6 --- /dev/null +++ b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/Responder.java @@ -0,0 +1,148 @@ +package dev.struchkov.godfather.quarkus.core; + +import dev.struchkov.godfather.main.domain.content.Message; +import dev.struchkov.godfather.main.domain.unit.KeyWord; +import dev.struchkov.godfather.quarkus.core.util.UnitPriorityComparator; +import dev.struchkov.godfather.quarkus.domain.unit.MainUnit; +import dev.struchkov.godfather.quarkus.domain.unit.func.UniPredicate; +import io.smallrye.mutiny.Multi; +import io.smallrye.mutiny.Uni; +import lombok.extern.slf4j.Slf4j; + +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +import static dev.struchkov.godfather.main.core.utils.Parser.splitWords; +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.Checker.checkNull; +import static dev.struchkov.haiti.utils.Exceptions.utilityClass; +import static dev.struchkov.haiti.utils.Inspector.isNotNull; +import static java.lang.Boolean.TRUE; + +/** + * Реализуют основную логику автоответчика. + * + * @author upagge [07/07/2019] + */ +@Slf4j +public final class Responder { + + /** + * Компаратор для сортировки Unit-ов + */ + private static final UnitPriorityComparator UNIT_PRIORITY_COMPARATOR = new UnitPriorityComparator(); + + private Responder() { + utilityClass(); + } + + /** + * Выбирает, какой Unit будет отдан для обработки + * + * @param nextUnits Множество следующих Unit-ов + * @param message Запрос пользователя - текстовое сообщение + * @return Юнит, который нуждается в обработке в соответствии с запросом пользователя + */ + public static Uni> nextUnit(M message, Collection> nextUnits) { + isNotNull(nextUnits); + if (checkNotEmpty(nextUnits)) { + return Multi.createFrom().iterable(nextUnits) + .onItem().transformToUniAndMerge(unit -> { + final String text = message.getText(); + if (checkNotNull(text)) { + final Set unitPhrases = unit.getPhrases(); + final Set patterns = unit.getTriggerPatterns(); + + final boolean triggerPhrases = checkNotEmpty(unitPhrases) && unitPhrases.contains(text); + final boolean triggerPatterns = checkNotEmpty(patterns) && patterns.stream().anyMatch(pattern -> patternReg(pattern, text)); + final boolean triggerKeyWords = percentageMatch(unit, text) >= unit.getMatchThreshold(); + final boolean trigger = triggerPhrases || triggerPatterns || triggerKeyWords; + + if (trigger) { + return Uni.createFrom().item(unit); + } + } + + final UniPredicate triggerCheck = unit.getTriggerCheck(); + if (checkNotNull(triggerCheck)) { + return triggerCheck.test(message) + .onItem().transform(matchesTrigger -> TRUE.equals(matchesTrigger) ? unit : null); + } + + return Uni.createFrom().nullItem(); + }) + .collect().asList() + .onItem().transform(searchUnit -> { + if (searchUnit.isEmpty()) { + return nextUnits.stream().filter(Responder::isNotTrigger).collect(Collectors.toList()); + } else { + return searchUnit; + } + }) + .onItem().transform(list -> list.stream().max(UNIT_PRIORITY_COMPARATOR).orElse(null)); + } else { + return Uni.createFrom().nullItem(); + } + } + + private static boolean isNotTrigger(MainUnit nextUnit) { + return isNotPattern(nextUnit) && isNotKeyWords(nextUnit) && isNotPhrase(nextUnit) && isNotCheck(nextUnit); + } + + private static boolean isNotCheck(MainUnit unit) { + return checkNull(unit.getTriggerCheck()); + } + + private static boolean isNotPhrase(MainUnit unit) { + return checkEmpty(unit.getPhrases()); + } + + private static boolean isNotPattern(MainUnit unit) { + return checkEmpty(unit.getTriggerPatterns()); + } + + private static boolean isNotKeyWords(MainUnit unit) { + return checkEmpty(unit.getTriggerWords()); + } + + private static boolean patternReg(Pattern pattern, String message) { + isNotNull(pattern); + return message.matches(pattern.pattern()); + } + + private static double percentageMatch(MainUnit unit, String message) { + final Set unitKeyWords = unit.getTriggerWords(); + if (checkNotEmpty(unitKeyWords)) { + final Set messageWords = splitWords(message); + final Set intersection = getIntersection(unitKeyWords, messageWords); + final double intersectionWeight = getIntersectionWeight(intersection); + log.trace("Ключевые слова юнита: {} ({})", unitKeyWords, unitKeyWords.size()); + log.trace("Слова, которые прислал пользователь: {}", messageWords); + log.trace("Пересечение: {} ({})", intersection, intersectionWeight); + log.trace("Процент: {} Необходимо: {}", intersectionWeight / unitKeyWords.size() * 100.0, unit.getMatchThreshold()); + return (double) intersection.size() / (double) unitKeyWords.size() * 100.0; + } else { + return 0.0; + } + } + + private static double getIntersectionWeight(Set intersection) { + return intersection.stream().mapToInt(KeyWord::getImportant).sum(); + } + + private static Set getIntersection(Set unitKeyWords, Set messageWords) { + final Set intersection = new HashSet<>(); + for (KeyWord unitKeyWord : unitKeyWords) { + if (messageWords.contains(unitKeyWord.getWord())) { + intersection.add(unitKeyWord); + } + } + return intersection; + } + +} 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 index 928694e..3561267 100644 --- 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 @@ -1,5 +1,6 @@ package dev.struchkov.godfather.quarkus.core.provider; +import dev.struchkov.godfather.main.domain.EventContainer; import dev.struchkov.godfather.main.domain.content.Mail; import dev.struchkov.godfather.quarkus.context.service.EventHandler; import dev.struchkov.godfather.quarkus.core.GeneralAutoResponder; @@ -14,13 +15,13 @@ public class StoryLineHandler implements EventHandler { } @Override - public Uni handle(Mail message) { - return generalAutoResponder.processingNewMessage(message); + public Uni handle(EventContainer event) { + return generalAutoResponder.processingNewMessage(event.getObject()); } @Override - public String getEventType() { - return Mail.class.getName(); + public Class getEventClass() { + return Mail.class; } } diff --git a/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/util/UnitPriorityComparator.java b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/util/UnitPriorityComparator.java new file mode 100644 index 0000000..959c0db --- /dev/null +++ b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/util/UnitPriorityComparator.java @@ -0,0 +1,19 @@ +package dev.struchkov.godfather.quarkus.core.util; + +import dev.struchkov.godfather.quarkus.domain.unit.MainUnit; + +import java.util.Comparator; + +/** + * Компоратор для сортировки по приоритету. + * + * @author upagge [07/07/2019] + */ +public class UnitPriorityComparator implements Comparator> { + + @Override + public int compare(MainUnit unit1, MainUnit unit2) { + return Integer.compare(unit1.getPriority(), unit2.getPriority()); + } + +} diff --git a/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/EventDispatchingImpl.java b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/EventDispatchingImpl.java new file mode 100644 index 0000000..0c62a0f --- /dev/null +++ b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/EventDispatchingImpl.java @@ -0,0 +1,37 @@ +package dev.struchkov.godfather.simple.core; + +import dev.struchkov.godfather.main.domain.EventContainer; +import dev.struchkov.godfather.simple.context.service.EventDispatching; +import dev.struchkov.godfather.simple.context.service.EventHandler; + +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.stream.Collectors; + +import static dev.struchkov.haiti.utils.Checker.checkNotNull; + +public class EventDispatchingImpl implements EventDispatching { + + private final Map> eventHandlerMap; + + public EventDispatchingImpl(List eventProviders) { + this.eventHandlerMap = eventProviders.stream().collect(Collectors.groupingBy(EventHandler::getEventClass)); + } + + @Override + public void dispatch(EventContainer event) { + if (checkNotNull(event)) { + final Optional> optHandlers = getHandler(event.getType()); + if (optHandlers.isPresent()) { + final List eventHandlers = optHandlers.get(); + eventHandlers.forEach(eventHandler -> eventHandler.handle(event)); + } + } + } + + private Optional> getHandler(Class type) { + return Optional.ofNullable(eventHandlerMap.get(type)); + } + +} diff --git a/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/GeneralAutoResponder.java b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/GeneralAutoResponder.java index 4774930..d217747 100644 --- a/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/GeneralAutoResponder.java +++ b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/GeneralAutoResponder.java @@ -1,6 +1,5 @@ package dev.struchkov.godfather.simple.core; -import dev.struchkov.autoresponder.Responder; import dev.struchkov.godfather.main.domain.content.Message; import dev.struchkov.godfather.main.domain.unit.UnitActiveType; import dev.struchkov.godfather.simple.context.service.Accessibility; diff --git a/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/Responder.java b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/Responder.java new file mode 100644 index 0000000..0092ee7 --- /dev/null +++ b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/Responder.java @@ -0,0 +1,149 @@ +package dev.struchkov.godfather.simple.core; + +import dev.struchkov.godfather.main.domain.content.Message; +import dev.struchkov.godfather.main.domain.unit.KeyWord; +import dev.struchkov.godfather.simple.core.util.UnitPriorityComparator; +import dev.struchkov.godfather.simple.domain.unit.MainUnit; +import lombok.extern.slf4j.Slf4j; + +import java.util.Collection; +import java.util.HashSet; +import java.util.Optional; +import java.util.Set; +import java.util.function.Predicate; +import java.util.regex.Pattern; + +import static dev.struchkov.godfather.main.core.utils.Parser.splitWords; +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.Checker.checkNull; +import static dev.struchkov.haiti.utils.Exceptions.utilityClass; +import static dev.struchkov.haiti.utils.Inspector.isNotNull; + +/** + * Реализуют основную логику автоответчика. + * + * @author upagge [07/07/2019] + */ +@Slf4j +public final class Responder { + + /** + * Компаратор для сортировки Unit-ов + */ + private static final UnitPriorityComparator UNIT_PRIORITY_COMPARATOR = new UnitPriorityComparator(); + + private Responder() { + utilityClass(); + } + + /** + * Выбирает, какой Unit будет отдан для обработки + * + * @param nextUnits Множество следующих Unit-ов + * @param message Запрос пользователя - текстовое сообщение + * @return Юнит, который нуждается в обработке в соответствии с запросом пользователя + */ + public static Optional> nextUnit(M message, Collection> nextUnits) { + isNotNull(nextUnits); + final Set> searchUnit = new HashSet<>(); + + if (checkNotEmpty(nextUnits)) { + for (MainUnit unit : nextUnits) { + final String text = message.getText(); + if (checkNotNull(text)) { + final Set unitPhrases = unit.getPhrases(); + if (checkNotEmpty(unitPhrases) && unitPhrases.contains(text)) { + searchUnit.add(unit); + } + + final Set patterns = unit.getTriggerPatterns(); + if (checkNotEmpty(patterns)) { + for (Pattern pattern : patterns) { + if (patternReg(pattern, text)) { + searchUnit.add(unit); + break; + } + } + } + + if (percentageMatch(unit, text) >= unit.getMatchThreshold()) { + searchUnit.add(unit); + } + } + + final Predicate triggerCheck = unit.getTriggerCheck(); + if (checkNotNull(triggerCheck) && triggerCheck.test(message)) { + searchUnit.add(unit); + } + } + } + + if (searchUnit.isEmpty()) { + for (MainUnit nextUnit : nextUnits) { + if (isNotTrigger(nextUnit)) { + searchUnit.add(nextUnit); + } + } + } + + return searchUnit.stream().max(UNIT_PRIORITY_COMPARATOR); + } + + private static boolean isNotTrigger(MainUnit nextUnit) { + return isNotPattern(nextUnit) && isNotKeyWords(nextUnit) && isNotPhrase(nextUnit) && isNotCheck(nextUnit); + } + + private static boolean isNotCheck(MainUnit unit) { + return checkNull(unit.getTriggerCheck()); + } + + private static boolean isNotPhrase(MainUnit unit) { + return checkEmpty(unit.getPhrases()); + } + + private static boolean isNotPattern(MainUnit unit) { + return checkEmpty(unit.getTriggerPatterns()); + } + + private static boolean isNotKeyWords(MainUnit unit) { + return checkEmpty(unit.getTriggerWords()); + } + + private static boolean patternReg(Pattern pattern, String message) { + isNotNull(pattern); + return message.matches(pattern.pattern()); + } + + private static double percentageMatch(MainUnit unit, String message) { + final Set unitKeyWords = unit.getTriggerWords(); + if (checkNotEmpty(unitKeyWords)) { + final Set messageWords = splitWords(message); + final Set intersection = getIntersection(unitKeyWords, messageWords); + final double intersectionWeight = getIntersectionWeight(intersection); + log.trace("Ключевые слова юнита: {} ({})", unitKeyWords, unitKeyWords.size()); + log.trace("Слова, которые прислал пользователь: {}", messageWords); + log.trace("Пересечение: {} ({})", intersection, intersectionWeight); + log.trace("Процент: {} Необходимо: {}", intersectionWeight / unitKeyWords.size() * 100.0, unit.getMatchThreshold()); + return (double) intersection.size() / (double) unitKeyWords.size() * 100.0; + } else { + return 0.0; + } + } + + private static double getIntersectionWeight(Set intersection) { + return intersection.stream().mapToInt(KeyWord::getImportant).sum(); + } + + private static Set getIntersection(Set unitKeyWords, Set messageWords) { + final Set intersection = new HashSet<>(); + for (KeyWord unitKeyWord : unitKeyWords) { + if (messageWords.contains(unitKeyWord.getWord())) { + intersection.add(unitKeyWord); + } + } + return intersection; + } + +} diff --git a/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/provider/ChatStoryLineHandler.java b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/provider/ChatStoryLineHandler.java index bd5506c..17fbb1c 100644 --- a/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/provider/ChatStoryLineHandler.java +++ b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/provider/ChatStoryLineHandler.java @@ -1,5 +1,6 @@ package dev.struchkov.godfather.simple.core.provider; +import dev.struchkov.godfather.main.domain.EventContainer; import dev.struchkov.godfather.main.domain.content.ChatMail; import dev.struchkov.godfather.simple.context.service.EventHandler; import dev.struchkov.godfather.simple.core.GeneralAutoResponder; @@ -13,13 +14,13 @@ public class ChatStoryLineHandler implements EventHandler { } @Override - public void handle(ChatMail message) { - generalAutoResponder.processingNewMessage(message); + public void handle(EventContainer message) { + generalAutoResponder.processingNewMessage(message.getObject()); } @Override - public String getEventType() { - return ChatMail.class.getSimpleName(); + public Class getEventClass() { + return ChatMail.class; } } diff --git a/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/provider/PersonStoryLineHandler.java b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/provider/PersonStoryLineHandler.java index 0c2fa67..463eda8 100644 --- a/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/provider/PersonStoryLineHandler.java +++ b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/provider/PersonStoryLineHandler.java @@ -1,5 +1,6 @@ package dev.struchkov.godfather.simple.core.provider; +import dev.struchkov.godfather.main.domain.EventContainer; import dev.struchkov.godfather.main.domain.content.Mail; import dev.struchkov.godfather.simple.context.service.EventHandler; import dev.struchkov.godfather.simple.core.GeneralAutoResponder; @@ -13,13 +14,13 @@ public class PersonStoryLineHandler implements EventHandler { } @Override - public void handle(Mail message) { - generalAutoResponder.processingNewMessage(message); + public void handle(EventContainer event) { + generalAutoResponder.processingNewMessage(event.getObject()); } @Override - public String getEventType() { - return Mail.class.getSimpleName(); + public Class getEventClass() { + return Mail.class; } } diff --git a/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/service/StorylineMailService.java b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/service/StorylineMailService.java index 6fd6821..abf225c 100644 --- a/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/service/StorylineMailService.java +++ b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/service/StorylineMailService.java @@ -1,6 +1,5 @@ package dev.struchkov.godfather.simple.core.service; -import dev.struchkov.autoresponder.entity.Unit; import dev.struchkov.godfather.main.domain.StorylineHistory; import dev.struchkov.godfather.main.domain.UnitPointer; import dev.struchkov.godfather.main.domain.content.Message; @@ -53,7 +52,7 @@ public class StorylineMailService implements StorylineService @Override public Set> getNextUnitByPersonId(@NotNull String personId) { final Optional>> optMainUnits = getUnitNameByPersonId(personId) - .map(Unit::getNextUnits) + .map(MainUnit::getNextUnits) .filter(mainUnits -> !mainUnits.isEmpty()); if (optMainUnits.isEmpty()) { storylineRepository.cleanHistoryByPersonId(personId); diff --git a/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/util/UnitPriorityComparator.java b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/util/UnitPriorityComparator.java new file mode 100644 index 0000000..bae1d71 --- /dev/null +++ b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/util/UnitPriorityComparator.java @@ -0,0 +1,19 @@ +package dev.struchkov.godfather.simple.core.util; + +import dev.struchkov.godfather.simple.domain.unit.MainUnit; + +import java.util.Comparator; + +/** + * Компоратор для сортировки по приоритету. + * + * @author upagge [07/07/2019] + */ +public class UnitPriorityComparator implements Comparator> { + + @Override + public int compare(MainUnit unit1, MainUnit unit2) { + return Integer.compare(unit1.getPriority(), unit2.getPriority()); + } + +} diff --git a/bot-domain/bot-domain-main/pom.xml b/bot-domain/bot-domain-main/pom.xml index 15ced08..39886e9 100644 --- a/bot-domain/bot-domain-main/pom.xml +++ b/bot-domain/bot-domain-main/pom.xml @@ -1,5 +1,6 @@ - + 4.0.0 bot-domain @@ -22,8 +23,13 @@ - dev.struchkov - autoresponder + dev.struchkov.haiti + haiti-utils + + + + com.fasterxml.jackson.core + jackson-databind diff --git a/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/EventContainer.java b/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/EventContainer.java new file mode 100644 index 0000000..5e14e6f --- /dev/null +++ b/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/EventContainer.java @@ -0,0 +1,20 @@ +package dev.struchkov.godfather.main.domain; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import dev.struchkov.godfather.main.domain.jackson.TelegramEventContainerDeserializer; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@JsonDeserialize(using = TelegramEventContainerDeserializer.class) +public class EventContainer { + + private Class type; + private T object; + +} 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 index 40450d5..c66ae0a 100644 --- 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 @@ -1,7 +1,15 @@ package dev.struchkov.godfather.main.domain.content; -public interface Attachment { +public abstract class Attachment { - String getType(); + protected final String type; + + protected Attachment(String type) { + this.type = type; + } + + public String getType() { + return type; + } } diff --git a/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/content/Mail.java b/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/content/Mail.java index 9e1e921..8932a2b 100644 --- a/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/content/Mail.java +++ b/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/content/Mail.java @@ -3,6 +3,7 @@ package dev.struchkov.godfather.main.domain.content; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; +import lombok.ToString; import java.util.ArrayList; import java.util.Collection; @@ -16,7 +17,8 @@ import java.util.List; @Getter @Setter -@EqualsAndHashCode(onlyExplicitlyIncluded = true) +@ToString +@EqualsAndHashCode(onlyExplicitlyIncluded = true, callSuper = true) public class Mail extends Message { public static final String TYPE = "MAIL"; @@ -53,4 +55,5 @@ public class Mail extends Message { this.attachments.addAll(attachments); } + } diff --git a/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/content/Message.java b/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/content/Message.java index 1fc374b..d168f0a 100644 --- a/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/content/Message.java +++ b/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/content/Message.java @@ -1,14 +1,17 @@ package dev.struchkov.godfather.main.domain.content; -import dev.struchkov.autoresponder.entity.DeliverableText; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import dev.struchkov.godfather.main.domain.jackson.TelegramPayloadDeserializer; +import dev.struchkov.godfather.main.domain.jackson.TelegramPayloadSerializer; import dev.struchkov.haiti.utils.container.ContextKey; +import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; import java.time.LocalDateTime; import java.util.HashMap; import java.util.Map; -import java.util.Objects; import java.util.Optional; import static dev.struchkov.haiti.utils.Checker.checkNotNull; @@ -20,8 +23,10 @@ import static dev.struchkov.haiti.utils.Checker.checkNotNull; */ @Getter @Setter -public abstract class Message implements DeliverableText { +@EqualsAndHashCode(onlyExplicitlyIncluded = true) +public abstract class Message { + @EqualsAndHashCode.Include protected String id; /** @@ -44,7 +49,9 @@ public abstract class Message implements DeliverableText { */ protected String text; - protected Map payload = new HashMap<>(); + @JsonSerialize(using = TelegramPayloadSerializer.class) + @JsonDeserialize(using = TelegramPayloadDeserializer.class) + protected Map payload = new HashMap<>(); protected Message(Message source) { this.id = source.getId(); @@ -60,26 +67,13 @@ public abstract class Message implements DeliverableText { public void addPayload(ContextKey key, T value) { if (checkNotNull(value)) { - payload.put(key.getValue(), value); + payload.put(key, value); } } public Optional getPayLoad(ContextKey contextKey) { - return Optional.ofNullable(payload.get(contextKey.getValue())) + return Optional.ofNullable(payload.get(contextKey)) .map(value -> (T) value); } - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Message message = (Message) o; - return Objects.equals(id, message.id); - } - - @Override - public int hashCode() { - return Objects.hash(id); - } - } diff --git a/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/jackson/TelegramEventContainerDeserializer.java b/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/jackson/TelegramEventContainerDeserializer.java new file mode 100644 index 0000000..56c4681 --- /dev/null +++ b/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/jackson/TelegramEventContainerDeserializer.java @@ -0,0 +1,36 @@ +package dev.struchkov.godfather.main.domain.jackson; + +import com.fasterxml.jackson.core.JacksonException; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.deser.std.StdDeserializer; +import dev.struchkov.godfather.main.domain.EventContainer; +import lombok.SneakyThrows; + +import java.io.IOException; + +public class TelegramEventContainerDeserializer extends StdDeserializer { + + public TelegramEventContainerDeserializer() { + this(null); + } + + public TelegramEventContainerDeserializer(Class vc) { + super(vc); + } + + @Override + @SneakyThrows + public EventContainer deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JacksonException { + final JsonNode node = jsonParser.getCodec().readTree(jsonParser); + final Class typeEvent = Class.forName(node.get("type").asText()); + final JsonNode object = node.get("object"); + + final EventContainer eventContainer = new EventContainer<>(); + eventContainer.setType(typeEvent); + eventContainer.setObject(jsonParser.getCodec().treeToValue(object, typeEvent)); + return eventContainer; + } + +} diff --git a/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/jackson/TelegramPayloadDeserializer.java b/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/jackson/TelegramPayloadDeserializer.java new file mode 100644 index 0000000..bd9109e --- /dev/null +++ b/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/jackson/TelegramPayloadDeserializer.java @@ -0,0 +1,58 @@ +package dev.struchkov.godfather.main.domain.jackson; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.deser.std.StdDeserializer; +import dev.struchkov.haiti.utils.container.ContextKey; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +public class TelegramPayloadDeserializer extends StdDeserializer> { + + public TelegramPayloadDeserializer() { + super(HashMap.class); + } + + @Override + public Map deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException { + Map resultMap = new HashMap<>(); + JsonNode rootNode = jsonParser.getCodec().readTree(jsonParser); + + Iterator> fieldsIterator = rootNode.fields(); + while (fieldsIterator.hasNext()) { + Map.Entry fieldEntry = fieldsIterator.next(); + String keyString = fieldEntry.getKey(); + JsonNode valueNode = fieldEntry.getValue(); + + // Разделяем строковое представление ключа на имя класса и значение + String[] keyParts = keyString.split("@"); + if (keyParts.length != 2) { + throw new IOException("Некорректный формат ключа: " + keyString); + } + + String className = keyParts[0]; + String keyValue = keyParts[1]; + + Class keyClass; + try { + keyClass = Class.forName(className); + } catch (ClassNotFoundException e) { + throw new IOException("Не удалось найти класс " + className, e); + } + + ContextKey contextKey = ContextKey.of(keyValue, keyClass); + + // Десериализация значения + Object objectValue = jsonParser.getCodec().treeToValue(valueNode, keyClass); + resultMap.put(contextKey, objectValue); + } + + return resultMap; + } + +} + diff --git a/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/jackson/TelegramPayloadSerializer.java b/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/jackson/TelegramPayloadSerializer.java new file mode 100644 index 0000000..f8c446a --- /dev/null +++ b/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/jackson/TelegramPayloadSerializer.java @@ -0,0 +1,38 @@ +package dev.struchkov.godfather.main.domain.jackson; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.ser.std.StdSerializer; +import dev.struchkov.haiti.utils.container.ContextKey; + +import java.io.IOException; +import java.util.Map; + +public class TelegramPayloadSerializer extends StdSerializer> { + + public TelegramPayloadSerializer() { + this(null); + } + + public TelegramPayloadSerializer(Class> t) { + super(t); + } + + @Override + public void serialize(Map value, JsonGenerator gen, SerializerProvider provider) throws IOException { + gen.writeStartObject(); + + for (Map.Entry entry : value.entrySet()) { + ContextKey key = entry.getKey(); + String keyString = key.getType().getName() + "@" + key.getValue(); + Object objectValue = entry.getValue(); + + gen.writeObjectField(keyString, objectValue); + } + + gen.writeEndObject(); + } + + +} + diff --git a/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/unit/KeyWord.java b/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/unit/KeyWord.java new file mode 100644 index 0000000..30312b2 --- /dev/null +++ b/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/unit/KeyWord.java @@ -0,0 +1,35 @@ +package dev.struchkov.godfather.main.domain.unit; + +/** + * Ключевое слово для юнитов. + */ +public class KeyWord { + + private final Integer important; + private final String word; + + private KeyWord(Integer important, String word) { + if (important < 0 || important > 10) { + throw new RuntimeException("Вес слова должен быть значением от 0 до 100"); + } + this.important = important; + this.word = word; + } + + public static KeyWord of(Integer weight, String word) { + return new KeyWord(weight, word); + } + + public static KeyWord of(String word) { + return new KeyWord(1, word); + } + + public Integer getImportant() { + return important; + } + + public String getWord() { + return word; + } + +} diff --git a/bot-domain/bot-domain-quarkus/src/main/java/dev/struchkov/godfather/quarkus/domain/unit/AnswerCheck.java b/bot-domain/bot-domain-quarkus/src/main/java/dev/struchkov/godfather/quarkus/domain/unit/AnswerCheck.java index a5958e8..c3f39ad 100644 --- a/bot-domain/bot-domain-quarkus/src/main/java/dev/struchkov/godfather/quarkus/domain/unit/AnswerCheck.java +++ b/bot-domain/bot-domain-quarkus/src/main/java/dev/struchkov/godfather/quarkus/domain/unit/AnswerCheck.java @@ -1,15 +1,15 @@ package dev.struchkov.godfather.quarkus.domain.unit; -import dev.struchkov.autoresponder.entity.KeyWord; import dev.struchkov.godfather.main.domain.content.Message; +import dev.struchkov.godfather.main.domain.unit.KeyWord; import dev.struchkov.godfather.main.domain.unit.UnitActiveType; import dev.struchkov.godfather.quarkus.domain.BoxAnswer; import dev.struchkov.godfather.quarkus.domain.unit.func.CheckData; +import dev.struchkov.godfather.quarkus.domain.unit.func.UniPredicate; 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; @@ -50,17 +50,17 @@ public class AnswerCheck extends MainUnit { private AnswerCheck(Builder builder) { super( builder.name, - builder.description, builder.triggerWords, builder.triggerPhrases, - builder.triggerCheck, builder.triggerPatterns, + builder.triggerCheck, builder.matchThreshold, builder.priority, new HashSet<>(), + builder.description, + TYPE, builder.activeType, - builder.notSaveHistory, - TYPE + builder.notSaveHistory ); unitTrue = builder.unitTrue; unitFalse = builder.unitFalse; @@ -100,7 +100,7 @@ public class AnswerCheck extends MainUnit { private Set triggerWords; private Set triggerPhrases; - private Predicate triggerCheck; + private UniPredicate triggerCheck; private Set triggerPatterns; private Integer matchThreshold; @@ -186,7 +186,7 @@ public class AnswerCheck extends MainUnit { return this; } - public Builder triggerCheck(Predicate trigger) { + public Builder triggerCheck(UniPredicate trigger) { triggerCheck = trigger; return this; } diff --git a/bot-domain/bot-domain-quarkus/src/main/java/dev/struchkov/godfather/quarkus/domain/unit/AnswerSave.java b/bot-domain/bot-domain-quarkus/src/main/java/dev/struchkov/godfather/quarkus/domain/unit/AnswerSave.java index fa08e89..125b064 100644 --- a/bot-domain/bot-domain-quarkus/src/main/java/dev/struchkov/godfather/quarkus/domain/unit/AnswerSave.java +++ b/bot-domain/bot-domain-quarkus/src/main/java/dev/struchkov/godfather/quarkus/domain/unit/AnswerSave.java @@ -1,18 +1,18 @@ package dev.struchkov.godfather.quarkus.domain.unit; -import dev.struchkov.autoresponder.entity.KeyWord; import dev.struchkov.godfather.main.domain.content.Message; +import dev.struchkov.godfather.main.domain.unit.KeyWord; import dev.struchkov.godfather.main.domain.unit.UnitActiveType; import dev.struchkov.godfather.quarkus.domain.unit.func.CheckSave; import dev.struchkov.godfather.quarkus.domain.unit.func.PreservableData; import dev.struchkov.godfather.quarkus.domain.unit.func.Pusher; +import dev.struchkov.godfather.quarkus.domain.unit.func.UniPredicate; import dev.struchkov.godfather.quarkus.domain.unit.func.preser.AnswerSavePreservable; 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; @@ -57,17 +57,17 @@ public class AnswerSave extends MainUnit { private AnswerSave(Builder builder) { super( builder.name, - builder.description, builder.triggerWords, builder.triggerPhrases, - builder.triggerCheck, builder.triggerPatterns, + builder.triggerCheck, builder.matchThreshold, builder.priority, builder.nextUnits, + builder.description, + TYPE, (builder.hidden) ? UnitActiveType.AFTER : UnitActiveType.DEFAULT, - builder.notSaveHistory, - TYPE + builder.notSaveHistory ); maintenanceNextUnit(nextUnits); preservable = builder.preservable; @@ -121,7 +121,7 @@ public class AnswerSave extends MainUnit { private Set triggerWords; private Set triggerPhrases; private Set triggerPatterns; - private Predicate triggerCheck; + private UniPredicate triggerCheck; private Integer matchThreshold; private Integer priority; @@ -206,7 +206,7 @@ public class AnswerSave extends MainUnit { return this; } - public Builder triggerCheck(Predicate trigger) { + public Builder triggerCheck(UniPredicate trigger) { triggerCheck = trigger; return this; } diff --git a/bot-domain/bot-domain-quarkus/src/main/java/dev/struchkov/godfather/quarkus/domain/unit/AnswerText.java b/bot-domain/bot-domain-quarkus/src/main/java/dev/struchkov/godfather/quarkus/domain/unit/AnswerText.java index 1982fe7..cd8fd84 100644 --- a/bot-domain/bot-domain-quarkus/src/main/java/dev/struchkov/godfather/quarkus/domain/unit/AnswerText.java +++ b/bot-domain/bot-domain-quarkus/src/main/java/dev/struchkov/godfather/quarkus/domain/unit/AnswerText.java @@ -1,11 +1,12 @@ package dev.struchkov.godfather.quarkus.domain.unit; -import dev.struchkov.autoresponder.entity.KeyWord; import dev.struchkov.godfather.main.domain.content.Message; +import dev.struchkov.godfather.main.domain.unit.KeyWord; import dev.struchkov.godfather.main.domain.unit.UnitActiveType; import dev.struchkov.godfather.quarkus.domain.BoxAnswer; import dev.struchkov.godfather.quarkus.domain.unit.func.CallBackConsumer; import dev.struchkov.godfather.quarkus.domain.unit.func.ProcessingData; +import dev.struchkov.godfather.quarkus.domain.unit.func.UniPredicate; import io.smallrye.mutiny.Uni; import java.util.HashSet; @@ -14,7 +15,6 @@ 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; @@ -43,17 +43,17 @@ public class AnswerText extends MainUnit { private AnswerText(Builder builder) { super( builder.name, - builder.description, builder.triggerWords, builder.triggerPhrases, - builder.triggerCheck, builder.triggerPatterns, + builder.triggerCheck, builder.matchThreshold, builder.priority, builder.nextUnits, + builder.description, + TYPE, builder.activeType, - builder.notSaveHistory, - TYPE + builder.notSaveHistory ); answer = builder.boxAnswer; callBack = builder.callBack; @@ -83,7 +83,7 @@ public class AnswerText extends MainUnit { private Set triggerWords; private Set triggerPhrases; - private Predicate triggerCheck; + private UniPredicate triggerCheck; private Set triggerPatterns; private Integer matchThreshold; @@ -189,7 +189,7 @@ public class AnswerText extends MainUnit { return this; } - public Builder triggerCheck(Predicate trigger) { + public Builder triggerCheck(UniPredicate trigger) { triggerCheck = trigger; return this; } diff --git a/bot-domain/bot-domain-quarkus/src/main/java/dev/struchkov/godfather/quarkus/domain/unit/MainUnit.java b/bot-domain/bot-domain-quarkus/src/main/java/dev/struchkov/godfather/quarkus/domain/unit/MainUnit.java index 6ebc83e..3c8dcc5 100644 --- a/bot-domain/bot-domain-quarkus/src/main/java/dev/struchkov/godfather/quarkus/domain/unit/MainUnit.java +++ b/bot-domain/bot-domain-quarkus/src/main/java/dev/struchkov/godfather/quarkus/domain/unit/MainUnit.java @@ -1,28 +1,69 @@ package dev.struchkov.godfather.quarkus.domain.unit; -import dev.struchkov.autoresponder.entity.KeyWord; -import dev.struchkov.autoresponder.entity.Unit; import dev.struchkov.godfather.main.domain.content.Message; +import dev.struchkov.godfather.main.domain.unit.KeyWord; import dev.struchkov.godfather.main.domain.unit.UnitActiveType; +import dev.struchkov.godfather.quarkus.domain.unit.func.UniPredicate; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; -import java.util.Objects; +import java.util.Collection; import java.util.Optional; import java.util.Set; -import java.util.function.Predicate; import java.util.regex.Pattern; /** - * Главный обработчик {@link Unit}, от него наследуются все остальные Unit-ы. + * Главный обработчик, от него наследуются все остальные Unit-ы. * * @author upagge [08/07/2019] */ -public abstract class MainUnit extends Unit, M> { +@Getter +@Setter +@EqualsAndHashCode(onlyExplicitlyIncluded = true) +public abstract class MainUnit { /** * Уникальное имя юнита */ + @EqualsAndHashCode.Include private String name; + /** + * Ключевые слова. + */ + protected Set triggerWords; + + /** + * Точная фраза. + */ + protected Set phrases; + + /** + * Триггеры на срабатывание юнита по регулярному выражению. + */ + protected Set triggerPatterns; + + /** + * Пользовательский триггер + */ + protected UniPredicate triggerCheck; + + /** + * Значение минимального отношения количества найденных ключевых слов, к количеству ключевых слов Unit-а. + */ + protected Integer matchThreshold; + + /** + * Значение приоритета. + */ + protected Integer priority; + + /** + * Множество следующих Unit в сценарии. + */ + protected Set> nextUnits; + /** * Описание юнита, что он делает. Никак не влияет на работу юнита и не участвует в ней. Возможно отображение этого текста в логах. */ @@ -42,65 +83,38 @@ public abstract class MainUnit extends Unit, M> { protected MainUnit( String name, - String description, - Set keyWords, + Set triggerWords, Set phrases, - Predicate triggerCheck, - Set patterns, + Set triggerPatterns, + UniPredicate triggerCheck, Integer matchThreshold, Integer priority, Set> nextUnits, + String description, + String type, UnitActiveType activeType, - boolean notSaveHistory, - String type + boolean notSaveHistory ) { - super(keyWords, phrases, triggerCheck, patterns, matchThreshold, priority, nextUnits); this.name = name; + this.triggerWords = triggerWords; + this.phrases = phrases; + this.triggerPatterns = triggerPatterns; + this.triggerCheck = triggerCheck; + this.matchThreshold = matchThreshold == null ? 10 : matchThreshold; + this.priority = priority == null ? 10 : priority; + this.nextUnits = nextUnits; this.description = description; - this.activeType = Optional.ofNullable(activeType).orElse(UnitActiveType.DEFAULT); this.type = type; + this.activeType = Optional.ofNullable(activeType).orElse(UnitActiveType.DEFAULT); this.notSaveHistory = notSaveHistory; } - public String getType() { - return type; + public void addPhrase(String phrase) { + phrases.add(phrase); } - 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 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); + public void addPhrases(Collection phrases) { + this.phrases.addAll(phrases); } } diff --git a/bot-domain/bot-domain-quarkus/src/main/java/dev/struchkov/godfather/quarkus/domain/unit/cmd/ReplaceCmd.java b/bot-domain/bot-domain-quarkus/src/main/java/dev/struchkov/godfather/quarkus/domain/unit/cmd/ReplaceCmd.java index cc6e2fd..90363f5 100644 --- a/bot-domain/bot-domain-quarkus/src/main/java/dev/struchkov/godfather/quarkus/domain/unit/cmd/ReplaceCmd.java +++ b/bot-domain/bot-domain-quarkus/src/main/java/dev/struchkov/godfather/quarkus/domain/unit/cmd/ReplaceCmd.java @@ -1,15 +1,15 @@ package dev.struchkov.godfather.quarkus.domain.unit.cmd; -import dev.struchkov.autoresponder.entity.KeyWord; import dev.struchkov.godfather.main.domain.content.Message; +import dev.struchkov.godfather.main.domain.unit.KeyWord; import dev.struchkov.godfather.main.domain.unit.UnitActiveType; import dev.struchkov.godfather.quarkus.domain.unit.MainUnit; +import dev.struchkov.godfather.quarkus.domain.unit.func.UniPredicate; 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; @@ -22,17 +22,17 @@ public class ReplaceCmd extends MainUnit { private ReplaceCmd(Builder builder) { super( builder.name, - builder.description, builder.triggerWords, builder.triggerPhrases, - builder.triggerCheck, builder.triggerPatterns, + builder.triggerCheck, builder.matchThreshold, builder.priority, new HashSet<>(), + builder.description, + TYPE, builder.activeType, - true, - TYPE + true ); this.thisUnit = builder.thisUnit; } @@ -46,11 +46,12 @@ public class ReplaceCmd extends MainUnit { } public static final class Builder { + private String name = UUID.randomUUID().toString(); private String description; private Set triggerPhrases; - private Predicate triggerCheck; + private UniPredicate triggerCheck; private Set triggerPatterns; private Set triggerWords; private Integer matchThreshold; @@ -130,7 +131,7 @@ public class ReplaceCmd extends MainUnit { return this; } - public Builder triggerCheck(Predicate trigger) { + public Builder triggerCheck(UniPredicate trigger) { triggerCheck = trigger; return this; } diff --git a/bot-domain/bot-domain-quarkus/src/main/java/dev/struchkov/godfather/quarkus/domain/unit/cmd/RollBackCmd.java b/bot-domain/bot-domain-quarkus/src/main/java/dev/struchkov/godfather/quarkus/domain/unit/cmd/RollBackCmd.java index f3fa561..694c16c 100644 --- a/bot-domain/bot-domain-quarkus/src/main/java/dev/struchkov/godfather/quarkus/domain/unit/cmd/RollBackCmd.java +++ b/bot-domain/bot-domain-quarkus/src/main/java/dev/struchkov/godfather/quarkus/domain/unit/cmd/RollBackCmd.java @@ -1,15 +1,15 @@ package dev.struchkov.godfather.quarkus.domain.unit.cmd; -import dev.struchkov.autoresponder.entity.KeyWord; import dev.struchkov.godfather.exception.UnitConfigException; import dev.struchkov.godfather.main.domain.content.Message; +import dev.struchkov.godfather.main.domain.unit.KeyWord; import dev.struchkov.godfather.main.domain.unit.UnitActiveType; import dev.struchkov.godfather.quarkus.domain.unit.MainUnit; +import dev.struchkov.godfather.quarkus.domain.unit.func.UniPredicate; 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; @@ -35,17 +35,17 @@ public class RollBackCmd extends MainUnit { private RollBackCmd(Builder builder) { super( builder.name, - builder.description, builder.triggerWords, builder.triggerPhrases, - builder.triggerCheck, builder.triggerPatterns, + builder.triggerCheck, builder.matchThreshold, builder.priority, new HashSet<>(), + builder.description, + TYPE, builder.activeType, - true, - TYPE + true ); this.countBack = builder.countBack; this.rollbackUnitName = builder.rollbackUnitName; @@ -89,7 +89,7 @@ public class RollBackCmd extends MainUnit { private String description; private Set triggerPhrases; - private Predicate triggerCheck; + private UniPredicate triggerCheck; private Set triggerPatterns; private Set triggerWords; private Integer matchThreshold; @@ -158,7 +158,7 @@ public class RollBackCmd extends MainUnit { return this; } - public Builder triggerCheck(Predicate trigger) { + public Builder triggerCheck(UniPredicate trigger) { triggerCheck = trigger; return this; } diff --git a/bot-domain/bot-domain-quarkus/src/main/java/dev/struchkov/godfather/quarkus/domain/unit/func/UniPredicate.java b/bot-domain/bot-domain-quarkus/src/main/java/dev/struchkov/godfather/quarkus/domain/unit/func/UniPredicate.java new file mode 100644 index 0000000..98c257e --- /dev/null +++ b/bot-domain/bot-domain-quarkus/src/main/java/dev/struchkov/godfather/quarkus/domain/unit/func/UniPredicate.java @@ -0,0 +1,9 @@ +package dev.struchkov.godfather.quarkus.domain.unit.func; + +import io.smallrye.mutiny.Uni; + +public interface UniPredicate { + + Uni test(T t); + +} diff --git a/bot-domain/bot-domain-simple/src/main/java/dev/struchkov/godfather/simple/domain/unit/AnswerCheck.java b/bot-domain/bot-domain-simple/src/main/java/dev/struchkov/godfather/simple/domain/unit/AnswerCheck.java index bc48672..5eed7bc 100644 --- a/bot-domain/bot-domain-simple/src/main/java/dev/struchkov/godfather/simple/domain/unit/AnswerCheck.java +++ b/bot-domain/bot-domain-simple/src/main/java/dev/struchkov/godfather/simple/domain/unit/AnswerCheck.java @@ -1,7 +1,7 @@ package dev.struchkov.godfather.simple.domain.unit; -import dev.struchkov.autoresponder.entity.KeyWord; import dev.struchkov.godfather.main.domain.content.Message; +import dev.struchkov.godfather.main.domain.unit.KeyWord; import dev.struchkov.godfather.main.domain.unit.UnitActiveType; import dev.struchkov.godfather.simple.domain.BoxAnswer; import dev.struchkov.godfather.simple.domain.unit.func.CheckData; @@ -50,17 +50,17 @@ public class AnswerCheck extends MainUnit { private AnswerCheck(Builder builder) { super( builder.name, - builder.description, builder.triggerWords, builder.triggerPhrases, - builder.triggerCheck, builder.triggerPatterns, + builder.triggerCheck, builder.matchThreshold, builder.priority, new HashSet<>(), + builder.description, + TYPE, builder.activeType, - builder.notSaveHistory, - TYPE + builder.notSaveHistory ); unitTrue = builder.unitTrue; unitFalse = builder.unitFalse; diff --git a/bot-domain/bot-domain-simple/src/main/java/dev/struchkov/godfather/simple/domain/unit/AnswerSave.java b/bot-domain/bot-domain-simple/src/main/java/dev/struchkov/godfather/simple/domain/unit/AnswerSave.java index 55ffd28..79fbc25 100644 --- a/bot-domain/bot-domain-simple/src/main/java/dev/struchkov/godfather/simple/domain/unit/AnswerSave.java +++ b/bot-domain/bot-domain-simple/src/main/java/dev/struchkov/godfather/simple/domain/unit/AnswerSave.java @@ -1,7 +1,7 @@ package dev.struchkov.godfather.simple.domain.unit; -import dev.struchkov.autoresponder.entity.KeyWord; import dev.struchkov.godfather.main.domain.content.Message; +import dev.struchkov.godfather.main.domain.unit.KeyWord; import dev.struchkov.godfather.main.domain.unit.UnitActiveType; import dev.struchkov.godfather.simple.domain.unit.func.CheckSave; import dev.struchkov.godfather.simple.domain.unit.func.PreservableData; @@ -56,17 +56,17 @@ public class AnswerSave extends MainUnit { private AnswerSave(Builder builder) { super( builder.name, - builder.description, builder.triggerWords, builder.triggerPhrases, - builder.triggerCheck, builder.triggerPatterns, + builder.triggerCheck, builder.matchThreshold, builder.priority, builder.nextUnits, + builder.description, + TYPE, (builder.hidden) ? UnitActiveType.AFTER : UnitActiveType.DEFAULT, - builder.notSaveHistory, - TYPE + builder.notSaveHistory ); maintenanceNextUnit(nextUnits); preservable = builder.preservable; diff --git a/bot-domain/bot-domain-simple/src/main/java/dev/struchkov/godfather/simple/domain/unit/AnswerText.java b/bot-domain/bot-domain-simple/src/main/java/dev/struchkov/godfather/simple/domain/unit/AnswerText.java index 62008f4..2cc5b0f 100644 --- a/bot-domain/bot-domain-simple/src/main/java/dev/struchkov/godfather/simple/domain/unit/AnswerText.java +++ b/bot-domain/bot-domain-simple/src/main/java/dev/struchkov/godfather/simple/domain/unit/AnswerText.java @@ -1,7 +1,7 @@ package dev.struchkov.godfather.simple.domain.unit; -import dev.struchkov.autoresponder.entity.KeyWord; import dev.struchkov.godfather.main.domain.content.Message; +import dev.struchkov.godfather.main.domain.unit.KeyWord; import dev.struchkov.godfather.main.domain.unit.UnitActiveType; import dev.struchkov.godfather.simple.domain.BoxAnswer; import dev.struchkov.godfather.simple.domain.unit.func.CallBackConsumer; @@ -38,17 +38,17 @@ public class AnswerText extends MainUnit { private AnswerText(Builder builder) { super( builder.name, - builder.description, builder.triggerWords, builder.triggerPhrases, - builder.triggerCheck, builder.triggerPatterns, + builder.triggerCheck, builder.matchThreshold, builder.priority, builder.nextUnits, + builder.description, + TYPE, builder.activeType, - builder.notSaveHistory, - TYPE + builder.notSaveHistory ); answer = builder.boxAnswer; callBack = builder.callBack; diff --git a/bot-domain/bot-domain-simple/src/main/java/dev/struchkov/godfather/simple/domain/unit/MainUnit.java b/bot-domain/bot-domain-simple/src/main/java/dev/struchkov/godfather/simple/domain/unit/MainUnit.java index 7b5a375..ca5eea1 100644 --- a/bot-domain/bot-domain-simple/src/main/java/dev/struchkov/godfather/simple/domain/unit/MainUnit.java +++ b/bot-domain/bot-domain-simple/src/main/java/dev/struchkov/godfather/simple/domain/unit/MainUnit.java @@ -1,28 +1,69 @@ package dev.struchkov.godfather.simple.domain.unit; -import dev.struchkov.autoresponder.entity.KeyWord; -import dev.struchkov.autoresponder.entity.Unit; import dev.struchkov.godfather.main.domain.content.Message; +import dev.struchkov.godfather.main.domain.unit.KeyWord; import dev.struchkov.godfather.main.domain.unit.UnitActiveType; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; -import java.util.Objects; +import java.util.Collection; import java.util.Optional; import java.util.Set; import java.util.function.Predicate; import java.util.regex.Pattern; /** - * Главный обработчик {@link Unit}, от него наследуются все остальные Unit-ы. + * Главный обработчик, от него наследуются все остальные Unit-ы. * * @author upagge [08/07/2019] */ -public abstract class MainUnit extends Unit, M> { +@Getter +@Setter +@EqualsAndHashCode(onlyExplicitlyIncluded = true) +public abstract class MainUnit { /** * Уникальное имя юнита */ + @EqualsAndHashCode.Include private String name; + /** + * Ключевые слова. + */ + protected Set triggerWords; + + /** + * Точная фраза. + */ + protected Set phrases; + + /** + * Триггеры на срабатывание юнита по регулярному выражению. + */ + protected Set triggerPatterns; + + /** + * Пользовательский триггер + */ + protected Predicate triggerCheck; + + /** + * Значение минимального отношения количества найденных ключевых слов, к количеству ключевых слов Unit-а. + */ + protected Integer matchThreshold; + + /** + * Значение приоритета. + */ + protected Integer priority; + + /** + * Множество следующих Unit в сценарии. + */ + protected Set> nextUnits; + /** * Описание юнита, что он делает. Никак не влияет на работу юнита и не участвует в ней. Возможно отображение этого текста в логах. */ @@ -42,65 +83,38 @@ public abstract class MainUnit extends Unit, M> { protected MainUnit( String name, - String description, - Set keyWords, + Set triggerWords, Set phrases, + Set triggerPatterns, Predicate triggerCheck, - Set patterns, Integer matchThreshold, Integer priority, Set> nextUnits, + String description, + String type, UnitActiveType activeType, - boolean notSaveHistory, - String type + boolean notSaveHistory ) { - super(keyWords, phrases, triggerCheck, patterns, matchThreshold, priority, nextUnits); this.name = name; + this.triggerWords = triggerWords; + this.phrases = phrases; + this.triggerPatterns = triggerPatterns; + this.triggerCheck = triggerCheck; + this.matchThreshold = matchThreshold == null ? 10 : matchThreshold; + this.priority = priority == null ? 10 : priority; + this.nextUnits = nextUnits; this.description = description; - this.activeType = Optional.ofNullable(activeType).orElse(UnitActiveType.DEFAULT); this.type = type; + this.activeType = Optional.ofNullable(activeType).orElse(UnitActiveType.DEFAULT); this.notSaveHistory = notSaveHistory; } - public String getType() { - return type; + public void addPhrase(String phrase) { + phrases.add(phrase); } - 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 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); + public void addPhrases(Collection phrases) { + this.phrases.addAll(phrases); } } diff --git a/bot-domain/bot-domain-simple/src/main/java/dev/struchkov/godfather/simple/domain/unit/cmd/ReplaceCmd.java b/bot-domain/bot-domain-simple/src/main/java/dev/struchkov/godfather/simple/domain/unit/cmd/ReplaceCmd.java index 1ef8c95..4d70d16 100644 --- a/bot-domain/bot-domain-simple/src/main/java/dev/struchkov/godfather/simple/domain/unit/cmd/ReplaceCmd.java +++ b/bot-domain/bot-domain-simple/src/main/java/dev/struchkov/godfather/simple/domain/unit/cmd/ReplaceCmd.java @@ -1,7 +1,7 @@ package dev.struchkov.godfather.simple.domain.unit.cmd; -import dev.struchkov.autoresponder.entity.KeyWord; import dev.struchkov.godfather.main.domain.content.Message; +import dev.struchkov.godfather.main.domain.unit.KeyWord; import dev.struchkov.godfather.main.domain.unit.UnitActiveType; import dev.struchkov.godfather.simple.domain.unit.MainUnit; import dev.struchkov.haiti.utils.Checker; @@ -22,17 +22,17 @@ public class ReplaceCmd extends MainUnit { private ReplaceCmd(Builder builder) { super( builder.name, - builder.description, builder.triggerWords, builder.triggerPhrases, - builder.triggerCheck, builder.triggerPatterns, + builder.triggerCheck, builder.matchThreshold, builder.priority, new HashSet<>(), + builder.description, + TYPE, builder.activeType, - true, - TYPE + true ); this.thisUnit = builder.thisUnit; } @@ -46,6 +46,7 @@ public class ReplaceCmd extends MainUnit { } public static final class Builder { + private String name = UUID.randomUUID().toString(); private String description; diff --git a/bot-domain/bot-domain-simple/src/main/java/dev/struchkov/godfather/simple/domain/unit/cmd/RollBackCmd.java b/bot-domain/bot-domain-simple/src/main/java/dev/struchkov/godfather/simple/domain/unit/cmd/RollBackCmd.java index 5a6e9a6..3cd5230 100644 --- a/bot-domain/bot-domain-simple/src/main/java/dev/struchkov/godfather/simple/domain/unit/cmd/RollBackCmd.java +++ b/bot-domain/bot-domain-simple/src/main/java/dev/struchkov/godfather/simple/domain/unit/cmd/RollBackCmd.java @@ -1,8 +1,8 @@ package dev.struchkov.godfather.simple.domain.unit.cmd; -import dev.struchkov.autoresponder.entity.KeyWord; import dev.struchkov.godfather.exception.UnitConfigException; import dev.struchkov.godfather.main.domain.content.Message; +import dev.struchkov.godfather.main.domain.unit.KeyWord; import dev.struchkov.godfather.main.domain.unit.UnitActiveType; import dev.struchkov.godfather.simple.domain.unit.MainUnit; @@ -35,17 +35,17 @@ public class RollBackCmd extends MainUnit { private RollBackCmd(Builder builder) { super( builder.name, - builder.description, builder.triggerWords, builder.triggerPhrases, - builder.triggerCheck, builder.triggerPatterns, + builder.triggerCheck, builder.matchThreshold, builder.priority, new HashSet<>(), + builder.description, + TYPE, builder.activeType, - true, - TYPE + true ); this.countBack = builder.countBack; this.rollbackUnitName = builder.rollbackUnitName; diff --git a/pom.xml b/pom.xml index e26ca24..ff4fe28 100644 --- a/pom.xml +++ b/pom.xml @@ -33,8 +33,7 @@ UTF-8 UTF-8 - 3.6.1 - 2.6.0 + 2.7.2 2.30.1 @@ -127,12 +126,6 @@ ${project.version} - - dev.struchkov - autoresponder - ${autoresponder.ver} - - dev.struchkov.haiti haiti-utils @@ -150,6 +143,13 @@ annotations ${jetbrains.annotations.version} + + + + com.fasterxml.jackson.core + jackson-databind + 2.14.2 +