diff --git a/bot-context/pom.xml b/bot-context/pom.xml index b1e62d2..0cc1745 100644 --- a/bot-context/pom.xml +++ b/bot-context/pom.xml @@ -6,7 +6,7 @@ dev.struchkov.godfather godfather-bot - 0.0.14 + 0.0.17 bot-context diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/BoxAnswer.java b/bot-context/src/main/java/dev/struchkov/godfather/context/domain/BoxAnswer.java index 426c5c5..5392893 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/BoxAnswer.java +++ b/bot-context/src/main/java/dev/struchkov/godfather/context/domain/BoxAnswer.java @@ -30,18 +30,38 @@ public class BoxAnswer { replace = builder.replace; } + public static BoxAnswer boxAnswer(boolean replace, String message) { + return BoxAnswer.builder().replace(replace).message(message).build(); + } + + public static BoxAnswer boxAnswer(boolean replace, String messageText, KeyBoard keyBoard) { + return BoxAnswer.builder().replace(replace).message(messageText).keyBoard(keyBoard).build(); + } + public static BoxAnswer boxAnswer(String message) { - return BoxAnswer.builder().message(message).build(); + return boxAnswer(false, message); } public static BoxAnswer boxAnswer(String messageText, KeyBoard keyBoard) { - return BoxAnswer.builder().message(messageText).keyBoard(keyBoard).build(); + return boxAnswer(false, messageText, keyBoard); + } + + public static BoxAnswer replaceBoxAnswer(String message) { + return boxAnswer(true, message); + } + + public static BoxAnswer replaceBoxAnswer(String messageText, KeyBoard keyBoard) { + return boxAnswer(true, messageText, keyBoard); } public static Builder builder() { return new Builder(); } + public static Builder replaceBuilder() { + return new Builder().replace(true); + } + public String getMessage() { return message; } diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/ContextKey.java b/bot-context/src/main/java/dev/struchkov/godfather/context/domain/ContextKey.java new file mode 100644 index 0000000..e6ac5cf --- /dev/null +++ b/bot-context/src/main/java/dev/struchkov/godfather/context/domain/ContextKey.java @@ -0,0 +1,23 @@ +package dev.struchkov.godfather.context.domain; + +public interface ContextKey { + + String getValue(); + + Class getType(); + + static ContextKey of(String value, Class type) { + return new ContextKey<>() { + @Override + public String getValue() { + return value; + } + + @Override + public Class getType() { + return type; + } + }; + } + +} diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/unit/AnswerCheck.java b/bot-context/src/main/java/dev/struchkov/godfather/context/domain/unit/AnswerCheck.java index 761eed0..7ea377a 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/unit/AnswerCheck.java +++ b/bot-context/src/main/java/dev/struchkov/godfather/context/domain/unit/AnswerCheck.java @@ -9,6 +9,7 @@ import dev.struchkov.godfather.context.service.usercode.CheckData; import java.util.Collection; import java.util.HashSet; import java.util.Set; +import java.util.function.Predicate; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -43,6 +44,7 @@ public class AnswerCheck extends MainUnit { builder.name, builder.keyWords, builder.phrases, + builder.triggerCheck, builder.pattern, builder.matchThreshold, builder.priority, @@ -77,6 +79,7 @@ public class AnswerCheck extends MainUnit { private String name; private final Set keyWords = new HashSet<>(); private final Set phrases = new HashSet<>(); + private Predicate triggerCheck; private Pattern pattern; private Integer matchThreshold; private Integer priority; @@ -130,6 +133,11 @@ public class AnswerCheck extends MainUnit { return this; } + private Builder triggerCheck(Predicate trigger) { + triggerCheck = trigger; + return this; + } + public Builder matchThreshold(Integer val) { matchThreshold = val; return this; diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/unit/AnswerSave.java b/bot-context/src/main/java/dev/struchkov/godfather/context/domain/unit/AnswerSave.java index 9155f49..83b776b 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/unit/AnswerSave.java +++ b/bot-context/src/main/java/dev/struchkov/godfather/context/domain/unit/AnswerSave.java @@ -12,9 +12,11 @@ import dev.struchkov.godfather.context.service.save.Pusher; import java.util.Collection; import java.util.HashSet; import java.util.Set; +import java.util.function.Predicate; import java.util.regex.Pattern; import java.util.stream.Collectors; +import static dev.struchkov.haiti.utils.Checker.checkNull; import static dev.struchkov.haiti.utils.Inspector.isNotNull; /** @@ -56,6 +58,7 @@ public class AnswerSave extends MainUnit { builder.name, builder.keyWords, builder.phrases, + builder.triggerCheck, builder.pattern, builder.matchThreshold, builder.priority, @@ -112,6 +115,7 @@ public class AnswerSave extends MainUnit { private String name; private final Set keyWords = new HashSet<>(); private final Set phrases = new HashSet<>(); + private Predicate triggerCheck; private Pattern pattern; private Integer matchThreshold; private Integer priority; @@ -168,6 +172,11 @@ public class AnswerSave extends MainUnit { return this; } + public Builder triggerCheck(Predicate trigger) { + triggerCheck = trigger; + return this; + } + public Builder matchThreshold(Integer val) { matchThreshold = val; return this; @@ -230,8 +239,10 @@ public class AnswerSave extends MainUnit { public AnswerSave build() { isNotNull(preservable, "Не указан репозиторий для сохранения формы пользователя"); - isNotNull(preservableData, "Не указаны данные для сохранения"); - isNotNull(key, "Не указан ключ для сохранения"); + if (checkNull(pusher)) { + isNotNull(preservableData, "Не указаны данные для сохранения"); + isNotNull(key, "Не указан ключ для сохранения"); + } return new AnswerSave<>(this); } diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/unit/AnswerText.java b/bot-context/src/main/java/dev/struchkov/godfather/context/domain/unit/AnswerText.java index d491c10..2501d27 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/unit/AnswerText.java +++ b/bot-context/src/main/java/dev/struchkov/godfather/context/domain/unit/AnswerText.java @@ -8,13 +8,12 @@ import dev.struchkov.godfather.context.exception.UnitConfigException; import dev.struchkov.godfather.context.service.Accessibility; import dev.struchkov.godfather.context.service.sender.Sending; import dev.struchkov.godfather.context.service.usercode.Insert; -import dev.struchkov.godfather.context.service.usercode.MessageFunction; import dev.struchkov.godfather.context.service.usercode.ProcessingData; -import java.util.Collection; +import java.util.Arrays; import java.util.HashSet; import java.util.Set; -import java.util.function.Consumer; +import java.util.function.Predicate; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -47,6 +46,7 @@ public class AnswerText extends MainUnit { builder.name, builder.keyWords, builder.phrases, + builder.triggerCheck, builder.pattern, builder.matchThreshold, builder.priority, @@ -65,6 +65,10 @@ public class AnswerText extends MainUnit { return AnswerText.builder().boxAnswer(BoxAnswer.boxAnswer(message)).build(); } + public static AnswerText of(BoxAnswer boxAnswer) { + return AnswerText.builder().boxAnswer(boxAnswer).build(); + } + public static Builder builder() { return new Builder<>(); } @@ -84,6 +88,7 @@ public class AnswerText extends MainUnit { public static final class Builder { private final Set keyWords = new HashSet<>(); private final Set phrases = new HashSet<>(); + private Predicate triggerCheck; private String name; private ProcessingData boxAnswer; private Insert insert; @@ -109,22 +114,6 @@ public class AnswerText extends MainUnit { return this; } - public Builder message(MessageFunction function) { - this.boxAnswer = message -> { - final BoxAnswer.Builder builder = BoxAnswer.builder(); - function.build(message, builder); - return builder.build(); - }; - return this; - } - - public Builder boxAnswer(Consumer boxAnswer) { - final BoxAnswer.Builder boxAnswerBuilder = BoxAnswer.builder(); - boxAnswer.accept(boxAnswerBuilder); - this.boxAnswer = message -> boxAnswerBuilder.build(); - return this; - } - public Builder boxAnswer(BoxAnswer boxAnswer) { this.boxAnswer = message -> boxAnswer; return this; @@ -165,8 +154,13 @@ public class AnswerText extends MainUnit { return this; } - public Builder phrases(Collection val) { - phrases.addAll(val); + public Builder phrases(String... val) { + phrases.addAll(Arrays.asList(val)); + return this; + } + + public Builder triggerCheck(Predicate trigger) { + triggerCheck = trigger; return this; } diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/unit/AnswerTimer.java b/bot-context/src/main/java/dev/struchkov/godfather/context/domain/unit/AnswerTimer.java index ef51233..ae9ed31 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/unit/AnswerTimer.java +++ b/bot-context/src/main/java/dev/struchkov/godfather/context/domain/unit/AnswerTimer.java @@ -9,6 +9,7 @@ import dev.struchkov.godfather.context.service.usercode.CheckData; import java.util.Collection; import java.util.HashSet; import java.util.Set; +import java.util.function.Predicate; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -47,6 +48,7 @@ public class AnswerTimer extends MainUnit { builder.name, builder.keyWords, builder.phrases, + builder.triggerCheck, builder.pattern, builder.matchThreshold, builder.priority, @@ -90,6 +92,7 @@ public class AnswerTimer extends MainUnit { private CheckData checkLoop; private final Set keyWords = new HashSet<>(); private final Set phrases = new HashSet<>(); + private Predicate triggerCheck; private Pattern pattern; private Integer matchThreshold; private Integer priority; @@ -160,6 +163,11 @@ public class AnswerTimer extends MainUnit { return this; } + public Builder triggerCheck(Predicate trigger) { + triggerCheck = trigger; + return this; + } + public Builder matchThreshold(Integer val) { matchThreshold = val; return this; diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/unit/AnswerValidity.java b/bot-context/src/main/java/dev/struchkov/godfather/context/domain/unit/AnswerValidity.java index c57bf6d..dfd3d27 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/unit/AnswerValidity.java +++ b/bot-context/src/main/java/dev/struchkov/godfather/context/domain/unit/AnswerValidity.java @@ -2,14 +2,15 @@ package dev.struchkov.godfather.context.domain.unit; import dev.struchkov.autoresponder.entity.KeyWord; import dev.struchkov.godfather.context.domain.TypeUnit; -import dev.struchkov.godfather.context.service.Accessibility; -import dev.struchkov.godfather.context.service.ClarificationQuestion; import dev.struchkov.godfather.context.repository.preser.AnswerSaveMapPreservable; import dev.struchkov.godfather.context.repository.preser.Preservable; +import dev.struchkov.godfather.context.service.Accessibility; +import dev.struchkov.godfather.context.service.ClarificationQuestion; import java.util.Collection; import java.util.HashSet; import java.util.Set; +import java.util.function.Predicate; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -44,6 +45,7 @@ public class AnswerValidity extends MainUnit { builder.name, builder.keyWords, builder.phrases, + builder.triggerCheck, builder.pattern, builder.matchThreshold, builder.priority, @@ -86,6 +88,7 @@ public class AnswerValidity extends MainUnit { public static final class Builder { private final Set keyWords = new HashSet<>(); private final Set phrases = new HashSet<>(); + private Predicate triggerCheck; private String name; private MainUnit unitYes; private MainUnit unitNo; @@ -161,6 +164,11 @@ public class AnswerValidity extends MainUnit { return this; } + public Builder triggerCheck(Predicate trigger) { + triggerCheck = trigger; + return this; + } + public Builder matchThreshold(Integer val) { matchThreshold = val; return this; diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/unit/MainUnit.java b/bot-context/src/main/java/dev/struchkov/godfather/context/domain/unit/MainUnit.java index 8ed3ad3..91e7cbc 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/unit/MainUnit.java +++ b/bot-context/src/main/java/dev/struchkov/godfather/context/domain/unit/MainUnit.java @@ -8,6 +8,7 @@ import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.UUID; +import java.util.function.Predicate; import java.util.regex.Pattern; /** @@ -48,6 +49,7 @@ public abstract class MainUnit extends Unit { String name, Set keyWords, Set phrases, + Predicate triggerCheck, Pattern pattern, Integer matchThreshold, Integer priority, @@ -57,7 +59,7 @@ public abstract class MainUnit extends Unit { Accessibility accessibility, String type ) { - super(keyWords, phrases, pattern, matchThreshold, priority, nextUnits); + super(keyWords, phrases, triggerCheck, pattern, matchThreshold, priority, nextUnits); this.name = name; this.activeType = Optional.ofNullable(activeType).orElse(UnitActiveType.DEFAULT); this.accessibility = accessibility; diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/unit/cmd/ReplaceCmd.java b/bot-context/src/main/java/dev/struchkov/godfather/context/domain/unit/cmd/ReplaceCmd.java index f9aed0a..1259290 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/unit/cmd/ReplaceCmd.java +++ b/bot-context/src/main/java/dev/struchkov/godfather/context/domain/unit/cmd/ReplaceCmd.java @@ -8,6 +8,7 @@ import dev.struchkov.godfather.context.domain.unit.UnitActiveType; import java.util.Collection; import java.util.HashSet; import java.util.Set; +import java.util.function.Predicate; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -20,6 +21,7 @@ public class ReplaceCmd extends MainUnit { builder.name, builder.keyWords, builder.phrases, + builder.triggerCheck, builder.pattern, builder.matchThreshold, builder.priority, @@ -43,7 +45,8 @@ public class ReplaceCmd extends MainUnit { public static final class Builder { private final Set keyWords = new HashSet<>(); private String name; - private Set phrases = new HashSet<>(); + private final Set phrases = new HashSet<>(); + private Predicate triggerCheck; private Pattern pattern; private Integer matchThreshold; private Integer priority; @@ -94,6 +97,11 @@ public class ReplaceCmd extends MainUnit { return this; } + public Builder triggerCheck(Predicate trigger) { + triggerCheck = trigger; + return this; + } + public Builder matchThreshold(Integer val) { matchThreshold = val; return this; diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/unit/cmd/RollBackCmd.java b/bot-context/src/main/java/dev/struchkov/godfather/context/domain/unit/cmd/RollBackCmd.java index 4748172..6d740b6 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/unit/cmd/RollBackCmd.java +++ b/bot-context/src/main/java/dev/struchkov/godfather/context/domain/unit/cmd/RollBackCmd.java @@ -9,6 +9,7 @@ import dev.struchkov.godfather.context.exception.UnitConfigException; import java.util.Collection; import java.util.HashSet; import java.util.Set; +import java.util.function.Predicate; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -32,6 +33,7 @@ public class RollBackCmd extends MainUnit { builder.name, builder.keyWords, builder.phrases, + builder.triggerCheck, builder.pattern, builder.matchThreshold, builder.priority, @@ -80,7 +82,8 @@ public class RollBackCmd extends MainUnit { public static final class Builder { private final Set keyWords = new HashSet<>(); private String name; - private Set phrases = new HashSet<>(); + private final Set phrases = new HashSet<>(); + private Predicate triggerCheck; private Pattern pattern; private Integer matchThreshold; private Integer priority; @@ -121,6 +124,11 @@ public class RollBackCmd extends MainUnit { return this; } + public Builder triggerCheck(Predicate trigger) { + triggerCheck = trigger; + return this; + } + public Builder phrases(Collection val) { phrases.addAll(val); return this; diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/unit/cmd/TeleportCmd.java b/bot-context/src/main/java/dev/struchkov/godfather/context/domain/unit/cmd/TeleportCmd.java index 5b9a879..fd0fe3a 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/domain/unit/cmd/TeleportCmd.java +++ b/bot-context/src/main/java/dev/struchkov/godfather/context/domain/unit/cmd/TeleportCmd.java @@ -8,6 +8,7 @@ import dev.struchkov.godfather.context.domain.unit.UnitActiveType; import java.util.Collection; import java.util.HashSet; import java.util.Set; +import java.util.function.Predicate; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -26,6 +27,7 @@ public class TeleportCmd extends MainUnit { builder.name, builder.keyWords, builder.phrases, + builder.triggerCheck, builder.pattern, builder.matchThreshold, builder.priority, @@ -49,6 +51,7 @@ public class TeleportCmd extends MainUnit { public static final class Builder { private final Set keyWords = new HashSet<>(); private final Set phrases = new HashSet<>(); + private Predicate triggerCheck; private String name; private Pattern pattern; private Integer matchThreshold; @@ -99,6 +102,11 @@ public class TeleportCmd extends MainUnit { return this; } + public Builder triggerCheck(Predicate trigger) { + triggerCheck = trigger; + return this; + } + public Builder matchThreshold(Integer val) { matchThreshold = val; return this; diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/repository/impl/local/StorylineMapRepository.java b/bot-context/src/main/java/dev/struchkov/godfather/context/repository/impl/local/StorylineMapRepository.java index 8044296..f3355a6 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/repository/impl/local/StorylineMapRepository.java +++ b/bot-context/src/main/java/dev/struchkov/godfather/context/repository/impl/local/StorylineMapRepository.java @@ -5,18 +5,22 @@ import dev.struchkov.godfather.context.repository.StorylineRepository; import org.jetbrains.annotations.NotNull; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; import java.util.Optional; +import java.util.Set; import java.util.Stack; public class StorylineMapRepository implements StorylineRepository { private final Map> map = new HashMap<>(); + private final Map> historyUnitName = new HashMap<>(); @Override public void save(@NotNull StorylineHistory history) { final Long personId = history.getPersonId(); map.computeIfAbsent(personId, k -> new Stack<>()).push(history); + historyUnitName.computeIfAbsent(personId, k -> new HashSet<>()).add(history.getUnitName()); } @Override @@ -29,6 +33,7 @@ public class StorylineMapRepository implements StorylineRepository { StorylineHistory storylineHistory = null; for (int i = 0; i < countUnitsToBack; i++) { storylineHistory = stack.pop(); + historyUnitName.get(personId).remove(storylineHistory.getUnitName()); } return Optional.ofNullable(storylineHistory); } @@ -40,8 +45,9 @@ public class StorylineMapRepository implements StorylineRepository { if (map.containsKey(personId)) { final Stack stack = map.get(personId); StorylineHistory storylineHistory; - while (!stack.isEmpty()) { + while (!stack.isEmpty() && historyUnitName.get(personId).contains(unitName)) { storylineHistory = stack.pop(); + historyUnitName.get(personId).remove(storylineHistory.getUnitName()); if (unitName.equals(storylineHistory.getUnitName())) { return Optional.of(storylineHistory); } diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/repository/preser/AnswerSaveMapPreservable.java b/bot-context/src/main/java/dev/struchkov/godfather/context/repository/preser/AnswerSaveMapPreservable.java index 086d6fb..a17effd 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/repository/preser/AnswerSaveMapPreservable.java +++ b/bot-context/src/main/java/dev/struchkov/godfather/context/repository/preser/AnswerSaveMapPreservable.java @@ -31,7 +31,7 @@ public class AnswerSaveMapPreservable implements AnswerSavePreservable { @Override public void push(Long personId, Pusher pusher) { - Optional.ofNullable(pusher).ifPresent(sPusher -> sPusher.push(getAllSaveElement(personId))); + Optional.ofNullable(pusher).ifPresent(sPusher -> sPusher.push(personId, getAllSaveElement(personId))); } } diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/service/StorylineContext.java b/bot-context/src/main/java/dev/struchkov/godfather/context/service/StorylineContext.java new file mode 100644 index 0000000..13c2623 --- /dev/null +++ b/bot-context/src/main/java/dev/struchkov/godfather/context/service/StorylineContext.java @@ -0,0 +1,23 @@ +package dev.struchkov.godfather.context.service; + +import dev.struchkov.godfather.context.domain.ContextKey; +import org.jetbrains.annotations.NotNull; + +import java.util.Map; +import java.util.Optional; + +public interface StorylineContext { + + void save(@NotNull Long telegramId, @NotNull ContextKey key, Object objectForSave); + + Optional getByKey(@NotNull Long telegramId, @NotNull ContextKey key); + + T getByKeyOrThrow(@NotNull Long telegramId, @NotNull ContextKey key); + + Map getAllSaveElement(@NotNull Long telegramId); + + void removeAll(@NotNull Long telegramId); + + void removeByKey(@NotNull Long telegramId, @NotNull ContextKey key); + +} diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/service/save/Pusher.java b/bot-context/src/main/java/dev/struchkov/godfather/context/service/save/Pusher.java index c4ff5b2..fcc9781 100644 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/service/save/Pusher.java +++ b/bot-context/src/main/java/dev/struchkov/godfather/context/service/save/Pusher.java @@ -10,6 +10,6 @@ import java.util.Map; @FunctionalInterface public interface Pusher { - void push(Map saveElement); + void push(Long personId, Map saveElement); } diff --git a/bot-context/src/main/java/dev/struchkov/godfather/context/service/usercode/MessageFunction.java b/bot-context/src/main/java/dev/struchkov/godfather/context/service/usercode/MessageFunction.java deleted file mode 100644 index 2508b6a..0000000 --- a/bot-context/src/main/java/dev/struchkov/godfather/context/service/usercode/MessageFunction.java +++ /dev/null @@ -1,10 +0,0 @@ -package dev.struchkov.godfather.context.service.usercode; - -import dev.struchkov.godfather.context.domain.BoxAnswer; -import dev.struchkov.godfather.context.domain.content.Message; - -public interface MessageFunction { - - void build(M message, BoxAnswer.Builder builder); - -} diff --git a/bot-core/pom.xml b/bot-core/pom.xml index e1d5fda..60ff90a 100644 --- a/bot-core/pom.xml +++ b/bot-core/pom.xml @@ -6,7 +6,7 @@ dev.struchkov.godfather godfather-bot - 0.0.14 + 0.0.17 bot-core diff --git a/bot-core/src/main/java/dev/struchkov/godfather/core/service/StorylineContextMapImpl.java b/bot-core/src/main/java/dev/struchkov/godfather/core/service/StorylineContextMapImpl.java new file mode 100644 index 0000000..b28c807 --- /dev/null +++ b/bot-core/src/main/java/dev/struchkov/godfather/core/service/StorylineContextMapImpl.java @@ -0,0 +1,55 @@ +package dev.struchkov.godfather.core.service; + +import dev.struchkov.godfather.context.domain.ContextKey; +import dev.struchkov.godfather.context.service.StorylineContext; +import org.jetbrains.annotations.NotNull; + +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; + +import static dev.struchkov.haiti.context.exception.NotFoundException.notFoundException; +import static dev.struchkov.haiti.utils.Inspector.isNotNull; + +public class StorylineContextMapImpl implements StorylineContext { + + private final Map> map = new HashMap<>(); + + public void save(@NotNull Long personId, @NotNull ContextKey key, Object objectForSave) { + isNotNull(personId, key); + map.computeIfAbsent(personId, k -> new HashMap<>()).put(key.getValue(), objectForSave); + } + + public Optional getByKey(@NotNull Long personId, @NotNull ContextKey key) { + isNotNull(personId, key); + if (map.containsKey(personId)) { + final Map storage = map.get(personId); + final T object = (T) storage.get(key.getValue()); + if (object != null && object.getClass().equals(key.getType())) { + return Optional.of(object); + } + } + return Optional.empty(); + } + + @Override + public T getByKeyOrThrow(@NotNull Long personId, @NotNull ContextKey key) { + return getByKey(personId, key).orElseThrow(notFoundException("Не найдено значение ключа {0}, для пользователя {1}", key.getValue(), personId)); + } + + public Map getAllSaveElement(@NotNull Long personId) { + isNotNull(personId); + return map.get(personId); + } + + public void removeAll(@NotNull Long personId) { + isNotNull(personId); + map.remove(personId); + } + + public void removeByKey(@NotNull Long personId, @NotNull ContextKey key) { + isNotNull(personId, key); + map.computeIfAbsent(personId, k -> new HashMap<>()).remove(key.getValue()); + } + +} diff --git a/bot-core/src/main/java/dev/struchkov/godfather/core/service/action/AnswerSaveAction.java b/bot-core/src/main/java/dev/struchkov/godfather/core/service/action/AnswerSaveAction.java index 059f09b..21d5aed 100644 --- a/bot-core/src/main/java/dev/struchkov/godfather/core/service/action/AnswerSaveAction.java +++ b/bot-core/src/main/java/dev/struchkov/godfather/core/service/action/AnswerSaveAction.java @@ -7,6 +7,9 @@ import dev.struchkov.godfather.context.domain.unit.MainUnit; import dev.struchkov.godfather.context.repository.preser.AnswerSavePreservable; import dev.struchkov.godfather.context.service.save.CheckSave; import dev.struchkov.godfather.context.service.save.PreservableData; +import dev.struchkov.godfather.context.service.save.Pusher; + +import static dev.struchkov.haiti.utils.Checker.checkNotNull; /** * Обработчик Unit-а {@link AnswerSave}. @@ -24,22 +27,25 @@ public class AnswerSaveAction implements ActionUnit, Message> { final Long personId = message.getPersonId(); final CheckSave checkSave = answerSave.getCheckSave(); - if (checkSave != null) { + if (checkNotNull(checkSave)) { MainUnit unit = checkSave.check(message); - if (unit != null) { + if (checkNotNull(unit)) { return UnitRequest.of(unit, message); } } - PreservableData preservableData = answerSave.getPreservableData(); - if (preservableData != null) { + final PreservableData preservableData = answerSave.getPreservableData(); + if (checkNotNull(preservableData)) { D data = preservableData.getData(message); - if (data != null) { + if (checkNotNull(data)) { preservable.save(personId, answerSave.getKey(), data); } } - preservable.push(personId, answerSave.getPusher()); + final Pusher pusher = answerSave.getPusher(); + if (checkNotNull(pusher)) { + preservable.push(personId, pusher); + } return UnitRequest.of(answerSave, message); } } diff --git a/bot-core/src/main/java/dev/struchkov/godfather/core/service/save/push/UserSanderPusher.java b/bot-core/src/main/java/dev/struchkov/godfather/core/service/save/push/UserSanderPusher.java index 9a79034..472c053 100644 --- a/bot-core/src/main/java/dev/struchkov/godfather/core/service/save/push/UserSanderPusher.java +++ b/bot-core/src/main/java/dev/struchkov/godfather/core/service/save/push/UserSanderPusher.java @@ -19,7 +19,7 @@ public class UserSanderPusher implements Pusher { } @Override - public void push(Map saveElement) { + public void push(Long personId, Map saveElement) { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append("========= ").append(nameForm).append(" =========\n"); saveElement.forEach((key, value) -> stringBuilder.append(key).append(": ").append(value).append("\n")); diff --git a/pom.xml b/pom.xml index c400431..d56854e 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ dev.struchkov.godfather godfather-bot - 0.0.14 + 0.0.17 pom @@ -32,13 +32,13 @@ UTF-8 UTF-8 - 0.0.14 + 0.0.17 ${godfather.ver} ${godfather.ver} - 3.2.0 - 1.0.2 + 3.3.0 + 1.0.3 2.2 2.0.1.Final