From 5e0b6f38d44ec503ba8ad8e4a7581c398f06afa1 Mon Sep 17 00:00:00 2001 From: Struchkov Mark Date: Sun, 15 Jan 2023 11:33:45 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D1=8F=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=BE?= =?UTF-8?q?=D0=BD=D0=B0=D0=BB=D0=B0=20callback.=20=D0=A3=D0=B4=D0=B0=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20=D0=BC=D0=B5=D1=85=D0=B0=D0=BD=D0=B8=D0=B7=D0=BC?= =?UTF-8?q?=20InsertWords.=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=BE=20SendingService=20-=20=D1=80=D0=B0=D1=81=D1=88?= =?UTF-8?q?=D0=B8=D1=80=D0=B5=D0=BD=D0=B8=D0=B5=20Sending.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../quarkus/context/service/Sending.java | 7 +-- .../context/service/SendingService.java | 21 +++++++ .../simple/context/service/Sending.java | 9 +-- .../context/service/SendingService.java | 22 +++++++ .../main/core/utils/InsertWords.java | 47 --------------- .../quarkus/core/GeneralAutoResponder.java | 10 ++-- .../core/action/AnswerCheckAction.java | 4 +- .../quarkus/core/action/AnswerTextAction.java | 43 +++++--------- .../core/service/StorylineContextMapImpl.java | 23 ++++++-- .../quarkus/core/unit/AnswerText.java | 38 ++++--------- .../quarkus/core/unit/func/Insert.java | 12 ---- .../unit/func/collback/CallBackConsumer.java | 11 ++++ .../unit/func/collback/IntegerCallBack.java | 11 ++++ .../unit/func/collback/StringCallBack.java | 11 ++++ .../simple/core/GeneralAutoResponder.java | 57 ++++++++++++++----- .../simple/core/action/AnswerCheckAction.java | 4 +- .../simple/core/action/AnswerTextAction.java | 43 +++++++------- .../simple/core/pusher/UserSanderPusher.java | 4 +- .../core/service/StorylineContextMapImpl.java | 24 ++++++-- .../simple/core/unit/AnswerText.java | 41 ++++--------- .../simple/core/unit/func/Insert.java | 10 ---- .../unit/func/collback/CallBackConsumer.java | 10 ++++ .../unit/func/collback/IntegerCallBack.java | 10 ++++ .../unit/func/collback/StringCallBack.java | 10 ++++ .../quarkus/data/StorylineContext.java | 4 +- .../simple/data/StorylineContext.java | 4 +- .../godfather/main/domain/SentBox.java | 33 +++++++++++ 27 files changed, 298 insertions(+), 225 deletions(-) create mode 100644 bot-context/bot-context-quarkus/src/main/java/dev/struchkov/godfather/quarkus/context/service/SendingService.java create mode 100644 bot-context/bot-context-simple/src/main/java/dev/struchkov/godfather/simple/context/service/SendingService.java delete mode 100644 bot-core/bot-core-main/src/main/java/dev/struchkov/godfather/main/core/utils/InsertWords.java delete mode 100644 bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/unit/func/Insert.java create mode 100644 bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/unit/func/collback/CallBackConsumer.java create mode 100644 bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/unit/func/collback/IntegerCallBack.java create mode 100644 bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/unit/func/collback/StringCallBack.java delete mode 100644 bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/unit/func/Insert.java create mode 100644 bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/unit/func/collback/CallBackConsumer.java create mode 100644 bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/unit/func/collback/IntegerCallBack.java create mode 100644 bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/unit/func/collback/StringCallBack.java create mode 100644 bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/SentBox.java 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 index c04e0b4..d657105 100644 --- 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 @@ -2,6 +2,7 @@ package dev.struchkov.godfather.quarkus.context.service; import dev.struchkov.godfather.main.domain.BoxAnswer; import dev.struchkov.godfather.main.domain.SendType; +import dev.struchkov.godfather.main.domain.SentBox; import io.smallrye.mutiny.Uni; import org.jetbrains.annotations.NotNull; @@ -10,16 +11,14 @@ import org.jetbrains.annotations.NotNull; * * @author upagge [08/07/2019] */ -public interface Sending { +public interface Sending { /** * Отправляет сообщение пользователю * * @param boxAnswer Объект с данными, которые необходимо отправить */ - Uni send(@NotNull BoxAnswer boxAnswer); - - void addPreSendProcess(@NotNull PreSendProcessing processing); + Uni> send(@NotNull BoxAnswer boxAnswer); /** * Возвращает тип объекта отправляющего ответ пользователя. В зависимости от типа ответ будет отправлен с помощью diff --git a/bot-context/bot-context-quarkus/src/main/java/dev/struchkov/godfather/quarkus/context/service/SendingService.java b/bot-context/bot-context-quarkus/src/main/java/dev/struchkov/godfather/quarkus/context/service/SendingService.java new file mode 100644 index 0000000..136b731 --- /dev/null +++ b/bot-context/bot-context-quarkus/src/main/java/dev/struchkov/godfather/quarkus/context/service/SendingService.java @@ -0,0 +1,21 @@ +package dev.struchkov.godfather.quarkus.context.service; + +import dev.struchkov.godfather.main.domain.BoxAnswer; +import dev.struchkov.godfather.main.domain.SentBox; +import io.smallrye.mutiny.Uni; +import org.jetbrains.annotations.NotNull; + +/** + * Интерфейс для отправки ответов пользователю. + * + * @author upagge [08/07/2019] + */ +public interface SendingService extends Sending { + + void addPreSendProcess(@NotNull PreSendProcessing processing); + + Uni deleteMessage(@NotNull String personId, @NotNull MESSAGE_ID messageId); + + Uni> replaceMessage(@NotNull String personId, @NotNull MESSAGE_ID messageId, @NotNull BoxAnswer newAnswer); + +} diff --git a/bot-context/bot-context-simple/src/main/java/dev/struchkov/godfather/simple/context/service/Sending.java b/bot-context/bot-context-simple/src/main/java/dev/struchkov/godfather/simple/context/service/Sending.java index c2eb819..897a0fd 100644 --- a/bot-context/bot-context-simple/src/main/java/dev/struchkov/godfather/simple/context/service/Sending.java +++ b/bot-context/bot-context-simple/src/main/java/dev/struchkov/godfather/simple/context/service/Sending.java @@ -2,23 +2,24 @@ package dev.struchkov.godfather.simple.context.service; import dev.struchkov.godfather.main.domain.BoxAnswer; import dev.struchkov.godfather.main.domain.SendType; +import dev.struchkov.godfather.main.domain.SentBox; import org.jetbrains.annotations.NotNull; +import java.util.Optional; + /** * Интерфейс для отправки ответов пользователю. * * @author upagge [08/07/2019] */ -public interface Sending { +public interface Sending { /** * Отравляет сообщение пользователю. * * @param boxAnswer Объект с данными, которые необходимо отправить */ - void send(@NotNull BoxAnswer boxAnswer); - - void addPreSendProcess(@NotNull PreSendProcessing processing); + Optional> send(@NotNull BoxAnswer boxAnswer); /** * Возвращает тип объекта отправляющего ответ пользователя. В зависимости от типа ответ будет отправлен с помощью diff --git a/bot-context/bot-context-simple/src/main/java/dev/struchkov/godfather/simple/context/service/SendingService.java b/bot-context/bot-context-simple/src/main/java/dev/struchkov/godfather/simple/context/service/SendingService.java new file mode 100644 index 0000000..ccac6d2 --- /dev/null +++ b/bot-context/bot-context-simple/src/main/java/dev/struchkov/godfather/simple/context/service/SendingService.java @@ -0,0 +1,22 @@ +package dev.struchkov.godfather.simple.context.service; + +import dev.struchkov.godfather.main.domain.BoxAnswer; +import dev.struchkov.godfather.main.domain.SentBox; +import org.jetbrains.annotations.NotNull; + +import java.util.Optional; + +/** + * Интерфейс для отправки ответов пользователю. + * + * @author upagge [08/07/2019] + */ +public interface SendingService extends Sending { + + void addPreSendProcess(@NotNull PreSendProcessing processing); + + void deleteMessage(@NotNull String personId, @NotNull MESSAGE_ID messageId); + + Optional> replaceMessage(@NotNull String personId, @NotNull MESSAGE_ID messageId, @NotNull BoxAnswer newAnswer); + +} diff --git a/bot-core/bot-core-main/src/main/java/dev/struchkov/godfather/main/core/utils/InsertWords.java b/bot-core/bot-core-main/src/main/java/dev/struchkov/godfather/main/core/utils/InsertWords.java deleted file mode 100644 index 6a0b49f..0000000 --- a/bot-core/bot-core-main/src/main/java/dev/struchkov/godfather/main/core/utils/InsertWords.java +++ /dev/null @@ -1,47 +0,0 @@ -package dev.struchkov.godfather.main.core.utils; - -import org.jetbrains.annotations.NotNull; - -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import static dev.struchkov.haiti.utils.Exceptions.utilityClass; - -/** - * Класс для вставки слов в текстовую строку вместо подстрок - шаблонов маркеров. - * - * @author upagge [08/07/2019] - */ -public class InsertWords { - - private static final Pattern pattern = Pattern.compile("\\{(\\d+)}"); - - private InsertWords() { - utilityClass(); - } - - /** - * Заменяет шаблон {n} в строке на слово из списка, где n - это порядковое число. - * - * @param text Текстовая строка - * @param words Список слов, которые необходимо поместить вместо шаблона - * @return Модифицированная строка - */ - public static String insert(@NotNull String text, List words) { - final Matcher m = pattern.matcher(text); - final StringBuilder result = new StringBuilder(); - while (m.find()) { - if (Integer.parseInt(m.group(1)) < words.size()) { - m.appendReplacement(result, words.get(Integer.parseInt(m.group(1)))); - } else { - m.appendReplacement(result, m.group(0)); - } - } - m.appendTail(result); - return result.toString(); - } - -} - - 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 aead876..310c44c 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 @@ -36,14 +36,14 @@ import static java.util.Collections.emptySet; public class GeneralAutoResponder { - private final PersonSettingService personSettingService; - private final StorylineService storyLineService; + protected final PersonSettingService personSettingService; + protected final StorylineService storyLineService; protected Map actionUnitMap = new HashMap<>(); protected List> modifiable; - private ErrorHandler errorHandler; + protected ErrorHandler errorHandler; protected GeneralAutoResponder( - Sending sending, + Sending sending, PersonSettingService personSettingService, StorylineService storyLineService ) { @@ -52,7 +52,7 @@ public class GeneralAutoResponder { init(sending); } - private void init(Sending sending) { + private void init(Sending sending) { actionUnitMap.put(TypeUnit.CHECK, new AnswerCheckAction<>(sending)); actionUnitMap.put(TypeUnit.TEXT, new AnswerTextAction(sending)); actionUnitMap.put(TypeUnit.REPLACE_CMD, new ReplaceCmdAction()); 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 index 18ef5b4..98d12af 100644 --- 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 @@ -20,9 +20,9 @@ import static dev.struchkov.haiti.utils.Checker.checkTrue; */ public class AnswerCheckAction implements ActionUnit, M> { - private final Sending sending; + private final Sending sending; - public AnswerCheckAction(Sending sending) { + public AnswerCheckAction(Sending sending) { this.sending = sending; } 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 index 085b27e..06dc6a4 100644 --- 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 @@ -1,15 +1,13 @@ 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.unit.func.collback.CallBackConsumer; import io.smallrye.mutiny.Uni; -import static dev.struchkov.haiti.utils.Checker.checkNotEmpty; import static dev.struchkov.haiti.utils.Checker.checkNotNull; /** @@ -19,9 +17,9 @@ import static dev.struchkov.haiti.utils.Checker.checkNotNull; */ public class AnswerTextAction implements ActionUnit, Message> { - private final Sending sending; + private final Sending sending; - public AnswerTextAction(Sending sending) { + public AnswerTextAction(Sending sending) { this.sending = sending; } @@ -29,31 +27,20 @@ public class AnswerTextAction implements ActionUnit, Message public Uni> action(UnitRequest, Message> unitRequest) { final Message message = unitRequest.getMessage(); final AnswerText unit = unitRequest.getUnit(); - return Uni.createFrom().voidItem() - .chain(request -> unit.getAnswer().processing(message)) - .onItem().ifNotNull().transformToUni(boxAnswer -> replaceMarkers(unit, message, boxAnswer)) - .onItem().ifNotNull().transformToUni(boxAnswer -> { - final Sending answerTextSending = unit.getSending(); - boxAnswer.setRecipientIfNull(message.getPersonId()); - if (checkNotNull(answerTextSending)) { - return answerTextSending.send(boxAnswer); - } else { - return sending.send(boxAnswer); - } - }).replaceWith(UnitRequest.of(unit, message)); - } - private Uni replaceMarkers(AnswerText answerText, Message message, BoxAnswer boxAnswer) { - return Uni.createFrom().item(answerText.getInsert()) - .onItem().ifNotNull().transformToUni(insert -> insert.insert(message.getPersonId())) - .onItem().ifNotNull().transform(words -> { - if (checkNotEmpty(words)) { - final String newMessage = InsertWords.insert(boxAnswer.getMessage(), words); - boxAnswer.setMessage(newMessage); - } - return boxAnswer; + return unit.getAnswer().processing(message) + .onItem().ifNotNull().transformToUni(boxAnswer -> { + boxAnswer.setRecipientIfNull(message.getPersonId()); + return sending.send(boxAnswer); }) - .replaceIfNullWith(boxAnswer); + .onItem().ifNotNull().transformToUni(sentBox -> { + final CallBackConsumer callBack = unit.getCallBack(); + if (checkNotNull(callBack)) { + return callBack.processing(sentBox); + } + return Uni.createFrom().voidItem(); + }) + .replaceWith(UnitRequest.of(unit, message)); } } 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 index 3176ce0..60b5013 100644 --- 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 @@ -9,6 +9,7 @@ import java.util.HashMap; import java.util.Map; import static dev.struchkov.haiti.context.exception.NotFoundException.notFoundException; +import static dev.struchkov.haiti.utils.Checker.checkNotNull; import static dev.struchkov.haiti.utils.Inspector.isNotNull; public class StorylineContextMapImpl implements StorylineContext { @@ -33,27 +34,37 @@ public class StorylineContextMapImpl implements StorylineContext { return Uni.createFrom().nullItem(); } + @Override + public Uni removeKey(@NotNull String 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 (checkNotNull(object) && object.getClass().equals(key.getType())) { + storage.remove(key.getValue()); + return Uni.createFrom().item(object); + } + } + return Uni.createFrom().nullItem(); + } + @Override public Uni getByKeyOrThrow(@NotNull String personId, @NotNull ContextKey key) { return getByKey(personId, key) .onItem().ifNull().failWith(notFoundException("Не найдено значение ключа {0}, для пользователя {1}", key.getValue(), personId)); } + @Override public Uni> getAllSaveElement(@NotNull String personId) { isNotNull(personId); return Uni.createFrom().item(map.get(personId)); } + @Override public Uni removeAll(@NotNull String personId) { isNotNull(personId); map.remove(personId); return Uni.createFrom().voidItem(); } - public Uni removeByKey(@NotNull String 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/unit/AnswerText.java b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/unit/AnswerText.java index ab6e56c..c7ed014 100644 --- 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 @@ -6,9 +6,8 @@ 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 dev.struchkov.godfather.quarkus.core.unit.func.collback.CallBackConsumer; import io.smallrye.mutiny.Uni; import java.util.HashSet; @@ -34,15 +33,10 @@ public class AnswerText extends MainUnit { */ private final ProcessingData answer; - /** - * Информация, которую необходимо вставить вместо маркеров в строку ответа. - */ - private final Insert insert; - /** * Объект нестандартной отправки ответа. */ - private final Sending sender; + private final CallBackConsumer callBack; private AnswerText(Builder builder) { super( @@ -61,8 +55,7 @@ public class AnswerText extends MainUnit { TypeUnit.TEXT ); answer = builder.boxAnswer; - insert = builder.insert; - sender = builder.sending; + callBack = builder.callBack; } public static AnswerText of(String message) { @@ -81,15 +74,12 @@ public class AnswerText extends MainUnit { return answer; } - public Insert getInsert() { - return insert; - } - - public Sending getSending() { - return sender; + public CallBackConsumer getCallBack() { + return callBack; } public static final class Builder { + private String name = UUID.randomUUID().toString(); private String description; private Set> nextUnits; @@ -107,8 +97,7 @@ public class AnswerText extends MainUnit { private boolean notSaveHistory; private ProcessingData boxAnswer; - private Insert insert; - private Sending sending; + private CallBackConsumer callBack; private Builder() { } @@ -123,10 +112,10 @@ public class AnswerText extends MainUnit { return this; } - public Builder processing(Consumer answer) { + public Builder answer(Consumer answer) { this.boxAnswer = message -> { answer.accept(message); - return null; + return Uni.createFrom().nullItem(); }; return this; } @@ -146,13 +135,8 @@ public class AnswerText extends MainUnit { return this; } - public Builder insert(Insert insert) { - this.insert = insert; - return this; - } - - public Builder sending(Sending sending) { - this.sending = sending; + public Builder callBack(CallBackConsumer callBack) { + this.callBack = callBack; return this; } 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 deleted file mode 100644 index 4369c55..0000000 --- a/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/unit/func/Insert.java +++ /dev/null @@ -1,12 +0,0 @@ -package dev.struchkov.godfather.quarkus.core.unit.func; - -import io.smallrye.mutiny.Uni; - -import java.util.List; - -@FunctionalInterface -public interface Insert { - - Uni> insert(String personId); - -} diff --git a/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/unit/func/collback/CallBackConsumer.java b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/unit/func/collback/CallBackConsumer.java new file mode 100644 index 0000000..1310ae1 --- /dev/null +++ b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/unit/func/collback/CallBackConsumer.java @@ -0,0 +1,11 @@ +package dev.struchkov.godfather.quarkus.core.unit.func.collback; + +import dev.struchkov.godfather.main.domain.SentBox; +import io.smallrye.mutiny.Uni; + +@FunctionalInterface +public interface CallBackConsumer { + + Uni processing(SentBox sentBox); + +} diff --git a/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/unit/func/collback/IntegerCallBack.java b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/unit/func/collback/IntegerCallBack.java new file mode 100644 index 0000000..ec9aefa --- /dev/null +++ b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/unit/func/collback/IntegerCallBack.java @@ -0,0 +1,11 @@ +package dev.struchkov.godfather.quarkus.core.unit.func.collback; + +import dev.struchkov.godfather.main.domain.SentBox; +import io.smallrye.mutiny.Uni; + +@FunctionalInterface +public interface IntegerCallBack extends CallBackConsumer { + + Uni processing(SentBox sentBox); + +} diff --git a/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/unit/func/collback/StringCallBack.java b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/unit/func/collback/StringCallBack.java new file mode 100644 index 0000000..b862363 --- /dev/null +++ b/bot-core/bot-core-quarkus/src/main/java/dev/struchkov/godfather/quarkus/core/unit/func/collback/StringCallBack.java @@ -0,0 +1,11 @@ +package dev.struchkov.godfather.quarkus.core.unit.func.collback; + +import dev.struchkov.godfather.main.domain.SentBox; +import io.smallrye.mutiny.Uni; + +@FunctionalInterface +public interface StringCallBack extends CallBackConsumer { + + Uni processing(SentBox sentBox); + +} 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 0f1a710..5bd25f6 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 @@ -25,18 +25,24 @@ import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Set; +import java.util.concurrent.ExecutorService; import java.util.stream.Collectors; +import static dev.struchkov.haiti.utils.Checker.checkNotEmpty; +import static dev.struchkov.haiti.utils.Checker.checkNotNull; + public class GeneralAutoResponder { - private final PersonSettingService personSettingService; - private final StorylineService storyLineService; + protected final PersonSettingService personSettingService; + protected final StorylineService storyLineService; + protected Map actionUnitMap = new HashMap<>(); protected List> modifiable; - private ErrorHandler errorHandler; + protected ErrorHandler errorHandler; + protected ExecutorService executorService; protected GeneralAutoResponder( - Sending sending, + Sending sending, PersonSettingService personSettingService, StorylineService storyLineService ) { @@ -45,7 +51,7 @@ public class GeneralAutoResponder { init(sending); } - private void init(Sending sending) { + private void init(Sending sending) { actionUnitMap.put(TypeUnit.CHECK, new AnswerCheckAction<>(sending)); actionUnitMap.put(TypeUnit.TEXT, new AnswerTextAction(sending)); actionUnitMap.put(TypeUnit.REPLACE_CMD, new ReplaceCmdAction()); @@ -74,21 +80,36 @@ public class GeneralAutoResponder { this.errorHandler = errorHandler; } + public void setExecutorService(ExecutorService executorService) { + this.executorService = executorService; + } + public void setDefaultUnit(String unitName) { storyLineService.setDefaultUnit(unitName); } public void processingNewMessage(M newMessage) { - if (newMessage != null) { - final boolean state = personSettingService.getStateProcessingByPersonId(newMessage.getPersonId()).orElse(true); - if (state) { - processing(newMessage); + if (checkNotNull(newMessage)) { + if (checkNotNull(executorService)) { + executorService.submit(() -> { + final boolean state = personSettingService.getStateProcessingByPersonId(newMessage.getPersonId()) + .orElse(true); + if (state) { + processing(newMessage); + } + }); + } else { + final boolean state = personSettingService.getStateProcessingByPersonId(newMessage.getPersonId()) + .orElse(true); + if (state) { + processing(newMessage); + } } } } public void processingNewMessages(List newMessages) { - if (newMessages != null && !newMessages.isEmpty()) { + if (checkNotEmpty(newMessages)) { final Set personIds = newMessages.stream() .map(Message::getPersonId) .collect(Collectors.toSet()); @@ -96,12 +117,20 @@ public class GeneralAutoResponder { final List allowedMessages = newMessages.stream() .filter(message -> !disableIds.contains(message.getPersonId())) .toList(); - allowedMessages.parallelStream().forEach(this::processing); + if (checkNotNull(executorService)) { + for (M allowedMessage : allowedMessages) { + executorService.submit(() -> processing(allowedMessage)); + } + } else { + for (M allowedMessage : allowedMessages) { + processing(allowedMessage); + } + } } } private void processing(M message) { - if (modifiable != null) { + if (checkNotEmpty(modifiable)) { modifiable.forEach(m -> m.change(message)); } final Set> units = storyLineService.getNextUnitByPersonId(message.getPersonId()); @@ -124,7 +153,7 @@ public class GeneralAutoResponder { unitRequest = getAction(unitRequest); activeUnitAfter(unitRequest); } catch (Exception e) { - if (errorHandler != null) { + if (checkNotNull(errorHandler)) { errorHandler.handle(unitRequest.getMessage(), e); } else { throw e; @@ -134,7 +163,7 @@ public class GeneralAutoResponder { private UnitRequest, M> activeUnitAfter(UnitRequest, M> unitRequest) { final Set> nextUnits = unitRequest.getUnit().getNextUnits(); - if (nextUnits != null) { + if (checkNotNull(nextUnits)) { Optional> first = nextUnits.stream() .filter(unit -> UnitActiveType.AFTER.equals(unit.getActiveType())) .findFirst(); diff --git a/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/action/AnswerCheckAction.java b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/action/AnswerCheckAction.java index 39d245a..90dd791 100644 --- a/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/action/AnswerCheckAction.java +++ b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/action/AnswerCheckAction.java @@ -22,9 +22,9 @@ public class AnswerCheckAction implements ActionUnit sending; - public AnswerCheckAction(Sending sending) { + public AnswerCheckAction(Sending sending) { this.sending = sending; } diff --git a/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/action/AnswerTextAction.java b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/action/AnswerTextAction.java index fe154c9..75c8752 100644 --- a/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/action/AnswerTextAction.java +++ b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/action/AnswerTextAction.java @@ -1,16 +1,19 @@ package dev.struchkov.godfather.simple.core.action; -import dev.struchkov.godfather.main.core.utils.InsertWords; import dev.struchkov.godfather.main.domain.BoxAnswer; +import dev.struchkov.godfather.main.domain.SentBox; 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.unit.func.ProcessingData; +import dev.struchkov.godfather.simple.core.unit.func.collback.CallBackConsumer; -import java.util.List; import java.util.Optional; +import static dev.struchkov.haiti.utils.Checker.checkNotNull; + /** * Обработчик Unit-а {@link AnswerText}. * @@ -18,40 +21,34 @@ import java.util.Optional; */ public class AnswerTextAction implements ActionUnit, Message> { - private final Sending sending; + private final Sending sending; - public AnswerTextAction(Sending sending) { + public AnswerTextAction(Sending sending) { this.sending = sending; } @Override public UnitRequest action(UnitRequest, Message> unitRequest) { - final AnswerText unit = unitRequest.getUnit(); final Message message = unitRequest.getMessage(); + final AnswerText unit = unitRequest.getUnit(); - final Optional optAnswer = unit.getAnswer().processing(message); - if (optAnswer.isPresent()) { - final BoxAnswer answer = optAnswer.get(); - replaceMarkers(unit, message, answer); + final ProcessingData answerProcessing = unit.getAnswer(); + if (checkNotNull(answerProcessing)) { + final Optional optAnswer = answerProcessing.processing(message); + if (optAnswer.isPresent()) { + final BoxAnswer answer = optAnswer.get(); - final Sending answerTextSending = unit.getSending(); - answer.setRecipientIfNull(message.getPersonId()); - if (answerTextSending != null) { - answerTextSending.send(answer); - } else { - sending.send(answer); + answer.setRecipientIfNull(message.getPersonId()); + final Optional> optSentBox = sending.send(answer); + final CallBackConsumer callBack = unit.getCallBack(); + if (checkNotNull(callBack) && optAnswer.isPresent()) { + final SentBox sentBox = optSentBox.get(); + callBack.processing(sentBox); + } } } return UnitRequest.of(unit, message); } - private void replaceMarkers(AnswerText answerText, Message message, BoxAnswer boxAnswer) { - if (answerText.getInsert() != null) { - final List words = answerText.getInsert().insert(message.getPersonId()); - final String newMessage = InsertWords.insert(boxAnswer.getMessage(), words); - boxAnswer.setMessage(newMessage); - } - } - } diff --git a/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/pusher/UserSanderPusher.java b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/pusher/UserSanderPusher.java index a5c2351..9e55aff 100644 --- a/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/pusher/UserSanderPusher.java +++ b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/pusher/UserSanderPusher.java @@ -12,9 +12,9 @@ public class UserSanderPusher implements Pusher { private final String personId; private final String nameForm; - private final Sending sending; + private final Sending sending; - public UserSanderPusher(String personId, String nameForm, Sending sending) { + public UserSanderPusher(String personId, String nameForm, Sending sending) { this.personId = personId; this.nameForm = nameForm; this.sending = sending; diff --git a/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/service/StorylineContextMapImpl.java b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/service/StorylineContextMapImpl.java index 1e46265..03a4d8b 100644 --- a/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/service/StorylineContextMapImpl.java +++ b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/service/StorylineContextMapImpl.java @@ -9,17 +9,20 @@ import java.util.Map; import java.util.Optional; import static dev.struchkov.haiti.context.exception.NotFoundException.notFoundException; +import static dev.struchkov.haiti.utils.Checker.checkNotNull; import static dev.struchkov.haiti.utils.Inspector.isNotNull; public class StorylineContextMapImpl implements StorylineContext { private final Map> map = new HashMap<>(); + @Override public void save(@NotNull String personId, @NotNull ContextKey key, Object objectForSave) { isNotNull(personId, key); map.computeIfAbsent(personId, k -> new HashMap<>()).put(key.getValue(), objectForSave); } + @Override public Optional getByKey(@NotNull String personId, @NotNull ContextKey key) { isNotNull(personId, key); if (map.containsKey(personId)) { @@ -32,24 +35,35 @@ public class StorylineContextMapImpl implements StorylineContext { return Optional.empty(); } + @Override + public Optional removeKey(@NotNull String 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 (checkNotNull(object) && object.getClass().equals(key.getType())) { + storage.remove(key.getValue()); + return Optional.of(object); + } + } + return Optional.empty(); + } + @Override public T getByKeyOrThrow(@NotNull String personId, @NotNull ContextKey key) { return getByKey(personId, key).orElseThrow(notFoundException("Не найдено значение ключа {0}, для пользователя {1}", key.getValue(), personId)); } + @Override public Map getAllSaveElement(@NotNull String personId) { isNotNull(personId); return map.get(personId); } + @Override public void removeAll(@NotNull String personId) { isNotNull(personId); map.remove(personId); } - public void removeByKey(@NotNull String personId, @NotNull ContextKey key) { - isNotNull(personId, key); - map.computeIfAbsent(personId, k -> new HashMap<>()).remove(key.getValue()); - } - } diff --git a/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/unit/AnswerText.java b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/unit/AnswerText.java index 04caa7b..5e365fc 100644 --- a/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/unit/AnswerText.java +++ b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/unit/AnswerText.java @@ -6,9 +6,8 @@ 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 dev.struchkov.godfather.simple.core.unit.func.collback.CallBackConsumer; import java.util.HashSet; import java.util.List; @@ -34,15 +33,7 @@ public class AnswerText extends MainUnit { */ private final ProcessingData answer; - /** - * Информация, которую необходимо вставить вместо маркеров в строку ответа. - */ - private final Insert insert; - - /** - * Объект нестандартной отправки ответа. - */ - private final Sending sender; + private final CallBackConsumer callBack; private AnswerText(Builder builder) { super( @@ -61,8 +52,7 @@ public class AnswerText extends MainUnit { TypeUnit.TEXT ); answer = builder.boxAnswer; - insert = builder.insert; - sender = builder.sending; + callBack = builder.callBack; } public static AnswerText of(String message) { @@ -81,15 +71,12 @@ public class AnswerText extends MainUnit { return answer; } - public Insert getInsert() { - return insert; - } - - public Sending getSending() { - return sender; + public CallBackConsumer getCallBack() { + return callBack; } public static final class Builder { + private String name = UUID.randomUUID().toString(); private String description; private Set> nextUnits; @@ -107,8 +94,7 @@ public class AnswerText extends MainUnit { private boolean notSaveHistory; private ProcessingData boxAnswer; - private Insert insert; - private Sending sending; + private CallBackConsumer callBack; private Builder() { } @@ -123,10 +109,10 @@ public class AnswerText extends MainUnit { return this; } - public Builder processing(Consumer answer) { + public Builder answer(Consumer answer) { this.boxAnswer = message -> { answer.accept(message); - return null; + return Optional.empty(); }; return this; } @@ -146,13 +132,8 @@ public class AnswerText extends MainUnit { return this; } - public Builder insert(Insert insert) { - this.insert = insert; - return this; - } - - public Builder sending(Sending sending) { - this.sending = sending; + public Builder callBack(CallBackConsumer callBack) { + this.callBack = callBack; return this; } diff --git a/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/unit/func/Insert.java b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/unit/func/Insert.java deleted file mode 100644 index e3cc6c3..0000000 --- a/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/unit/func/Insert.java +++ /dev/null @@ -1,10 +0,0 @@ -package dev.struchkov.godfather.simple.core.unit.func; - -import java.util.List; - -@FunctionalInterface -public interface Insert { - - List insert(String personId); - -} diff --git a/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/unit/func/collback/CallBackConsumer.java b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/unit/func/collback/CallBackConsumer.java new file mode 100644 index 0000000..986b0cc --- /dev/null +++ b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/unit/func/collback/CallBackConsumer.java @@ -0,0 +1,10 @@ +package dev.struchkov.godfather.simple.core.unit.func.collback; + +import dev.struchkov.godfather.main.domain.SentBox; + +@FunctionalInterface +public interface CallBackConsumer { + + void processing(SentBox sentBox); + +} diff --git a/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/unit/func/collback/IntegerCallBack.java b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/unit/func/collback/IntegerCallBack.java new file mode 100644 index 0000000..a26cacb --- /dev/null +++ b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/unit/func/collback/IntegerCallBack.java @@ -0,0 +1,10 @@ +package dev.struchkov.godfather.simple.core.unit.func.collback; + +import dev.struchkov.godfather.main.domain.SentBox; + +@FunctionalInterface +public interface IntegerCallBack extends CallBackConsumer { + + void processing(SentBox sentBox); + +} diff --git a/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/unit/func/collback/StringCallBack.java b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/unit/func/collback/StringCallBack.java new file mode 100644 index 0000000..75d121c --- /dev/null +++ b/bot-core/bot-core-simple/src/main/java/dev/struchkov/godfather/simple/core/unit/func/collback/StringCallBack.java @@ -0,0 +1,10 @@ +package dev.struchkov.godfather.simple.core.unit.func.collback; + +import dev.struchkov.godfather.main.domain.SentBox; + +@FunctionalInterface +public interface StringCallBack extends CallBackConsumer { + + void processing(SentBox sentBox); + +} 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 index 65bc983..e10ba9a 100644 --- 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 @@ -12,12 +12,12 @@ public interface StorylineContext { Uni getByKey(@NotNull String personId, @NotNull ContextKey key); + Uni removeKey(@NotNull String personId, @NotNull ContextKey key); + Uni getByKeyOrThrow(@NotNull String personId, @NotNull ContextKey key); Uni> getAllSaveElement(@NotNull String personId); Uni removeAll(@NotNull String personId); - Uni removeByKey(@NotNull String personId, @NotNull ContextKey key); - } diff --git a/bot-data/bot-data-simple/src/main/java/dev/struchkov/godfather/simple/data/StorylineContext.java b/bot-data/bot-data-simple/src/main/java/dev/struchkov/godfather/simple/data/StorylineContext.java index 01536a2..e0a7726 100644 --- a/bot-data/bot-data-simple/src/main/java/dev/struchkov/godfather/simple/data/StorylineContext.java +++ b/bot-data/bot-data-simple/src/main/java/dev/struchkov/godfather/simple/data/StorylineContext.java @@ -12,12 +12,12 @@ public interface StorylineContext { Optional getByKey(@NotNull String personId, @NotNull ContextKey key); + Optional removeKey(@NotNull String personId, @NotNull ContextKey key); + T getByKeyOrThrow(@NotNull String personId, @NotNull ContextKey key); Map getAllSaveElement(@NotNull String personId); void removeAll(@NotNull String personId); - void removeByKey(@NotNull String personId, @NotNull ContextKey key); - } diff --git a/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/SentBox.java b/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/SentBox.java new file mode 100644 index 0000000..1e98676 --- /dev/null +++ b/bot-domain/bot-domain-main/src/main/java/dev/struchkov/godfather/main/domain/SentBox.java @@ -0,0 +1,33 @@ +package dev.struchkov.godfather.main.domain; + +import java.util.Optional; + +public class SentBox { + + private T messageId; + private BoxAnswer sentAnswer; + private BoxAnswer originalAnswer; + + public SentBox(T messageId, BoxAnswer sentAnswer, BoxAnswer originalAnswer) { + this.messageId = messageId; + this.sentAnswer = sentAnswer; + this.originalAnswer = originalAnswer; + } + + public static Optional> optional(T messageId, BoxAnswer sentAnswer, BoxAnswer originalAnswer) { + return Optional.of(new SentBox<>(messageId, sentAnswer, originalAnswer)); + } + + public T getMessageId() { + return messageId; + } + + public BoxAnswer getSentAnswer() { + return sentAnswer; + } + + public BoxAnswer getOriginalAnswer() { + return originalAnswer; + } + +}