Добавил возможность отправки промежуточного сообщения в 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) {
actionUnitMap.put(TypeUnit.CHECK, new AnswerCheckAction<>());
actionUnitMap.put(TypeUnit.CHECK, new AnswerCheckAction<>(sending));
actionUnitMap.put(TypeUnit.TEXT, new AnswerTextAction(sending));
actionUnitMap.put(TypeUnit.REPLACE_CMD, new ReplaceCmdAction());
}

View File

@ -1,6 +1,7 @@
package dev.struchkov.godfather.quarkus.core.action;
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.MainUnit;
import dev.struchkov.godfather.quarkus.core.unit.UnitRequest;
@ -8,7 +9,7 @@ import io.smallrye.mutiny.Uni;
import java.util.Objects;
import static dev.struchkov.haiti.utils.Checker.checkNotNull;
import static dev.struchkov.haiti.utils.Checker.checkTrue;
/**
* Обработчик 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> {
private final Sending sending;
public AnswerCheckAction(Sending sending) {
this.sending = sending;
}
@Override
public Uni<UnitRequest<MainUnit, M>> action(UnitRequest<AnswerCheck<M>, M> unitRequest) {
final AnswerCheck<M> unit = unitRequest.getUnit();
final M message = unitRequest.getMessage();
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(
checkValue -> {
if (checkNotNull(checkValue) && checkValue) {
if (checkTrue(checkValue)) {
return UnitRequest.of(Objects.requireNonNullElse(unit.getUnitTrue(), unit), message);
} else {
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.godfather.main.core.unit.TypeUnit;
import dev.struchkov.godfather.main.core.unit.UnitActiveType;
import dev.struchkov.godfather.main.domain.BoxAnswer;
import dev.struchkov.godfather.main.domain.content.Message;
import dev.struchkov.godfather.quarkus.context.service.Accessibility;
import dev.struchkov.godfather.quarkus.core.unit.func.CheckData;
@ -14,9 +15,6 @@ import java.util.function.Predicate;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import static dev.struchkov.godfather.exception.UnitConfigException.unitConfigException;
import static dev.struchkov.haiti.utils.Inspector.isAnyNotNull;
/**
* Обработчик запроса, который реализует конструкцию IF в сценарии.
*
@ -34,6 +32,16 @@ public class AnswerCheck<M extends Message> extends MainUnit<M> {
*/
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;
unitFalse = builder.unitFalse;
check = builder.check;
intermediateAnswerIfTrue = builder.intermediateAnswerIfTrue;
intermediateAnswerIfFalse = builder.intermediateAnswerIfFalse;
}
public static <M extends Message> Builder<M> builder() {
@ -76,6 +86,14 @@ public class AnswerCheck<M extends Message> extends MainUnit<M> {
return check;
}
public BoxAnswer getIntermediateAnswerIfTrue() {
return intermediateAnswerIfTrue;
}
public BoxAnswer getIntermediateAnswerIfFalse() {
return intermediateAnswerIfFalse;
}
public static final class Builder<M extends Message> {
private String name = UUID.randomUUID().toString();
private String description;
@ -95,6 +113,8 @@ public class AnswerCheck<M extends Message> extends MainUnit<M> {
private MainUnit unitTrue;
private MainUnit unitFalse;
private CheckData<M> check;
private BoxAnswer intermediateAnswerIfFalse;
private BoxAnswer intermediateAnswerIfTrue;
private Builder() {
}
@ -212,9 +232,25 @@ public class AnswerCheck<M extends Message> extends MainUnit<M> {
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() {
// isNotNull(check, unitConfigException("Необходимо установить параметр проверки."));
isAnyNotNull(unitConfigException("Необходимо задать хотя бы один unit результата проверки."));
// isAnyNotNull(unitConfigException("Необходимо задать хотя бы один unit результата проверки."));
return new AnswerCheck<>(this);
}

View File

@ -46,7 +46,7 @@ public class GeneralAutoResponder<M extends Message> {
}
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.REPLACE_CMD, new ReplaceCmdAction());
}

View File

@ -1,6 +1,8 @@
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.simple.context.service.Sending;
import dev.struchkov.godfather.simple.core.unit.AnswerCheck;
import dev.struchkov.godfather.simple.core.unit.MainUnit;
import dev.struchkov.godfather.simple.core.unit.UnitRequest;
@ -9,6 +11,8 @@ import org.slf4j.LoggerFactory;
import java.util.Objects;
import static dev.struchkov.haiti.utils.Checker.checkNull;
/**
* Обработчик 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 final Sending sending;
public AnswerCheckAction(Sending sending) {
this.sending = sending;
}
@Override
public UnitRequest<MainUnit, M> action(UnitRequest<AnswerCheck<M>, M> unitRequest) {
final AnswerCheck<M> unit = unitRequest.getUnit();
log.debug("Началась обработка unit: {}.", unit.getName());
final M message = unitRequest.getMessage();
MainUnit<M> unitAnswer;
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();
} else {
log.info("Проверка не пройдена");
log.debug("Unit: {}. Проверка НЕ пройдена", unit.getName());
final BoxAnswer answerIfFalse = unit.getIntermediateAnswerIfFalse();
if (checkNull(answerIfFalse)) sending.send(message.getPersonId(), answerIfFalse);
unitAnswer = unit.getUnitFalse();
}
log.debug("Завершилась обработка unit: {}.", unit.getName());
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.godfather.main.core.unit.TypeUnit;
import dev.struchkov.godfather.main.core.unit.UnitActiveType;
import dev.struchkov.godfather.main.domain.BoxAnswer;
import dev.struchkov.godfather.main.domain.content.Message;
import dev.struchkov.godfather.simple.context.service.Accessibility;
import dev.struchkov.godfather.simple.core.unit.func.CheckData;
@ -36,6 +37,16 @@ public class AnswerCheck<M extends Message> extends MainUnit<M> {
*/
private final CheckData<M> check;
/**
* Временный ответ. Отправляется сразу после проверки условия, если оно true. Предполагается, что после условия следующий Unit может долго обрабатывать какой-то результат. Поэтому можно передать пользователю какое-то сообщение, наподобие: "Подождите идет обработка".
*/
private final BoxAnswer intermediateAnswerIfTrue;
/**
* Промежуточный ответ. Отправляется сразу после проверки условия, если оно false. Предполагается, что после условия следующий Unit может долго обрабатывать какой-то результат. Поэтому можно передать пользователю какое-то сообщение, наподобие: "Подождите идет обработка".
*/
private final BoxAnswer intermediateAnswerIfFalse;
private AnswerCheck(Builder<M> builder) {
super(
builder.name,
@ -55,6 +66,8 @@ public class AnswerCheck<M extends Message> extends MainUnit<M> {
unitTrue = builder.unitTrue;
unitFalse = builder.unitFalse;
check = builder.check;
intermediateAnswerIfTrue = builder.intermediateAnswerIfTrue;
intermediateAnswerIfFalse = builder.intermediateAnswerIfFalse;
}
public static <M extends Message> Builder<M> builder() {
@ -73,6 +86,14 @@ public class AnswerCheck<M extends Message> extends MainUnit<M> {
return check;
}
public BoxAnswer getIntermediateAnswerIfTrue() {
return intermediateAnswerIfTrue;
}
public BoxAnswer getIntermediateAnswerIfFalse() {
return intermediateAnswerIfFalse;
}
public static final class Builder<M extends Message> {
private String name = UUID.randomUUID().toString();
private String description;
@ -92,6 +113,8 @@ public class AnswerCheck<M extends Message> extends MainUnit<M> {
private MainUnit unitTrue;
private MainUnit unitFalse;
private CheckData<M> check;
private BoxAnswer intermediateAnswerIfFalse;
private BoxAnswer intermediateAnswerIfTrue;
private Builder() {
}
@ -209,6 +232,22 @@ public class AnswerCheck<M extends Message> extends MainUnit<M> {
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() {
// isNotNull(check, unitConfigException("Необходимо установить параметр проверки."));
// Inspector.isAnyNotNull(unitConfigException("Необходимо задать хотя бы один unit результата проверки."));

View File

@ -39,7 +39,7 @@
<godfather.core.ver>${project.version}</godfather.core.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>
<validation.api.ver>2.0.1.Final</validation.api.ver>