Добавил новый тип триггера
This commit is contained in:
parent
eaeb220515
commit
0bbdcaae07
@ -6,7 +6,7 @@
|
||||
<parent>
|
||||
<groupId>dev.struchkov.godfather</groupId>
|
||||
<artifactId>godfather-bot</artifactId>
|
||||
<version>0.0.17</version>
|
||||
<version>0.0.18</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>bot-context</artifactId>
|
||||
|
@ -19,7 +19,7 @@ public class UnitRequest<U extends MainUnit, M extends Message> {
|
||||
this.message = message;
|
||||
}
|
||||
|
||||
public static <U extends MainUnit, M extends Message> UnitRequest<U, M> of(U mainUnit, M message) {
|
||||
public static <U extends MainUnit<M>, M extends Message> UnitRequest<U, M> of(U mainUnit, M message) {
|
||||
return new UnitRequest<>(mainUnit, message);
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,6 @@
|
||||
package dev.struchkov.godfather.context.domain.content;
|
||||
|
||||
import dev.struchkov.autoresponder.entity.DeliverableText;
|
||||
import dev.struchkov.godfather.context.domain.BasicEntity;
|
||||
|
||||
import javax.persistence.Column;
|
||||
@ -16,7 +17,7 @@ import java.util.Objects;
|
||||
* @author upagge [08/07/2019]
|
||||
*/
|
||||
@MappedSuperclass
|
||||
public abstract class Message extends BasicEntity {
|
||||
public abstract class Message extends BasicEntity implements DeliverableText {
|
||||
|
||||
/**
|
||||
* Тип сообщения.
|
||||
|
@ -6,7 +6,6 @@ import dev.struchkov.godfather.context.domain.content.Message;
|
||||
import dev.struchkov.godfather.context.service.Accessibility;
|
||||
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;
|
||||
@ -22,7 +21,7 @@ import static dev.struchkov.haiti.utils.Inspector.isNotNull;
|
||||
*
|
||||
* @author upagge [08/07/2019]
|
||||
*/
|
||||
public class AnswerCheck extends MainUnit {
|
||||
public class AnswerCheck<M extends Message> extends MainUnit<M> {
|
||||
|
||||
/**
|
||||
* Unit для true.
|
||||
@ -37,15 +36,15 @@ public class AnswerCheck extends MainUnit {
|
||||
/**
|
||||
* Условие проверки.
|
||||
*/
|
||||
private final CheckData<Message> check;
|
||||
private final CheckData<M> check;
|
||||
|
||||
private AnswerCheck(Builder builder) {
|
||||
private AnswerCheck(Builder<M> builder) {
|
||||
super(
|
||||
builder.name,
|
||||
builder.keyWords,
|
||||
builder.phrases,
|
||||
builder.triggerWords,
|
||||
builder.triggerPhrases,
|
||||
builder.triggerCheck,
|
||||
builder.pattern,
|
||||
builder.triggerPatterns,
|
||||
builder.matchThreshold,
|
||||
builder.priority,
|
||||
new HashSet<>(),
|
||||
@ -59,8 +58,8 @@ public class AnswerCheck extends MainUnit {
|
||||
check = builder.check;
|
||||
}
|
||||
|
||||
public static Builder builder() {
|
||||
return new Builder();
|
||||
public static <M extends Message> Builder<M> builder() {
|
||||
return new Builder<>();
|
||||
}
|
||||
|
||||
public MainUnit getUnitTrue() {
|
||||
@ -71,117 +70,144 @@ public class AnswerCheck extends MainUnit {
|
||||
return unitFalse;
|
||||
}
|
||||
|
||||
public CheckData<Message> getCheck() {
|
||||
public CheckData<M> getCheck() {
|
||||
return check;
|
||||
}
|
||||
|
||||
public static final class Builder {
|
||||
public static final class Builder<M extends Message> {
|
||||
private String name;
|
||||
private final Set<KeyWord> keyWords = new HashSet<>();
|
||||
private final Set<String> phrases = new HashSet<>();
|
||||
private Predicate<String> triggerCheck;
|
||||
private Pattern pattern;
|
||||
|
||||
private Set<KeyWord> triggerWords;
|
||||
private Set<String> triggerPhrases;
|
||||
private Predicate<M> triggerCheck;
|
||||
private Set<Pattern> triggerPatterns;
|
||||
private Integer matchThreshold;
|
||||
|
||||
private Integer priority;
|
||||
private MainUnit unitTrue;
|
||||
private MainUnit unitFalse;
|
||||
private CheckData<Message> check;
|
||||
private UnitActiveType activeType;
|
||||
|
||||
private Accessibility accessibility;
|
||||
private boolean notSaveHistory;
|
||||
|
||||
private MainUnit unitTrue;
|
||||
private MainUnit unitFalse;
|
||||
private CheckData<M> check;
|
||||
|
||||
private Builder() {
|
||||
}
|
||||
|
||||
public Builder name(String name) {
|
||||
public Builder<M> name(String name) {
|
||||
this.name = name;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder keyWords(Set<KeyWord> val) {
|
||||
keyWords.addAll(val);
|
||||
public Builder<M> triggerWords(Set<KeyWord> val) {
|
||||
if (triggerWords == null) {
|
||||
triggerWords = new HashSet<>();
|
||||
}
|
||||
triggerWords.addAll(val);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder keyWord(KeyWord val) {
|
||||
keyWords.add(val);
|
||||
public Builder<M> triggerWord(KeyWord val) {
|
||||
if (triggerWords == null) {
|
||||
triggerWords = new HashSet<>();
|
||||
}
|
||||
triggerWords.add(val);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder stringKeyWords(Set<String> val) {
|
||||
keyWords.addAll(val.stream().map(KeyWord::of).collect(Collectors.toSet()));
|
||||
public Builder<M> triggerStringWords(Set<String> val) {
|
||||
if (triggerWords == null) {
|
||||
triggerWords = new HashSet<>();
|
||||
}
|
||||
triggerWords.addAll(val.stream().map(KeyWord::of).collect(Collectors.toSet()));
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder keyWord(String val) {
|
||||
keyWords.add(KeyWord.of(val));
|
||||
public Builder<M> triggerWord(String val) {
|
||||
if (triggerWords == null) {
|
||||
triggerWords = new HashSet<>();
|
||||
}
|
||||
triggerWords.add(KeyWord.of(val));
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder phrase(String val) {
|
||||
phrases.add(val);
|
||||
public Builder<M> triggerPhrase(String... val) {
|
||||
if (triggerPhrases == null) {
|
||||
triggerPhrases = new HashSet<>();
|
||||
}
|
||||
if (val.length == 1) {
|
||||
triggerPhrases.add(val[0]);
|
||||
} else {
|
||||
triggerPhrases.addAll(Set.of(val));
|
||||
}
|
||||
triggerPhrases.addAll(Set.of(val));
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder phrases(Collection<String> val) {
|
||||
phrases.addAll(val);
|
||||
public Builder<M> triggerPattern(Pattern... val) {
|
||||
if (triggerPatterns == null) {
|
||||
triggerPatterns = new HashSet<>();
|
||||
}
|
||||
if (val.length == 1) {
|
||||
triggerPatterns.add(val[0]);
|
||||
} else {
|
||||
triggerPatterns.addAll(Set.of(val));
|
||||
}
|
||||
triggerPatterns.addAll(Set.of(val));
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder pattern(Pattern val) {
|
||||
pattern = val;
|
||||
return this;
|
||||
}
|
||||
|
||||
private Builder triggerCheck(Predicate<String> trigger) {
|
||||
private Builder<M> triggerCheck(Predicate<M> trigger) {
|
||||
triggerCheck = trigger;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder matchThreshold(Integer val) {
|
||||
public Builder<M> matchThreshold(Integer val) {
|
||||
matchThreshold = val;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder priority(Integer val) {
|
||||
public Builder<M> priority(Integer val) {
|
||||
priority = val;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder unitTrue(MainUnit unitTrue) {
|
||||
public Builder<M> unitTrue(MainUnit unitTrue) {
|
||||
this.unitTrue = unitTrue;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder unitFalse(MainUnit unitFalse) {
|
||||
public Builder<M> unitFalse(MainUnit unitFalse) {
|
||||
this.unitFalse = unitFalse;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder check(CheckData<Message> check) {
|
||||
public Builder<M> check(CheckData<M> check) {
|
||||
this.check = check;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder accessibility(Accessibility val) {
|
||||
public Builder<M> accessibility(Accessibility val) {
|
||||
accessibility = val;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder activeType(UnitActiveType val) {
|
||||
public Builder<M> activeType(UnitActiveType val) {
|
||||
activeType = val;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder notSaveHistory() {
|
||||
public Builder<M> notSaveHistory() {
|
||||
notSaveHistory = true;
|
||||
return this;
|
||||
}
|
||||
|
||||
public AnswerCheck build() {
|
||||
public AnswerCheck<M> build() {
|
||||
isNotNull(check, unitConfigException("Необходимо установить параметр проверки."));
|
||||
isAnyNotNull(unitConfigException("Необходимо задать хотя бы один unit результата проверки."));
|
||||
return new AnswerCheck(this);
|
||||
return new AnswerCheck<>(this);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -24,7 +24,7 @@ import static dev.struchkov.haiti.utils.Inspector.isNotNull;
|
||||
*
|
||||
* @author upagge [08/07/2019]
|
||||
*/
|
||||
public class AnswerSave<D> extends MainUnit {
|
||||
public class AnswerSave<M extends Message, D> extends MainUnit<M> {
|
||||
|
||||
/**
|
||||
* Объект отвечающий за сохранение - репозиторий.
|
||||
@ -44,22 +44,22 @@ public class AnswerSave<D> extends MainUnit {
|
||||
/**
|
||||
* Данные для скрытого сохранения.
|
||||
*/
|
||||
private final PreservableData<D, ? super Message> preservableData;
|
||||
private final PreservableData<D, M> preservableData;
|
||||
|
||||
/**
|
||||
* Скрытое сохранение.
|
||||
*/
|
||||
private final boolean hidden;
|
||||
|
||||
private final CheckSave<? super Message> checkSave;
|
||||
private final CheckSave<M> checkSave;
|
||||
|
||||
private AnswerSave(Builder<D> builder) {
|
||||
private AnswerSave(Builder<M, D> builder) {
|
||||
super(
|
||||
builder.name,
|
||||
builder.keyWords,
|
||||
builder.phrases,
|
||||
builder.triggerWords,
|
||||
builder.triggerPhrases,
|
||||
builder.triggerCheck,
|
||||
builder.pattern,
|
||||
builder.triggerPatterns,
|
||||
builder.matchThreshold,
|
||||
builder.priority,
|
||||
builder.nextUnits,
|
||||
@ -77,11 +77,11 @@ public class AnswerSave<D> extends MainUnit {
|
||||
checkSave = builder.checkSave;
|
||||
}
|
||||
|
||||
public static <D> Builder<D> builder() {
|
||||
public static <M extends Message, D> Builder<M, D> builder() {
|
||||
return new Builder<>();
|
||||
}
|
||||
|
||||
private void maintenanceNextUnit(Collection<MainUnit> units) {
|
||||
private void maintenanceNextUnit(Collection<MainUnit<M>> units) {
|
||||
if (units != null) {
|
||||
units.forEach(mainUnit -> mainUnit.setActiveType(UnitActiveType.AFTER));
|
||||
}
|
||||
@ -99,7 +99,7 @@ public class AnswerSave<D> extends MainUnit {
|
||||
return pusher;
|
||||
}
|
||||
|
||||
public PreservableData<D, ? super Message> getPreservableData() {
|
||||
public PreservableData<D, M> getPreservableData() {
|
||||
return preservableData;
|
||||
}
|
||||
|
||||
@ -107,137 +107,162 @@ public class AnswerSave<D> extends MainUnit {
|
||||
return hidden;
|
||||
}
|
||||
|
||||
public CheckSave<? super Message> getCheckSave() {
|
||||
public CheckSave<M> getCheckSave() {
|
||||
return checkSave;
|
||||
}
|
||||
|
||||
public static final class Builder<D> {
|
||||
public static final class Builder<M extends Message, D> {
|
||||
private String name;
|
||||
private final Set<KeyWord> keyWords = new HashSet<>();
|
||||
private final Set<String> phrases = new HashSet<>();
|
||||
private Predicate<String> triggerCheck;
|
||||
private Pattern pattern;
|
||||
private Set<MainUnit<M>> nextUnits;
|
||||
|
||||
private Set<KeyWord> triggerWords;
|
||||
private Set<String> triggerPhrases;
|
||||
private Set<Pattern> triggerPatterns;
|
||||
private Predicate<M> triggerCheck;
|
||||
|
||||
private Integer matchThreshold;
|
||||
private Integer priority;
|
||||
private Set<MainUnit> nextUnits = new HashSet<>();
|
||||
|
||||
private Accessibility accessibility;
|
||||
private boolean notSaveHistory;
|
||||
|
||||
private AnswerSavePreservable<D> preservable;
|
||||
private String key;
|
||||
private Pusher<D> pusher;
|
||||
private PreservableData<D, ? super Message> preservableData;
|
||||
private PreservableData<D, M> preservableData;
|
||||
private boolean hidden;
|
||||
private CheckSave<? super Message> checkSave;
|
||||
private Accessibility accessibility;
|
||||
private boolean notSaveHistory;
|
||||
private CheckSave<M> checkSave;
|
||||
|
||||
private Builder() {
|
||||
}
|
||||
|
||||
public Builder<D> name(String name) {
|
||||
public Builder<M, D> name(String name) {
|
||||
this.name = name;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder<D> keyWords(Set<KeyWord> val) {
|
||||
keyWords.addAll(val);
|
||||
public Builder<M, D> triggerWords(Set<KeyWord> val) {
|
||||
if (checkNull(triggerWords)) {
|
||||
triggerWords = new HashSet<>();
|
||||
}
|
||||
triggerWords.addAll(val);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder<D> keyWord(KeyWord val) {
|
||||
keyWords.add(val);
|
||||
public Builder<M, D> triggerWord(KeyWord val) {
|
||||
if (checkNull(triggerWords)) {
|
||||
triggerWords = new HashSet<>();
|
||||
}
|
||||
triggerWords.add(val);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder<D> stringKeyWords(Set<String> val) {
|
||||
keyWords.addAll(val.stream().map(KeyWord::of).collect(Collectors.toSet()));
|
||||
public Builder<M, D> triggerStringWords(Set<String> val) {
|
||||
if (checkNull(triggerWords)) {
|
||||
triggerWords = new HashSet<>();
|
||||
}
|
||||
triggerWords.addAll(val.stream().map(KeyWord::of).collect(Collectors.toSet()));
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder<D> keyWord(String val) {
|
||||
keyWords.add(KeyWord.of(val));
|
||||
public Builder<M, D> triggerWord(String val) {
|
||||
if (checkNull(triggerWords)) {
|
||||
triggerWords = new HashSet<>();
|
||||
}
|
||||
triggerWords.add(KeyWord.of(val));
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder<D> phrase(String val) {
|
||||
phrases.add(val);
|
||||
public Builder<M, D> triggerPhrase(String... val) {
|
||||
if (checkNull(triggerPhrases)) {
|
||||
triggerPhrases = new HashSet<>();
|
||||
}
|
||||
if (val.length == 1) {
|
||||
triggerPhrases.add(val[0]);
|
||||
} else {
|
||||
triggerPhrases.addAll(Set.of(val));
|
||||
}
|
||||
triggerPhrases.addAll(Set.of(val));
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder<D> phrases(Collection<String> val) {
|
||||
phrases.addAll(val);
|
||||
public Builder<M, D> triggerPattern(Pattern... val) {
|
||||
if (checkNull(triggerPatterns)) {
|
||||
triggerPatterns = new HashSet<>();
|
||||
}
|
||||
if (val.length == 1) {
|
||||
triggerPatterns.add(val[0]);
|
||||
} else {
|
||||
triggerPatterns.addAll(Set.of(val));
|
||||
}
|
||||
triggerPatterns.addAll(Set.of(val));
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder<D> pattern(Pattern val) {
|
||||
pattern = val;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder<D> triggerCheck(Predicate<String> trigger) {
|
||||
public Builder<M, D> triggerCheck(Predicate<M> trigger) {
|
||||
triggerCheck = trigger;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder<D> matchThreshold(Integer val) {
|
||||
public Builder<M, D> matchThreshold(Integer val) {
|
||||
matchThreshold = val;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder<D> priority(Integer val) {
|
||||
public Builder<M, D> priority(Integer val) {
|
||||
priority = val;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder<D> nextUnits(Set<MainUnit> val) {
|
||||
nextUnits = val;
|
||||
return this;
|
||||
public Builder<M, D> next(MainUnit<M> val) {
|
||||
if (checkNull(nextUnits)) {
|
||||
nextUnits = new HashSet<>();
|
||||
}
|
||||
|
||||
public Builder<D> nextUnit(MainUnit val) {
|
||||
nextUnits.add(val);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder<D> preservable(AnswerSavePreservable<D> val) {
|
||||
public Builder<M, D> preservable(AnswerSavePreservable<D> val) {
|
||||
this.preservable = val;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder<D> key(String val) {
|
||||
public Builder<M, D> key(String val) {
|
||||
this.key = val;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder<D> pusher(Pusher<D> val) {
|
||||
public Builder<M, D> pusher(Pusher<D> val) {
|
||||
this.pusher = val;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder<D> preservableData(PreservableData<D, ? super Message> val) {
|
||||
public Builder<M, D> preservableData(PreservableData<D, M> val) {
|
||||
this.preservableData = val;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder<D> hidden(boolean val) {
|
||||
public Builder<M, D> hidden(boolean val) {
|
||||
this.hidden = val;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder<D> checkSave(CheckSave<? super Message> val) {
|
||||
public Builder<M, D> checkSave(CheckSave<M> val) {
|
||||
this.checkSave = val;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder<D> accessibility(Accessibility val) {
|
||||
public Builder<M, D> accessibility(Accessibility val) {
|
||||
accessibility = val;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder<D> notSaveHistory() {
|
||||
public Builder<M, D> notSaveHistory() {
|
||||
notSaveHistory = true;
|
||||
return this;
|
||||
}
|
||||
|
||||
public AnswerSave<D> build() {
|
||||
public AnswerSave<M, D> build() {
|
||||
isNotNull(preservable, "Не указан репозиторий для сохранения формы пользователя");
|
||||
if (checkNull(pusher)) {
|
||||
isNotNull(preservableData, "Не указаны данные для сохранения");
|
||||
|
@ -10,10 +10,14 @@ import dev.struchkov.godfather.context.service.sender.Sending;
|
||||
import dev.struchkov.godfather.context.service.usercode.Insert;
|
||||
import dev.struchkov.godfather.context.service.usercode.ProcessingData;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
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;
|
||||
|
||||
@ -24,12 +28,12 @@ import static dev.struchkov.haiti.utils.Inspector.isNotNull;
|
||||
*
|
||||
* @author upagge [08/07/2019]
|
||||
*/
|
||||
public class AnswerText<M extends Message> extends MainUnit {
|
||||
public class AnswerText<M extends Message> extends MainUnit<M> {
|
||||
|
||||
/**
|
||||
* Объект, который необходимо отправить пользователю.
|
||||
*/
|
||||
private final ProcessingData<M> boxAnswer;
|
||||
private final ProcessingData<M> answer;
|
||||
|
||||
/**
|
||||
* Информация, которую необходимо вставить вместо маркеров в строку ответа.
|
||||
@ -39,15 +43,15 @@ public class AnswerText<M extends Message> extends MainUnit {
|
||||
/**
|
||||
* Объект нестандартной отправки ответа.
|
||||
*/
|
||||
private final Sending sending;
|
||||
private final Sending sender;
|
||||
|
||||
private AnswerText(Builder<M> builder) {
|
||||
super(
|
||||
builder.name,
|
||||
builder.keyWords,
|
||||
builder.phrases,
|
||||
builder.triggerWords,
|
||||
builder.triggerPhrases,
|
||||
builder.triggerCheck,
|
||||
builder.pattern,
|
||||
builder.triggerPatterns,
|
||||
builder.matchThreshold,
|
||||
builder.priority,
|
||||
builder.nextUnits,
|
||||
@ -56,25 +60,25 @@ public class AnswerText<M extends Message> extends MainUnit {
|
||||
builder.accessibility,
|
||||
TypeUnit.TEXT
|
||||
);
|
||||
boxAnswer = builder.boxAnswer;
|
||||
answer = builder.boxAnswer;
|
||||
insert = builder.insert;
|
||||
sending = builder.sending;
|
||||
sender = builder.sending;
|
||||
}
|
||||
|
||||
public static <M extends Message> AnswerText<M> of(String message) {
|
||||
return AnswerText.<M>builder().boxAnswer(BoxAnswer.boxAnswer(message)).build();
|
||||
return AnswerText.<M>builder().answer(BoxAnswer.boxAnswer(message)).build();
|
||||
}
|
||||
|
||||
public static <M extends Message> AnswerText<M> of(BoxAnswer boxAnswer) {
|
||||
return AnswerText.<M>builder().boxAnswer(boxAnswer).build();
|
||||
return AnswerText.<M>builder().answer(boxAnswer).build();
|
||||
}
|
||||
|
||||
public static <M extends Message> Builder<M> builder() {
|
||||
return new Builder<>();
|
||||
}
|
||||
|
||||
public ProcessingData<M> getBoxAnswer() {
|
||||
return boxAnswer;
|
||||
public ProcessingData<M> getAnswer() {
|
||||
return answer;
|
||||
}
|
||||
|
||||
public Insert getInsert() {
|
||||
@ -82,25 +86,29 @@ public class AnswerText<M extends Message> extends MainUnit {
|
||||
}
|
||||
|
||||
public Sending getSending() {
|
||||
return sending;
|
||||
return sender;
|
||||
}
|
||||
|
||||
public static final class Builder<M extends Message> {
|
||||
private final Set<KeyWord> keyWords = new HashSet<>();
|
||||
private final Set<String> phrases = new HashSet<>();
|
||||
private Predicate<String> triggerCheck;
|
||||
private String name;
|
||||
private ProcessingData<M> boxAnswer;
|
||||
private Insert insert;
|
||||
private Sending sending;
|
||||
private Pattern pattern;
|
||||
private Set<MainUnit<M>> nextUnits;
|
||||
|
||||
private Set<KeyWord> triggerWords;
|
||||
private Set<String> triggerPhrases;
|
||||
private Predicate<M> triggerCheck;
|
||||
private Set<Pattern> triggerPatterns;
|
||||
|
||||
private Integer matchThreshold;
|
||||
private Integer priority;
|
||||
private Set<MainUnit> nextUnits = new HashSet<>();
|
||||
|
||||
private UnitActiveType activeType;
|
||||
private Accessibility accessibility;
|
||||
private boolean notSaveHistory;
|
||||
|
||||
private ProcessingData<M> boxAnswer;
|
||||
private Insert insert;
|
||||
private Sending sending;
|
||||
|
||||
private Builder() {
|
||||
}
|
||||
|
||||
@ -109,13 +117,26 @@ public class AnswerText<M extends Message> extends MainUnit {
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder<M> message(ProcessingData<M> message) {
|
||||
this.boxAnswer = message;
|
||||
public Builder<M> processing(Consumer<M> answer) {
|
||||
this.boxAnswer = message -> {
|
||||
answer.accept(message);
|
||||
return Optional.empty();
|
||||
};
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder<M> boxAnswer(BoxAnswer boxAnswer) {
|
||||
this.boxAnswer = message -> boxAnswer;
|
||||
public Builder<M> answer(Function<M, BoxAnswer> answer) {
|
||||
this.boxAnswer = message -> Optional.of(answer.apply(message));
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder<M> answer(BoxAnswer answer) {
|
||||
this.boxAnswer = message -> Optional.of(answer);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder<M> answer(Supplier<BoxAnswer> answer) {
|
||||
this.boxAnswer = message -> Optional.of(answer.get());
|
||||
return this;
|
||||
}
|
||||
|
||||
@ -129,46 +150,69 @@ public class AnswerText<M extends Message> extends MainUnit {
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder<M> keyWords(Set<KeyWord> val) {
|
||||
keyWords.addAll(val);
|
||||
public Builder<M> triggerWords(Set<KeyWord> val) {
|
||||
if (triggerWords == null) {
|
||||
triggerWords = new HashSet<>();
|
||||
}
|
||||
triggerWords.addAll(val);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder<M> keyWord(KeyWord val) {
|
||||
keyWords.add(val);
|
||||
public Builder<M> triggerWord(KeyWord val) {
|
||||
if (triggerWords == null) {
|
||||
triggerWords = new HashSet<>();
|
||||
}
|
||||
triggerWords.add(val);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder<M> stringKeyWords(Set<String> val) {
|
||||
keyWords.addAll(val.stream().map(KeyWord::of).collect(Collectors.toSet()));
|
||||
public Builder<M> triggerStringWords(Set<String> val) {
|
||||
if (triggerWords == null) {
|
||||
triggerWords = new HashSet<>();
|
||||
}
|
||||
triggerWords.addAll(val.stream().map(KeyWord::of).collect(Collectors.toSet()));
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder<M> keyWord(String val) {
|
||||
keyWords.add(KeyWord.of(val));
|
||||
public Builder<M> triggerWord(String val) {
|
||||
if (triggerWords == null) {
|
||||
triggerWords = new HashSet<>();
|
||||
}
|
||||
triggerWords.add(KeyWord.of(val));
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder<M> phrase(String val) {
|
||||
phrases.add(val);
|
||||
public Builder<M> triggerPhrase(String... val) {
|
||||
if (triggerPhrases == null) {
|
||||
triggerPhrases = new HashSet<>();
|
||||
}
|
||||
if (val.length == 1) {
|
||||
triggerPhrases.add(val[0]);
|
||||
} else {
|
||||
triggerPhrases.addAll(Set.of(val));
|
||||
}
|
||||
triggerPhrases.addAll(List.of(val));
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder<M> phrases(String... val) {
|
||||
phrases.addAll(Arrays.asList(val));
|
||||
public Builder<M> triggerPattern(Pattern... val) {
|
||||
if (triggerPatterns == null) {
|
||||
triggerPatterns = new HashSet<>();
|
||||
}
|
||||
if (val.length == 1) {
|
||||
triggerPatterns.add(val[0]);
|
||||
} else {
|
||||
triggerPatterns.addAll(Set.of(val));
|
||||
}
|
||||
triggerPatterns.addAll(Set.of(val));
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder<M> triggerCheck(Predicate<String> trigger) {
|
||||
public Builder<M> triggerCheck(Predicate<M> trigger) {
|
||||
triggerCheck = trigger;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder<M> pattern(Pattern val) {
|
||||
pattern = val;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder<M> matchThreshold(Integer val) {
|
||||
matchThreshold = val;
|
||||
return this;
|
||||
@ -179,12 +223,10 @@ public class AnswerText<M extends Message> extends MainUnit {
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder<M> nextUnits(Set<MainUnit> val) {
|
||||
nextUnits = val;
|
||||
return this;
|
||||
public Builder<M> next(MainUnit<M> val) {
|
||||
if (nextUnits == null) {
|
||||
nextUnits = new HashSet<>();
|
||||
}
|
||||
|
||||
public Builder<M> nextUnit(MainUnit val) {
|
||||
nextUnits.add(val);
|
||||
return this;
|
||||
}
|
||||
|
@ -6,7 +6,6 @@ import dev.struchkov.godfather.context.domain.content.Message;
|
||||
import dev.struchkov.godfather.context.service.Accessibility;
|
||||
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;
|
||||
@ -21,12 +20,12 @@ import static dev.struchkov.haiti.utils.Inspector.isNotNull;
|
||||
*
|
||||
* @author upagge [08/07/2019]
|
||||
*/
|
||||
public class AnswerTimer<M extends Message> extends MainUnit {
|
||||
public class AnswerTimer<M extends Message> extends MainUnit<M> {
|
||||
|
||||
/**
|
||||
* Unit обработку которого необходимо отложить.
|
||||
*/
|
||||
private final MainUnit unitAnswer;
|
||||
private final MainUnit<M> unitAnswer;
|
||||
|
||||
/**
|
||||
* Задержка обработки в секундах.
|
||||
@ -46,10 +45,10 @@ public class AnswerTimer<M extends Message> extends MainUnit {
|
||||
private AnswerTimer(Builder<M> builder) {
|
||||
super(
|
||||
builder.name,
|
||||
builder.keyWords,
|
||||
builder.phrases,
|
||||
builder.triggerWords,
|
||||
builder.triggerPhrases,
|
||||
builder.triggerCheck,
|
||||
builder.pattern,
|
||||
builder.triggerPatterns,
|
||||
builder.matchThreshold,
|
||||
builder.priority,
|
||||
null,
|
||||
@ -68,7 +67,7 @@ public class AnswerTimer<M extends Message> extends MainUnit {
|
||||
return new Builder<>();
|
||||
}
|
||||
|
||||
public MainUnit getUnitAnswer() {
|
||||
public MainUnit<M> getUnitAnswer() {
|
||||
return unitAnswer;
|
||||
}
|
||||
|
||||
@ -86,20 +85,23 @@ public class AnswerTimer<M extends Message> extends MainUnit {
|
||||
|
||||
public static final class Builder<M extends Message> {
|
||||
private String name;
|
||||
private MainUnit unitAnswer;
|
||||
private Integer timeDelaySec;
|
||||
private Integer timeDeathSec;
|
||||
private CheckData<M> checkLoop;
|
||||
private final Set<KeyWord> keyWords = new HashSet<>();
|
||||
private final Set<String> phrases = new HashSet<>();
|
||||
private Predicate<String> triggerCheck;
|
||||
private Pattern pattern;
|
||||
|
||||
private Set<KeyWord> triggerWords;
|
||||
private Set<String> triggerPhrases;
|
||||
private Predicate<M> triggerCheck;
|
||||
private Set<Pattern> triggerPatterns;
|
||||
private Integer matchThreshold;
|
||||
|
||||
private Integer priority;
|
||||
private UnitActiveType activeType = UnitActiveType.AFTER;
|
||||
private Accessibility accessibility;
|
||||
private boolean notSaveHistory;
|
||||
|
||||
private MainUnit<M> unitAnswer;
|
||||
private Integer timeDelaySec;
|
||||
private Integer timeDeathSec;
|
||||
private CheckData<M> checkLoop;
|
||||
|
||||
private Builder() {
|
||||
}
|
||||
|
||||
@ -108,7 +110,7 @@ public class AnswerTimer<M extends Message> extends MainUnit {
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder<M> unitAnswer(MainUnit val) {
|
||||
public Builder<M> unitAnswer(MainUnit<M> val) {
|
||||
unitAnswer = val;
|
||||
return this;
|
||||
}
|
||||
@ -128,42 +130,65 @@ public class AnswerTimer<M extends Message> extends MainUnit {
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder<M> keyWords(Set<KeyWord> val) {
|
||||
keyWords.addAll(val);
|
||||
public Builder<M> triggerWords(Set<KeyWord> val) {
|
||||
if (triggerWords == null) {
|
||||
triggerWords = new HashSet<>();
|
||||
}
|
||||
triggerWords.addAll(val);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder<M> keyWord(KeyWord val) {
|
||||
keyWords.add(val);
|
||||
public Builder<M> triggerWord(KeyWord val) {
|
||||
if (triggerWords == null) {
|
||||
triggerWords = new HashSet<>();
|
||||
}
|
||||
triggerWords.add(val);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder<M> stringKeyWords(Set<String> val) {
|
||||
keyWords.addAll(val.stream().map(KeyWord::of).collect(Collectors.toSet()));
|
||||
public Builder<M> triggerStringWords(Set<String> val) {
|
||||
if (triggerWords == null) {
|
||||
triggerWords = new HashSet<>();
|
||||
}
|
||||
triggerWords.addAll(val.stream().map(KeyWord::of).collect(Collectors.toSet()));
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder<M> keyWord(String val) {
|
||||
keyWords.add(KeyWord.of(val));
|
||||
public Builder<M> triggerWord(String val) {
|
||||
if (triggerWords == null) {
|
||||
triggerWords = new HashSet<>();
|
||||
}
|
||||
triggerWords.add(KeyWord.of(val));
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder<M> phrase(String val) {
|
||||
phrases.add(val);
|
||||
public Builder<M> triggerPhrase(String... val) {
|
||||
if (triggerPhrases == null) {
|
||||
triggerPhrases = new HashSet<>();
|
||||
}
|
||||
if (val.length == 1) {
|
||||
triggerPhrases.add(val[0]);
|
||||
} else {
|
||||
triggerPhrases.addAll(Set.of(val));
|
||||
}
|
||||
triggerPhrases.addAll(Set.of(val));
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder<M> phrases(Collection<String> val) {
|
||||
phrases.addAll(val);
|
||||
public Builder<M> triggerPattern(Pattern... val) {
|
||||
if (triggerPatterns == null) {
|
||||
triggerPatterns = new HashSet<>();
|
||||
}
|
||||
if (val.length == 1) {
|
||||
triggerPatterns.add(val[0]);
|
||||
} else {
|
||||
triggerPatterns.addAll(Set.of(val));
|
||||
}
|
||||
triggerPatterns.addAll(Set.of(val));
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder<M> pattern(Pattern val) {
|
||||
pattern = val;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder<M> triggerCheck(Predicate<String> trigger) {
|
||||
public Builder<M> triggerCheck(Predicate<M> trigger) {
|
||||
triggerCheck = trigger;
|
||||
return this;
|
||||
}
|
||||
|
@ -1,212 +0,0 @@
|
||||
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.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;
|
||||
|
||||
/**
|
||||
* Обработка данных со страницы пользователя.
|
||||
*
|
||||
* @author upagge [11/07/2019]
|
||||
*/
|
||||
public class AnswerValidity extends MainUnit {
|
||||
|
||||
/**
|
||||
* Unit обрабатывается, если пользователь подтверждает данные.
|
||||
*/
|
||||
private final MainUnit unitYes;
|
||||
|
||||
/**
|
||||
* Unit обрабатывается, если пользователь отклоняет данные.
|
||||
*/
|
||||
private final MainUnit unitNo;
|
||||
|
||||
/**
|
||||
* Unit обрабатывается, если данные не найдены.
|
||||
*/
|
||||
private final MainUnit unitNull;
|
||||
|
||||
private final Preservable<String> tempSave = new AnswerSaveMapPreservable<>();
|
||||
|
||||
private final ClarificationQuestion clarificationQuestion;
|
||||
|
||||
private AnswerValidity(Builder builder) {
|
||||
super(
|
||||
builder.name,
|
||||
builder.keyWords,
|
||||
builder.phrases,
|
||||
builder.triggerCheck,
|
||||
builder.pattern,
|
||||
builder.matchThreshold,
|
||||
builder.priority,
|
||||
builder.nextUnits,
|
||||
UnitActiveType.DEFAULT,
|
||||
builder.notSaveHistory,
|
||||
builder.accessibility,
|
||||
TypeUnit.VALIDITY
|
||||
);
|
||||
unitYes = builder.unitYes;
|
||||
unitNo = builder.unitNo;
|
||||
unitNull = builder.unitNull;
|
||||
clarificationQuestion = builder.clarificationQuestion;
|
||||
}
|
||||
|
||||
public static Builder builder() {
|
||||
return new Builder();
|
||||
}
|
||||
|
||||
public MainUnit getUnitYes() {
|
||||
return unitYes;
|
||||
}
|
||||
|
||||
public MainUnit getUnitNo() {
|
||||
return unitNo;
|
||||
}
|
||||
|
||||
public MainUnit getUnitNull() {
|
||||
return unitNull;
|
||||
}
|
||||
|
||||
public Preservable<String> getTempSave() {
|
||||
return tempSave;
|
||||
}
|
||||
|
||||
public ClarificationQuestion getClarificationQuestion() {
|
||||
return clarificationQuestion;
|
||||
}
|
||||
|
||||
public static final class Builder {
|
||||
private final Set<KeyWord> keyWords = new HashSet<>();
|
||||
private final Set<String> phrases = new HashSet<>();
|
||||
private Predicate<String> triggerCheck;
|
||||
private String name;
|
||||
private MainUnit unitYes;
|
||||
private MainUnit unitNo;
|
||||
private MainUnit unitNull;
|
||||
private ClarificationQuestion clarificationQuestion;
|
||||
private Pattern pattern;
|
||||
private Integer matchThreshold;
|
||||
private Integer priority;
|
||||
private Set<MainUnit> nextUnits = new HashSet<>();
|
||||
private Accessibility accessibility;
|
||||
private boolean notSaveHistory;
|
||||
|
||||
private Builder() {
|
||||
}
|
||||
|
||||
public Builder name(String name) {
|
||||
this.name = name;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder unitYes(MainUnit val) {
|
||||
unitYes = val;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder unitNo(MainUnit val) {
|
||||
unitNo = val;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder unitNull(MainUnit val) {
|
||||
unitNull = val;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder clarificationQuestion(ClarificationQuestion val) {
|
||||
clarificationQuestion = val;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder keyWords(Set<KeyWord> val) {
|
||||
keyWords.addAll(val);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder keyWord(KeyWord val) {
|
||||
keyWords.add(val);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder stringKeyWords(Set<String> val) {
|
||||
keyWords.addAll(val.stream().map(KeyWord::of).collect(Collectors.toSet()));
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder keyWord(String val) {
|
||||
keyWords.add(KeyWord.of(val));
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder phrase(String val) {
|
||||
phrases.add(val);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder phrases(Collection<String> val) {
|
||||
phrases.addAll(val);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder pattern(Pattern val) {
|
||||
pattern = val;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder triggerCheck(Predicate<String> trigger) {
|
||||
triggerCheck = trigger;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder matchThreshold(Integer val) {
|
||||
matchThreshold = val;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder priority(Integer val) {
|
||||
priority = val;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder nextUnits(Set<MainUnit> val) {
|
||||
nextUnits = val;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder nextUnit(MainUnit val) {
|
||||
nextUnits.add(val);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder clearKeyWords() {
|
||||
keyWords.clear();
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder accessibility(Accessibility val) {
|
||||
accessibility = val;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder notSaveHistory() {
|
||||
notSaveHistory = true;
|
||||
return this;
|
||||
}
|
||||
|
||||
public AnswerValidity build() {
|
||||
return new AnswerValidity(this);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -2,6 +2,7 @@ package dev.struchkov.godfather.context.domain.unit;
|
||||
|
||||
import dev.struchkov.autoresponder.entity.KeyWord;
|
||||
import dev.struchkov.autoresponder.entity.Unit;
|
||||
import dev.struchkov.godfather.context.domain.content.Message;
|
||||
import dev.struchkov.godfather.context.service.Accessibility;
|
||||
|
||||
import java.util.Objects;
|
||||
@ -16,7 +17,7 @@ import java.util.regex.Pattern;
|
||||
*
|
||||
* @author upagge [08/07/2019]
|
||||
*/
|
||||
public abstract class MainUnit extends Unit<MainUnit> {
|
||||
public abstract class MainUnit<M extends Message> extends Unit<MainUnit<M>, M> {
|
||||
|
||||
/**
|
||||
* Тип Unit-а.
|
||||
@ -49,17 +50,17 @@ public abstract class MainUnit extends Unit<MainUnit> {
|
||||
String name,
|
||||
Set<KeyWord> keyWords,
|
||||
Set<String> phrases,
|
||||
Predicate<String> triggerCheck,
|
||||
Pattern pattern,
|
||||
Predicate<M> triggerCheck,
|
||||
Set<Pattern> patterns,
|
||||
Integer matchThreshold,
|
||||
Integer priority,
|
||||
Set<MainUnit> nextUnits,
|
||||
Set<MainUnit<M>> nextUnits,
|
||||
UnitActiveType activeType,
|
||||
boolean notSaveHistory,
|
||||
Accessibility accessibility,
|
||||
String type
|
||||
) {
|
||||
super(keyWords, phrases, triggerCheck, pattern, matchThreshold, priority, nextUnits);
|
||||
super(keyWords, phrases, triggerCheck, patterns, matchThreshold, priority, nextUnits);
|
||||
this.name = name;
|
||||
this.activeType = Optional.ofNullable(activeType).orElse(UnitActiveType.DEFAULT);
|
||||
this.accessibility = accessibility;
|
||||
|
@ -2,27 +2,28 @@ package dev.struchkov.godfather.context.domain.unit.cmd;
|
||||
|
||||
import dev.struchkov.autoresponder.entity.KeyWord;
|
||||
import dev.struchkov.godfather.context.domain.TypeUnit;
|
||||
import dev.struchkov.godfather.context.domain.content.Message;
|
||||
import dev.struchkov.godfather.context.domain.unit.MainUnit;
|
||||
import dev.struchkov.godfather.context.domain.unit.UnitActiveType;
|
||||
import dev.struchkov.haiti.utils.Checker;
|
||||
|
||||
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;
|
||||
|
||||
public class ReplaceCmd extends MainUnit {
|
||||
public class ReplaceCmd<M extends Message> extends MainUnit<M> {
|
||||
|
||||
private final MainUnit thisUnit;
|
||||
|
||||
private ReplaceCmd(Builder builder) {
|
||||
private ReplaceCmd(Builder<M> builder) {
|
||||
super(
|
||||
builder.name,
|
||||
builder.keyWords,
|
||||
builder.phrases,
|
||||
builder.triggerWords,
|
||||
builder.triggerPhrases,
|
||||
builder.triggerCheck,
|
||||
builder.pattern,
|
||||
builder.triggerPatterns,
|
||||
builder.matchThreshold,
|
||||
builder.priority,
|
||||
new HashSet<>(),
|
||||
@ -34,21 +35,23 @@ public class ReplaceCmd extends MainUnit {
|
||||
this.thisUnit = builder.thisUnit;
|
||||
}
|
||||
|
||||
public static Builder builder() {
|
||||
return new Builder();
|
||||
public static <M extends Message> Builder<M> builder() {
|
||||
return new Builder<>();
|
||||
}
|
||||
|
||||
public MainUnit getThisUnit() {
|
||||
return thisUnit;
|
||||
}
|
||||
|
||||
public static final class Builder {
|
||||
private final Set<KeyWord> keyWords = new HashSet<>();
|
||||
public static final class Builder<M extends Message> {
|
||||
private String name;
|
||||
private final Set<String> phrases = new HashSet<>();
|
||||
private Predicate<String> triggerCheck;
|
||||
private Pattern pattern;
|
||||
|
||||
private Set<String> triggerPhrases;
|
||||
private Predicate<M> triggerCheck;
|
||||
private Set<Pattern> triggerPatterns;
|
||||
private Set<KeyWord> triggerWords;
|
||||
private Integer matchThreshold;
|
||||
|
||||
private Integer priority;
|
||||
private UnitActiveType activeType = UnitActiveType.AFTER;
|
||||
|
||||
@ -57,74 +60,95 @@ public class ReplaceCmd extends MainUnit {
|
||||
private Builder() {
|
||||
}
|
||||
|
||||
public Builder name(String name) {
|
||||
public Builder<M> name(String name) {
|
||||
this.name = name;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder keyWords(Set<KeyWord> val) {
|
||||
keyWords.addAll(val);
|
||||
public Builder<M> triggerWords(Set<KeyWord> val) {
|
||||
if (Checker.checkNull(triggerWords)) {
|
||||
triggerWords = new HashSet<>();
|
||||
}
|
||||
triggerWords.addAll(val);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder keyWord(KeyWord val) {
|
||||
keyWords.add(val);
|
||||
public Builder<M> triggerWord(KeyWord val) {
|
||||
if (Checker.checkNull(triggerWords)) {
|
||||
triggerWords = new HashSet<>();
|
||||
}
|
||||
triggerWords.add(val);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder stringKeyWords(Set<String> val) {
|
||||
keyWords.addAll(val.stream().map(KeyWord::of).collect(Collectors.toSet()));
|
||||
public Builder<M> triggerStringWords(Set<String> val) {
|
||||
if (Checker.checkNull(triggerWords)) {
|
||||
triggerWords = new HashSet<>();
|
||||
}
|
||||
triggerWords.addAll(val.stream().map(KeyWord::of).collect(Collectors.toSet()));
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder keyWord(String val) {
|
||||
keyWords.add(KeyWord.of(val));
|
||||
public Builder<M> triggerWord(String val) {
|
||||
if (Checker.checkNull(triggerWords)) {
|
||||
triggerWords = new HashSet<>();
|
||||
}
|
||||
triggerWords.add(KeyWord.of(val));
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder phrase(String val) {
|
||||
phrases.add(val);
|
||||
public Builder<M> triggerPhrase(String... val) {
|
||||
if (Checker.checkNull(triggerPhrases)) {
|
||||
triggerPhrases = new HashSet<>();
|
||||
}
|
||||
if (val.length == 1) {
|
||||
triggerPhrases.add(val[0]);
|
||||
} else {
|
||||
triggerPhrases.addAll(Set.of(val));
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder phrases(Collection<String> val) {
|
||||
phrases.addAll(val);
|
||||
public Builder<M> triggerPattern(Pattern... val) {
|
||||
if (Checker.checkNull(triggerPatterns)) {
|
||||
triggerPatterns = new HashSet<>();
|
||||
}
|
||||
if (val.length == 1) {
|
||||
triggerPatterns.add(val[0]);
|
||||
} else {
|
||||
triggerPatterns.addAll(Set.of(val));
|
||||
}
|
||||
triggerPatterns.addAll(Set.of(val));
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder pattern(Pattern val) {
|
||||
pattern = val;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder triggerCheck(Predicate<String> trigger) {
|
||||
public Builder<M> triggerCheck(Predicate<M> trigger) {
|
||||
triggerCheck = trigger;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder matchThreshold(Integer val) {
|
||||
public Builder<M> matchThreshold(Integer val) {
|
||||
matchThreshold = val;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder priority(Integer val) {
|
||||
public Builder<M> priority(Integer val) {
|
||||
priority = val;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder activeType(UnitActiveType val) {
|
||||
public Builder<M> activeType(UnitActiveType val) {
|
||||
activeType = val;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder thisUnit(MainUnit val) {
|
||||
public Builder<M> thisUnit(MainUnit val) {
|
||||
thisUnit = val;
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
public ReplaceCmd build() {
|
||||
return new ReplaceCmd(this);
|
||||
public ReplaceCmd<M> build() {
|
||||
return new ReplaceCmd<>(this);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -2,21 +2,23 @@ package dev.struchkov.godfather.context.domain.unit.cmd;
|
||||
|
||||
import dev.struchkov.autoresponder.entity.KeyWord;
|
||||
import dev.struchkov.godfather.context.domain.TypeUnit;
|
||||
import dev.struchkov.godfather.context.domain.content.Message;
|
||||
import dev.struchkov.godfather.context.domain.unit.MainUnit;
|
||||
import dev.struchkov.godfather.context.domain.unit.UnitActiveType;
|
||||
import dev.struchkov.godfather.context.exception.UnitConfigException;
|
||||
|
||||
import 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;
|
||||
|
||||
/**
|
||||
* Юнит, который позволяет откатить пользователя на предыдущие юниты в сценарии с сохранением ранее введенной информации в сообщениях.
|
||||
*/
|
||||
public class RollBackCmd extends MainUnit {
|
||||
public class RollBackCmd<M extends Message> extends MainUnit<M> {
|
||||
|
||||
/**
|
||||
* Количество юнитов, на которые можно откатиться назад.
|
||||
@ -28,13 +30,13 @@ public class RollBackCmd extends MainUnit {
|
||||
*/
|
||||
private final String rollbackUnitName;
|
||||
|
||||
private RollBackCmd(Builder builder) {
|
||||
private RollBackCmd(Builder<M> builder) {
|
||||
super(
|
||||
builder.name,
|
||||
builder.keyWords,
|
||||
builder.phrases,
|
||||
builder.triggerWords,
|
||||
builder.triggerPhrases,
|
||||
builder.triggerCheck,
|
||||
builder.pattern,
|
||||
builder.triggerPatterns,
|
||||
builder.matchThreshold,
|
||||
builder.priority,
|
||||
new HashSet<>(),
|
||||
@ -47,28 +49,28 @@ public class RollBackCmd extends MainUnit {
|
||||
this.rollbackUnitName = builder.rollbackUnitName;
|
||||
}
|
||||
|
||||
public static RollBackCmd.Builder builder() {
|
||||
return new RollBackCmd.Builder();
|
||||
public static <M extends Message> RollBackCmd.Builder<M> builder() {
|
||||
return new RollBackCmd.Builder<>();
|
||||
}
|
||||
|
||||
public static RollBackCmd rollBack(int countToBack) {
|
||||
return RollBackCmd.builder().countBack(countToBack).build();
|
||||
public static <M extends Message> RollBackCmd<M> rollBack(int countToBack) {
|
||||
return RollBackCmd.<M>builder().countBack(countToBack).build();
|
||||
}
|
||||
|
||||
public static RollBackCmd singleRollBack() {
|
||||
return RollBackCmd.builder().countBack(1).build();
|
||||
public static <M extends Message> RollBackCmd<M> singleRollBack() {
|
||||
return RollBackCmd.<M>builder().countBack(1).build();
|
||||
}
|
||||
|
||||
public static RollBackCmd doubleRollBack() {
|
||||
return RollBackCmd.builder().countBack(2).build();
|
||||
public static <M extends Message> RollBackCmd<M> doubleRollBack() {
|
||||
return RollBackCmd.<M>builder().countBack(2).build();
|
||||
}
|
||||
|
||||
public static RollBackCmd rollBack(String unitName) {
|
||||
return RollBackCmd.builder().rollbackUnitName(unitName).build();
|
||||
public static <M extends Message> RollBackCmd<M> rollBack(String unitName) {
|
||||
return RollBackCmd.<M>builder().rollbackUnitName(unitName).build();
|
||||
}
|
||||
|
||||
public static RollBackCmd rollBack(String phrase, String unitName) {
|
||||
return RollBackCmd.builder().phrase(phrase).rollbackUnitName(unitName).build();
|
||||
public static <M extends Message> RollBackCmd<M> rollBack(String phrase, String unitName) {
|
||||
return RollBackCmd.<M>builder().triggerPhrase(phrase).rollbackUnitName(unitName).build();
|
||||
}
|
||||
|
||||
public int getCountBack() {
|
||||
@ -79,96 +81,122 @@ public class RollBackCmd extends MainUnit {
|
||||
return rollbackUnitName;
|
||||
}
|
||||
|
||||
public static final class Builder {
|
||||
private final Set<KeyWord> keyWords = new HashSet<>();
|
||||
public static final class Builder<M extends Message> {
|
||||
private String name;
|
||||
private final Set<String> phrases = new HashSet<>();
|
||||
private Predicate<String> triggerCheck;
|
||||
private Pattern pattern;
|
||||
|
||||
private Set<String> triggerPhrases;
|
||||
private Predicate<M> triggerCheck;
|
||||
private Set<Pattern> triggerPatterns;
|
||||
private Set<KeyWord> triggerWords;
|
||||
private Integer matchThreshold;
|
||||
|
||||
private Integer priority;
|
||||
private UnitActiveType activeType = UnitActiveType.DEFAULT;
|
||||
|
||||
private int countBack;
|
||||
private String rollbackUnitName;
|
||||
|
||||
private Builder() {
|
||||
}
|
||||
|
||||
public Builder name(String name) {
|
||||
public Builder<M> name(String name) {
|
||||
this.name = name;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder keyWords(Set<KeyWord> val) {
|
||||
keyWords.addAll(val);
|
||||
public Builder<M> triggerWords(Set<KeyWord> val) {
|
||||
if (checkNull(triggerWords)) {
|
||||
triggerWords = new HashSet<>();
|
||||
}
|
||||
triggerWords.addAll(val);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder keyWord(KeyWord val) {
|
||||
keyWords.add(val);
|
||||
public Builder<M> triggerWord(KeyWord val) {
|
||||
if (checkNull(triggerWords)) {
|
||||
triggerWords = new HashSet<>();
|
||||
}
|
||||
triggerWords.add(val);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder stringKeyWords(Set<String> val) {
|
||||
keyWords.addAll(val.stream().map(KeyWord::of).collect(Collectors.toSet()));
|
||||
public Builder<M> triggerStringWords(Set<String> val) {
|
||||
if (checkNull(triggerWords)) {
|
||||
triggerWords = new HashSet<>();
|
||||
}
|
||||
triggerWords.addAll(val.stream().map(KeyWord::of).collect(Collectors.toSet()));
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder keyWord(String val) {
|
||||
keyWords.add(KeyWord.of(val));
|
||||
public Builder<M> triggerWord(String val) {
|
||||
if (checkNull(triggerWords)) {
|
||||
triggerWords = new HashSet<>();
|
||||
}
|
||||
triggerWords.add(KeyWord.of(val));
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder phrase(String val) {
|
||||
phrases.add(val);
|
||||
public Builder<M> triggerPhrase(String... val) {
|
||||
if (checkNull(triggerPhrases)) {
|
||||
triggerPhrases = new HashSet<>();
|
||||
}
|
||||
if (val.length == 1) {
|
||||
triggerPhrases.add(val[0]);
|
||||
} else {
|
||||
triggerPhrases.addAll(Set.of(val));
|
||||
}
|
||||
triggerPhrases.addAll(Set.of(val));
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder triggerCheck(Predicate<String> trigger) {
|
||||
public Builder<M> triggerCheck(Predicate<M> trigger) {
|
||||
triggerCheck = trigger;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder phrases(Collection<String> val) {
|
||||
phrases.addAll(val);
|
||||
public Builder<M> triggerPattern(Pattern... val) {
|
||||
if (checkNull(triggerPatterns)) {
|
||||
triggerPatterns = new HashSet<>();
|
||||
}
|
||||
if (val.length == 1) {
|
||||
triggerPatterns.add(val[0]);
|
||||
} else {
|
||||
triggerPatterns.addAll(Set.of(val));
|
||||
}
|
||||
triggerPatterns.addAll(Set.of(val));
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder pattern(Pattern val) {
|
||||
pattern = val;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder matchThreshold(Integer val) {
|
||||
public Builder<M> matchThreshold(Integer val) {
|
||||
matchThreshold = val;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder priority(Integer val) {
|
||||
public Builder<M> priority(Integer val) {
|
||||
priority = val;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder activeType(UnitActiveType val) {
|
||||
public Builder<M> activeType(UnitActiveType val) {
|
||||
activeType = val;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder countBack(int val) {
|
||||
public Builder<M> countBack(int val) {
|
||||
countBack = val + 1;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder rollbackUnitName(String val) {
|
||||
public Builder<M> rollbackUnitName(String val) {
|
||||
rollbackUnitName = val;
|
||||
return this;
|
||||
}
|
||||
|
||||
public RollBackCmd build() {
|
||||
public RollBackCmd<M> build() {
|
||||
if (rollbackUnitName == null && countBack < 2) {
|
||||
throw new UnitConfigException("Ошибка конфигурирования юнита {0}: Количество юнитов для отката не должно быть меньше 1.", name);
|
||||
}
|
||||
return new RollBackCmd(this);
|
||||
return new RollBackCmd<>(this);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -2,33 +2,35 @@ package dev.struchkov.godfather.context.domain.unit.cmd;
|
||||
|
||||
import dev.struchkov.autoresponder.entity.KeyWord;
|
||||
import dev.struchkov.godfather.context.domain.TypeUnit;
|
||||
import dev.struchkov.godfather.context.domain.content.Message;
|
||||
import dev.struchkov.godfather.context.domain.unit.MainUnit;
|
||||
import dev.struchkov.godfather.context.domain.unit.UnitActiveType;
|
||||
|
||||
import 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;
|
||||
|
||||
/**
|
||||
* Позволяет перенести пользователя в произвольное место в сценарии.
|
||||
*/
|
||||
public class TeleportCmd extends MainUnit {
|
||||
public class TeleportCmd<M extends Message> extends MainUnit<M> {
|
||||
|
||||
/**
|
||||
* Название юнита, в которое необходимо осуществить перенос.
|
||||
*/
|
||||
private final String unitNameToTeleport;
|
||||
|
||||
private TeleportCmd(Builder builder) {
|
||||
private TeleportCmd(Builder<M> builder) {
|
||||
super(
|
||||
builder.name,
|
||||
builder.keyWords,
|
||||
builder.phrases,
|
||||
builder.triggerWords,
|
||||
builder.triggerPhrases,
|
||||
builder.triggerCheck,
|
||||
builder.pattern,
|
||||
builder.triggerPatterns,
|
||||
builder.matchThreshold,
|
||||
builder.priority,
|
||||
new HashSet<>(),
|
||||
@ -40,21 +42,23 @@ public class TeleportCmd extends MainUnit {
|
||||
this.unitNameToTeleport = builder.unitNameToTeleport;
|
||||
}
|
||||
|
||||
public static Builder builder() {
|
||||
return new Builder();
|
||||
public static <M extends Message> Builder<M> builder() {
|
||||
return new Builder<>();
|
||||
}
|
||||
|
||||
public String getUnitNameToTeleport() {
|
||||
return unitNameToTeleport;
|
||||
}
|
||||
|
||||
public static final class Builder {
|
||||
private final Set<KeyWord> keyWords = new HashSet<>();
|
||||
private final Set<String> phrases = new HashSet<>();
|
||||
private Predicate<String> triggerCheck;
|
||||
public static final class Builder<M extends Message> {
|
||||
private String name;
|
||||
private Pattern pattern;
|
||||
|
||||
private Set<KeyWord> triggerWords;
|
||||
private Set<String> triggerPhrases;
|
||||
private Set<Pattern> triggerPatterns;
|
||||
private Predicate<M> triggerCheck;
|
||||
private Integer matchThreshold;
|
||||
|
||||
private Integer priority;
|
||||
private UnitActiveType activeType = UnitActiveType.DEFAULT;
|
||||
private String unitNameToTeleport;
|
||||
@ -62,73 +66,96 @@ public class TeleportCmd extends MainUnit {
|
||||
private Builder() {
|
||||
}
|
||||
|
||||
public Builder name(String name) {
|
||||
public Builder<M> name(String name) {
|
||||
this.name = name;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder keyWords(Set<KeyWord> val) {
|
||||
keyWords.addAll(val);
|
||||
public Builder<M> triggerWords(Set<KeyWord> val) {
|
||||
if (checkNull(triggerWords)) {
|
||||
triggerWords = new HashSet<>();
|
||||
}
|
||||
triggerWords.addAll(val);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder keyWord(KeyWord val) {
|
||||
keyWords.add(val);
|
||||
public Builder<M> triggerWord(KeyWord val) {
|
||||
if (checkNull(triggerWords)) {
|
||||
triggerWords = new HashSet<>();
|
||||
}
|
||||
triggerWords.add(val);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder stringKeyWords(Set<String> val) {
|
||||
keyWords.addAll(val.stream().map(KeyWord::of).collect(Collectors.toSet()));
|
||||
public Builder<M> triggerStringWords(Set<String> val) {
|
||||
if (checkNull(triggerWords)) {
|
||||
triggerWords = new HashSet<>();
|
||||
}
|
||||
triggerWords.addAll(val.stream().map(KeyWord::of).collect(Collectors.toSet()));
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder keyWord(String val) {
|
||||
keyWords.add(KeyWord.of(val));
|
||||
public Builder<M> triggerWord(String val) {
|
||||
if (checkNull(triggerWords)) {
|
||||
triggerWords = new HashSet<>();
|
||||
}
|
||||
triggerWords.add(KeyWord.of(val));
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder phrase(String val) {
|
||||
phrases.add(val);
|
||||
public Builder<M> triggerPhrase(String... val) {
|
||||
if (checkNull(triggerPhrases)) {
|
||||
triggerPhrases = new HashSet<>();
|
||||
}
|
||||
if (val.length == 1) {
|
||||
triggerPhrases.add(val[0]);
|
||||
} else {
|
||||
triggerPhrases.addAll(Set.of(val));
|
||||
}
|
||||
triggerPhrases.addAll(Set.of(val));
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder phrases(Collection<String> val) {
|
||||
phrases.addAll(val);
|
||||
public Builder<M> triggerPattern(Pattern... val) {
|
||||
if (checkNull(triggerPatterns)) {
|
||||
triggerPatterns = new HashSet<>();
|
||||
}
|
||||
if (val.length == 1) {
|
||||
triggerPatterns.add(val[0]);
|
||||
} else {
|
||||
triggerPatterns.addAll(Set.of(val));
|
||||
}
|
||||
triggerPatterns.addAll(Set.of(val));
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder pattern(Pattern val) {
|
||||
pattern = val;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder triggerCheck(Predicate<String> trigger) {
|
||||
public Builder<M> triggerCheck(Predicate<M> trigger) {
|
||||
triggerCheck = trigger;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder matchThreshold(Integer val) {
|
||||
public Builder<M> matchThreshold(Integer val) {
|
||||
matchThreshold = val;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder priority(Integer val) {
|
||||
public Builder<M> priority(Integer val) {
|
||||
priority = val;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder activeType(UnitActiveType val) {
|
||||
public Builder<M> activeType(UnitActiveType val) {
|
||||
activeType = val;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder unitNameToTeleport(String val) {
|
||||
public Builder<M> unitNameToTeleport(String val) {
|
||||
unitNameToTeleport = val;
|
||||
return this;
|
||||
}
|
||||
|
||||
public TeleportCmd build() {
|
||||
return new TeleportCmd(this);
|
||||
public TeleportCmd<M> build() {
|
||||
return new TeleportCmd<>(this);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -8,28 +8,28 @@ import org.jetbrains.annotations.NotNull;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
|
||||
public interface StorylineService<T extends Message> {
|
||||
public interface StorylineService<M extends Message> {
|
||||
|
||||
void save(@NotNull StorylineHistory storylineHistory);
|
||||
|
||||
Optional<MainUnit> getUnitNameByPersonId(@NotNull Long personId);
|
||||
Optional<MainUnit<M>> getUnitNameByPersonId(@NotNull Long personId);
|
||||
|
||||
Set<MainUnit> getNextUnitByPersonId(@NotNull Long personId);
|
||||
Set<MainUnit<M>> getNextUnitByPersonId(@NotNull Long personId);
|
||||
|
||||
void save(Long personId, String name, T message);
|
||||
void save(Long personId, String name, M message);
|
||||
|
||||
Optional<StorylineHistory> replaceUserToBack(long personId, int countUnitsToBack);
|
||||
|
||||
Optional<StorylineHistory> replaceUserToBack(long personId, String unitName);
|
||||
|
||||
Optional<MainUnit> getDefaultUnit();
|
||||
Optional<MainUnit<M>> getDefaultUnit();
|
||||
|
||||
/**
|
||||
* Ленивая (поздняя) связка юнитов между собой. Осуществляется уже после создания сценария. С помощью данного подхода можно реализовать циклические зависимости юнитов. Либо можно использовать {@link dev.struchkov.godfather.context.domain.unit.cmd.TeleportCmd}
|
||||
*/
|
||||
void lazyLink(String firstName, String secondName);
|
||||
|
||||
Optional<MainUnit> getUnitByName(String unitName);
|
||||
Optional<MainUnit<M>> getUnitByName(String unitName);
|
||||
|
||||
void setDefaultUnit(String unitName);
|
||||
|
||||
|
@ -9,8 +9,8 @@ import dev.struchkov.godfather.context.domain.unit.MainUnit;
|
||||
* @author upagge [04/08/2019]
|
||||
*/
|
||||
@FunctionalInterface
|
||||
public interface CheckSave<D extends Message> {
|
||||
public interface CheckSave<M extends Message> {
|
||||
|
||||
MainUnit check(D content);
|
||||
MainUnit<M> check(M content);
|
||||
|
||||
}
|
||||
|
@ -3,8 +3,8 @@ package dev.struchkov.godfather.context.service.save;
|
||||
import dev.struchkov.godfather.context.domain.content.Message;
|
||||
|
||||
@FunctionalInterface
|
||||
public interface PreservableData<E, C extends Message> {
|
||||
public interface PreservableData<D, M extends Message> {
|
||||
|
||||
E getData(C content);
|
||||
D getData(M content);
|
||||
|
||||
}
|
||||
|
@ -2,9 +2,11 @@ package dev.struchkov.godfather.context.service.usercode;
|
||||
|
||||
import dev.struchkov.godfather.context.domain.BoxAnswer;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
@FunctionalInterface
|
||||
public interface ProcessingData<C> {
|
||||
|
||||
BoxAnswer processing(C content);
|
||||
Optional<BoxAnswer> processing(C content);
|
||||
|
||||
}
|
||||
|
@ -6,7 +6,7 @@
|
||||
<parent>
|
||||
<groupId>dev.struchkov.godfather</groupId>
|
||||
<artifactId>godfather-bot</artifactId>
|
||||
<version>0.0.17</version>
|
||||
<version>0.0.18</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>bot-core</artifactId>
|
||||
|
@ -18,7 +18,6 @@ import dev.struchkov.godfather.core.service.action.AnswerCheckAction;
|
||||
import dev.struchkov.godfather.core.service.action.AnswerSaveAction;
|
||||
import dev.struchkov.godfather.core.service.action.AnswerTextAction;
|
||||
import dev.struchkov.godfather.core.service.action.AnswerTimerAction;
|
||||
import dev.struchkov.godfather.core.service.action.AnswerValidityAction;
|
||||
import dev.struchkov.godfather.core.service.action.cmd.ReplaceCmdAction;
|
||||
import dev.struchkov.godfather.core.service.timer.TimerService;
|
||||
import dev.struchkov.haiti.context.exception.NotFoundException;
|
||||
@ -30,18 +29,18 @@ import java.util.Optional;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class GeneralAutoResponder<T extends Message> {
|
||||
public class GeneralAutoResponder<M extends Message> {
|
||||
|
||||
private final PersonSettingService personSettingService;
|
||||
private final StorylineService<T> storyLineService;
|
||||
protected Map<String, ActionUnit<? extends MainUnit, ? extends Message>> actionUnitMap = new HashMap<>();
|
||||
protected List<Modifiable<T>> modifiable;
|
||||
private final StorylineService<M> storyLineService;
|
||||
protected Map<String, ActionUnit> actionUnitMap = new HashMap<>();
|
||||
protected List<Modifiable<M>> modifiable;
|
||||
private ErrorHandler errorHandler;
|
||||
|
||||
protected GeneralAutoResponder(
|
||||
Sending sending,
|
||||
PersonSettingService personSettingService,
|
||||
StorylineService<T> storyLineService
|
||||
StorylineService<M> storyLineService
|
||||
) {
|
||||
this.personSettingService = personSettingService;
|
||||
this.storyLineService = storyLineService;
|
||||
@ -49,17 +48,16 @@ public class GeneralAutoResponder<T extends Message> {
|
||||
}
|
||||
|
||||
private void init(Sending sending) {
|
||||
actionUnitMap.put(TypeUnit.CHECK, new AnswerCheckAction());
|
||||
actionUnitMap.put(TypeUnit.CHECK, new AnswerCheckAction<>());
|
||||
actionUnitMap.put(TypeUnit.TEXT, new AnswerTextAction(sending));
|
||||
actionUnitMap.put(TypeUnit.VALIDITY, new AnswerValidityAction());
|
||||
actionUnitMap.put(TypeUnit.REPLACE_CMD, new ReplaceCmdAction());
|
||||
}
|
||||
|
||||
public void initModifiable(List<Modifiable<T>> modifiable) {
|
||||
public void initModifiable(List<Modifiable<M>> modifiable) {
|
||||
this.modifiable = modifiable;
|
||||
}
|
||||
|
||||
public void initActionUnit(String typeUnit, ActionUnit<? extends MainUnit, T> actionUnit) {
|
||||
public void initActionUnit(String typeUnit, ActionUnit<? extends MainUnit<M>, M> actionUnit) {
|
||||
if (!actionUnitMap.containsKey(typeUnit)) {
|
||||
actionUnitMap.put(typeUnit, actionUnit);
|
||||
} else {
|
||||
@ -67,7 +65,7 @@ public class GeneralAutoResponder<T extends Message> {
|
||||
}
|
||||
}
|
||||
|
||||
public void initSaveAction(AnswerSaveAction<?> answerSaveAction) {
|
||||
public void initSaveAction(AnswerSaveAction<M, ?> answerSaveAction) {
|
||||
actionUnitMap.put(TypeUnit.SAVE, answerSaveAction);
|
||||
}
|
||||
|
||||
@ -86,7 +84,7 @@ public class GeneralAutoResponder<T extends Message> {
|
||||
storyLineService.setDefaultUnit(unitName);
|
||||
}
|
||||
|
||||
public void processingNewMessage(T newMessage) {
|
||||
public void processingNewMessage(M newMessage) {
|
||||
if (newMessage != null) {
|
||||
final boolean state = personSettingService.getStateProcessingByPersonId(newMessage.getPersonId()).orElse(true);
|
||||
if (state) {
|
||||
@ -95,39 +93,39 @@ public class GeneralAutoResponder<T extends Message> {
|
||||
}
|
||||
}
|
||||
|
||||
public void processingNewMessages(List<T> newMessages) {
|
||||
public void processingNewMessages(List<M> newMessages) {
|
||||
if (newMessages != null && !newMessages.isEmpty()) {
|
||||
final Set<Long> personIds = newMessages.stream()
|
||||
.map(Message::getPersonId)
|
||||
.collect(Collectors.toSet());
|
||||
final Set<Long> disableIds = personSettingService.getAllPersonIdDisableMessages(personIds);
|
||||
final List<T> allowedMessages = newMessages.stream()
|
||||
final List<M> allowedMessages = newMessages.stream()
|
||||
.filter(message -> !disableIds.contains(message.getPersonId()))
|
||||
.toList();
|
||||
allowedMessages.parallelStream().forEach(this::processing);
|
||||
}
|
||||
}
|
||||
|
||||
private void processing(T message) {
|
||||
private void processing(M message) {
|
||||
if (modifiable != null) {
|
||||
modifiable.forEach(m -> m.change(message));
|
||||
}
|
||||
final Set<MainUnit> units = storyLineService.getNextUnitByPersonId(message.getPersonId());
|
||||
final Optional<MainUnit> optAnswer = Responder.nextUnit(message.getText(), units)
|
||||
final Set<MainUnit<M>> units = storyLineService.getNextUnitByPersonId(message.getPersonId());
|
||||
final Optional<MainUnit<M>> optAnswer = Responder.nextUnit(message, units)
|
||||
.or(storyLineService::getDefaultUnit);
|
||||
if (optAnswer.isPresent()) {
|
||||
final MainUnit answer = optAnswer.get();
|
||||
final MainUnit<M> answer = optAnswer.get();
|
||||
if (checkPermission(answer.getAccessibility(), message)) {
|
||||
answer(UnitRequest.of(answer, message));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private boolean checkPermission(Optional<Accessibility> accessibility, T message) {
|
||||
private boolean checkPermission(Optional<Accessibility> accessibility, M message) {
|
||||
return accessibility.isEmpty() || accessibility.get().check(message);
|
||||
}
|
||||
|
||||
public void answer(UnitRequest<MainUnit, T> unitRequest) {
|
||||
public void answer(UnitRequest<MainUnit<M>, M> unitRequest) {
|
||||
try {
|
||||
unitRequest = getAction(unitRequest);
|
||||
activeUnitAfter(unitRequest);
|
||||
@ -140,10 +138,10 @@ public class GeneralAutoResponder<T extends Message> {
|
||||
}
|
||||
}
|
||||
|
||||
private UnitRequest<MainUnit, T> activeUnitAfter(UnitRequest<MainUnit, T> unitRequest) {
|
||||
final Set<MainUnit> nextUnits = unitRequest.getUnit().getNextUnits();
|
||||
private UnitRequest<MainUnit<M>, M> activeUnitAfter(UnitRequest<MainUnit<M>, M> unitRequest) {
|
||||
final Set<MainUnit<M>> nextUnits = unitRequest.getUnit().getNextUnits();
|
||||
if (nextUnits != null) {
|
||||
Optional<MainUnit> first = nextUnits.stream()
|
||||
Optional<MainUnit<M>> first = nextUnits.stream()
|
||||
.filter(unit -> UnitActiveType.AFTER.equals(unit.getActiveType()))
|
||||
.findFirst();
|
||||
if (first.isPresent()) {
|
||||
@ -154,18 +152,18 @@ public class GeneralAutoResponder<T extends Message> {
|
||||
return unitRequest;
|
||||
}
|
||||
|
||||
private UnitRequest<MainUnit, T> getAction(UnitRequest<MainUnit, T> unitRequest) {
|
||||
final MainUnit unit = unitRequest.getUnit();
|
||||
final T message = unitRequest.getMessage();
|
||||
private UnitRequest<MainUnit<M>, M> getAction(UnitRequest<MainUnit<M>, M> unitRequest) {
|
||||
final MainUnit<M> unit = unitRequest.getUnit();
|
||||
final M message = unitRequest.getMessage();
|
||||
final String typeUnit = unit.getType();
|
||||
if (actionUnitMap.containsKey(typeUnit)) {
|
||||
ActionUnit actionUnit = actionUnitMap.get(typeUnit);
|
||||
UnitRequest<MainUnit, T> newUnitRequest = actionUnit.action(unitRequest);
|
||||
final Optional<MainUnit> optDefaultUnit = storyLineService.getDefaultUnit();
|
||||
UnitRequest<MainUnit<M>, M> newUnitRequest = actionUnit.action(unitRequest);
|
||||
final Optional<MainUnit<M>> optDefaultUnit = storyLineService.getDefaultUnit();
|
||||
if (!unit.isNotSaveHistory() && (optDefaultUnit.isEmpty() || !optDefaultUnit.get().equals(unit))) {
|
||||
storyLineService.save(message.getPersonId(), unit.getName(), message);
|
||||
}
|
||||
final MainUnit newUnit = newUnitRequest.getUnit();
|
||||
final MainUnit<M> newUnit = newUnitRequest.getUnit();
|
||||
return !unit.equals(newUnit) ? getAction(newUnitRequest) : unitRequest;
|
||||
} else {
|
||||
throw new NotFoundException("ActionUnit для типа {0} не зарегистрирован", unit.getType());
|
||||
|
@ -1,5 +1,6 @@
|
||||
package dev.struchkov.godfather.core;
|
||||
|
||||
import dev.struchkov.godfather.context.domain.content.Message;
|
||||
import dev.struchkov.godfather.context.domain.unit.MainUnit;
|
||||
import dev.struchkov.haiti.utils.Inspector;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
@ -10,22 +11,22 @@ import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
|
||||
public class Storyline {
|
||||
public class Storyline<M extends Message> {
|
||||
|
||||
private final Set<MainUnit> startingUnits = new HashSet<>();
|
||||
private final Set<MainUnit> globalUnits = new HashSet<>();
|
||||
private final Map<String, MainUnit> units = new HashMap<>();
|
||||
private final Set<MainUnit<M>> startingUnits = new HashSet<>();
|
||||
private final Set<MainUnit<M>> globalUnits = new HashSet<>();
|
||||
private final Map<String, MainUnit<M>> units = new HashMap<>();
|
||||
|
||||
public Storyline(Set<MainUnit> startingUnits, Map<String, MainUnit> units) {
|
||||
public Storyline(Set<MainUnit<M>> startingUnits, Map<String, MainUnit<M>> units) {
|
||||
this.startingUnits.addAll(startingUnits);
|
||||
this.units.putAll(units);
|
||||
}
|
||||
|
||||
public void addGlobalUnits(Set<MainUnit> globalUnits) {
|
||||
public void addGlobalUnits(Set<MainUnit<M>> globalUnits) {
|
||||
this.globalUnits.addAll(globalUnits);
|
||||
}
|
||||
|
||||
public Set<MainUnit> getGlobalUnits() {
|
||||
public Set<MainUnit<M>> getGlobalUnits() {
|
||||
return globalUnits;
|
||||
}
|
||||
|
||||
@ -34,20 +35,20 @@ public class Storyline {
|
||||
*
|
||||
* @param unitName Название юнита.
|
||||
*/
|
||||
public Optional<MainUnit> getUnit(String unitName) {
|
||||
public Optional<MainUnit<M>> getUnit(String unitName) {
|
||||
Inspector.isNotNull(unitName);
|
||||
return Optional.ofNullable(units.get(unitName));
|
||||
}
|
||||
|
||||
public Set<MainUnit> getStartingUnits() {
|
||||
public Set<MainUnit<M>> getStartingUnits() {
|
||||
return startingUnits;
|
||||
}
|
||||
|
||||
//TODO [22.06.2022]: Временное решение ленивой связки юнитов, пока не будет реализован нормальный механизм.
|
||||
public void link(@NotNull String firstName, @NotNull String secondName) {
|
||||
Inspector.isNotNull(firstName, secondName);
|
||||
final MainUnit firstUnit = units.get(firstName);
|
||||
final MainUnit secondUnit = units.get(secondName);
|
||||
final MainUnit<M> firstUnit = units.get(firstName);
|
||||
final MainUnit<M> secondUnit = units.get(secondName);
|
||||
Inspector.isNotNull(firstUnit, secondUnit);
|
||||
firstUnit.getNextUnits().add(secondUnit);
|
||||
}
|
||||
|
@ -2,6 +2,7 @@ package dev.struchkov.godfather.core;
|
||||
|
||||
import dev.struchkov.godfather.context.domain.UnitDefinition;
|
||||
import dev.struchkov.godfather.context.domain.annotation.Unit;
|
||||
import dev.struchkov.godfather.context.domain.content.Message;
|
||||
import dev.struchkov.godfather.context.domain.unit.MainUnit;
|
||||
import dev.struchkov.godfather.context.exception.UnitConfigException;
|
||||
import dev.struchkov.haiti.utils.Inspector;
|
||||
@ -22,14 +23,14 @@ import java.util.stream.Collectors;
|
||||
|
||||
import static dev.struchkov.godfather.context.exception.UnitConfigException.unitConfigException;
|
||||
|
||||
public class StorylineMaker {
|
||||
public class StorylineMaker<M extends Message> {
|
||||
|
||||
private static final Logger log = LoggerFactory.getLogger(StorylineMaker.class);
|
||||
|
||||
private final List<Object> configurations = new ArrayList<>();
|
||||
|
||||
private final Map<String, UnitDefinition> unitDefinitions = new HashMap<>();
|
||||
private final Map<String, MainUnit> unitMap = new HashMap<>();
|
||||
private final Map<String, MainUnit<M>> unitMap = new HashMap<>();
|
||||
|
||||
private final Set<String> mainUnits = new HashSet<>();
|
||||
private final Set<String> globalUnits = new HashSet<>();
|
||||
@ -42,17 +43,17 @@ public class StorylineMaker {
|
||||
return unitDefinitions;
|
||||
}
|
||||
|
||||
public Map<String, MainUnit> getUnitMap() {
|
||||
public Map<String, MainUnit<M>> getUnitMap() {
|
||||
return unitMap;
|
||||
}
|
||||
|
||||
public Storyline createStoryLine() {
|
||||
public Storyline<M> createStoryLine() {
|
||||
generateUnitDefinitions();
|
||||
try {
|
||||
createUnitMap();
|
||||
final Set<MainUnit> mainUnit = getMainUnit();
|
||||
final Set<MainUnit> globalUnit = getGlobalUnit();
|
||||
final Storyline storyline = new Storyline(mainUnit, unitMap);
|
||||
final Set<MainUnit<M>> mainUnit = getMainUnit();
|
||||
final Set<MainUnit<M>> globalUnit = getGlobalUnit();
|
||||
final Storyline<M> storyline = new Storyline<>(mainUnit, unitMap);
|
||||
storyline.addGlobalUnits(globalUnit);
|
||||
return storyline;
|
||||
} catch (IllegalAccessException | InvocationTargetException e) {
|
||||
@ -61,14 +62,14 @@ public class StorylineMaker {
|
||||
throw new UnitConfigException("Ошибка построения StoryLine");
|
||||
}
|
||||
|
||||
private Set<MainUnit> getMainUnit() {
|
||||
private Set<MainUnit<M>> getMainUnit() {
|
||||
Inspector.isNotEmpty(mainUnits, unitConfigException("Не задан ни один mainUnit. Установите хотя бы для одного Unit флаг mainUnit"));
|
||||
return mainUnits.stream()
|
||||
.map(unitMap::get)
|
||||
.collect(Collectors.toSet());
|
||||
}
|
||||
|
||||
private Set<MainUnit> getGlobalUnit() {
|
||||
private Set<MainUnit<M>> getGlobalUnit() {
|
||||
return globalUnits.stream()
|
||||
.map(unitMap::get)
|
||||
.collect(Collectors.toSet());
|
||||
@ -85,7 +86,7 @@ public class StorylineMaker {
|
||||
}
|
||||
}
|
||||
|
||||
private MainUnit createUnit(UnitDefinition unitDefinition) throws IllegalAccessException, InvocationTargetException {
|
||||
private MainUnit<M> createUnit(UnitDefinition unitDefinition) throws IllegalAccessException, InvocationTargetException {
|
||||
final Object objectConfig = unitDefinition.getObjectConfig();
|
||||
final String currentUnitName = unitDefinition.getName();
|
||||
final Method method = unitDefinition.getMethod();
|
||||
@ -95,7 +96,7 @@ public class StorylineMaker {
|
||||
.map(Unit::value)
|
||||
.map(unitMap::get)
|
||||
.toArray();
|
||||
MainUnit newUnit = (MainUnit) method.invoke(objectConfig, nextUnits);
|
||||
MainUnit<M> newUnit = (MainUnit<M>) method.invoke(objectConfig, nextUnits);
|
||||
newUnit.setName(currentUnitName);
|
||||
|
||||
unitMap.put(currentUnitName, newUnit);
|
||||
|
@ -1,32 +0,0 @@
|
||||
//package dev.struchkov.godfather.core.domain.question;
|
||||
//
|
||||
//import dev.struchkov.godfather.context.domain.BoxAnswer;
|
||||
//import lombok.Builder;
|
||||
//import lombok.Getter;
|
||||
//import lombok.Setter;
|
||||
//import lombok.Singular;
|
||||
//
|
||||
//import java.util.List;
|
||||
//
|
||||
///**
|
||||
// * Используется для конфигурации генерации цепочки Unit-ов в виде тестов для прохождения пользователем.
|
||||
// *
|
||||
// * @author upagge [14/07/2019]
|
||||
// */
|
||||
//@Getter
|
||||
//@Setter
|
||||
//@Builder
|
||||
//public class Question {
|
||||
//
|
||||
// /**
|
||||
// * Вопрос.
|
||||
// */
|
||||
// private BoxAnswer boxAnswer;
|
||||
//
|
||||
// /**
|
||||
// * Список предполагаемых ответов.
|
||||
// */
|
||||
// @Singular
|
||||
// private List<QuestionAnswer> questionAnswers;
|
||||
//
|
||||
//}
|
@ -1,35 +0,0 @@
|
||||
//package dev.struchkov.godfather.core.domain.question;
|
||||
//
|
||||
//import lombok.Getter;
|
||||
//import lombok.Setter;
|
||||
//
|
||||
///**
|
||||
// * Используется для конфигурации генерации цепочки Unit-ов в виде тестов для прохождения пользователем.
|
||||
// * Отвечает за варианты ответов.
|
||||
// *
|
||||
// * @author upagge [14/07/2019]
|
||||
// */
|
||||
//@Getter
|
||||
//@Setter
|
||||
//public class QuestionAnswer {
|
||||
//
|
||||
// /**
|
||||
// * Текстовый ответ.
|
||||
// */
|
||||
// private String text;
|
||||
//
|
||||
// /**
|
||||
// * Количество балов за ответ.
|
||||
// */
|
||||
// private int points;
|
||||
//
|
||||
// public QuestionAnswer(String text, Integer points) {
|
||||
// this.text = text;
|
||||
// this.points = points;
|
||||
// }
|
||||
//
|
||||
// public QuestionAnswer(String text) {
|
||||
// this.text = text;
|
||||
// }
|
||||
//
|
||||
//}
|
@ -1,32 +0,0 @@
|
||||
//package dev.struchkov.godfather.core.domain.question;
|
||||
//
|
||||
//import lombok.AllArgsConstructor;
|
||||
//import lombok.Getter;
|
||||
//import lombok.Setter;
|
||||
//
|
||||
///**
|
||||
// * Используется для сохранения результатов ответов на вопросы.
|
||||
// *
|
||||
// * @author upagge [14/07/2019]
|
||||
// */
|
||||
//@Getter
|
||||
//@Setter
|
||||
//@AllArgsConstructor
|
||||
//public class QuestionResult {
|
||||
//
|
||||
// /**
|
||||
// * Вопрос.
|
||||
// */
|
||||
// private String question;
|
||||
//
|
||||
// /**
|
||||
// * Ответ.
|
||||
// */
|
||||
// private String answer;
|
||||
//
|
||||
// /**
|
||||
// * Количество баллов за ответ.
|
||||
// */
|
||||
// private Integer points;
|
||||
//
|
||||
//}
|
@ -26,7 +26,7 @@ public class StorylineMailService implements StorylineService<Mail> {
|
||||
|
||||
private final UnitPointerService unitPointerService;
|
||||
private final StorylineRepository storylineRepository;
|
||||
private final Storyline storyLine;
|
||||
private final Storyline<Mail> storyLine;
|
||||
private String defaultUnitName;
|
||||
|
||||
public StorylineMailService(
|
||||
@ -34,7 +34,7 @@ public class StorylineMailService implements StorylineService<Mail> {
|
||||
StorylineRepository storylineRepository,
|
||||
List<Object> unitConfigurations
|
||||
) {
|
||||
this.storyLine = new StorylineMaker(unitConfigurations).createStoryLine();
|
||||
this.storyLine = new StorylineMaker<Mail>(unitConfigurations).createStoryLine();
|
||||
this.unitPointerService = unitPointerService;
|
||||
this.storylineRepository = storylineRepository;
|
||||
}
|
||||
@ -47,21 +47,21 @@ public class StorylineMailService implements StorylineService<Mail> {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Optional<MainUnit> getUnitNameByPersonId(@NotNull Long personId) {
|
||||
public Optional<MainUnit<Mail>> getUnitNameByPersonId(@NotNull Long personId) {
|
||||
Inspector.isNotNull(personId);
|
||||
return unitPointerService.getUnitNameByPersonId(personId)
|
||||
.flatMap(storyLine::getUnit);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<MainUnit> getNextUnitByPersonId(@NotNull Long personId) {
|
||||
final Optional<Set<MainUnit>> optMainUnits = getUnitNameByPersonId(personId)
|
||||
public Set<MainUnit<Mail>> getNextUnitByPersonId(@NotNull Long personId) {
|
||||
final Optional<Set<MainUnit<Mail>>> optMainUnits = getUnitNameByPersonId(personId)
|
||||
.map(Unit::getNextUnits)
|
||||
.filter(mainUnits -> !mainUnits.isEmpty());
|
||||
if (optMainUnits.isEmpty()) {
|
||||
storylineRepository.cleanHistoryByPersonId(personId);
|
||||
}
|
||||
final Set<MainUnit> nextUnits = optMainUnits.orElse(storyLine.getStartingUnits());
|
||||
final Set<MainUnit<Mail>> nextUnits = optMainUnits.orElse(storyLine.getStartingUnits());
|
||||
nextUnits.addAll(storyLine.getGlobalUnits());
|
||||
return nextUnits;
|
||||
}
|
||||
@ -89,7 +89,7 @@ public class StorylineMailService implements StorylineService<Mail> {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Optional<MainUnit> getDefaultUnit() {
|
||||
public Optional<MainUnit<Mail>> getDefaultUnit() {
|
||||
if (defaultUnitName == null) return Optional.empty();
|
||||
return storyLine.getUnit(defaultUnitName);
|
||||
}
|
||||
@ -106,7 +106,7 @@ public class StorylineMailService implements StorylineService<Mail> {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Optional<MainUnit> getUnitByName(String unitName) {
|
||||
public Optional<MainUnit<Mail>> getUnitByName(String unitName) {
|
||||
return storyLine.getUnit(unitName);
|
||||
}
|
||||
|
||||
|
@ -10,13 +10,13 @@ import dev.struchkov.godfather.context.domain.unit.MainUnit;
|
||||
* @author upagge [11/07/2019]
|
||||
*/
|
||||
@FunctionalInterface
|
||||
public interface ActionUnit<M extends MainUnit, C extends Message> {
|
||||
public interface ActionUnit<U extends MainUnit, M extends Message> {
|
||||
|
||||
/**
|
||||
* Метод обработки Unit-а.
|
||||
*
|
||||
* @return Новый Unit, который может нуждаться в обработке
|
||||
*/
|
||||
UnitRequest<MainUnit, C> action(UnitRequest<M, C> unitRequest);
|
||||
UnitRequest<MainUnit, M> action(UnitRequest<U, M> unitRequest);
|
||||
|
||||
}
|
||||
|
@ -8,23 +8,22 @@ import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
|
||||
/**
|
||||
* Обработчик Unit-а {@link AnswerCheck}.
|
||||
*
|
||||
* @author upagge [11/07/2019]
|
||||
*/
|
||||
public class AnswerCheckAction implements ActionUnit<AnswerCheck, Message> {
|
||||
public class AnswerCheckAction<M extends Message> implements ActionUnit<AnswerCheck<M>, M> {
|
||||
|
||||
private static final Logger log = LoggerFactory.getLogger(AnswerCheckAction.class);
|
||||
|
||||
@Override
|
||||
public UnitRequest<MainUnit, Message> action(UnitRequest<AnswerCheck, Message> unitRequest) {
|
||||
final AnswerCheck unit = unitRequest.getUnit();
|
||||
final Message message = unitRequest.getMessage();
|
||||
public UnitRequest<MainUnit, M> action(UnitRequest<AnswerCheck<M>, M> unitRequest) {
|
||||
final AnswerCheck<M> unit = unitRequest.getUnit();
|
||||
final M message = unitRequest.getMessage();
|
||||
|
||||
MainUnit unitAnswer;
|
||||
MainUnit<M> unitAnswer;
|
||||
if (unit.getCheck().checked(message)) {
|
||||
log.info("Проверка пройдена");
|
||||
unitAnswer = unit.getUnitTrue();
|
||||
|
@ -16,25 +16,25 @@ import static dev.struchkov.haiti.utils.Checker.checkNotNull;
|
||||
*
|
||||
* @author upagge [11/07/2019]
|
||||
*/
|
||||
public class AnswerSaveAction<D> implements ActionUnit<AnswerSave<D>, Message> {
|
||||
public class AnswerSaveAction<M extends Message, D> implements ActionUnit<AnswerSave<M, D>, M> {
|
||||
|
||||
@Override
|
||||
public UnitRequest<MainUnit, Message> action(UnitRequest<AnswerSave<D>, Message> unitRequest) {
|
||||
final AnswerSave<D> answerSave = unitRequest.getUnit();
|
||||
final Message message = unitRequest.getMessage();
|
||||
public UnitRequest<MainUnit, M> action(UnitRequest<AnswerSave<M, D>, M> unitRequest) {
|
||||
final AnswerSave<M, D> answerSave = unitRequest.getUnit();
|
||||
final M message = unitRequest.getMessage();
|
||||
|
||||
final AnswerSavePreservable<D> preservable = answerSave.getPreservable();
|
||||
final Long personId = message.getPersonId();
|
||||
|
||||
final CheckSave<? super Message> checkSave = answerSave.getCheckSave();
|
||||
final CheckSave<M> checkSave = answerSave.getCheckSave();
|
||||
if (checkNotNull(checkSave)) {
|
||||
MainUnit unit = checkSave.check(message);
|
||||
MainUnit<M> unit = checkSave.check(message);
|
||||
if (checkNotNull(unit)) {
|
||||
return UnitRequest.of(unit, message);
|
||||
}
|
||||
}
|
||||
|
||||
final PreservableData<D, ? super Message> preservableData = answerSave.getPreservableData();
|
||||
final PreservableData<D, M> preservableData = answerSave.getPreservableData();
|
||||
if (checkNotNull(preservableData)) {
|
||||
D data = preservableData.getData(message);
|
||||
if (checkNotNull(data)) {
|
||||
|
@ -10,6 +10,7 @@ import dev.struchkov.godfather.context.utils.InsertWords;
|
||||
import dev.struchkov.godfather.context.utils.Sender;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
/**
|
||||
* Обработчик Unit-а {@link AnswerText}.
|
||||
@ -29,14 +30,17 @@ public class AnswerTextAction implements ActionUnit<AnswerText<Message>, Message
|
||||
final AnswerText<Message> unit = unitRequest.getUnit();
|
||||
final Message message = unitRequest.getMessage();
|
||||
|
||||
final BoxAnswer boxAnswer = unit.getBoxAnswer().processing(message);
|
||||
replaceMarkers(unit, message, boxAnswer);
|
||||
final Optional<BoxAnswer> optAnswer = unit.getAnswer().processing(message);
|
||||
if (optAnswer.isPresent()) {
|
||||
final BoxAnswer answer = optAnswer.get();
|
||||
replaceMarkers(unit, message, answer);
|
||||
|
||||
final Sending answerTextSending = unit.getSending();
|
||||
if (answerTextSending != null) {
|
||||
Sender.sends(message, boxAnswer, answerTextSending);
|
||||
Sender.sends(message, answer, answerTextSending);
|
||||
} else {
|
||||
Sender.sends(message, boxAnswer, this.sending);
|
||||
Sender.sends(message, answer, this.sending);
|
||||
}
|
||||
}
|
||||
|
||||
return UnitRequest.of(unit, message);
|
||||
|
@ -2,11 +2,11 @@ package dev.struchkov.godfather.core.service.action;
|
||||
|
||||
import dev.struchkov.godfather.context.domain.UnitRequest;
|
||||
import dev.struchkov.godfather.context.domain.content.Message;
|
||||
import dev.struchkov.godfather.context.domain.unit.AnswerTimer;
|
||||
import dev.struchkov.godfather.context.domain.unit.MainUnit;
|
||||
import dev.struchkov.godfather.context.exception.TimerSettingException;
|
||||
import dev.struchkov.godfather.core.GeneralAutoResponder;
|
||||
import dev.struchkov.godfather.core.domain.Timer;
|
||||
import dev.struchkov.godfather.context.domain.unit.AnswerTimer;
|
||||
import dev.struchkov.godfather.context.domain.unit.MainUnit;
|
||||
import dev.struchkov.godfather.core.service.timer.TimerActionTask;
|
||||
import dev.struchkov.godfather.core.service.timer.TimerService;
|
||||
|
||||
@ -20,9 +20,9 @@ import java.util.Optional;
|
||||
*
|
||||
* @author upagge [11/07/2019]
|
||||
*/
|
||||
public class AnswerTimerAction implements ActionUnit<AnswerTimer, Message> {
|
||||
public class AnswerTimerAction<M extends Message> implements ActionUnit<AnswerTimer<M>, M> {
|
||||
|
||||
private TimerService timerService;
|
||||
private final TimerService timerService;
|
||||
private Long verificationPeriodSec = 15L;
|
||||
|
||||
public AnswerTimerAction(TimerService timerService, GeneralAutoResponder generalAutoresponder) {
|
||||
@ -41,9 +41,9 @@ public class AnswerTimerAction implements ActionUnit<AnswerTimer, Message> {
|
||||
}
|
||||
|
||||
@Override
|
||||
public UnitRequest<MainUnit, Message> action(UnitRequest<AnswerTimer, Message> unitRequest) {
|
||||
final AnswerTimer unit = unitRequest.getUnit();
|
||||
final Message message = unitRequest.getMessage();
|
||||
public UnitRequest<MainUnit, M> action(UnitRequest<AnswerTimer<M>, M> unitRequest) {
|
||||
final AnswerTimer<M> unit = unitRequest.getUnit();
|
||||
final M message = unitRequest.getMessage();
|
||||
|
||||
final LocalDateTime timeActive = LocalDateTime
|
||||
.now(Clock.tickSeconds(ZoneId.systemDefault()))
|
||||
|
@ -1,57 +0,0 @@
|
||||
package dev.struchkov.godfather.core.service.action;
|
||||
|
||||
import dev.struchkov.godfather.context.domain.Clarification;
|
||||
import dev.struchkov.godfather.context.domain.UnitRequest;
|
||||
import dev.struchkov.godfather.context.domain.content.Message;
|
||||
import dev.struchkov.godfather.context.domain.unit.AnswerText;
|
||||
import dev.struchkov.godfather.context.domain.unit.AnswerValidity;
|
||||
import dev.struchkov.godfather.context.domain.unit.MainUnit;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* Обработчик Unit-а {@link AnswerValidity}.
|
||||
*
|
||||
* @author upagge [11/07/2019]
|
||||
*/
|
||||
public class AnswerValidityAction implements ActionUnit<AnswerValidity, Message> {
|
||||
|
||||
public static final Set<String> WORDS_YES = Set.of("да", "ага");
|
||||
public static final Set<String> WORDS_NO = Set.of("нет", "неа");
|
||||
public static final Set<String> WORDS_YES_NO = Set.of("да", "ага", "нет", "неа");
|
||||
|
||||
@Override
|
||||
public UnitRequest<MainUnit, Message> action(UnitRequest<AnswerValidity, Message> unitRequest) {
|
||||
final AnswerValidity unit = unitRequest.getUnit();
|
||||
final Message content = unitRequest.getMessage();
|
||||
|
||||
String message = content.getText();
|
||||
Long personId = content.getPersonId();
|
||||
if (WORDS_YES.contains(message.toLowerCase())) {
|
||||
unit.getTempSave().getByKey(personId, "temp").ifPresent(content::setText);
|
||||
return UnitRequest.of(unit.getUnitYes(), content);
|
||||
} else if (WORDS_NO.contains(message.toLowerCase())) {
|
||||
unit.getTempSave().getByKey(personId, "temp").ifPresent(content::setText);
|
||||
return UnitRequest.of(unit.getUnitNo(), content);
|
||||
} else {
|
||||
Clarification clarification = unit.getClarificationQuestion().getClarification(content);
|
||||
final String value = clarification.getValue();
|
||||
if (value == null) {
|
||||
return UnitRequest.of(unit.getUnitNull(), content);
|
||||
} else {
|
||||
unit.getTempSave().save(personId, "temp", value);
|
||||
AnswerValidity newValidity = unit.builder()
|
||||
.clearKeyWords()
|
||||
.stringKeyWords(WORDS_YES_NO)
|
||||
.build();
|
||||
return UnitRequest.of(
|
||||
AnswerText.builder()
|
||||
.message(mes -> clarification.getQuestion())
|
||||
.nextUnit(newValidity)
|
||||
.build(),
|
||||
content
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -10,18 +10,18 @@ import dev.struchkov.godfather.core.service.action.ActionUnit;
|
||||
|
||||
import static dev.struchkov.godfather.context.exception.RollBackException.rollBackException;
|
||||
|
||||
public class RollBackCmdAction<T extends Message> implements ActionUnit<RollBackCmd, T> {
|
||||
public class RollBackCmdAction<M extends Message> implements ActionUnit<RollBackCmd<M>, M> {
|
||||
|
||||
private final StorylineService<T> storyLineService;
|
||||
private final StorylineService<M> storyLineService;
|
||||
|
||||
public RollBackCmdAction(StorylineService<T> storyLineService) {
|
||||
public RollBackCmdAction(StorylineService<M> storyLineService) {
|
||||
this.storyLineService = storyLineService;
|
||||
}
|
||||
|
||||
@Override
|
||||
public UnitRequest<MainUnit, T> action(UnitRequest<RollBackCmd, T> unitRequest) {
|
||||
final RollBackCmd unit = unitRequest.getUnit();
|
||||
final T message = unitRequest.getMessage();
|
||||
public UnitRequest<MainUnit, M> action(UnitRequest<RollBackCmd<M>, M> unitRequest) {
|
||||
final RollBackCmd<M> unit = unitRequest.getUnit();
|
||||
final M message = unitRequest.getMessage();
|
||||
|
||||
final int countToBack = unit.getCountBack();
|
||||
final String rollbackUnitName = unit.getRollbackUnitName();
|
||||
@ -30,8 +30,9 @@ public class RollBackCmdAction<T extends Message> implements ActionUnit<RollBack
|
||||
? storyLineService.replaceUserToBack(message.getPersonId(), rollbackUnitName).orElseThrow(rollBackException("Юнит для возвращения не был найден"))
|
||||
: storyLineService.replaceUserToBack(message.getPersonId(), countToBack).orElseThrow(rollBackException("Юнит для возвращения не был найден"));
|
||||
final String unitName = history.getUnitName();
|
||||
final MainUnit nextUnit = storyLineService.getUnitByName(unitName).orElse(unit);
|
||||
final T oldMessage = (T) history.getMessage();
|
||||
final MainUnit<M> nextUnit = storyLineService.getUnitByName(unitName).orElse(unit);
|
||||
final M oldMessage = (M) history.getMessage();
|
||||
return UnitRequest.of(nextUnit, oldMessage);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -9,22 +9,24 @@ import dev.struchkov.godfather.core.service.action.ActionUnit;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
public class TeleportCmdAction<T extends Message> implements ActionUnit<TeleportCmd, T> {
|
||||
public class TeleportCmdAction<M extends Message> implements ActionUnit<TeleportCmd<M>, M> {
|
||||
|
||||
private final StorylineService<T> storyLineService;
|
||||
private final StorylineService<M> storyLineService;
|
||||
|
||||
public TeleportCmdAction(StorylineService<T> storyLineService) {
|
||||
public TeleportCmdAction(StorylineService<M> storyLineService) {
|
||||
this.storyLineService = storyLineService;
|
||||
}
|
||||
|
||||
@Override
|
||||
public UnitRequest<MainUnit, T> action(UnitRequest<TeleportCmd, T> unitRequest) {
|
||||
final TeleportCmd unit = unitRequest.getUnit();
|
||||
final T message = unitRequest.getMessage();
|
||||
final Optional<MainUnit> optNextUnit = storyLineService.getUnitByName(unit.getUnitNameToTeleport());
|
||||
return optNextUnit
|
||||
.map(mainUnit -> UnitRequest.of(mainUnit, message))
|
||||
.orElseGet(() -> UnitRequest.of(unit, message));
|
||||
public UnitRequest<MainUnit, M> action(UnitRequest<TeleportCmd<M>, M> unitRequest) {
|
||||
final TeleportCmd<M> unit = unitRequest.getUnit();
|
||||
final M message = unitRequest.getMessage();
|
||||
final Optional<MainUnit<M>> optNextUnit = storyLineService.getUnitByName(unit.getUnitNameToTeleport());
|
||||
if (optNextUnit.isPresent()) {
|
||||
return UnitRequest.of(optNextUnit.get(), message);
|
||||
} else {
|
||||
return UnitRequest.of(unit, message);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,95 +0,0 @@
|
||||
//package dev.struchkov.godfather.core.utils;
|
||||
//
|
||||
//import dev.struchkov.godfather.context.domain.BoxAnswer;
|
||||
//import dev.struchkov.godfather.context.utils.KeyBoards;
|
||||
//import dev.struchkov.godfather.core.domain.question.Question;
|
||||
//import dev.struchkov.godfather.core.domain.question.QuestionAnswer;
|
||||
//import dev.struchkov.godfather.core.domain.question.QuestionResult;
|
||||
//import dev.struchkov.godfather.core.domain.unit.AnswerSave;
|
||||
//import dev.struchkov.godfather.core.domain.unit.AnswerText;
|
||||
//import dev.struchkov.godfather.core.domain.unit.MainUnit;
|
||||
//import dev.struchkov.godfather.core.domain.unit.UnitActiveType;
|
||||
//import dev.struchkov.godfather.context.repository.preser.Preservable;
|
||||
//import dev.struchkov.godfather.context.service.save.Pusher;
|
||||
//
|
||||
//import java.util.List;
|
||||
//import java.util.Optional;
|
||||
//import java.util.stream.Collectors;
|
||||
//
|
||||
///**
|
||||
// * Утилита для быстрой генерации цепочки Unit-ов, образующих сценарий "Тестирование".
|
||||
// *
|
||||
// * @author upagge [14/07/2019]
|
||||
// */
|
||||
//public class QuestionUtils {
|
||||
//
|
||||
// private final Preservable<QuestionResult> preservable;
|
||||
// private final List<Question> questions;
|
||||
// private Pusher<QuestionResult> pusher;
|
||||
//
|
||||
// private QuestionUtils(List<Question> questions, Preservable<QuestionResult> preservable) {
|
||||
// this.questions = questions;
|
||||
// this.preservable = preservable;
|
||||
// }
|
||||
//
|
||||
// private QuestionUtils(List<Question> questions, Preservable<QuestionResult> preservable, Pusher<QuestionResult> pusher) {
|
||||
// this.questions = questions;
|
||||
// this.preservable = preservable;
|
||||
// this.pusher = pusher;
|
||||
// }
|
||||
//
|
||||
// public static QuestionUtils builder(Preservable<QuestionResult> preservable, List<Question> questions) {
|
||||
// return new QuestionUtils(questions, preservable);
|
||||
// }
|
||||
//
|
||||
// public static QuestionUtils builder(Preservable<QuestionResult> preservable, Pusher<QuestionResult> pusher, List<Question> list) {
|
||||
// return new QuestionUtils(list, preservable, pusher);
|
||||
// }
|
||||
//
|
||||
// public MainUnit build(MainUnit finishUnit) {
|
||||
// return generateTest(finishUnit);
|
||||
// }
|
||||
//
|
||||
// public MainUnit build() {
|
||||
// return generateTest(null);
|
||||
// }
|
||||
//
|
||||
// private MainUnit generateTest(MainUnit finishUnit) {
|
||||
// AnswerText previousUnit = null;
|
||||
// for (int i = questions.size() - 1; i >= 0; i--) {
|
||||
// Question question = this.questions.get(i);
|
||||
// List<String> collectAnswer = question.getQuestionAnswers().stream()
|
||||
// .map(QuestionAnswer::getText)
|
||||
// .collect(Collectors.toList());
|
||||
// BoxAnswer boxAnswer = question.getBoxAnswer().toBuilder()
|
||||
// .keyBoard(KeyBoards.verticalDuoMenuString(collectAnswer)).build();
|
||||
//
|
||||
// AnswerText.Builder answerTextBuilder = AnswerText.builder()
|
||||
// .boxAnswer(message -> boxAnswer);
|
||||
//
|
||||
// for (QuestionAnswer questionAnswer : question.getQuestionAnswers()) {
|
||||
// AnswerSave.AnswerSaveBuilder answerSaveBuilder = AnswerSave.<QuestionResult>builder()
|
||||
// .preservable(preservable)
|
||||
// .preservableData(
|
||||
// message -> new QuestionResult(
|
||||
// question.getBoxAnswer().getMessage(),
|
||||
// questionAnswer.getText(),
|
||||
// questionAnswer.getPoints()
|
||||
// )
|
||||
// )
|
||||
// .phrase(questionAnswer.getText());
|
||||
// if (i != this.questions.size() - 1) {
|
||||
// answerSaveBuilder.nextUnit(previousUnit).build();
|
||||
// } else {
|
||||
// answerSaveBuilder.pusher(pusher);
|
||||
// Optional.of(finishUnit).ifPresent(answerSaveBuilder::nextUnit);
|
||||
// }
|
||||
// answerTextBuilder.nextUnit(answerSaveBuilder.build());
|
||||
// }
|
||||
// if (i == 0) answerTextBuilder.activeType(UnitActiveType.AFTER);
|
||||
// previousUnit = answerTextBuilder.build();
|
||||
// }
|
||||
// return previousUnit;
|
||||
// }
|
||||
//
|
||||
//}
|
8
pom.xml
8
pom.xml
@ -6,7 +6,7 @@
|
||||
|
||||
<groupId>dev.struchkov.godfather</groupId>
|
||||
<artifactId>godfather-bot</artifactId>
|
||||
<version>0.0.17</version>
|
||||
<version>0.0.18</version>
|
||||
<packaging>pom</packaging>
|
||||
|
||||
<modules>
|
||||
@ -32,13 +32,13 @@
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
||||
|
||||
<godfather.ver>0.0.17</godfather.ver>
|
||||
<godfather.ver>0.0.18</godfather.ver>
|
||||
|
||||
<godfather.context.ver>${godfather.ver}</godfather.context.ver>
|
||||
<godfather.core.ver>${godfather.ver}</godfather.core.ver>
|
||||
|
||||
<autoresponder.ver>3.3.0</autoresponder.ver>
|
||||
<haiti.utils>1.0.3</haiti.utils>
|
||||
<autoresponder.ver>3.4.0</autoresponder.ver>
|
||||
<haiti.utils>1.2.0</haiti.utils>
|
||||
|
||||
<javax.persistence.api.ver>2.2</javax.persistence.api.ver>
|
||||
<validation.api.ver>2.0.1.Final</validation.api.ver>
|
||||
|
Loading…
Reference in New Issue
Block a user