Добавил возможность отправки промежуточного сообщения в AnswerCheck

This commit is contained in:
Struchkov Mark 2022-12-09 21:15:00 +03:00
parent eaaca3be6c
commit b2046cc977
7 changed files with 117 additions and 11 deletions

View File

@ -53,7 +53,7 @@ public class GeneralAutoResponder<M extends Message> {
} }
private void init(Sending sending) { private void init(Sending sending) {
actionUnitMap.put(TypeUnit.CHECK, new AnswerCheckAction<>()); actionUnitMap.put(TypeUnit.CHECK, new AnswerCheckAction<>(sending));
actionUnitMap.put(TypeUnit.TEXT, new AnswerTextAction(sending)); actionUnitMap.put(TypeUnit.TEXT, new AnswerTextAction(sending));
actionUnitMap.put(TypeUnit.REPLACE_CMD, new ReplaceCmdAction()); actionUnitMap.put(TypeUnit.REPLACE_CMD, new ReplaceCmdAction());
} }

View File

@ -1,6 +1,7 @@
package dev.struchkov.godfather.quarkus.core.action; package dev.struchkov.godfather.quarkus.core.action;
import dev.struchkov.godfather.main.domain.content.Message; import dev.struchkov.godfather.main.domain.content.Message;
import dev.struchkov.godfather.quarkus.context.service.Sending;
import dev.struchkov.godfather.quarkus.core.unit.AnswerCheck; import dev.struchkov.godfather.quarkus.core.unit.AnswerCheck;
import dev.struchkov.godfather.quarkus.core.unit.MainUnit; import dev.struchkov.godfather.quarkus.core.unit.MainUnit;
import dev.struchkov.godfather.quarkus.core.unit.UnitRequest; import dev.struchkov.godfather.quarkus.core.unit.UnitRequest;
@ -8,7 +9,7 @@ import io.smallrye.mutiny.Uni;
import java.util.Objects; import java.util.Objects;
import static dev.struchkov.haiti.utils.Checker.checkNotNull; import static dev.struchkov.haiti.utils.Checker.checkTrue;
/** /**
* Обработчик Unit-а {@link AnswerCheck}. * Обработчик Unit-а {@link AnswerCheck}.
@ -17,15 +18,28 @@ import static dev.struchkov.haiti.utils.Checker.checkNotNull;
*/ */
public class AnswerCheckAction<M extends Message> implements ActionUnit<AnswerCheck<M>, M> { public class AnswerCheckAction<M extends Message> implements ActionUnit<AnswerCheck<M>, M> {
private final Sending sending;
public AnswerCheckAction(Sending sending) {
this.sending = sending;
}
@Override @Override
public Uni<UnitRequest<MainUnit, M>> action(UnitRequest<AnswerCheck<M>, M> unitRequest) { public Uni<UnitRequest<MainUnit, M>> action(UnitRequest<AnswerCheck<M>, M> unitRequest) {
final AnswerCheck<M> unit = unitRequest.getUnit(); final AnswerCheck<M> unit = unitRequest.getUnit();
final M message = unitRequest.getMessage(); final M message = unitRequest.getMessage();
return unit.getCheck().checked(message) return unit.getCheck().checked(message)
.onItem().call(checkValue -> {
if (checkTrue(checkValue)) {
return sending.send(message.getPersonId(), unit.getIntermediateAnswerIfTrue());
} else {
return sending.send(message.getPersonId(), unit.getIntermediateAnswerIfFalse());
}
})
.onItem().transform( .onItem().transform(
checkValue -> { checkValue -> {
if (checkNotNull(checkValue) && checkValue) { if (checkTrue(checkValue)) {
return UnitRequest.of(Objects.requireNonNullElse(unit.getUnitTrue(), unit), message); return UnitRequest.of(Objects.requireNonNullElse(unit.getUnitTrue(), unit), message);
} else { } else {
return UnitRequest.of(Objects.requireNonNullElse(unit.getUnitFalse(), unit), message); return UnitRequest.of(Objects.requireNonNullElse(unit.getUnitFalse(), unit), message);

View File

@ -3,6 +3,7 @@ package dev.struchkov.godfather.quarkus.core.unit;
import dev.struchkov.autoresponder.entity.KeyWord; import dev.struchkov.autoresponder.entity.KeyWord;
import dev.struchkov.godfather.main.core.unit.TypeUnit; import dev.struchkov.godfather.main.core.unit.TypeUnit;
import dev.struchkov.godfather.main.core.unit.UnitActiveType; import dev.struchkov.godfather.main.core.unit.UnitActiveType;
import dev.struchkov.godfather.main.domain.BoxAnswer;
import dev.struchkov.godfather.main.domain.content.Message; import dev.struchkov.godfather.main.domain.content.Message;
import dev.struchkov.godfather.quarkus.context.service.Accessibility; import dev.struchkov.godfather.quarkus.context.service.Accessibility;
import dev.struchkov.godfather.quarkus.core.unit.func.CheckData; import dev.struchkov.godfather.quarkus.core.unit.func.CheckData;
@ -14,9 +15,6 @@ import java.util.function.Predicate;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static dev.struchkov.godfather.exception.UnitConfigException.unitConfigException;
import static dev.struchkov.haiti.utils.Inspector.isAnyNotNull;
/** /**
* Обработчик запроса, который реализует конструкцию IF в сценарии. * Обработчик запроса, который реализует конструкцию IF в сценарии.
* *
@ -34,6 +32,16 @@ public class AnswerCheck<M extends Message> extends MainUnit<M> {
*/ */
private final MainUnit unitFalse; private final MainUnit unitFalse;
/**
* Временный ответ. Отправляется сразу после проверки условия, если оно true. Предполагается, что после условия следующий Unit может долго обрабатывать какой-то результат. Поэтому можно передать пользователю какое-то сообщение, наподобие: "Подождите идет обработка".
*/
private final BoxAnswer intermediateAnswerIfTrue;
/**
* Промежуточный ответ. Отправляется сразу после проверки условия, если оно false. Предполагается, что после условия следующий Unit может долго обрабатывать какой-то результат. Поэтому можно передать пользователю какое-то сообщение, наподобие: "Подождите идет обработка".
*/
private final BoxAnswer intermediateAnswerIfFalse;
/** /**
* Условие проверки. * Условие проверки.
*/ */
@ -58,6 +66,8 @@ public class AnswerCheck<M extends Message> extends MainUnit<M> {
unitTrue = builder.unitTrue; unitTrue = builder.unitTrue;
unitFalse = builder.unitFalse; unitFalse = builder.unitFalse;
check = builder.check; check = builder.check;
intermediateAnswerIfTrue = builder.intermediateAnswerIfTrue;
intermediateAnswerIfFalse = builder.intermediateAnswerIfFalse;
} }
public static <M extends Message> Builder<M> builder() { public static <M extends Message> Builder<M> builder() {
@ -76,6 +86,14 @@ public class AnswerCheck<M extends Message> extends MainUnit<M> {
return check; return check;
} }
public BoxAnswer getIntermediateAnswerIfTrue() {
return intermediateAnswerIfTrue;
}
public BoxAnswer getIntermediateAnswerIfFalse() {
return intermediateAnswerIfFalse;
}
public static final class Builder<M extends Message> { public static final class Builder<M extends Message> {
private String name = UUID.randomUUID().toString(); private String name = UUID.randomUUID().toString();
private String description; private String description;
@ -95,6 +113,8 @@ public class AnswerCheck<M extends Message> extends MainUnit<M> {
private MainUnit unitTrue; private MainUnit unitTrue;
private MainUnit unitFalse; private MainUnit unitFalse;
private CheckData<M> check; private CheckData<M> check;
private BoxAnswer intermediateAnswerIfFalse;
private BoxAnswer intermediateAnswerIfTrue;
private Builder() { private Builder() {
} }
@ -212,9 +232,25 @@ public class AnswerCheck<M extends Message> extends MainUnit<M> {
return this; return this;
} }
public Builder<M> intermediateAnswer(BoxAnswer val) {
intermediateAnswerIfTrue = val;
intermediateAnswerIfFalse = val;
return this;
}
public Builder<M> intermediateAnswerIfTrue(BoxAnswer val) {
intermediateAnswerIfTrue = val;
return this;
}
public Builder<M> intermediateAnswerIfFalse(BoxAnswer val) {
intermediateAnswerIfFalse = val;
return this;
}
public AnswerCheck<M> build() { public AnswerCheck<M> build() {
// isNotNull(check, unitConfigException("Необходимо установить параметр проверки.")); // isNotNull(check, unitConfigException("Необходимо установить параметр проверки."));
isAnyNotNull(unitConfigException("Необходимо задать хотя бы один unit результата проверки.")); // isAnyNotNull(unitConfigException("Необходимо задать хотя бы один unit результата проверки."));
return new AnswerCheck<>(this); return new AnswerCheck<>(this);
} }

View File

@ -46,7 +46,7 @@ public class GeneralAutoResponder<M extends Message> {
} }
private void init(Sending sending) { private void init(Sending sending) {
actionUnitMap.put(TypeUnit.CHECK, new AnswerCheckAction<>()); actionUnitMap.put(TypeUnit.CHECK, new AnswerCheckAction<>(sending));
actionUnitMap.put(TypeUnit.TEXT, new AnswerTextAction(sending)); actionUnitMap.put(TypeUnit.TEXT, new AnswerTextAction(sending));
actionUnitMap.put(TypeUnit.REPLACE_CMD, new ReplaceCmdAction()); actionUnitMap.put(TypeUnit.REPLACE_CMD, new ReplaceCmdAction());
} }

View File

@ -1,6 +1,8 @@
package dev.struchkov.godfather.simple.core.action; package dev.struchkov.godfather.simple.core.action;
import dev.struchkov.godfather.main.domain.BoxAnswer;
import dev.struchkov.godfather.main.domain.content.Message; import dev.struchkov.godfather.main.domain.content.Message;
import dev.struchkov.godfather.simple.context.service.Sending;
import dev.struchkov.godfather.simple.core.unit.AnswerCheck; import dev.struchkov.godfather.simple.core.unit.AnswerCheck;
import dev.struchkov.godfather.simple.core.unit.MainUnit; import dev.struchkov.godfather.simple.core.unit.MainUnit;
import dev.struchkov.godfather.simple.core.unit.UnitRequest; import dev.struchkov.godfather.simple.core.unit.UnitRequest;
@ -9,6 +11,8 @@ import org.slf4j.LoggerFactory;
import java.util.Objects; import java.util.Objects;
import static dev.struchkov.haiti.utils.Checker.checkNull;
/** /**
* Обработчик Unit-а {@link AnswerCheck}. * Обработчик Unit-а {@link AnswerCheck}.
* *
@ -18,19 +22,32 @@ public class AnswerCheckAction<M extends Message> implements ActionUnit<AnswerCh
private static final Logger log = LoggerFactory.getLogger(AnswerCheckAction.class); private static final Logger log = LoggerFactory.getLogger(AnswerCheckAction.class);
private final Sending sending;
public AnswerCheckAction(Sending sending) {
this.sending = sending;
}
@Override @Override
public UnitRequest<MainUnit, M> action(UnitRequest<AnswerCheck<M>, M> unitRequest) { public UnitRequest<MainUnit, M> action(UnitRequest<AnswerCheck<M>, M> unitRequest) {
final AnswerCheck<M> unit = unitRequest.getUnit(); final AnswerCheck<M> unit = unitRequest.getUnit();
log.debug("Началась обработка unit: {}.", unit.getName());
final M message = unitRequest.getMessage(); final M message = unitRequest.getMessage();
MainUnit<M> unitAnswer; MainUnit<M> unitAnswer;
if (unit.getCheck().checked(message)) { if (unit.getCheck().checked(message)) {
log.info("Проверка пройдена"); log.debug("Unit: {}. Проверка пройдена", unit.getName());
final BoxAnswer answerIfTrue = unit.getIntermediateAnswerIfTrue();
if (checkNull(answerIfTrue)) sending.send(message.getPersonId(), answerIfTrue);
unitAnswer = unit.getUnitTrue(); unitAnswer = unit.getUnitTrue();
} else { } else {
log.info("Проверка не пройдена"); log.debug("Unit: {}. Проверка НЕ пройдена", unit.getName());
final BoxAnswer answerIfFalse = unit.getIntermediateAnswerIfFalse();
if (checkNull(answerIfFalse)) sending.send(message.getPersonId(), answerIfFalse);
unitAnswer = unit.getUnitFalse(); unitAnswer = unit.getUnitFalse();
} }
log.debug("Завершилась обработка unit: {}.", unit.getName());
return UnitRequest.of(Objects.requireNonNullElse(unitAnswer, unit), message); return UnitRequest.of(Objects.requireNonNullElse(unitAnswer, unit), message);
} }
} }

View File

@ -3,6 +3,7 @@ package dev.struchkov.godfather.simple.core.unit;
import dev.struchkov.autoresponder.entity.KeyWord; import dev.struchkov.autoresponder.entity.KeyWord;
import dev.struchkov.godfather.main.core.unit.TypeUnit; import dev.struchkov.godfather.main.core.unit.TypeUnit;
import dev.struchkov.godfather.main.core.unit.UnitActiveType; import dev.struchkov.godfather.main.core.unit.UnitActiveType;
import dev.struchkov.godfather.main.domain.BoxAnswer;
import dev.struchkov.godfather.main.domain.content.Message; import dev.struchkov.godfather.main.domain.content.Message;
import dev.struchkov.godfather.simple.context.service.Accessibility; import dev.struchkov.godfather.simple.context.service.Accessibility;
import dev.struchkov.godfather.simple.core.unit.func.CheckData; import dev.struchkov.godfather.simple.core.unit.func.CheckData;
@ -36,6 +37,16 @@ public class AnswerCheck<M extends Message> extends MainUnit<M> {
*/ */
private final CheckData<M> check; private final CheckData<M> check;
/**
* Временный ответ. Отправляется сразу после проверки условия, если оно true. Предполагается, что после условия следующий Unit может долго обрабатывать какой-то результат. Поэтому можно передать пользователю какое-то сообщение, наподобие: "Подождите идет обработка".
*/
private final BoxAnswer intermediateAnswerIfTrue;
/**
* Промежуточный ответ. Отправляется сразу после проверки условия, если оно false. Предполагается, что после условия следующий Unit может долго обрабатывать какой-то результат. Поэтому можно передать пользователю какое-то сообщение, наподобие: "Подождите идет обработка".
*/
private final BoxAnswer intermediateAnswerIfFalse;
private AnswerCheck(Builder<M> builder) { private AnswerCheck(Builder<M> builder) {
super( super(
builder.name, builder.name,
@ -55,6 +66,8 @@ public class AnswerCheck<M extends Message> extends MainUnit<M> {
unitTrue = builder.unitTrue; unitTrue = builder.unitTrue;
unitFalse = builder.unitFalse; unitFalse = builder.unitFalse;
check = builder.check; check = builder.check;
intermediateAnswerIfTrue = builder.intermediateAnswerIfTrue;
intermediateAnswerIfFalse = builder.intermediateAnswerIfFalse;
} }
public static <M extends Message> Builder<M> builder() { public static <M extends Message> Builder<M> builder() {
@ -73,6 +86,14 @@ public class AnswerCheck<M extends Message> extends MainUnit<M> {
return check; return check;
} }
public BoxAnswer getIntermediateAnswerIfTrue() {
return intermediateAnswerIfTrue;
}
public BoxAnswer getIntermediateAnswerIfFalse() {
return intermediateAnswerIfFalse;
}
public static final class Builder<M extends Message> { public static final class Builder<M extends Message> {
private String name = UUID.randomUUID().toString(); private String name = UUID.randomUUID().toString();
private String description; private String description;
@ -92,6 +113,8 @@ public class AnswerCheck<M extends Message> extends MainUnit<M> {
private MainUnit unitTrue; private MainUnit unitTrue;
private MainUnit unitFalse; private MainUnit unitFalse;
private CheckData<M> check; private CheckData<M> check;
private BoxAnswer intermediateAnswerIfFalse;
private BoxAnswer intermediateAnswerIfTrue;
private Builder() { private Builder() {
} }
@ -209,6 +232,22 @@ public class AnswerCheck<M extends Message> extends MainUnit<M> {
return this; return this;
} }
public Builder<M> intermediateAnswer(BoxAnswer val) {
intermediateAnswerIfTrue = val;
intermediateAnswerIfFalse = val;
return this;
}
public Builder<M> intermediateAnswerIfTrue(BoxAnswer val) {
intermediateAnswerIfTrue = val;
return this;
}
public Builder<M> intermediateAnswerIfFalse(BoxAnswer val) {
intermediateAnswerIfFalse = val;
return this;
}
public AnswerCheck<M> build() { public AnswerCheck<M> build() {
// isNotNull(check, unitConfigException("Необходимо установить параметр проверки.")); // isNotNull(check, unitConfigException("Необходимо установить параметр проверки."));
// Inspector.isAnyNotNull(unitConfigException("Необходимо задать хотя бы один unit результата проверки.")); // Inspector.isAnyNotNull(unitConfigException("Необходимо задать хотя бы один unit результата проверки."));

View File

@ -39,7 +39,7 @@
<godfather.core.ver>${project.version}</godfather.core.ver> <godfather.core.ver>${project.version}</godfather.core.ver>
<autoresponder.ver>3.5.0</autoresponder.ver> <autoresponder.ver>3.5.0</autoresponder.ver>
<haiti.utils>1.4.0</haiti.utils> <haiti.utils>2.2.0</haiti.utils>
<javax.persistence.api.ver>2.2</javax.persistence.api.ver> <javax.persistence.api.ver>2.2</javax.persistence.api.ver>
<validation.api.ver>2.0.1.Final</validation.api.ver> <validation.api.ver>2.0.1.Final</validation.api.ver>