Добавил версию для реактивного Quarkus
This commit is contained in:
parent
d2cf3ed645
commit
dd6b166506
38
bot-context/bot-context-main/pom.xml
Normal file
38
bot-context/bot-context-main/pom.xml
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<parent>
|
||||||
|
<artifactId>godfather-bot</artifactId>
|
||||||
|
<groupId>dev.struchkov.godfather</groupId>
|
||||||
|
<version>0.0.25</version>
|
||||||
|
<relativePath>../../pom.xml</relativePath>
|
||||||
|
</parent>
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<artifactId>bot-context-main</artifactId>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<maven.compiler.source>17</maven.compiler.source>
|
||||||
|
<maven.compiler.target>17</maven.compiler.target>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>dev.struchkov.godfather</groupId>
|
||||||
|
<artifactId>bot-domain-main</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>dev.struchkov.haiti</groupId>
|
||||||
|
<artifactId>haiti-utils</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.jetbrains</groupId>
|
||||||
|
<artifactId>annotations</artifactId>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
</project>
|
@ -1,8 +1,8 @@
|
|||||||
package dev.struchkov.godfather.context.utils;
|
package dev.struchkov.godfather.main.context.utils;
|
||||||
|
|
||||||
import dev.struchkov.godfather.context.domain.keyboard.button.SimpleButton;
|
import dev.struchkov.godfather.main.domain.keyboard.button.SimpleButton;
|
||||||
import dev.struchkov.godfather.context.domain.keyboard.simple.SimpleKeyBoard;
|
import dev.struchkov.godfather.main.domain.keyboard.simple.SimpleKeyBoard;
|
||||||
import dev.struchkov.godfather.context.domain.keyboard.simple.SimpleKeyBoardLine;
|
import dev.struchkov.godfather.main.domain.keyboard.simple.SimpleKeyBoardLine;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
32
bot-context/bot-context-quarkus/pom.xml
Normal file
32
bot-context/bot-context-quarkus/pom.xml
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<parent>
|
||||||
|
<groupId>dev.struchkov.godfather</groupId>
|
||||||
|
<artifactId>bot-context</artifactId>
|
||||||
|
<version>0.0.25</version>
|
||||||
|
</parent>
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<artifactId>bot-context-quarkus</artifactId>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<maven.compiler.source>17</maven.compiler.source>
|
||||||
|
<maven.compiler.target>17</maven.compiler.target>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>dev.struchkov.godfather</groupId>
|
||||||
|
<artifactId>bot-domain-main</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.smallrye.reactive</groupId>
|
||||||
|
<artifactId>smallrye-mutiny-vertx-core</artifactId>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
</project>
|
@ -0,0 +1,10 @@
|
|||||||
|
package dev.struchkov.godfather.quarkus.context.service;
|
||||||
|
|
||||||
|
import dev.struchkov.godfather.main.domain.content.Message;
|
||||||
|
import io.smallrye.mutiny.Uni;
|
||||||
|
|
||||||
|
public interface Accessibility {
|
||||||
|
|
||||||
|
Uni<Void> check(Message message);
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,18 @@
|
|||||||
|
package dev.struchkov.godfather.quarkus.context.service;
|
||||||
|
|
||||||
|
import dev.struchkov.godfather.main.domain.content.Message;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Используется для перехвата исключений, которые возникают при обработке юнитов.
|
||||||
|
*/
|
||||||
|
public interface ErrorHandler {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Метод, который должен как-то обработать исключение.
|
||||||
|
*
|
||||||
|
* @param message Сообщение, после которого возникло исключение.
|
||||||
|
* @param e Объект исключения.
|
||||||
|
*/
|
||||||
|
void handle(Message message, Throwable e);
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,12 @@
|
|||||||
|
package dev.struchkov.godfather.quarkus.context.service;
|
||||||
|
|
||||||
|
import dev.struchkov.godfather.main.domain.event.Event;
|
||||||
|
import io.smallrye.mutiny.Uni;
|
||||||
|
|
||||||
|
public interface EventHandler<T extends Event> {
|
||||||
|
|
||||||
|
Uni<Void> handle(T event);
|
||||||
|
|
||||||
|
String getEventType();
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,18 @@
|
|||||||
|
package dev.struchkov.godfather.quarkus.context.service;
|
||||||
|
|
||||||
|
import dev.struchkov.godfather.main.domain.content.Message;
|
||||||
|
import io.smallrye.mutiny.Uni;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Интерфес для изменения запроса пользователя перед тем, как он попадет в подсистему обработки.
|
||||||
|
* Например можно исправить опечатки, перевести сообщение на другой язык и так далее.
|
||||||
|
*
|
||||||
|
* @author upagge [08/07/2019]
|
||||||
|
*/
|
||||||
|
@FunctionalInterface
|
||||||
|
public interface Modifiable<T extends Message> {
|
||||||
|
|
||||||
|
Uni<Void> change(@NotNull T content);
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,18 @@
|
|||||||
|
package dev.struchkov.godfather.quarkus.context.service;
|
||||||
|
|
||||||
|
import io.smallrye.mutiny.Uni;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
public interface PersonSettingService {
|
||||||
|
|
||||||
|
Uni<Set<Long>> getAllPersonIdDisableMessages(@NotNull Set<Long> personIds);
|
||||||
|
|
||||||
|
Uni<Boolean> getStateProcessingByPersonId(@NotNull Long personId);
|
||||||
|
|
||||||
|
Uni<Void> disableMessageProcessing(@NotNull Long personId);
|
||||||
|
|
||||||
|
Uni<Void> enableMessageProcessing(@NotNull Long personId);
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,17 @@
|
|||||||
|
package dev.struchkov.godfather.quarkus.context.service;
|
||||||
|
|
||||||
|
import io.smallrye.mutiny.Uni;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO: Добавить описание класса.
|
||||||
|
*
|
||||||
|
* @author upagge [13/07/2019]
|
||||||
|
*/
|
||||||
|
@FunctionalInterface
|
||||||
|
public interface Pusher<D> {
|
||||||
|
|
||||||
|
Uni<Void> push(Long personId, Map<String, D> saveElement);
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,29 @@
|
|||||||
|
package dev.struchkov.godfather.quarkus.context.service;
|
||||||
|
|
||||||
|
import dev.struchkov.godfather.main.domain.BoxAnswer;
|
||||||
|
import dev.struchkov.godfather.main.domain.SendType;
|
||||||
|
import io.smallrye.mutiny.Uni;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Интерфейс для отправки ответов пользователю.
|
||||||
|
*
|
||||||
|
* @author upagge [08/07/2019]
|
||||||
|
*/
|
||||||
|
public interface Sending {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Отрпавляет ответ пользователю
|
||||||
|
*
|
||||||
|
* @param personId Идентификатор пользователя
|
||||||
|
* @param boxAnswer Объект с данными, которые необходимо отправить
|
||||||
|
*/
|
||||||
|
Uni<Void> send(@NotNull Long personId, @NotNull BoxAnswer boxAnswer);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Возвращает тип объекта отправляющего ответ пользователя. В зависимости от типа ответ будет отправлен с помощью
|
||||||
|
* разных методов.
|
||||||
|
*/
|
||||||
|
SendType getType();
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,20 @@
|
|||||||
|
package dev.struchkov.godfather.quarkus.context.service;
|
||||||
|
|
||||||
|
import dev.struchkov.godfather.main.domain.UnitPointer;
|
||||||
|
import io.smallrye.mutiny.Uni;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Сервис для взаимодействия с сущностью {@link UnitPointer}.
|
||||||
|
*
|
||||||
|
* @author upagge [07/07/2019]
|
||||||
|
*/
|
||||||
|
public interface UnitPointerService {
|
||||||
|
|
||||||
|
Uni<UnitPointer> save(@NotNull UnitPointer unitPointer);
|
||||||
|
|
||||||
|
Uni<String> getUnitNameByPersonId(@NotNull Long personId);
|
||||||
|
|
||||||
|
Uni<Void> removeByPersonId(@NotNull Long personId);
|
||||||
|
|
||||||
|
}
|
27
bot-context/bot-context-simple/pom.xml
Normal file
27
bot-context/bot-context-simple/pom.xml
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<parent>
|
||||||
|
<groupId>dev.struchkov.godfather</groupId>
|
||||||
|
<artifactId>bot-context</artifactId>
|
||||||
|
<version>0.0.25</version>
|
||||||
|
</parent>
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<artifactId>bot-context-simple</artifactId>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<maven.compiler.source>17</maven.compiler.source>
|
||||||
|
<maven.compiler.target>17</maven.compiler.target>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>dev.struchkov.godfather</groupId>
|
||||||
|
<artifactId>bot-domain-main</artifactId>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
</project>
|
@ -0,0 +1,9 @@
|
|||||||
|
package dev.struchkov.godfather.simple.context.service;
|
||||||
|
|
||||||
|
import dev.struchkov.godfather.main.domain.content.Message;
|
||||||
|
|
||||||
|
public interface Accessibility {
|
||||||
|
|
||||||
|
boolean check(Message message);
|
||||||
|
|
||||||
|
}
|
@ -1,6 +1,6 @@
|
|||||||
package dev.struchkov.godfather.core.service;
|
package dev.struchkov.godfather.simple.context.service;
|
||||||
|
|
||||||
import dev.struchkov.godfather.context.domain.content.Message;
|
import dev.struchkov.godfather.main.domain.content.Message;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Используется для перехвата исключений, которые возникают при обработке юнитов.
|
* Используется для перехвата исключений, которые возникают при обработке юнитов.
|
@ -0,0 +1,11 @@
|
|||||||
|
package dev.struchkov.godfather.simple.context.service;
|
||||||
|
|
||||||
|
import dev.struchkov.godfather.main.domain.event.Event;
|
||||||
|
|
||||||
|
public interface EventHandler<T extends Event> {
|
||||||
|
|
||||||
|
void handle(T event);
|
||||||
|
|
||||||
|
String getEventType();
|
||||||
|
|
||||||
|
}
|
@ -1,6 +1,6 @@
|
|||||||
package dev.struchkov.godfather.context.service;
|
package dev.struchkov.godfather.simple.context.service;
|
||||||
|
|
||||||
import dev.struchkov.godfather.context.domain.content.Message;
|
import dev.struchkov.godfather.main.domain.content.Message;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
/**
|
/**
|
@ -1,4 +1,4 @@
|
|||||||
package dev.struchkov.godfather.context.service;
|
package dev.struchkov.godfather.simple.context.service;
|
||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
package dev.struchkov.godfather.context.service.save;
|
package dev.struchkov.godfather.simple.context.service;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
@ -1,6 +1,7 @@
|
|||||||
package dev.struchkov.godfather.context.service.sender;
|
package dev.struchkov.godfather.simple.context.service;
|
||||||
|
|
||||||
import dev.struchkov.godfather.context.domain.BoxAnswer;
|
import dev.struchkov.godfather.main.domain.BoxAnswer;
|
||||||
|
import dev.struchkov.godfather.main.domain.SendType;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
/**
|
/**
|
@ -1,6 +1,6 @@
|
|||||||
package dev.struchkov.godfather.context.service;
|
package dev.struchkov.godfather.simple.context.service;
|
||||||
|
|
||||||
import dev.struchkov.godfather.context.domain.UnitPointer;
|
import dev.struchkov.godfather.main.domain.UnitPointer;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
@ -10,6 +10,13 @@
|
|||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<artifactId>bot-context</artifactId>
|
<artifactId>bot-context</artifactId>
|
||||||
|
<packaging>pom</packaging>
|
||||||
|
<modules>
|
||||||
|
<module>bot-context-main</module>
|
||||||
|
<module>bot-context-simple</module>
|
||||||
|
<module>bot-context-quarkus</module>
|
||||||
|
</modules>
|
||||||
|
|
||||||
|
|
||||||
<name>Bot Context</name>
|
<name>Bot Context</name>
|
||||||
<description>Доменные сущности, интерфейсы, для библиотеки Godfather</description>
|
<description>Доменные сущности, интерфейсы, для библиотеки Godfather</description>
|
||||||
|
@ -1,27 +0,0 @@
|
|||||||
package dev.struchkov.godfather.context.domain;
|
|
||||||
|
|
||||||
import javax.persistence.GeneratedValue;
|
|
||||||
import javax.persistence.Id;
|
|
||||||
import javax.persistence.MappedSuperclass;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Основная сущность для сокрытия id у других сущностей.
|
|
||||||
*
|
|
||||||
* @author upagge [28/07/2019]
|
|
||||||
*/
|
|
||||||
@MappedSuperclass
|
|
||||||
public class BasicEntity {
|
|
||||||
|
|
||||||
@Id
|
|
||||||
@GeneratedValue
|
|
||||||
protected Long id;
|
|
||||||
|
|
||||||
public Long getId() {
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setId(Long id) {
|
|
||||||
this.id = id;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,21 +0,0 @@
|
|||||||
package dev.struchkov.godfather.context.domain;
|
|
||||||
|
|
||||||
public class Clarification {
|
|
||||||
|
|
||||||
private BoxAnswer question;
|
|
||||||
private String value;
|
|
||||||
|
|
||||||
public Clarification(BoxAnswer question, String value) {
|
|
||||||
this.question = question;
|
|
||||||
this.value = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public BoxAnswer getQuestion() {
|
|
||||||
return question;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getValue() {
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,17 +0,0 @@
|
|||||||
package dev.struchkov.godfather.context.domain.content.attachment;
|
|
||||||
|
|
||||||
import dev.struchkov.godfather.context.domain.BasicEntity;
|
|
||||||
|
|
||||||
import javax.persistence.Entity;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Абстрактная сущность, для всех вложений к сообщениям от пользователей.
|
|
||||||
*
|
|
||||||
* @author upagge [08/07/2019]
|
|
||||||
*/
|
|
||||||
@Entity
|
|
||||||
public abstract class Attachment extends BasicEntity {
|
|
||||||
|
|
||||||
public abstract String getType();
|
|
||||||
|
|
||||||
}
|
|
@ -1,14 +0,0 @@
|
|||||||
package dev.struchkov.godfather.context.exception;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Ошибка таймера.
|
|
||||||
*
|
|
||||||
* @author upagge [08/07/2019]
|
|
||||||
*/
|
|
||||||
public class TimerSettingException extends AppBotException {
|
|
||||||
|
|
||||||
public TimerSettingException(String message) {
|
|
||||||
super(message);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,9 +0,0 @@
|
|||||||
package dev.struchkov.godfather.context.service;
|
|
||||||
|
|
||||||
import dev.struchkov.godfather.context.domain.content.Message;
|
|
||||||
|
|
||||||
public interface Accessibility {
|
|
||||||
|
|
||||||
boolean check(Message message);
|
|
||||||
|
|
||||||
}
|
|
@ -1,11 +0,0 @@
|
|||||||
package dev.struchkov.godfather.context.service;
|
|
||||||
|
|
||||||
import dev.struchkov.godfather.context.domain.Clarification;
|
|
||||||
import dev.struchkov.godfather.context.domain.content.Message;
|
|
||||||
|
|
||||||
@FunctionalInterface
|
|
||||||
public interface ClarificationQuestion<C extends Message> {
|
|
||||||
|
|
||||||
Clarification getClarification(C message);
|
|
||||||
|
|
||||||
}
|
|
@ -1,11 +0,0 @@
|
|||||||
package dev.struchkov.godfather.context.service;
|
|
||||||
|
|
||||||
import dev.struchkov.godfather.context.domain.event.Event;
|
|
||||||
|
|
||||||
public interface EventHandler<T extends Event> {
|
|
||||||
|
|
||||||
void handle(T event);
|
|
||||||
|
|
||||||
String getEventType();
|
|
||||||
|
|
||||||
}
|
|
@ -1,12 +0,0 @@
|
|||||||
package dev.struchkov.godfather.context.service;
|
|
||||||
|
|
||||||
import dev.struchkov.godfather.context.domain.content.Mail;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Интерфейс для взаимодействия с личными сообщениями.
|
|
||||||
*
|
|
||||||
* @author upagge [08/07/2019]
|
|
||||||
*/
|
|
||||||
public interface MailService extends MessageService<Mail> {
|
|
||||||
|
|
||||||
}
|
|
@ -1,49 +0,0 @@
|
|||||||
package dev.struchkov.godfather.context.service;
|
|
||||||
|
|
||||||
import dev.struchkov.godfather.context.domain.content.Message;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Интерфейс взаимодйствия с наследниками текстовых сообщений пользователей.
|
|
||||||
*
|
|
||||||
* @author upagge [08/07/2019]
|
|
||||||
*/
|
|
||||||
public interface MessageService<T extends Message> {
|
|
||||||
|
|
||||||
void add(@NotNull T event);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Получить список сообщений за заданный временной интервал
|
|
||||||
*
|
|
||||||
* @param dateFrom Начало интервала
|
|
||||||
* @param dateTo Конец интервала
|
|
||||||
* @return Список сообщений
|
|
||||||
*/
|
|
||||||
List<T> getByAddDateTime(@NotNull LocalDateTime dateFrom, @NotNull LocalDateTime dateTo);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Получить список ПОСЛЕДНИХ сообщений для каждого пользователя за заданных временной интервал
|
|
||||||
*
|
|
||||||
* @param dateFrom Начало интервала
|
|
||||||
* @param dateTo Конец интервала
|
|
||||||
* @return Список сообщений
|
|
||||||
*/
|
|
||||||
List<T> getLastEventByCreateDateTime(@NotNull LocalDateTime dateFrom, @NotNull LocalDateTime dateTo);
|
|
||||||
|
|
||||||
List<T> getLastEventByAddDateTime(@NotNull LocalDateTime dateFrom, @NotNull LocalDateTime dateTo);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Возвращает новые сообщения от последнего запроса.
|
|
||||||
*/
|
|
||||||
List<T> getNewMessage();
|
|
||||||
|
|
||||||
void deleteAllByAddDateBetween(@NotNull LocalDateTime dateFrom, @NotNull LocalDateTime dateTo);
|
|
||||||
|
|
||||||
void deleteAllByAddDateBefore(@NotNull LocalDateTime date);
|
|
||||||
|
|
||||||
void deleteAllByAddDateAfter(@NotNull LocalDateTime date);
|
|
||||||
|
|
||||||
}
|
|
@ -1,10 +0,0 @@
|
|||||||
package dev.struchkov.godfather.context.service;
|
|
||||||
|
|
||||||
import dev.struchkov.godfather.context.domain.content.Message;
|
|
||||||
import dev.struchkov.godfather.context.domain.unit.AnswerText;
|
|
||||||
|
|
||||||
public interface UnitContextFactory<M extends Message> {
|
|
||||||
|
|
||||||
AnswerText.Builder<M> createAnswerText();
|
|
||||||
|
|
||||||
}
|
|
@ -1,10 +0,0 @@
|
|||||||
package dev.struchkov.godfather.context.service.save;
|
|
||||||
|
|
||||||
import dev.struchkov.godfather.context.domain.content.Message;
|
|
||||||
|
|
||||||
@FunctionalInterface
|
|
||||||
public interface PreservableData<D, M extends Message> {
|
|
||||||
|
|
||||||
D getData(M content);
|
|
||||||
|
|
||||||
}
|
|
@ -1,10 +0,0 @@
|
|||||||
package dev.struchkov.godfather.context.service.usercode;
|
|
||||||
|
|
||||||
import dev.struchkov.godfather.context.domain.content.Message;
|
|
||||||
|
|
||||||
@FunctionalInterface
|
|
||||||
public interface CheckData<C extends Message> {
|
|
||||||
|
|
||||||
boolean checked(C content);
|
|
||||||
|
|
||||||
}
|
|
@ -1,19 +0,0 @@
|
|||||||
package dev.struchkov.godfather.context.utils;
|
|
||||||
|
|
||||||
import dev.struchkov.godfather.context.domain.content.EmptyMessage;
|
|
||||||
import dev.struchkov.godfather.context.domain.content.Message;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Класс для хранения объекта заглушки для {@link Message}.
|
|
||||||
*
|
|
||||||
* @author upagge [08/07/2019]
|
|
||||||
*/
|
|
||||||
public class MessageUtils {
|
|
||||||
|
|
||||||
public static final EmptyMessage EMPTY_MESSAGE = new EmptyMessage();
|
|
||||||
|
|
||||||
private MessageUtils() {
|
|
||||||
throw new IllegalStateException(Messages.UTILITY_CLASS);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,16 +0,0 @@
|
|||||||
package dev.struchkov.godfather.context.utils;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Класс утилита, содержащий сообщения об ошибках, и сообщения логирования.
|
|
||||||
*
|
|
||||||
* @author upagge [15/08/2019]
|
|
||||||
*/
|
|
||||||
public class Messages {
|
|
||||||
|
|
||||||
public static final String UTILITY_CLASS = "Класс утилита";
|
|
||||||
|
|
||||||
private Messages() {
|
|
||||||
throw new IllegalStateException(UTILITY_CLASS);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
27
bot-core/bot-core-main/pom.xml
Normal file
27
bot-core/bot-core-main/pom.xml
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<parent>
|
||||||
|
<groupId>dev.struchkov.godfather</groupId>
|
||||||
|
<artifactId>bot-core</artifactId>
|
||||||
|
<version>0.0.25</version>
|
||||||
|
</parent>
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<artifactId>bot-core-main</artifactId>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<maven.compiler.source>17</maven.compiler.source>
|
||||||
|
<maven.compiler.target>17</maven.compiler.target>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>dev.struchkov.godfather</groupId>
|
||||||
|
<artifactId>bot-domain-main</artifactId>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
</project>
|
@ -1,4 +1,4 @@
|
|||||||
package dev.struchkov.godfather.context.domain;
|
package dev.struchkov.godfather.main.core.unit;
|
||||||
|
|
||||||
import static dev.struchkov.haiti.utils.Exceptions.utilityClass;
|
import static dev.struchkov.haiti.utils.Exceptions.utilityClass;
|
||||||
|
|
||||||
@ -13,10 +13,8 @@ public class TypeUnit {
|
|||||||
public static final String SAVE = "SAVE";
|
public static final String SAVE = "SAVE";
|
||||||
public static final String TIMER = "TIMER";
|
public static final String TIMER = "TIMER";
|
||||||
public static final String CHECK = "CHECK";
|
public static final String CHECK = "CHECK";
|
||||||
public static final String VALIDITY = "VALIDITY";
|
|
||||||
|
|
||||||
public static final String BACK_CMD = "BACK_CMD";
|
public static final String BACK_CMD = "BACK_CMD";
|
||||||
public static final String TELEPORT_CMD = "TELEPORT_CMD";
|
|
||||||
public static final String REPLACE_CMD = "REPLACE_CMD";
|
public static final String REPLACE_CMD = "REPLACE_CMD";
|
||||||
|
|
||||||
private TypeUnit() {
|
private TypeUnit() {
|
@ -1,4 +1,4 @@
|
|||||||
package dev.struchkov.godfather.context.domain.unit;
|
package dev.struchkov.godfather.main.core.unit;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Тип активации Unit-а. Определяет порядок обработки Unit.
|
* Тип активации Unit-а. Определяет порядок обработки Unit.
|
@ -1,4 +1,4 @@
|
|||||||
package dev.struchkov.godfather.context.utils;
|
package dev.struchkov.godfather.main.core.utils;
|
||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
@ -0,0 +1,21 @@
|
|||||||
|
package dev.struchkov.godfather.main.core.utils;
|
||||||
|
|
||||||
|
import dev.struchkov.godfather.main.domain.content.EmptyMessage;
|
||||||
|
import dev.struchkov.godfather.main.domain.content.Message;
|
||||||
|
|
||||||
|
import static dev.struchkov.haiti.utils.Exceptions.utilityClass;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Класс для хранения объекта заглушки для {@link Message}.
|
||||||
|
*
|
||||||
|
* @author upagge [08/07/2019]
|
||||||
|
*/
|
||||||
|
public final class MessageUtils {
|
||||||
|
|
||||||
|
public static final EmptyMessage EMPTY_MESSAGE = new EmptyMessage();
|
||||||
|
|
||||||
|
private MessageUtils() {
|
||||||
|
utilityClass();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
41
bot-core/bot-core-quarkus/pom.xml
Normal file
41
bot-core/bot-core-quarkus/pom.xml
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<parent>
|
||||||
|
<groupId>dev.struchkov.godfather</groupId>
|
||||||
|
<artifactId>bot-core</artifactId>
|
||||||
|
<version>0.0.25</version>
|
||||||
|
</parent>
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<artifactId>bot-core-quarkus</artifactId>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<maven.compiler.source>17</maven.compiler.source>
|
||||||
|
<maven.compiler.target>17</maven.compiler.target>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>dev.struchkov.godfather</groupId>
|
||||||
|
<artifactId>bot-core-main</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>dev.struchkov.godfather</groupId>
|
||||||
|
<artifactId>bot-context-quarkus</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>dev.struchkov.godfather</groupId>
|
||||||
|
<artifactId>bot-data-quarkus</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.smallrye.reactive</groupId>
|
||||||
|
<artifactId>smallrye-mutiny-vertx-core</artifactId>
|
||||||
|
<optional>true</optional>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
</project>
|
@ -0,0 +1,221 @@
|
|||||||
|
package dev.struchkov.godfather.quarkus.core;
|
||||||
|
|
||||||
|
import dev.struchkov.autoresponder.Responder;
|
||||||
|
import dev.struchkov.godfather.exception.ConfigAppException;
|
||||||
|
import dev.struchkov.godfather.main.core.unit.TypeUnit;
|
||||||
|
import dev.struchkov.godfather.main.core.unit.UnitActiveType;
|
||||||
|
import dev.struchkov.godfather.main.domain.content.Message;
|
||||||
|
import dev.struchkov.godfather.quarkus.context.service.ErrorHandler;
|
||||||
|
import dev.struchkov.godfather.quarkus.context.service.Modifiable;
|
||||||
|
import dev.struchkov.godfather.quarkus.context.service.PersonSettingService;
|
||||||
|
import dev.struchkov.godfather.quarkus.context.service.Sending;
|
||||||
|
import dev.struchkov.godfather.quarkus.core.action.ActionUnit;
|
||||||
|
import dev.struchkov.godfather.quarkus.core.action.AnswerCheckAction;
|
||||||
|
import dev.struchkov.godfather.quarkus.core.action.AnswerSaveAction;
|
||||||
|
import dev.struchkov.godfather.quarkus.core.action.AnswerTextAction;
|
||||||
|
import dev.struchkov.godfather.quarkus.core.action.cmd.ReplaceCmdAction;
|
||||||
|
import dev.struchkov.godfather.quarkus.core.service.StorylineService;
|
||||||
|
import dev.struchkov.godfather.quarkus.core.unit.MainUnit;
|
||||||
|
import dev.struchkov.godfather.quarkus.core.unit.UnitRequest;
|
||||||
|
import dev.struchkov.haiti.context.exception.NotFoundException;
|
||||||
|
import io.smallrye.mutiny.Multi;
|
||||||
|
import io.smallrye.mutiny.Uni;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import static dev.struchkov.haiti.utils.Checker.checkNotEmpty;
|
||||||
|
import static dev.struchkov.haiti.utils.Checker.checkNotNull;
|
||||||
|
import static dev.struchkov.haiti.utils.Checker.checkNull;
|
||||||
|
|
||||||
|
public class GeneralAutoResponder<M extends Message> {
|
||||||
|
|
||||||
|
private final PersonSettingService personSettingService;
|
||||||
|
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<M> storyLineService
|
||||||
|
) {
|
||||||
|
this.personSettingService = personSettingService;
|
||||||
|
this.storyLineService = storyLineService;
|
||||||
|
init(sending);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void init(Sending sending) {
|
||||||
|
actionUnitMap.put(TypeUnit.CHECK, new AnswerCheckAction<>());
|
||||||
|
actionUnitMap.put(TypeUnit.TEXT, new AnswerTextAction(sending));
|
||||||
|
actionUnitMap.put(TypeUnit.REPLACE_CMD, new ReplaceCmdAction());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void initModifiable(List<Modifiable<M>> modifiable) {
|
||||||
|
this.modifiable = modifiable;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void initActionUnit(String typeUnit, ActionUnit<? extends MainUnit<M>, M> actionUnit) {
|
||||||
|
if (!actionUnitMap.containsKey(typeUnit)) {
|
||||||
|
actionUnitMap.put(typeUnit, actionUnit);
|
||||||
|
} else {
|
||||||
|
throw new ConfigAppException("Обработка такого типа юнита уже зарегистрирована");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void initSaveAction(AnswerSaveAction<M, ?> answerSaveAction) {
|
||||||
|
actionUnitMap.put(TypeUnit.SAVE, answerSaveAction);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Позволяет установить перехватчик и обработчик исключений, возникающих при обработке юнитов.
|
||||||
|
*/
|
||||||
|
public void setErrorHandler(ErrorHandler errorHandler) {
|
||||||
|
this.errorHandler = errorHandler;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDefaultUnit(String unitName) {
|
||||||
|
storyLineService.setDefaultUnit(unitName);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Uni<Void> processingNewMessage(M newMessage) {
|
||||||
|
if (newMessage != null) {
|
||||||
|
return personSettingService.getStateProcessingByPersonId(newMessage.getPersonId())
|
||||||
|
.onItem().transformToUni(
|
||||||
|
state -> {
|
||||||
|
if (checkNull(state) || state) {
|
||||||
|
return processing(newMessage);
|
||||||
|
}
|
||||||
|
return Uni.createFrom().voidItem();
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return Uni.createFrom().voidItem();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Uni<Void> processingNewMessages(List<M> newMessages) {
|
||||||
|
if (newMessages != null && !newMessages.isEmpty()) {
|
||||||
|
final Set<Long> personIds = newMessages.stream()
|
||||||
|
.map(Message::getPersonId)
|
||||||
|
.collect(Collectors.toSet());
|
||||||
|
return personSettingService.getAllPersonIdDisableMessages(personIds)
|
||||||
|
.onItem().transformToMulti(
|
||||||
|
disableIds -> {
|
||||||
|
final List<M> allowedMessages = newMessages.stream()
|
||||||
|
.filter(message -> !disableIds.contains(message.getPersonId()))
|
||||||
|
.toList();
|
||||||
|
return Multi.createFrom().iterable(allowedMessages);
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.onItem().transform(this::processing)
|
||||||
|
.toUni().replaceWithVoid();
|
||||||
|
}
|
||||||
|
return Uni.createFrom().voidItem();
|
||||||
|
}
|
||||||
|
|
||||||
|
private Uni<Void> processing(M message) {
|
||||||
|
return Uni.createFrom().item(message)
|
||||||
|
.onItem().transformToUni(
|
||||||
|
mail -> {
|
||||||
|
if (checkNotEmpty(modifiable)) {
|
||||||
|
return Multi.createFrom().iterable(modifiable)
|
||||||
|
.onItem().transformToUni(m -> m.change(mail))
|
||||||
|
.concatenate().toUni().replaceWith(mail);
|
||||||
|
}
|
||||||
|
return Uni.createFrom().item(mail);
|
||||||
|
}
|
||||||
|
).onItem().transformToUni(
|
||||||
|
mail -> {
|
||||||
|
final Uni<Set<MainUnit<M>>> uniUnits = storyLineService.getNextUnitByPersonId(mail.getPersonId());
|
||||||
|
return Uni.combine().all().unis(uniUnits, Uni.createFrom().item(mail)).asTuple();
|
||||||
|
}
|
||||||
|
).onItem().transformToUni(
|
||||||
|
t -> {
|
||||||
|
final Set<MainUnit<M>> units = t.getItem1();
|
||||||
|
final M mail = t.getItem2();
|
||||||
|
final Optional<MainUnit<M>> optAnswer = Responder.nextUnit(mail, units).or(storyLineService::getDefaultUnit);
|
||||||
|
if (optAnswer.isPresent()) {
|
||||||
|
final MainUnit<M> answer = optAnswer.get();
|
||||||
|
//TODO [05.08.2022]: нужно ли проверку встраивать в поток?
|
||||||
|
// if (checkPermission(answer.getAccessibility(), message)) {
|
||||||
|
return answer(UnitRequest.of(answer, message));
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
return Uni.createFrom().voidItem();
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// private boolean checkPermission(Optional<Accessibility> accessibility, M message) {
|
||||||
|
// return accessibility.isEmpty() || accessibility.get().check(message);
|
||||||
|
// }
|
||||||
|
|
||||||
|
public Uni<Void> answer(UnitRequest<MainUnit, M> unitRequest) {
|
||||||
|
return getAction(unitRequest)
|
||||||
|
.onItem().transformToUni(
|
||||||
|
request -> activeUnitAfter(unitRequest)
|
||||||
|
)
|
||||||
|
.onFailure().invoke(
|
||||||
|
throwable -> {
|
||||||
|
if (errorHandler != null) {
|
||||||
|
errorHandler.handle(unitRequest.getMessage(), throwable);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.replaceWithVoid();
|
||||||
|
}
|
||||||
|
|
||||||
|
private Uni<UnitRequest<MainUnit, M>> activeUnitAfter(UnitRequest<MainUnit, M> unitRequest) {
|
||||||
|
final Set<MainUnit<M>> nextUnits = unitRequest.getUnit().getNextUnits();
|
||||||
|
if (checkNotNull(nextUnits)) {
|
||||||
|
Optional<MainUnit<M>> first = nextUnits.stream()
|
||||||
|
.filter(unit -> UnitActiveType.AFTER.equals(unit.getActiveType()))
|
||||||
|
.findFirst();
|
||||||
|
if (first.isPresent()) {
|
||||||
|
return Uni.createFrom().voidItem().onItem().transformToUni(
|
||||||
|
v-> getAction(UnitRequest.of(first.get(), unitRequest.getMessage()))
|
||||||
|
)
|
||||||
|
.onItem().transformToUni(
|
||||||
|
uR -> activeUnitAfter(UnitRequest.of(first.get(), unitRequest.getMessage()))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Uni.createFrom().item(unitRequest);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Uni<UnitRequest<MainUnit, M>> getAction(UnitRequest<MainUnit, M> unitRequest) {
|
||||||
|
final MainUnit<M> unit = unitRequest.getUnit();
|
||||||
|
final M message = unitRequest.getMessage();
|
||||||
|
final String typeUnit = unit.getType();
|
||||||
|
if (actionUnitMap.containsKey(typeUnit)) {
|
||||||
|
ActionUnit<MainUnit, M> actionUnit = actionUnitMap.get(typeUnit);
|
||||||
|
return actionUnit.action(unitRequest)
|
||||||
|
.onItem().transformToUni(
|
||||||
|
newUnitRequest -> {
|
||||||
|
final Optional<MainUnit<M>> optDefaultUnit = storyLineService.getDefaultUnit();
|
||||||
|
if (!unit.isNotSaveHistory() && (optDefaultUnit.isEmpty() || !optDefaultUnit.get().equals(unit))) {
|
||||||
|
return Uni.combine().all().unis(
|
||||||
|
Uni.createFrom().item(newUnitRequest),
|
||||||
|
storyLineService.save(message.getPersonId(), unit.getName(), message)
|
||||||
|
).asTuple();
|
||||||
|
}
|
||||||
|
return Uni.combine().all().unis(Uni.createFrom().item(newUnitRequest), Uni.createFrom().voidItem()).asTuple();
|
||||||
|
}
|
||||||
|
).onItem().transformToUni(
|
||||||
|
t -> {
|
||||||
|
final UnitRequest<MainUnit, M> newUnitRequest = t.getItem1();
|
||||||
|
final MainUnit<M> newUnit = newUnitRequest.getUnit();
|
||||||
|
return !unit.equals(newUnit) ? getAction(newUnitRequest) : Uni.createFrom().item(unitRequest);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
throw new NotFoundException("ActionUnit для типа {0} не зарегистрирован", unit.getType());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,61 @@
|
|||||||
|
package dev.struchkov.godfather.quarkus.core;
|
||||||
|
|
||||||
|
import dev.struchkov.godfather.main.domain.content.Message;
|
||||||
|
import dev.struchkov.godfather.quarkus.core.unit.MainUnit;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import static dev.struchkov.haiti.utils.Checker.checkNull;
|
||||||
|
import static dev.struchkov.haiti.utils.Inspector.isNotNull;
|
||||||
|
|
||||||
|
public class Storyline<M extends Message> {
|
||||||
|
|
||||||
|
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<M>> startingUnits, Map<String, MainUnit<M>> units) {
|
||||||
|
this.startingUnits.addAll(startingUnits);
|
||||||
|
this.units.putAll(units);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addGlobalUnits(Set<MainUnit<M>> globalUnits) {
|
||||||
|
this.globalUnits.addAll(globalUnits);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<MainUnit<M>> getGlobalUnits() {
|
||||||
|
return globalUnits;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Получить юнит по названию.
|
||||||
|
*
|
||||||
|
* @param unitName Название юнита.
|
||||||
|
*/
|
||||||
|
public Optional<MainUnit<M>> getUnit(String unitName) {
|
||||||
|
isNotNull(unitName);
|
||||||
|
return Optional.ofNullable(units.get(unitName));
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<MainUnit<M>> getStartingUnits() {
|
||||||
|
return startingUnits;
|
||||||
|
}
|
||||||
|
|
||||||
|
//TODO [22.06.2022]: Временное решение ленивой связки юнитов, пока не будет реализован нормальный механизм.
|
||||||
|
public void link(@NotNull String firstName, @NotNull String secondName) {
|
||||||
|
isNotNull(firstName, secondName);
|
||||||
|
final MainUnit<M> firstUnit = units.get(firstName);
|
||||||
|
final MainUnit<M> secondUnit = units.get(secondName);
|
||||||
|
isNotNull(firstUnit, secondUnit);
|
||||||
|
if (checkNull(firstUnit.getNextUnits())) {
|
||||||
|
firstUnit.setNextUnits(new HashSet<>());
|
||||||
|
}
|
||||||
|
firstUnit.getNextUnits().add(secondUnit);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,10 +1,10 @@
|
|||||||
package dev.struchkov.godfather.core;
|
package dev.struchkov.godfather.quarkus.core;
|
||||||
|
|
||||||
import dev.struchkov.godfather.context.domain.UnitDefinition;
|
import dev.struchkov.godfather.exception.UnitConfigException;
|
||||||
import dev.struchkov.godfather.context.domain.annotation.Unit;
|
import dev.struchkov.godfather.main.domain.UnitDefinition;
|
||||||
import dev.struchkov.godfather.context.domain.content.Message;
|
import dev.struchkov.godfather.main.domain.annotation.Unit;
|
||||||
import dev.struchkov.godfather.context.domain.unit.MainUnit;
|
import dev.struchkov.godfather.main.domain.content.Message;
|
||||||
import dev.struchkov.godfather.context.exception.UnitConfigException;
|
import dev.struchkov.godfather.quarkus.core.unit.MainUnit;
|
||||||
import dev.struchkov.haiti.utils.Inspector;
|
import dev.struchkov.haiti.utils.Inspector;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
@ -21,7 +21,7 @@ import java.util.Map;
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import static dev.struchkov.godfather.context.exception.UnitConfigException.unitConfigException;
|
import static dev.struchkov.godfather.exception.UnitConfigException.unitConfigException;
|
||||||
|
|
||||||
public class StorylineFactory<M extends Message> {
|
public class StorylineFactory<M extends Message> {
|
||||||
|
|
@ -0,0 +1,23 @@
|
|||||||
|
package dev.struchkov.godfather.quarkus.core.action;
|
||||||
|
|
||||||
|
import dev.struchkov.godfather.main.domain.content.Message;
|
||||||
|
import dev.struchkov.godfather.quarkus.core.unit.MainUnit;
|
||||||
|
import dev.struchkov.godfather.quarkus.core.unit.UnitRequest;
|
||||||
|
import io.smallrye.mutiny.Uni;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Интерфейс для обработки Unit-ов.
|
||||||
|
*
|
||||||
|
* @author upagge [11/07/2019]
|
||||||
|
*/
|
||||||
|
@FunctionalInterface
|
||||||
|
public interface ActionUnit<U extends MainUnit, M extends Message> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Метод обработки Unit-а.
|
||||||
|
*
|
||||||
|
* @return Новый Unit, который может нуждаться в обработке
|
||||||
|
*/
|
||||||
|
Uni<UnitRequest<MainUnit, M>> action(UnitRequest<U, M> unitRequest);
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,36 @@
|
|||||||
|
package dev.struchkov.godfather.quarkus.core.action;
|
||||||
|
|
||||||
|
import dev.struchkov.godfather.main.domain.content.Message;
|
||||||
|
import dev.struchkov.godfather.quarkus.core.unit.AnswerCheck;
|
||||||
|
import dev.struchkov.godfather.quarkus.core.unit.MainUnit;
|
||||||
|
import dev.struchkov.godfather.quarkus.core.unit.UnitRequest;
|
||||||
|
import io.smallrye.mutiny.Uni;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
import static dev.struchkov.haiti.utils.Checker.checkNotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Обработчик Unit-а {@link AnswerCheck}.
|
||||||
|
*
|
||||||
|
* @author upagge [11/07/2019]
|
||||||
|
*/
|
||||||
|
public class AnswerCheckAction<M extends Message> implements ActionUnit<AnswerCheck<M>, M> {
|
||||||
|
|
||||||
|
@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().transform(
|
||||||
|
checkValue -> {
|
||||||
|
if (checkNotNull(checkValue) && checkValue) {
|
||||||
|
return UnitRequest.of(Objects.requireNonNullElse(unit.getUnitTrue(), unit), message);
|
||||||
|
} else {
|
||||||
|
return UnitRequest.of(Objects.requireNonNullElse(unit.getUnitFalse(), unit), message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,75 @@
|
|||||||
|
package dev.struchkov.godfather.quarkus.core.action;
|
||||||
|
|
||||||
|
import dev.struchkov.godfather.main.domain.content.Message;
|
||||||
|
import dev.struchkov.godfather.quarkus.context.service.Pusher;
|
||||||
|
import dev.struchkov.godfather.quarkus.core.unit.AnswerSave;
|
||||||
|
import dev.struchkov.godfather.quarkus.core.unit.MainUnit;
|
||||||
|
import dev.struchkov.godfather.quarkus.core.unit.UnitRequest;
|
||||||
|
import dev.struchkov.godfather.quarkus.core.unit.func.CheckSave;
|
||||||
|
import dev.struchkov.godfather.quarkus.core.unit.func.PreservableData;
|
||||||
|
import dev.struchkov.godfather.quarkus.data.preser.AnswerSavePreservable;
|
||||||
|
import io.smallrye.mutiny.Uni;
|
||||||
|
|
||||||
|
import static dev.struchkov.haiti.utils.Checker.checkNotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Обработчик Unit-а {@link AnswerSave}.
|
||||||
|
*
|
||||||
|
* @author upagge [11/07/2019]
|
||||||
|
*/
|
||||||
|
public class AnswerSaveAction<M extends Message, D> implements ActionUnit<AnswerSave<M, D>, M> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Uni<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<M> checkSave = answerSave.getCheckSave();
|
||||||
|
if (checkNotNull(checkSave)) {
|
||||||
|
return Uni.createFrom().voidItem()
|
||||||
|
.onItem().transformToUni(
|
||||||
|
v -> checkSave.check(message)
|
||||||
|
.onItem().transform(
|
||||||
|
unit -> {
|
||||||
|
if (checkNotNull(unit)) {
|
||||||
|
return UnitRequest.of(unit, message);
|
||||||
|
}
|
||||||
|
return UnitRequest.of(answerSave, message);
|
||||||
|
}
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
final PreservableData<D, M> preservableData = answerSave.getPreservableData();
|
||||||
|
final Pusher<D> pusher = answerSave.getPusher();
|
||||||
|
|
||||||
|
return Uni.createFrom().voidItem()
|
||||||
|
.onItem().transformToUni(
|
||||||
|
v -> {
|
||||||
|
if (checkNotNull(preservableData)) {
|
||||||
|
return preservableData.getData(message);
|
||||||
|
}
|
||||||
|
return Uni.createFrom().nullItem();
|
||||||
|
}
|
||||||
|
).onItem().transformToUni(
|
||||||
|
dataFromSave -> {
|
||||||
|
if (checkNotNull(dataFromSave)) {
|
||||||
|
return preservable.save(personId, answerSave.getKey(), dataFromSave);
|
||||||
|
}
|
||||||
|
return Uni.createFrom().nullItem();
|
||||||
|
}
|
||||||
|
).onItem().transformToUni(
|
||||||
|
v -> {
|
||||||
|
if (checkNotNull(pusher)) {
|
||||||
|
return preservable.push(personId, pusher);
|
||||||
|
}
|
||||||
|
return Uni.createFrom().nullItem();
|
||||||
|
}
|
||||||
|
).onItem().transform(
|
||||||
|
v -> UnitRequest.of(answerSave, message)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,75 @@
|
|||||||
|
package dev.struchkov.godfather.quarkus.core.action;
|
||||||
|
|
||||||
|
import dev.struchkov.godfather.main.core.utils.InsertWords;
|
||||||
|
import dev.struchkov.godfather.main.domain.BoxAnswer;
|
||||||
|
import dev.struchkov.godfather.main.domain.content.Message;
|
||||||
|
import dev.struchkov.godfather.quarkus.context.service.Sending;
|
||||||
|
import dev.struchkov.godfather.quarkus.core.unit.AnswerText;
|
||||||
|
import dev.struchkov.godfather.quarkus.core.unit.MainUnit;
|
||||||
|
import dev.struchkov.godfather.quarkus.core.unit.UnitRequest;
|
||||||
|
import dev.struchkov.godfather.quarkus.core.utils.Sender;
|
||||||
|
import io.smallrye.mutiny.Uni;
|
||||||
|
|
||||||
|
import static dev.struchkov.haiti.utils.Checker.checkNotEmpty;
|
||||||
|
import static dev.struchkov.haiti.utils.Checker.checkNotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Обработчик Unit-а {@link AnswerText}.
|
||||||
|
*
|
||||||
|
* @author upagge [11/07/2019]
|
||||||
|
*/
|
||||||
|
public class AnswerTextAction implements ActionUnit<AnswerText<Message>, Message> {
|
||||||
|
|
||||||
|
private final Sending sending;
|
||||||
|
|
||||||
|
public AnswerTextAction(Sending sending) {
|
||||||
|
this.sending = sending;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Uni<UnitRequest<MainUnit, Message>> action(UnitRequest<AnswerText<Message>, Message> unitRequest) {
|
||||||
|
final AnswerText<Message> unit = unitRequest.getUnit();
|
||||||
|
final Message message = unitRequest.getMessage();
|
||||||
|
|
||||||
|
return unit.getAnswer().processing(message)
|
||||||
|
.onItem().transformToUni(
|
||||||
|
boxAnswer -> {
|
||||||
|
if (checkNotNull(boxAnswer)) {
|
||||||
|
return replaceMarkers(unit, message, boxAnswer);
|
||||||
|
}
|
||||||
|
return Uni.createFrom().nullItem();
|
||||||
|
}
|
||||||
|
).onItem().transformToUni(
|
||||||
|
boxAnswer -> {
|
||||||
|
if (checkNotNull(boxAnswer)) {
|
||||||
|
final Sending answerTextSending = unit.getSending();
|
||||||
|
if (answerTextSending != null) {
|
||||||
|
return Sender.sends(message, boxAnswer, answerTextSending);
|
||||||
|
} else {
|
||||||
|
return Sender.sends(message, boxAnswer, this.sending);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Uni.createFrom().nullItem();
|
||||||
|
}
|
||||||
|
).onItem().transform(
|
||||||
|
v -> UnitRequest.of(unit, message)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Uni<BoxAnswer> replaceMarkers(AnswerText<Message> answerText, Message message, BoxAnswer boxAnswer) {
|
||||||
|
if (answerText.getInsert() != null) {
|
||||||
|
return answerText.getInsert().insert(message.getPersonId())
|
||||||
|
.onItem().transformToUni(
|
||||||
|
words -> {
|
||||||
|
if (checkNotEmpty(words)) {
|
||||||
|
final String newMessage = InsertWords.insert(boxAnswer.getMessage(), words);
|
||||||
|
boxAnswer.setMessage(newMessage);
|
||||||
|
}
|
||||||
|
return Uni.createFrom().item(boxAnswer);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return Uni.createFrom().item(boxAnswer);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,19 @@
|
|||||||
|
package dev.struchkov.godfather.quarkus.core.action.cmd;
|
||||||
|
|
||||||
|
import dev.struchkov.godfather.main.domain.content.Message;
|
||||||
|
import dev.struchkov.godfather.quarkus.core.action.ActionUnit;
|
||||||
|
import dev.struchkov.godfather.quarkus.core.unit.MainUnit;
|
||||||
|
import dev.struchkov.godfather.quarkus.core.unit.UnitRequest;
|
||||||
|
import dev.struchkov.godfather.quarkus.core.unit.cmd.ReplaceCmd;
|
||||||
|
import io.smallrye.mutiny.Uni;
|
||||||
|
|
||||||
|
public class ReplaceCmdAction implements ActionUnit<ReplaceCmd<Message>, Message> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Uni<UnitRequest<MainUnit, Message>> action(UnitRequest<ReplaceCmd<Message>, Message> unitRequest) {
|
||||||
|
final ReplaceCmd<Message> unit = unitRequest.getUnit();
|
||||||
|
final Message message = unitRequest.getMessage();
|
||||||
|
return Uni.createFrom().item(UnitRequest.of(unit.getThisUnit(), message));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,45 @@
|
|||||||
|
package dev.struchkov.godfather.quarkus.core.action.cmd;
|
||||||
|
|
||||||
|
import dev.struchkov.godfather.main.domain.StorylineHistory;
|
||||||
|
import dev.struchkov.godfather.main.domain.content.Message;
|
||||||
|
import dev.struchkov.godfather.quarkus.core.action.ActionUnit;
|
||||||
|
import dev.struchkov.godfather.quarkus.core.service.StorylineService;
|
||||||
|
import dev.struchkov.godfather.quarkus.core.unit.MainUnit;
|
||||||
|
import dev.struchkov.godfather.quarkus.core.unit.UnitRequest;
|
||||||
|
import dev.struchkov.godfather.quarkus.core.unit.cmd.RollBackCmd;
|
||||||
|
import io.smallrye.mutiny.Uni;
|
||||||
|
|
||||||
|
import static dev.struchkov.godfather.exception.RollBackException.rollBackException;
|
||||||
|
|
||||||
|
public class RollBackCmdAction<M extends Message> implements ActionUnit<RollBackCmd<M>, M> {
|
||||||
|
|
||||||
|
private final StorylineService<M> storyLineService;
|
||||||
|
|
||||||
|
public RollBackCmdAction(StorylineService<M> storyLineService) {
|
||||||
|
this.storyLineService = storyLineService;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Uni<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();
|
||||||
|
|
||||||
|
final Uni<StorylineHistory> uniHistory = (rollbackUnitName != null)
|
||||||
|
? storyLineService.replaceUserToBack(message.getPersonId(), rollbackUnitName).onItem().ifNull().failWith(rollBackException("Юнит для возвращения не был найден"))
|
||||||
|
: storyLineService.replaceUserToBack(message.getPersonId(), countToBack).onItem().ifNull().failWith(rollBackException("Юнит для возвращения не был найден"));
|
||||||
|
|
||||||
|
return uniHistory
|
||||||
|
.onItem().transform(
|
||||||
|
history -> {
|
||||||
|
final String unitName = history.getUnitName();
|
||||||
|
final MainUnit<M> nextUnit = storyLineService.getUnitByName(unitName).orElse(unit);
|
||||||
|
final M oldMessage = (M) history.getMessage();
|
||||||
|
return UnitRequest.of(nextUnit, oldMessage);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,26 @@
|
|||||||
|
package dev.struchkov.godfather.quarkus.core.provider;
|
||||||
|
|
||||||
|
import dev.struchkov.godfather.main.domain.content.Mail;
|
||||||
|
import dev.struchkov.godfather.quarkus.context.service.EventHandler;
|
||||||
|
import dev.struchkov.godfather.quarkus.core.GeneralAutoResponder;
|
||||||
|
import io.smallrye.mutiny.Uni;
|
||||||
|
|
||||||
|
public class StoryLineHandler implements EventHandler<Mail> {
|
||||||
|
|
||||||
|
private final GeneralAutoResponder<Mail> generalAutoResponder;
|
||||||
|
|
||||||
|
public StoryLineHandler(GeneralAutoResponder<Mail> generalAutoResponder) {
|
||||||
|
this.generalAutoResponder = generalAutoResponder;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Uni<Void> handle(Mail message) {
|
||||||
|
return generalAutoResponder.processingNewMessage(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getEventType() {
|
||||||
|
return Mail.TYPE;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,42 @@
|
|||||||
|
package dev.struchkov.godfather.quarkus.core.service;
|
||||||
|
|
||||||
|
import dev.struchkov.godfather.quarkus.context.service.PersonSettingService;
|
||||||
|
import dev.struchkov.godfather.quarkus.data.repository.PersonSettingRepository;
|
||||||
|
import dev.struchkov.haiti.utils.Inspector;
|
||||||
|
import io.smallrye.mutiny.Uni;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
public class PersonSettingServiceImpl implements PersonSettingService {
|
||||||
|
|
||||||
|
private final PersonSettingRepository personSettingRepository;
|
||||||
|
|
||||||
|
public PersonSettingServiceImpl(PersonSettingRepository personSettingRepository) {
|
||||||
|
this.personSettingRepository = personSettingRepository;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Uni<Set<Long>> getAllPersonIdDisableMessages(@NotNull Set<Long> personIds) {
|
||||||
|
Inspector.isNotNull(personIds);
|
||||||
|
return personSettingRepository.findAllByAllowedProcessing(personIds);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Uni<Boolean> getStateProcessingByPersonId(@NotNull Long personId) {
|
||||||
|
return personSettingRepository.findStateByPersonId(personId);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Uni<Void> disableMessageProcessing(@NotNull Long personId) {
|
||||||
|
Inspector.isNotNull(personId);
|
||||||
|
return personSettingRepository.disableMessageProcessing(personId);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Uni<Void> enableMessageProcessing(@NotNull Long personId) {
|
||||||
|
Inspector.isNotNull(personId);
|
||||||
|
return personSettingRepository.enableMessageProcessing(personId);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,59 @@
|
|||||||
|
package dev.struchkov.godfather.quarkus.core.service;
|
||||||
|
|
||||||
|
import dev.struchkov.godfather.main.domain.ContextKey;
|
||||||
|
import dev.struchkov.godfather.quarkus.data.StorylineContext;
|
||||||
|
import io.smallrye.mutiny.Uni;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import static dev.struchkov.haiti.context.exception.NotFoundException.notFoundException;
|
||||||
|
import static dev.struchkov.haiti.utils.Inspector.isNotNull;
|
||||||
|
|
||||||
|
public class StorylineContextMapImpl implements StorylineContext {
|
||||||
|
|
||||||
|
private final Map<Long, Map<String, Object>> map = new HashMap<>();
|
||||||
|
|
||||||
|
public Uni<Void> save(@NotNull Long personId, @NotNull ContextKey<?> key, Object objectForSave) {
|
||||||
|
isNotNull(personId, key);
|
||||||
|
map.computeIfAbsent(personId, k -> new HashMap<>()).put(key.getValue(), objectForSave);
|
||||||
|
return Uni.createFrom().voidItem();
|
||||||
|
}
|
||||||
|
|
||||||
|
public <T> Uni<T> getByKey(@NotNull Long personId, @NotNull ContextKey<T> key) {
|
||||||
|
isNotNull(personId, key);
|
||||||
|
if (map.containsKey(personId)) {
|
||||||
|
final Map<String, Object> storage = map.get(personId);
|
||||||
|
final T object = (T) storage.get(key.getValue());
|
||||||
|
if (object != null && object.getClass().equals(key.getType())) {
|
||||||
|
return Uni.createFrom().item(object);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Uni.createFrom().nullItem();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <T> Uni<T> getByKeyOrThrow(@NotNull Long personId, @NotNull ContextKey<T> key) {
|
||||||
|
return getByKey(personId, key)
|
||||||
|
.onItem().ifNull().failWith(notFoundException("Не найдено значение ключа {0}, для пользователя {1}", key.getValue(), personId));
|
||||||
|
}
|
||||||
|
|
||||||
|
public Uni<Map<String, Object>> getAllSaveElement(@NotNull Long personId) {
|
||||||
|
isNotNull(personId);
|
||||||
|
return Uni.createFrom().item(map.get(personId));
|
||||||
|
}
|
||||||
|
|
||||||
|
public Uni<Void> removeAll(@NotNull Long personId) {
|
||||||
|
isNotNull(personId);
|
||||||
|
map.remove(personId);
|
||||||
|
return Uni.createFrom().voidItem();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Uni<Void> removeByKey(@NotNull Long personId, @NotNull ContextKey<?> key) {
|
||||||
|
isNotNull(personId, key);
|
||||||
|
map.computeIfAbsent(personId, k -> new HashMap<>()).remove(key.getValue());
|
||||||
|
return Uni.createFrom().voidItem();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,133 @@
|
|||||||
|
package dev.struchkov.godfather.quarkus.core.service;
|
||||||
|
|
||||||
|
import dev.struchkov.godfather.main.domain.StorylineHistory;
|
||||||
|
import dev.struchkov.godfather.main.domain.UnitPointer;
|
||||||
|
import dev.struchkov.godfather.main.domain.content.Mail;
|
||||||
|
import dev.struchkov.godfather.quarkus.context.service.UnitPointerService;
|
||||||
|
import dev.struchkov.godfather.quarkus.core.Storyline;
|
||||||
|
import dev.struchkov.godfather.quarkus.core.StorylineFactory;
|
||||||
|
import dev.struchkov.godfather.quarkus.core.unit.MainUnit;
|
||||||
|
import dev.struchkov.godfather.quarkus.data.repository.StorylineRepository;
|
||||||
|
import io.smallrye.mutiny.Uni;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import static dev.struchkov.haiti.utils.Checker.checkEmpty;
|
||||||
|
import static dev.struchkov.haiti.utils.Checker.checkNotEmpty;
|
||||||
|
import static dev.struchkov.haiti.utils.Checker.checkNotNull;
|
||||||
|
import static dev.struchkov.haiti.utils.Inspector.isNotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Отвечает за работу со сценарием в личных сообщениях с пользователем.
|
||||||
|
*/
|
||||||
|
public class StorylineMailService implements StorylineService<Mail> {
|
||||||
|
|
||||||
|
private final UnitPointerService unitPointerService;
|
||||||
|
private final StorylineRepository storylineRepository;
|
||||||
|
private final Storyline<Mail> storyLine;
|
||||||
|
private String defaultUnitName;
|
||||||
|
|
||||||
|
public StorylineMailService(
|
||||||
|
UnitPointerService unitPointerService,
|
||||||
|
StorylineRepository storylineRepository,
|
||||||
|
List<Object> unitConfigurations
|
||||||
|
) {
|
||||||
|
this.storyLine = new StorylineFactory<Mail>(unitConfigurations).createStoryLine();
|
||||||
|
this.unitPointerService = unitPointerService;
|
||||||
|
this.storylineRepository = storylineRepository;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Uni<Void> save(@NotNull StorylineHistory storylineHistory) {
|
||||||
|
isNotNull(storylineHistory);
|
||||||
|
return storylineRepository.save(storylineHistory);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Uni<MainUnit<Mail>> getUnitNameByPersonId(@NotNull Long personId) {
|
||||||
|
isNotNull(personId);
|
||||||
|
return unitPointerService.getUnitNameByPersonId(personId)
|
||||||
|
.onItem().transform(
|
||||||
|
unitName -> {
|
||||||
|
if (checkNotNull(unitName)) {
|
||||||
|
return storyLine.getUnit(unitName).orElse(null);
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Uni<Set<MainUnit<Mail>>> getNextUnitByPersonId(@NotNull Long personId) {
|
||||||
|
return getUnitNameByPersonId(personId)
|
||||||
|
.flatMap(
|
||||||
|
unit -> {
|
||||||
|
if (checkNotNull(unit) && checkNotEmpty(unit.getNextUnits())) {
|
||||||
|
return Uni.createFrom().item(unit.getNextUnits());
|
||||||
|
} else {
|
||||||
|
return storylineRepository.cleanHistoryByPersonId(personId)
|
||||||
|
.onItem().transform(v -> storyLine.getStartingUnits());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
).map(
|
||||||
|
nextUnits -> {
|
||||||
|
if (checkEmpty(nextUnits)) {
|
||||||
|
return storyLine.getGlobalUnits();
|
||||||
|
} else {
|
||||||
|
nextUnits.addAll(storyLine.getGlobalUnits());
|
||||||
|
return nextUnits;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Uni<Void> save(Long personId, String unitName, Mail mail) {
|
||||||
|
isNotNull(personId, unitName, mail);
|
||||||
|
return unitPointerService.save(new UnitPointer(personId, unitName))
|
||||||
|
.map(u -> {
|
||||||
|
final StorylineHistory storylineHistory = new StorylineHistory();
|
||||||
|
storylineHistory.setPersonId(personId);
|
||||||
|
storylineHistory.setUnitName(unitName);
|
||||||
|
storylineHistory.setMessage(mail);
|
||||||
|
return storylineRepository.save(storylineHistory);
|
||||||
|
}).replaceWithVoid();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Uni<StorylineHistory> replaceUserToBack(long personId, int countUnitsToBack) {
|
||||||
|
return storylineRepository.findByCountLast(personId, countUnitsToBack);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Uni<StorylineHistory> replaceUserToBack(long personId, String unitName) {
|
||||||
|
return storylineRepository.findByCountLast(personId, unitName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Optional<MainUnit<Mail>> getDefaultUnit() {
|
||||||
|
if (defaultUnitName == null) return Optional.empty();
|
||||||
|
return storyLine.getUnit(defaultUnitName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setDefaultUnit(String defaultUnit) {
|
||||||
|
defaultUnitName = defaultUnit;
|
||||||
|
}
|
||||||
|
|
||||||
|
//TODO [22.06.2022]: Временное решение для ленивой инициализации
|
||||||
|
@Override
|
||||||
|
public void lazyLink(String firstName, String secondName) {
|
||||||
|
storyLine.link(firstName, secondName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Optional<MainUnit<Mail>> getUnitByName(String unitName) {
|
||||||
|
return storyLine.getUnit(unitName);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,37 @@
|
|||||||
|
package dev.struchkov.godfather.quarkus.core.service;
|
||||||
|
|
||||||
|
import dev.struchkov.godfather.main.domain.StorylineHistory;
|
||||||
|
import dev.struchkov.godfather.main.domain.content.Message;
|
||||||
|
import dev.struchkov.godfather.quarkus.core.unit.MainUnit;
|
||||||
|
import io.smallrye.mutiny.Uni;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
public interface StorylineService<M extends Message> {
|
||||||
|
|
||||||
|
Uni<Void> save(@NotNull StorylineHistory storylineHistory);
|
||||||
|
|
||||||
|
Uni<MainUnit<M>> getUnitNameByPersonId(@NotNull Long personId);
|
||||||
|
|
||||||
|
Uni<Set<MainUnit<M>>> getNextUnitByPersonId(@NotNull Long personId);
|
||||||
|
|
||||||
|
Uni<Void> save(Long personId, String name, M message);
|
||||||
|
|
||||||
|
Uni<StorylineHistory> replaceUserToBack(long personId, int countUnitsToBack);
|
||||||
|
|
||||||
|
Uni<StorylineHistory> replaceUserToBack(long personId, String unitName);
|
||||||
|
|
||||||
|
Optional<MainUnit<M>> getDefaultUnit();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ленивая (поздняя) связка юнитов между собой. Осуществляется уже после создания сценария. С помощью данного подхода можно реализовать циклические зависимости юнитов.
|
||||||
|
*/
|
||||||
|
void lazyLink(String firstName, String secondName);
|
||||||
|
|
||||||
|
Optional<MainUnit<M>> getUnitByName(String unitName);
|
||||||
|
|
||||||
|
void setDefaultUnit(String unitName);
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
package dev.struchkov.godfather.quarkus.core.service;
|
||||||
|
|
||||||
|
import dev.struchkov.godfather.main.domain.UnitPointer;
|
||||||
|
import dev.struchkov.godfather.quarkus.context.service.UnitPointerService;
|
||||||
|
import dev.struchkov.godfather.quarkus.data.repository.UnitPointerRepository;
|
||||||
|
import io.smallrye.mutiny.Uni;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
public class UnitPointerServiceImpl implements UnitPointerService {
|
||||||
|
|
||||||
|
private final UnitPointerRepository unitPointerRepository;
|
||||||
|
|
||||||
|
public UnitPointerServiceImpl(UnitPointerRepository unitPointerRepository) {
|
||||||
|
this.unitPointerRepository = unitPointerRepository;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Uni<UnitPointer> save(@NotNull UnitPointer unitPointer) {
|
||||||
|
return unitPointerRepository.save(unitPointer);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Uni<String> getUnitNameByPersonId(@NotNull Long personId) {
|
||||||
|
return unitPointerRepository.findUnitNameByPersonId(personId);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Uni<Void> removeByPersonId(@NotNull Long personId) {
|
||||||
|
return unitPointerRepository.removeByPersonId(personId);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,10 +1,11 @@
|
|||||||
package dev.struchkov.godfather.context.domain.unit;
|
package dev.struchkov.godfather.quarkus.core.unit;
|
||||||
|
|
||||||
import dev.struchkov.autoresponder.entity.KeyWord;
|
import dev.struchkov.autoresponder.entity.KeyWord;
|
||||||
import dev.struchkov.godfather.context.domain.TypeUnit;
|
import dev.struchkov.godfather.main.core.unit.TypeUnit;
|
||||||
import dev.struchkov.godfather.context.domain.content.Message;
|
import dev.struchkov.godfather.main.core.unit.UnitActiveType;
|
||||||
import dev.struchkov.godfather.context.service.Accessibility;
|
import dev.struchkov.godfather.main.domain.content.Message;
|
||||||
import dev.struchkov.godfather.context.service.usercode.CheckData;
|
import dev.struchkov.godfather.quarkus.context.service.Accessibility;
|
||||||
|
import dev.struchkov.godfather.quarkus.core.unit.func.CheckData;
|
||||||
|
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
@ -13,9 +14,8 @@ 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.context.exception.UnitConfigException.unitConfigException;
|
import static dev.struchkov.godfather.exception.UnitConfigException.unitConfigException;
|
||||||
import static dev.struchkov.haiti.utils.Inspector.isAnyNotNull;
|
import static dev.struchkov.haiti.utils.Inspector.isAnyNotNull;
|
||||||
import static dev.struchkov.haiti.utils.Inspector.isNotNull;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Обработчик запроса, который реализует конструкцию IF в сценарии.
|
* Обработчик запроса, который реализует конструкцию IF в сценарии.
|
||||||
@ -213,7 +213,7 @@ public class AnswerCheck<M extends Message> extends MainUnit<M> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
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);
|
||||||
}
|
}
|
@ -1,13 +1,14 @@
|
|||||||
package dev.struchkov.godfather.context.domain.unit;
|
package dev.struchkov.godfather.quarkus.core.unit;
|
||||||
|
|
||||||
import dev.struchkov.autoresponder.entity.KeyWord;
|
import dev.struchkov.autoresponder.entity.KeyWord;
|
||||||
import dev.struchkov.godfather.context.domain.TypeUnit;
|
import dev.struchkov.godfather.main.core.unit.TypeUnit;
|
||||||
import dev.struchkov.godfather.context.domain.content.Message;
|
import dev.struchkov.godfather.main.core.unit.UnitActiveType;
|
||||||
import dev.struchkov.godfather.context.repository.preser.AnswerSavePreservable;
|
import dev.struchkov.godfather.main.domain.content.Message;
|
||||||
import dev.struchkov.godfather.context.service.Accessibility;
|
import dev.struchkov.godfather.quarkus.context.service.Accessibility;
|
||||||
import dev.struchkov.godfather.context.service.save.CheckSave;
|
import dev.struchkov.godfather.quarkus.context.service.Pusher;
|
||||||
import dev.struchkov.godfather.context.service.save.PreservableData;
|
import dev.struchkov.godfather.quarkus.core.unit.func.CheckSave;
|
||||||
import dev.struchkov.godfather.context.service.save.Pusher;
|
import dev.struchkov.godfather.quarkus.core.unit.func.PreservableData;
|
||||||
|
import dev.struchkov.godfather.quarkus.data.preser.AnswerSavePreservable;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
@ -18,7 +19,6 @@ import java.util.regex.Pattern;
|
|||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import static dev.struchkov.haiti.utils.Checker.checkNull;
|
import static dev.struchkov.haiti.utils.Checker.checkNull;
|
||||||
import static dev.struchkov.haiti.utils.Inspector.isNotNull;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Обработчик для сохранения ответов пользователя. Так же допускается скрытое сохранение.
|
* Обработчик для сохранения ответов пользователя. Так же допускается скрытое сохранение.
|
||||||
@ -271,11 +271,11 @@ public class AnswerSave<M extends Message, D> extends MainUnit<M> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public AnswerSave<M, D> build() {
|
public AnswerSave<M, D> build() {
|
||||||
isNotNull(preservable, "Не указан репозиторий для сохранения формы пользователя");
|
// isNotNull(preservable, "Не указан репозиторий для сохранения формы пользователя");
|
||||||
if (checkNull(pusher)) {
|
// if (checkNull(pusher)) {
|
||||||
isNotNull(preservableData, "Не указаны данные для сохранения");
|
// isNotNull(preservableData, "Не указаны данные для сохранения");
|
||||||
isNotNull(key, "Не указан ключ для сохранения");
|
// Inspector.isNotNull(key, "Не указан ключ для сохранения");
|
||||||
}
|
// }
|
||||||
return new AnswerSave<>(this);
|
return new AnswerSave<>(this);
|
||||||
}
|
}
|
||||||
|
|
@ -0,0 +1,261 @@
|
|||||||
|
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.context.service.Sending;
|
||||||
|
import dev.struchkov.godfather.quarkus.core.unit.func.Insert;
|
||||||
|
import dev.struchkov.godfather.quarkus.core.unit.func.ProcessingData;
|
||||||
|
import io.smallrye.mutiny.Uni;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.UUID;
|
||||||
|
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;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Используется для отправки ответа пользователю.
|
||||||
|
*
|
||||||
|
* @author upagge [08/07/2019]
|
||||||
|
*/
|
||||||
|
public class AnswerText<M extends Message> extends MainUnit<M> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Объект, который необходимо отправить пользователю.
|
||||||
|
*/
|
||||||
|
private final ProcessingData<M> answer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Информация, которую необходимо вставить вместо маркеров в строку ответа.
|
||||||
|
*/
|
||||||
|
private final Insert insert;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Объект нестандартной отправки ответа.
|
||||||
|
*/
|
||||||
|
private final Sending sender;
|
||||||
|
|
||||||
|
private AnswerText(Builder<M> builder) {
|
||||||
|
super(
|
||||||
|
builder.name,
|
||||||
|
builder.description,
|
||||||
|
builder.triggerWords,
|
||||||
|
builder.triggerPhrases,
|
||||||
|
builder.triggerCheck,
|
||||||
|
builder.triggerPatterns,
|
||||||
|
builder.matchThreshold,
|
||||||
|
builder.priority,
|
||||||
|
builder.nextUnits,
|
||||||
|
builder.activeType,
|
||||||
|
builder.notSaveHistory,
|
||||||
|
builder.accessibility,
|
||||||
|
TypeUnit.TEXT
|
||||||
|
);
|
||||||
|
answer = builder.boxAnswer;
|
||||||
|
insert = builder.insert;
|
||||||
|
sender = builder.sending;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <M extends Message> AnswerText<M> of(String message) {
|
||||||
|
return AnswerText.<M>builder().answer(BoxAnswer.boxAnswer(message)).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <M extends Message> AnswerText<M> of(BoxAnswer boxAnswer) {
|
||||||
|
return AnswerText.<M>builder().answer(boxAnswer).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <M extends Message> Builder<M> builder() {
|
||||||
|
return new Builder<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public ProcessingData<M> getAnswer() {
|
||||||
|
return answer;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Insert getInsert() {
|
||||||
|
return insert;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Sending getSending() {
|
||||||
|
return sender;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final class Builder<M extends Message> {
|
||||||
|
private String name = UUID.randomUUID().toString();
|
||||||
|
private String description;
|
||||||
|
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 UnitActiveType activeType;
|
||||||
|
private Accessibility accessibility;
|
||||||
|
private boolean notSaveHistory;
|
||||||
|
|
||||||
|
private ProcessingData<M> boxAnswer;
|
||||||
|
private Insert insert;
|
||||||
|
private Sending sending;
|
||||||
|
|
||||||
|
private Builder() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder<M> name(String name) {
|
||||||
|
this.name = name;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder<M> description(String description) {
|
||||||
|
this.description = description;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder<M> processing(Consumer<M> answer) {
|
||||||
|
this.boxAnswer = message -> {
|
||||||
|
answer.accept(message);
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder<M> answer(Function<M, Uni<BoxAnswer>> answer) {
|
||||||
|
this.boxAnswer = answer::apply;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder<M> answer(BoxAnswer answer) {
|
||||||
|
this.boxAnswer = message -> Uni.createFrom().item(answer);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder<M> answer(Supplier<BoxAnswer> answer) {
|
||||||
|
this.boxAnswer = message -> Uni.createFrom().item(answer.get());
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder<M> insert(Insert insert) {
|
||||||
|
this.insert = insert;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder<M> sending(Sending sending) {
|
||||||
|
this.sending = sending;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder<M> triggerWords(Set<KeyWord> val) {
|
||||||
|
if (triggerWords == null) {
|
||||||
|
triggerWords = new HashSet<>();
|
||||||
|
}
|
||||||
|
triggerWords.addAll(val);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder<M> triggerWord(KeyWord val) {
|
||||||
|
if (triggerWords == null) {
|
||||||
|
triggerWords = new HashSet<>();
|
||||||
|
}
|
||||||
|
triggerWords.add(val);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
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> triggerWord(String val) {
|
||||||
|
if (triggerWords == null) {
|
||||||
|
triggerWords = new HashSet<>();
|
||||||
|
}
|
||||||
|
triggerWords.add(KeyWord.of(val));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
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> 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<M> trigger) {
|
||||||
|
triggerCheck = trigger;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder<M> matchThreshold(Integer val) {
|
||||||
|
matchThreshold = val;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder<M> priority(Integer val) {
|
||||||
|
priority = val;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder<M> next(MainUnit<M> val) {
|
||||||
|
if (nextUnits == null) {
|
||||||
|
nextUnits = new HashSet<>();
|
||||||
|
}
|
||||||
|
nextUnits.add(val);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder<M> accessibility(Accessibility val) {
|
||||||
|
accessibility = val;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder<M> notSaveHistory() {
|
||||||
|
notSaveHistory = true;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder<M> activeType(UnitActiveType val) {
|
||||||
|
activeType = val;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AnswerText<M> build() {
|
||||||
|
// isNotNull(boxAnswer, UnitConfigException.unitConfigException("BoxAnswer обязательный параметр юнита"));
|
||||||
|
return new AnswerText<>(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,118 @@
|
|||||||
|
package dev.struchkov.godfather.quarkus.core.unit;
|
||||||
|
|
||||||
|
import dev.struchkov.autoresponder.entity.KeyWord;
|
||||||
|
import dev.struchkov.autoresponder.entity.Unit;
|
||||||
|
import dev.struchkov.godfather.main.core.unit.UnitActiveType;
|
||||||
|
import dev.struchkov.godfather.main.domain.content.Message;
|
||||||
|
import dev.struchkov.godfather.quarkus.context.service.Accessibility;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Главный обработчик {@link Unit}, от него наследуются все остальные Unit-ы.
|
||||||
|
*
|
||||||
|
* @author upagge [08/07/2019]
|
||||||
|
*/
|
||||||
|
public abstract class MainUnit<M extends Message> extends Unit<MainUnit<M>, M> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Уникальное имя юнита
|
||||||
|
*/
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Описание юнита, что он делает. Никак не влияет на работу юнита и не участвует в ней. Возможно отображение этого текста в логах.
|
||||||
|
*/
|
||||||
|
private final String description;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Тип Unit-а.
|
||||||
|
*/
|
||||||
|
protected final String type;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Режим срабатывания Unit-а.
|
||||||
|
*/
|
||||||
|
protected UnitActiveType activeType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Проверка доступа пользователя к юниту.
|
||||||
|
*/
|
||||||
|
private final Accessibility accessibility;
|
||||||
|
|
||||||
|
private final boolean notSaveHistory;
|
||||||
|
|
||||||
|
protected MainUnit(
|
||||||
|
String name,
|
||||||
|
String description,
|
||||||
|
Set<KeyWord> keyWords,
|
||||||
|
Set<String> phrases,
|
||||||
|
Predicate<M> triggerCheck,
|
||||||
|
Set<Pattern> patterns,
|
||||||
|
Integer matchThreshold,
|
||||||
|
Integer priority,
|
||||||
|
Set<MainUnit<M>> nextUnits,
|
||||||
|
UnitActiveType activeType,
|
||||||
|
boolean notSaveHistory,
|
||||||
|
Accessibility accessibility,
|
||||||
|
String type
|
||||||
|
) {
|
||||||
|
super(keyWords, phrases, triggerCheck, patterns, matchThreshold, priority, nextUnits);
|
||||||
|
this.name = name;
|
||||||
|
this.description = description;
|
||||||
|
this.activeType = Optional.ofNullable(activeType).orElse(UnitActiveType.DEFAULT);
|
||||||
|
this.accessibility = accessibility;
|
||||||
|
this.type = type;
|
||||||
|
this.notSaveHistory = notSaveHistory;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getType() {
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public UnitActiveType getActiveType() {
|
||||||
|
return activeType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setActiveType(UnitActiveType activeType) {
|
||||||
|
this.activeType = activeType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isNotSaveHistory() {
|
||||||
|
return notSaveHistory;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Optional<Accessibility> getAccessibility() {
|
||||||
|
return Optional.ofNullable(accessibility);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDescription() {
|
||||||
|
return description;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
if (this == o) return true;
|
||||||
|
if (o == null || getClass() != o.getClass()) return false;
|
||||||
|
MainUnit<?> unit = (MainUnit<?>) o;
|
||||||
|
return name.equals(unit.name);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Objects.hash(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,7 +1,6 @@
|
|||||||
package dev.struchkov.godfather.context.domain;
|
package dev.struchkov.godfather.quarkus.core.unit;
|
||||||
|
|
||||||
import dev.struchkov.godfather.context.domain.content.Message;
|
import dev.struchkov.godfather.main.domain.content.Message;
|
||||||
import dev.struchkov.godfather.context.domain.unit.MainUnit;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Сущность инкапсулирует в себе данные, необходимые для обработки сценария.
|
* Сущность инкапсулирует в себе данные, необходимые для обработки сценария.
|
@ -1,10 +1,10 @@
|
|||||||
package dev.struchkov.godfather.context.domain.unit.cmd;
|
package dev.struchkov.godfather.quarkus.core.unit.cmd;
|
||||||
|
|
||||||
import dev.struchkov.autoresponder.entity.KeyWord;
|
import dev.struchkov.autoresponder.entity.KeyWord;
|
||||||
import dev.struchkov.godfather.context.domain.TypeUnit;
|
import dev.struchkov.godfather.main.core.unit.TypeUnit;
|
||||||
import dev.struchkov.godfather.context.domain.content.Message;
|
import dev.struchkov.godfather.main.core.unit.UnitActiveType;
|
||||||
import dev.struchkov.godfather.context.domain.unit.MainUnit;
|
import dev.struchkov.godfather.main.domain.content.Message;
|
||||||
import dev.struchkov.godfather.context.domain.unit.UnitActiveType;
|
import dev.struchkov.godfather.quarkus.core.unit.MainUnit;
|
||||||
import dev.struchkov.haiti.utils.Checker;
|
import dev.struchkov.haiti.utils.Checker;
|
||||||
|
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
@ -0,0 +1,212 @@
|
|||||||
|
package dev.struchkov.godfather.quarkus.core.unit.cmd;
|
||||||
|
|
||||||
|
import dev.struchkov.autoresponder.entity.KeyWord;
|
||||||
|
import dev.struchkov.godfather.exception.UnitConfigException;
|
||||||
|
import dev.struchkov.godfather.main.core.unit.TypeUnit;
|
||||||
|
import dev.struchkov.godfather.main.core.unit.UnitActiveType;
|
||||||
|
import dev.struchkov.godfather.main.domain.content.Message;
|
||||||
|
import dev.struchkov.godfather.quarkus.core.unit.MainUnit;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.UUID;
|
||||||
|
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<M extends Message> extends MainUnit<M> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Количество юнитов, на которые можно откатиться назад.
|
||||||
|
*/
|
||||||
|
private final int countBack;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Имя юнита, на который нужно вернуть пользователя.
|
||||||
|
*/
|
||||||
|
private final String rollbackUnitName;
|
||||||
|
|
||||||
|
private RollBackCmd(Builder<M> builder) {
|
||||||
|
super(
|
||||||
|
builder.name,
|
||||||
|
builder.description,
|
||||||
|
builder.triggerWords,
|
||||||
|
builder.triggerPhrases,
|
||||||
|
builder.triggerCheck,
|
||||||
|
builder.triggerPatterns,
|
||||||
|
builder.matchThreshold,
|
||||||
|
builder.priority,
|
||||||
|
new HashSet<>(),
|
||||||
|
builder.activeType,
|
||||||
|
true,
|
||||||
|
null,
|
||||||
|
TypeUnit.BACK_CMD
|
||||||
|
);
|
||||||
|
this.countBack = builder.countBack;
|
||||||
|
this.rollbackUnitName = builder.rollbackUnitName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <M extends Message> Builder<M> builder() {
|
||||||
|
return new Builder<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <M extends Message> RollBackCmd<M> rollBack(int countToBack) {
|
||||||
|
return RollBackCmd.<M>builder().countBack(countToBack).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <M extends Message> RollBackCmd<M> singleRollBack() {
|
||||||
|
return RollBackCmd.<M>builder().countBack(1).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <M extends Message> RollBackCmd<M> doubleRollBack() {
|
||||||
|
return RollBackCmd.<M>builder().countBack(2).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <M extends Message> RollBackCmd<M> rollBack(String unitName) {
|
||||||
|
return RollBackCmd.<M>builder().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() {
|
||||||
|
return countBack;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getRollbackUnitName() {
|
||||||
|
return rollbackUnitName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final class Builder<M extends Message> {
|
||||||
|
private String name = UUID.randomUUID().toString();
|
||||||
|
private String description;
|
||||||
|
|
||||||
|
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<M> name(String name) {
|
||||||
|
this.name = name;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder<M> description(String description) {
|
||||||
|
this.description = description;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder<M> triggerWords(Set<KeyWord> val) {
|
||||||
|
if (checkNull(triggerWords)) {
|
||||||
|
triggerWords = new HashSet<>();
|
||||||
|
}
|
||||||
|
triggerWords.addAll(val);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder<M> triggerWord(KeyWord val) {
|
||||||
|
if (checkNull(triggerWords)) {
|
||||||
|
triggerWords = new HashSet<>();
|
||||||
|
}
|
||||||
|
triggerWords.add(val);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
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<M> triggerWord(String val) {
|
||||||
|
if (checkNull(triggerWords)) {
|
||||||
|
triggerWords = new HashSet<>();
|
||||||
|
}
|
||||||
|
triggerWords.add(KeyWord.of(val));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
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<M> triggerCheck(Predicate<M> trigger) {
|
||||||
|
triggerCheck = trigger;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
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<M> matchThreshold(Integer val) {
|
||||||
|
matchThreshold = val;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder<M> priority(Integer val) {
|
||||||
|
priority = val;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder<M> activeType(UnitActiveType val) {
|
||||||
|
activeType = val;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder<M> countBack(int val) {
|
||||||
|
countBack = val + 1;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder<M> rollbackUnitName(String val) {
|
||||||
|
rollbackUnitName = val;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public RollBackCmd<M> build() {
|
||||||
|
if (rollbackUnitName == null && countBack < 2) {
|
||||||
|
throw new UnitConfigException("Ошибка конфигурирования юнита {0}: Количество юнитов для отката не должно быть меньше 1.", name);
|
||||||
|
}
|
||||||
|
return new RollBackCmd<M>(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,11 @@
|
|||||||
|
package dev.struchkov.godfather.quarkus.core.unit.func;
|
||||||
|
|
||||||
|
import dev.struchkov.godfather.main.domain.content.Message;
|
||||||
|
import io.smallrye.mutiny.Uni;
|
||||||
|
|
||||||
|
@FunctionalInterface
|
||||||
|
public interface CheckData<C extends Message> {
|
||||||
|
|
||||||
|
Uni<Boolean> checked(C content);
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,17 @@
|
|||||||
|
package dev.struchkov.godfather.quarkus.core.unit.func;
|
||||||
|
|
||||||
|
import dev.struchkov.godfather.main.domain.content.Message;
|
||||||
|
import dev.struchkov.godfather.quarkus.core.unit.MainUnit;
|
||||||
|
import io.smallrye.mutiny.Uni;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO: Добавить описание интерфейса.
|
||||||
|
*
|
||||||
|
* @author upagge [04/08/2019]
|
||||||
|
*/
|
||||||
|
@FunctionalInterface
|
||||||
|
public interface CheckSave<M extends Message> {
|
||||||
|
|
||||||
|
Uni<MainUnit<M>> check(M content);
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,12 @@
|
|||||||
|
package dev.struchkov.godfather.quarkus.core.unit.func;
|
||||||
|
|
||||||
|
import io.smallrye.mutiny.Uni;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@FunctionalInterface
|
||||||
|
public interface Insert {
|
||||||
|
|
||||||
|
Uni<List<String>> insert(Long personId);
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,11 @@
|
|||||||
|
package dev.struchkov.godfather.quarkus.core.unit.func;
|
||||||
|
|
||||||
|
import dev.struchkov.godfather.main.domain.content.Message;
|
||||||
|
import io.smallrye.mutiny.Uni;
|
||||||
|
|
||||||
|
@FunctionalInterface
|
||||||
|
public interface PreservableData<D, M extends Message> {
|
||||||
|
|
||||||
|
Uni<D> getData(M content);
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,11 @@
|
|||||||
|
package dev.struchkov.godfather.quarkus.core.unit.func;
|
||||||
|
|
||||||
|
import dev.struchkov.godfather.main.domain.BoxAnswer;
|
||||||
|
import io.smallrye.mutiny.Uni;
|
||||||
|
|
||||||
|
@FunctionalInterface
|
||||||
|
public interface ProcessingData<C> {
|
||||||
|
|
||||||
|
Uni<BoxAnswer> processing(C content);
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,35 @@
|
|||||||
|
package dev.struchkov.godfather.quarkus.core.utils;
|
||||||
|
|
||||||
|
import dev.struchkov.godfather.main.domain.BoxAnswer;
|
||||||
|
import dev.struchkov.godfather.main.domain.content.Message;
|
||||||
|
import dev.struchkov.godfather.quarkus.context.service.Sending;
|
||||||
|
import io.smallrye.mutiny.Uni;
|
||||||
|
|
||||||
|
import static dev.struchkov.haiti.utils.Exceptions.utilityClass;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Используется для отправки сообщений определенного типа.
|
||||||
|
*
|
||||||
|
* @author upagge
|
||||||
|
*/
|
||||||
|
public class Sender {
|
||||||
|
|
||||||
|
private Sender() {
|
||||||
|
utilityClass();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Uni<Void> sends(Message message, BoxAnswer boxAnswer, Sending sending) {
|
||||||
|
switch (sending.getType()) {
|
||||||
|
case PUBLIC:
|
||||||
|
break;
|
||||||
|
case PRIVATE:
|
||||||
|
return privateSend(message, boxAnswer, sending);
|
||||||
|
}
|
||||||
|
return Uni.createFrom().voidItem();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Uni<Void> privateSend(Message message, BoxAnswer boxAnswer, Sending sending) {
|
||||||
|
return sending.send(message.getPersonId(), boxAnswer);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
35
bot-core/bot-core-simple/pom.xml
Normal file
35
bot-core/bot-core-simple/pom.xml
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<parent>
|
||||||
|
<artifactId>bot-core</artifactId>
|
||||||
|
<groupId>dev.struchkov.godfather</groupId>
|
||||||
|
<version>0.0.25</version>
|
||||||
|
</parent>
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<artifactId>bot-core-simple</artifactId>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<maven.compiler.source>17</maven.compiler.source>
|
||||||
|
<maven.compiler.target>17</maven.compiler.target>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>dev.struchkov.godfather</groupId>
|
||||||
|
<artifactId>bot-core-main</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>dev.struchkov.godfather</groupId>
|
||||||
|
<artifactId>bot-context-simple</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>dev.struchkov.godfather</groupId>
|
||||||
|
<artifactId>bot-data-simple</artifactId>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
</project>
|
@ -1,25 +1,23 @@
|
|||||||
package dev.struchkov.godfather.core;
|
package dev.struchkov.godfather.simple.core;
|
||||||
|
|
||||||
import dev.struchkov.autoresponder.Responder;
|
import dev.struchkov.autoresponder.Responder;
|
||||||
import dev.struchkov.godfather.context.domain.TypeUnit;
|
import dev.struchkov.godfather.exception.ConfigAppException;
|
||||||
import dev.struchkov.godfather.context.domain.UnitRequest;
|
import dev.struchkov.godfather.main.core.unit.TypeUnit;
|
||||||
import dev.struchkov.godfather.context.domain.content.Message;
|
import dev.struchkov.godfather.main.core.unit.UnitActiveType;
|
||||||
import dev.struchkov.godfather.context.domain.unit.MainUnit;
|
import dev.struchkov.godfather.main.domain.content.Message;
|
||||||
import dev.struchkov.godfather.context.domain.unit.UnitActiveType;
|
import dev.struchkov.godfather.simple.context.service.Accessibility;
|
||||||
import dev.struchkov.godfather.context.exception.ConfigAppException;
|
import dev.struchkov.godfather.simple.context.service.ErrorHandler;
|
||||||
import dev.struchkov.godfather.context.service.Accessibility;
|
import dev.struchkov.godfather.simple.context.service.Modifiable;
|
||||||
import dev.struchkov.godfather.context.service.Modifiable;
|
import dev.struchkov.godfather.simple.context.service.PersonSettingService;
|
||||||
import dev.struchkov.godfather.context.service.PersonSettingService;
|
import dev.struchkov.godfather.simple.context.service.Sending;
|
||||||
import dev.struchkov.godfather.context.service.StorylineService;
|
import dev.struchkov.godfather.simple.core.action.ActionUnit;
|
||||||
import dev.struchkov.godfather.context.service.sender.Sending;
|
import dev.struchkov.godfather.simple.core.action.AnswerCheckAction;
|
||||||
import dev.struchkov.godfather.core.service.ErrorHandler;
|
import dev.struchkov.godfather.simple.core.action.AnswerSaveAction;
|
||||||
import dev.struchkov.godfather.core.service.action.ActionUnit;
|
import dev.struchkov.godfather.simple.core.action.AnswerTextAction;
|
||||||
import dev.struchkov.godfather.core.service.action.AnswerCheckAction;
|
import dev.struchkov.godfather.simple.core.action.cmd.ReplaceCmdAction;
|
||||||
import dev.struchkov.godfather.core.service.action.AnswerSaveAction;
|
import dev.struchkov.godfather.simple.core.service.StorylineService;
|
||||||
import dev.struchkov.godfather.core.service.action.AnswerTextAction;
|
import dev.struchkov.godfather.simple.core.unit.MainUnit;
|
||||||
import dev.struchkov.godfather.core.service.action.AnswerTimerAction;
|
import dev.struchkov.godfather.simple.core.unit.UnitRequest;
|
||||||
import dev.struchkov.godfather.core.service.action.cmd.ReplaceCmdAction;
|
|
||||||
import dev.struchkov.godfather.core.service.timer.TimerService;
|
|
||||||
import dev.struchkov.haiti.context.exception.NotFoundException;
|
import dev.struchkov.haiti.context.exception.NotFoundException;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
@ -69,10 +67,6 @@ public class GeneralAutoResponder<M extends Message> {
|
|||||||
actionUnitMap.put(TypeUnit.SAVE, answerSaveAction);
|
actionUnitMap.put(TypeUnit.SAVE, answerSaveAction);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void initTimerAction(TimerService timerService) {
|
|
||||||
actionUnitMap.put(TypeUnit.TIMER, new AnswerTimerAction(timerService, this));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Позволяет установить перехватчик и обработчик исключений, возникающих при обработке юнитов.
|
* Позволяет установить перехватчик и обработчик исключений, возникающих при обработке юнитов.
|
||||||
*/
|
*/
|
@ -1,7 +1,7 @@
|
|||||||
package dev.struchkov.godfather.core;
|
package dev.struchkov.godfather.simple.core;
|
||||||
|
|
||||||
import dev.struchkov.godfather.context.domain.content.Message;
|
import dev.struchkov.godfather.main.domain.content.Message;
|
||||||
import dev.struchkov.godfather.context.domain.unit.MainUnit;
|
import dev.struchkov.godfather.simple.core.unit.MainUnit;
|
||||||
import dev.struchkov.haiti.utils.Inspector;
|
import dev.struchkov.haiti.utils.Inspector;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
@ -0,0 +1,167 @@
|
|||||||
|
package dev.struchkov.godfather.simple.core;
|
||||||
|
|
||||||
|
import dev.struchkov.godfather.exception.UnitConfigException;
|
||||||
|
import dev.struchkov.godfather.main.domain.UnitDefinition;
|
||||||
|
import dev.struchkov.godfather.main.domain.annotation.Unit;
|
||||||
|
import dev.struchkov.godfather.main.domain.content.Message;
|
||||||
|
import dev.struchkov.godfather.simple.core.unit.MainUnit;
|
||||||
|
import dev.struchkov.haiti.utils.Inspector;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
import java.lang.reflect.Parameter;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import static dev.struchkov.godfather.exception.UnitConfigException.unitConfigException;
|
||||||
|
|
||||||
|
public class StorylineFactory<M extends Message> {
|
||||||
|
|
||||||
|
private static final Logger log = LoggerFactory.getLogger(StorylineFactory.class);
|
||||||
|
|
||||||
|
private final List<Object> configurations = new ArrayList<>();
|
||||||
|
|
||||||
|
private final Map<String, UnitDefinition> unitDefinitions = 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<>();
|
||||||
|
|
||||||
|
public StorylineFactory(List<Object> unitConfigurations) {
|
||||||
|
this.configurations.addAll(unitConfigurations);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<String, UnitDefinition> getUnitDefinitions() {
|
||||||
|
return unitDefinitions;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<String, MainUnit<M>> getUnitMap() {
|
||||||
|
return unitMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Storyline<M> createStoryLine() {
|
||||||
|
generateUnitDefinitions();
|
||||||
|
try {
|
||||||
|
createUnitMap();
|
||||||
|
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) {
|
||||||
|
log.error(e.getMessage(), e);
|
||||||
|
}
|
||||||
|
throw new UnitConfigException("Ошибка построения StoryLine");
|
||||||
|
}
|
||||||
|
|
||||||
|
private Set<MainUnit<M>> getMainUnit() {
|
||||||
|
Inspector.isNotEmpty(mainUnits, unitConfigException("Не задан ни один mainUnit. Установите хотя бы для одного Unit флаг mainUnit"));
|
||||||
|
return mainUnits.stream()
|
||||||
|
.map(unitMap::get)
|
||||||
|
.collect(Collectors.toSet());
|
||||||
|
}
|
||||||
|
|
||||||
|
private Set<MainUnit<M>> getGlobalUnit() {
|
||||||
|
return globalUnits.stream()
|
||||||
|
.map(unitMap::get)
|
||||||
|
.collect(Collectors.toSet());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void createUnitMap() throws IllegalAccessException, InvocationTargetException {
|
||||||
|
for (UnitDefinition unitDefinition : unitDefinitions.values()) {
|
||||||
|
if (!unitMap.containsKey(unitDefinition.getName())) {
|
||||||
|
final Set<String> nextUnitNames = unitDefinition.getNextUnitNames();
|
||||||
|
if (nextUnitNames.isEmpty() || unitMap.keySet().containsAll(nextUnitNames)) {
|
||||||
|
createUnit(unitDefinition);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private MainUnit<M> createUnit(UnitDefinition unitDefinition) throws IllegalAccessException, InvocationTargetException {
|
||||||
|
final Object objectConfig = unitDefinition.getObjectConfig();
|
||||||
|
final String currentUnitName = unitDefinition.getName();
|
||||||
|
final Method method = unitDefinition.getMethod();
|
||||||
|
final Object[] nextUnits = Arrays.stream(method.getParameters())
|
||||||
|
.filter(parameter -> parameter.isAnnotationPresent(Unit.class))
|
||||||
|
.map(parameter -> parameter.getAnnotation(Unit.class))
|
||||||
|
.map(Unit::value)
|
||||||
|
.map(unitMap::get)
|
||||||
|
.toArray();
|
||||||
|
MainUnit<M> newUnit = (MainUnit<M>) method.invoke(objectConfig, nextUnits);
|
||||||
|
newUnit.setName(currentUnitName);
|
||||||
|
|
||||||
|
unitMap.put(currentUnitName, newUnit);
|
||||||
|
|
||||||
|
final Set<String> dependentUnitsName = unitDefinition.getDependentUnits();
|
||||||
|
for (String dependentUnitName : dependentUnitsName) {
|
||||||
|
final Set<String> dependentNextUnitNames = unitDefinitions.get(dependentUnitName).getNextUnitNames();
|
||||||
|
if (unitMap.keySet().containsAll(dependentNextUnitNames)) {
|
||||||
|
createUnit(unitDefinitions.get(dependentUnitName));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return newUnit;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void generateUnitDefinitions() {
|
||||||
|
final Map<String, Set<String>> dependentUnits = new HashMap<>();
|
||||||
|
|
||||||
|
for (Object config : configurations) {
|
||||||
|
final Class<?> classUnitConfig = config.getClass();
|
||||||
|
|
||||||
|
for (Method method : classUnitConfig.getDeclaredMethods()) {
|
||||||
|
if (method.isAnnotationPresent(Unit.class)) {
|
||||||
|
final Unit unitConfig = method.getAnnotation(Unit.class);
|
||||||
|
|
||||||
|
final String unitName = unitConfig.value();
|
||||||
|
|
||||||
|
final UnitDefinition unitDefinition = new UnitDefinition();
|
||||||
|
unitDefinition.setName(unitName);
|
||||||
|
unitDefinition.setMethod(method);
|
||||||
|
unitDefinition.setObjectConfig(config);
|
||||||
|
|
||||||
|
if (unitConfig.main()) {
|
||||||
|
mainUnits.add(unitName);
|
||||||
|
}
|
||||||
|
if (unitConfig.global()) {
|
||||||
|
globalUnits.add(unitName);
|
||||||
|
}
|
||||||
|
|
||||||
|
final Parameter[] nextUnits = method.getParameters();
|
||||||
|
if (nextUnits.length > 0) {
|
||||||
|
for (Parameter nextUnit : nextUnits) {
|
||||||
|
if (nextUnit.isAnnotationPresent(Unit.class)) {
|
||||||
|
final Unit nextUnitConfig = nextUnit.getAnnotation(Unit.class);
|
||||||
|
final String nextUnitName = nextUnitConfig.value();
|
||||||
|
unitDefinition.setNextUnitName(nextUnitName);
|
||||||
|
dependentUnits.computeIfAbsent(nextUnitName, k -> new HashSet<>());
|
||||||
|
dependentUnits.get(nextUnitName).add(unitName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unitDefinitions.put(unitDefinition.getName(), unitDefinition);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Map.Entry<String, Set<String>> entry : dependentUnits.entrySet()) {
|
||||||
|
final UnitDefinition unitDefinition = unitDefinitions.get(entry.getKey());
|
||||||
|
if (unitDefinition != null) {
|
||||||
|
unitDefinition.setDependentUnits(entry.getValue());
|
||||||
|
} else {
|
||||||
|
throw new UnitConfigException("Ошибка связи юнитов. Проблема с описанием {0} юнита. Возможно вы не указали класс конфигурации для этого юнита.", entry.getKey());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,8 +1,8 @@
|
|||||||
package dev.struchkov.godfather.core.service.action;
|
package dev.struchkov.godfather.simple.core.action;
|
||||||
|
|
||||||
import dev.struchkov.godfather.context.domain.UnitRequest;
|
import dev.struchkov.godfather.main.domain.content.Message;
|
||||||
import dev.struchkov.godfather.context.domain.content.Message;
|
import dev.struchkov.godfather.simple.core.unit.MainUnit;
|
||||||
import dev.struchkov.godfather.context.domain.unit.MainUnit;
|
import dev.struchkov.godfather.simple.core.unit.UnitRequest;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Интерфейс для обработки Unit-ов.
|
* Интерфейс для обработки Unit-ов.
|
@ -1,9 +1,9 @@
|
|||||||
package dev.struchkov.godfather.core.service.action;
|
package dev.struchkov.godfather.simple.core.action;
|
||||||
|
|
||||||
import dev.struchkov.godfather.context.domain.UnitRequest;
|
import dev.struchkov.godfather.main.domain.content.Message;
|
||||||
import dev.struchkov.godfather.context.domain.content.Message;
|
import dev.struchkov.godfather.simple.core.unit.AnswerCheck;
|
||||||
import dev.struchkov.godfather.context.domain.unit.AnswerCheck;
|
import dev.struchkov.godfather.simple.core.unit.MainUnit;
|
||||||
import dev.struchkov.godfather.context.domain.unit.MainUnit;
|
import dev.struchkov.godfather.simple.core.unit.UnitRequest;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
@ -1,13 +1,13 @@
|
|||||||
package dev.struchkov.godfather.core.service.action;
|
package dev.struchkov.godfather.simple.core.action;
|
||||||
|
|
||||||
import dev.struchkov.godfather.context.domain.UnitRequest;
|
import dev.struchkov.godfather.main.domain.content.Message;
|
||||||
import dev.struchkov.godfather.context.domain.content.Message;
|
import dev.struchkov.godfather.simple.context.service.Pusher;
|
||||||
import dev.struchkov.godfather.context.domain.unit.AnswerSave;
|
import dev.struchkov.godfather.simple.core.unit.AnswerSave;
|
||||||
import dev.struchkov.godfather.context.domain.unit.MainUnit;
|
import dev.struchkov.godfather.simple.core.unit.MainUnit;
|
||||||
import dev.struchkov.godfather.context.repository.preser.AnswerSavePreservable;
|
import dev.struchkov.godfather.simple.core.unit.UnitRequest;
|
||||||
import dev.struchkov.godfather.context.service.save.CheckSave;
|
import dev.struchkov.godfather.simple.core.unit.func.CheckSave;
|
||||||
import dev.struchkov.godfather.context.service.save.PreservableData;
|
import dev.struchkov.godfather.simple.core.unit.func.PreservableData;
|
||||||
import dev.struchkov.godfather.context.service.save.Pusher;
|
import dev.struchkov.godfather.simple.data.preser.AnswerSavePreservable;
|
||||||
|
|
||||||
import static dev.struchkov.haiti.utils.Checker.checkNotNull;
|
import static dev.struchkov.haiti.utils.Checker.checkNotNull;
|
||||||
|
|
@ -1,13 +1,13 @@
|
|||||||
package dev.struchkov.godfather.core.service.action;
|
package dev.struchkov.godfather.simple.core.action;
|
||||||
|
|
||||||
import dev.struchkov.godfather.context.domain.BoxAnswer;
|
import dev.struchkov.godfather.main.core.utils.InsertWords;
|
||||||
import dev.struchkov.godfather.context.domain.UnitRequest;
|
import dev.struchkov.godfather.main.domain.BoxAnswer;
|
||||||
import dev.struchkov.godfather.context.domain.content.Message;
|
import dev.struchkov.godfather.main.domain.content.Message;
|
||||||
import dev.struchkov.godfather.context.domain.unit.AnswerText;
|
import dev.struchkov.godfather.simple.context.service.Sending;
|
||||||
import dev.struchkov.godfather.context.domain.unit.MainUnit;
|
import dev.struchkov.godfather.simple.core.unit.AnswerText;
|
||||||
import dev.struchkov.godfather.context.service.sender.Sending;
|
import dev.struchkov.godfather.simple.core.unit.MainUnit;
|
||||||
import dev.struchkov.godfather.context.utils.InsertWords;
|
import dev.struchkov.godfather.simple.core.unit.UnitRequest;
|
||||||
import dev.struchkov.godfather.context.utils.Sender;
|
import dev.struchkov.godfather.simple.core.utils.Sender;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
@ -0,0 +1,18 @@
|
|||||||
|
package dev.struchkov.godfather.simple.core.action.cmd;
|
||||||
|
|
||||||
|
import dev.struchkov.godfather.main.domain.content.Message;
|
||||||
|
import dev.struchkov.godfather.simple.core.action.ActionUnit;
|
||||||
|
import dev.struchkov.godfather.simple.core.unit.MainUnit;
|
||||||
|
import dev.struchkov.godfather.simple.core.unit.UnitRequest;
|
||||||
|
import dev.struchkov.godfather.simple.core.unit.cmd.ReplaceCmd;
|
||||||
|
|
||||||
|
public class ReplaceCmdAction implements ActionUnit<ReplaceCmd<Message>, Message> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public UnitRequest<MainUnit, Message> action(UnitRequest<ReplaceCmd<Message>, Message> unitRequest) {
|
||||||
|
final ReplaceCmd<Message> unit = unitRequest.getUnit();
|
||||||
|
final Message message = unitRequest.getMessage();
|
||||||
|
return UnitRequest.of(unit.getThisUnit(), message);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,14 +1,14 @@
|
|||||||
package dev.struchkov.godfather.core.service.action.cmd;
|
package dev.struchkov.godfather.simple.core.action.cmd;
|
||||||
|
|
||||||
import dev.struchkov.godfather.context.domain.StorylineHistory;
|
import dev.struchkov.godfather.main.domain.StorylineHistory;
|
||||||
import dev.struchkov.godfather.context.domain.UnitRequest;
|
import dev.struchkov.godfather.main.domain.content.Message;
|
||||||
import dev.struchkov.godfather.context.domain.content.Message;
|
import dev.struchkov.godfather.simple.core.action.ActionUnit;
|
||||||
import dev.struchkov.godfather.context.domain.unit.MainUnit;
|
import dev.struchkov.godfather.simple.core.service.StorylineService;
|
||||||
import dev.struchkov.godfather.context.domain.unit.cmd.RollBackCmd;
|
import dev.struchkov.godfather.simple.core.unit.MainUnit;
|
||||||
import dev.struchkov.godfather.context.service.StorylineService;
|
import dev.struchkov.godfather.simple.core.unit.UnitRequest;
|
||||||
import dev.struchkov.godfather.core.service.action.ActionUnit;
|
import dev.struchkov.godfather.simple.core.unit.cmd.RollBackCmd;
|
||||||
|
|
||||||
import static dev.struchkov.godfather.context.exception.RollBackException.rollBackException;
|
import static dev.struchkov.godfather.exception.RollBackException.rollBackException;
|
||||||
|
|
||||||
public class RollBackCmdAction<M extends Message> implements ActionUnit<RollBackCmd<M>, M> {
|
public class RollBackCmdAction<M extends Message> implements ActionUnit<RollBackCmd<M>, M> {
|
||||||
|
|
@ -1,8 +1,8 @@
|
|||||||
package dev.struchkov.godfather.core.service.provider;
|
package dev.struchkov.godfather.simple.core.provider;
|
||||||
|
|
||||||
import dev.struchkov.godfather.context.domain.content.Mail;
|
import dev.struchkov.godfather.main.domain.content.Mail;
|
||||||
import dev.struchkov.godfather.context.service.EventHandler;
|
import dev.struchkov.godfather.simple.context.service.EventHandler;
|
||||||
import dev.struchkov.godfather.core.GeneralAutoResponder;
|
import dev.struchkov.godfather.simple.core.GeneralAutoResponder;
|
||||||
|
|
||||||
public class StoryLineHandler implements EventHandler<Mail> {
|
public class StoryLineHandler implements EventHandler<Mail> {
|
||||||
|
|
@ -1,11 +1,12 @@
|
|||||||
package dev.struchkov.godfather.core.service.save.push;
|
package dev.struchkov.godfather.simple.core.pusher;
|
||||||
|
|
||||||
import dev.struchkov.godfather.context.domain.BoxAnswer;
|
import dev.struchkov.godfather.simple.context.service.Pusher;
|
||||||
import dev.struchkov.godfather.context.service.save.Pusher;
|
import dev.struchkov.godfather.simple.context.service.Sending;
|
||||||
import dev.struchkov.godfather.context.service.sender.Sending;
|
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
import static dev.struchkov.godfather.main.domain.BoxAnswer.boxAnswer;
|
||||||
|
|
||||||
public class UserSanderPusher implements Pusher<String> {
|
public class UserSanderPusher implements Pusher<String> {
|
||||||
|
|
||||||
private final Long personId;
|
private final Long personId;
|
||||||
@ -24,7 +25,7 @@ public class UserSanderPusher implements Pusher<String> {
|
|||||||
stringBuilder.append("========= ").append(nameForm).append(" =========\n");
|
stringBuilder.append("========= ").append(nameForm).append(" =========\n");
|
||||||
saveElement.forEach((key, value) -> stringBuilder.append(key).append(": ").append(value).append("\n"));
|
saveElement.forEach((key, value) -> stringBuilder.append(key).append(": ").append(value).append("\n"));
|
||||||
stringBuilder.append("====================");
|
stringBuilder.append("====================");
|
||||||
sending.send(this.personId, BoxAnswer.builder().message(stringBuilder.toString()).build());
|
sending.send(this.personId, boxAnswer(stringBuilder.toString()));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -1,7 +1,7 @@
|
|||||||
package dev.struchkov.godfather.core.service;
|
package dev.struchkov.godfather.simple.core.service;
|
||||||
|
|
||||||
import dev.struchkov.godfather.context.repository.PersonSettingRepository;
|
import dev.struchkov.godfather.simple.context.service.PersonSettingService;
|
||||||
import dev.struchkov.godfather.context.service.PersonSettingService;
|
import dev.struchkov.godfather.simple.data.repository.PersonSettingRepository;
|
||||||
import dev.struchkov.haiti.utils.Inspector;
|
import dev.struchkov.haiti.utils.Inspector;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
@ -1,7 +1,7 @@
|
|||||||
package dev.struchkov.godfather.core.service;
|
package dev.struchkov.godfather.simple.core.service;
|
||||||
|
|
||||||
import dev.struchkov.godfather.context.domain.ContextKey;
|
import dev.struchkov.godfather.main.domain.ContextKey;
|
||||||
import dev.struchkov.godfather.context.service.StorylineContext;
|
import dev.struchkov.godfather.simple.data.StorylineContext;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
@ -1,16 +1,14 @@
|
|||||||
package dev.struchkov.godfather.core.service;
|
package dev.struchkov.godfather.simple.core.service;
|
||||||
|
|
||||||
import dev.struchkov.autoresponder.entity.Unit;
|
import dev.struchkov.autoresponder.entity.Unit;
|
||||||
import dev.struchkov.godfather.context.domain.StorylineHistory;
|
import dev.struchkov.godfather.main.domain.StorylineHistory;
|
||||||
import dev.struchkov.godfather.context.domain.UnitPointer;
|
import dev.struchkov.godfather.main.domain.UnitPointer;
|
||||||
import dev.struchkov.godfather.context.domain.content.Mail;
|
import dev.struchkov.godfather.main.domain.content.Mail;
|
||||||
import dev.struchkov.godfather.context.domain.unit.MainUnit;
|
import dev.struchkov.godfather.simple.context.service.UnitPointerService;
|
||||||
import dev.struchkov.godfather.context.repository.StorylineRepository;
|
import dev.struchkov.godfather.simple.core.Storyline;
|
||||||
import dev.struchkov.godfather.context.service.StorylineService;
|
import dev.struchkov.godfather.simple.core.StorylineFactory;
|
||||||
import dev.struchkov.godfather.context.service.UnitPointerService;
|
import dev.struchkov.godfather.simple.core.unit.MainUnit;
|
||||||
import dev.struchkov.godfather.core.Storyline;
|
import dev.struchkov.godfather.simple.data.repository.StorylineRepository;
|
||||||
import dev.struchkov.godfather.core.StorylineFactory;
|
|
||||||
import dev.struchkov.haiti.utils.Inspector;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -42,13 +40,12 @@ public class StorylineMailService implements StorylineService<Mail> {
|
|||||||
@Override
|
@Override
|
||||||
public void save(@NotNull StorylineHistory storylineHistory) {
|
public void save(@NotNull StorylineHistory storylineHistory) {
|
||||||
isNotNull(storylineHistory);
|
isNotNull(storylineHistory);
|
||||||
storylineHistory.setId(null);
|
|
||||||
storylineRepository.save(storylineHistory);
|
storylineRepository.save(storylineHistory);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Optional<MainUnit<Mail>> getUnitNameByPersonId(@NotNull Long personId) {
|
public Optional<MainUnit<Mail>> getUnitNameByPersonId(@NotNull Long personId) {
|
||||||
Inspector.isNotNull(personId);
|
isNotNull(personId);
|
||||||
return unitPointerService.getUnitNameByPersonId(personId)
|
return unitPointerService.getUnitNameByPersonId(personId)
|
||||||
.flatMap(storyLine::getUnit);
|
.flatMap(storyLine::getUnit);
|
||||||
}
|
}
|
||||||
@ -68,7 +65,7 @@ public class StorylineMailService implements StorylineService<Mail> {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void save(Long personId, String unitName, Mail mail) {
|
public void save(Long personId, String unitName, Mail mail) {
|
||||||
Inspector.isNotNull(personId, unitName, mail);
|
isNotNull(personId, unitName, mail);
|
||||||
unitPointerService.save(new UnitPointer(personId, unitName));
|
unitPointerService.save(new UnitPointer(personId, unitName));
|
||||||
|
|
||||||
final StorylineHistory storylineHistory = new StorylineHistory();
|
final StorylineHistory storylineHistory = new StorylineHistory();
|
@ -1,8 +1,8 @@
|
|||||||
package dev.struchkov.godfather.context.service;
|
package dev.struchkov.godfather.simple.core.service;
|
||||||
|
|
||||||
import dev.struchkov.godfather.context.domain.StorylineHistory;
|
import dev.struchkov.godfather.main.domain.StorylineHistory;
|
||||||
import dev.struchkov.godfather.context.domain.content.Message;
|
import dev.struchkov.godfather.main.domain.content.Message;
|
||||||
import dev.struchkov.godfather.context.domain.unit.MainUnit;
|
import dev.struchkov.godfather.simple.core.unit.MainUnit;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
@ -1,8 +1,8 @@
|
|||||||
package dev.struchkov.godfather.core.service;
|
package dev.struchkov.godfather.simple.core.service;
|
||||||
|
|
||||||
import dev.struchkov.godfather.context.domain.UnitPointer;
|
import dev.struchkov.godfather.main.domain.UnitPointer;
|
||||||
import dev.struchkov.godfather.context.repository.UnitPointerRepository;
|
import dev.struchkov.godfather.simple.context.service.UnitPointerService;
|
||||||
import dev.struchkov.godfather.context.service.UnitPointerService;
|
import dev.struchkov.godfather.simple.data.repository.UnitPointerRepository;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
@ -1,10 +1,11 @@
|
|||||||
package dev.struchkov.godfather.context.domain.unit;
|
package dev.struchkov.godfather.simple.core.unit;
|
||||||
|
|
||||||
import dev.struchkov.autoresponder.entity.KeyWord;
|
import dev.struchkov.autoresponder.entity.KeyWord;
|
||||||
import dev.struchkov.godfather.context.domain.TypeUnit;
|
import dev.struchkov.godfather.main.core.unit.TypeUnit;
|
||||||
import dev.struchkov.godfather.context.domain.content.Message;
|
import dev.struchkov.godfather.main.core.unit.UnitActiveType;
|
||||||
import dev.struchkov.godfather.context.service.Accessibility;
|
import dev.struchkov.godfather.main.domain.content.Message;
|
||||||
import dev.struchkov.godfather.context.service.usercode.CheckData;
|
import dev.struchkov.godfather.simple.context.service.Accessibility;
|
||||||
|
import dev.struchkov.godfather.simple.core.unit.func.CheckData;
|
||||||
|
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
@ -13,37 +14,29 @@ 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.context.exception.UnitConfigException.unitConfigException;
|
|
||||||
import static dev.struchkov.haiti.utils.Inspector.isNotNull;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Обработчик таймер, позволяющий отложить обработку других Unit-ов.
|
* Обработчик запроса, который реализует конструкцию IF в сценарии.
|
||||||
*
|
*
|
||||||
* @author upagge [08/07/2019]
|
* @author upagge [08/07/2019]
|
||||||
*/
|
*/
|
||||||
public class AnswerTimer<M extends Message> extends MainUnit<M> {
|
public class AnswerCheck<M extends Message> extends MainUnit<M> {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Unit обработку которого необходимо отложить.
|
* Unit для true.
|
||||||
*/
|
*/
|
||||||
private final MainUnit<M> unitAnswer;
|
private final MainUnit unitTrue;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Задержка обработки в секундах.
|
* Unit для false.
|
||||||
*/
|
*/
|
||||||
private final Integer timeDelaySec;
|
private final MainUnit unitFalse;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Время, через которое таймер будет удален в секундах.
|
* Условие проверки.
|
||||||
*/
|
*/
|
||||||
private final Integer timeDeathSec;
|
private final CheckData<M> check;
|
||||||
|
|
||||||
/**
|
private AnswerCheck(Builder<M> builder) {
|
||||||
* Условие срабатывания отложенного Unit.
|
|
||||||
*/
|
|
||||||
private final CheckData<M> checkLoop;
|
|
||||||
|
|
||||||
private AnswerTimer(Builder<M> builder) {
|
|
||||||
super(
|
super(
|
||||||
builder.name,
|
builder.name,
|
||||||
builder.description,
|
builder.description,
|
||||||
@ -53,36 +46,31 @@ public class AnswerTimer<M extends Message> extends MainUnit<M> {
|
|||||||
builder.triggerPatterns,
|
builder.triggerPatterns,
|
||||||
builder.matchThreshold,
|
builder.matchThreshold,
|
||||||
builder.priority,
|
builder.priority,
|
||||||
null,
|
new HashSet<>(),
|
||||||
builder.activeType,
|
builder.activeType,
|
||||||
builder.notSaveHistory,
|
builder.notSaveHistory,
|
||||||
builder.accessibility,
|
builder.accessibility,
|
||||||
TypeUnit.TIMER
|
TypeUnit.CHECK
|
||||||
);
|
);
|
||||||
unitAnswer = builder.unitAnswer;
|
unitTrue = builder.unitTrue;
|
||||||
timeDelaySec = builder.timeDelaySec;
|
unitFalse = builder.unitFalse;
|
||||||
timeDeathSec = builder.timeDeathSec;
|
check = builder.check;
|
||||||
checkLoop = builder.checkLoop;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <M extends Message> Builder<M> builder() {
|
public static <M extends Message> Builder<M> builder() {
|
||||||
return new Builder<>();
|
return new Builder<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public MainUnit<M> getUnitAnswer() {
|
public MainUnit getUnitTrue() {
|
||||||
return unitAnswer;
|
return unitTrue;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Integer getTimeDelaySec() {
|
public MainUnit getUnitFalse() {
|
||||||
return timeDelaySec;
|
return unitFalse;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Integer getTimeDeathSec() {
|
public CheckData<M> getCheck() {
|
||||||
return timeDeathSec;
|
return check;
|
||||||
}
|
|
||||||
|
|
||||||
public CheckData<M> getCheckLoop() {
|
|
||||||
return checkLoop;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static final class Builder<M extends Message> {
|
public static final class Builder<M extends Message> {
|
||||||
@ -96,14 +84,14 @@ public class AnswerTimer<M extends Message> extends MainUnit<M> {
|
|||||||
private Integer matchThreshold;
|
private Integer matchThreshold;
|
||||||
|
|
||||||
private Integer priority;
|
private Integer priority;
|
||||||
private UnitActiveType activeType = UnitActiveType.AFTER;
|
private UnitActiveType activeType;
|
||||||
|
|
||||||
private Accessibility accessibility;
|
private Accessibility accessibility;
|
||||||
private boolean notSaveHistory;
|
private boolean notSaveHistory;
|
||||||
|
|
||||||
private MainUnit<M> unitAnswer;
|
private MainUnit unitTrue;
|
||||||
private Integer timeDelaySec;
|
private MainUnit unitFalse;
|
||||||
private Integer timeDeathSec;
|
private CheckData<M> check;
|
||||||
private CheckData<M> checkLoop;
|
|
||||||
|
|
||||||
private Builder() {
|
private Builder() {
|
||||||
}
|
}
|
||||||
@ -118,26 +106,6 @@ public class AnswerTimer<M extends Message> extends MainUnit<M> {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Builder<M> unitAnswer(MainUnit<M> val) {
|
|
||||||
unitAnswer = val;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Builder<M> timeDelaySec(Integer val) {
|
|
||||||
timeDelaySec = val;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Builder<M> timeDeathSec(Integer val) {
|
|
||||||
timeDeathSec = val;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Builder<M> checkLoop(CheckData<M> val) {
|
|
||||||
checkLoop = val;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Builder<M> triggerWords(Set<KeyWord> val) {
|
public Builder<M> triggerWords(Set<KeyWord> val) {
|
||||||
if (triggerWords == null) {
|
if (triggerWords == null) {
|
||||||
triggerWords = new HashSet<>();
|
triggerWords = new HashSet<>();
|
||||||
@ -196,7 +164,7 @@ public class AnswerTimer<M extends Message> extends MainUnit<M> {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Builder<M> triggerCheck(Predicate<M> trigger) {
|
private Builder<M> triggerCheck(Predicate<M> trigger) {
|
||||||
triggerCheck = trigger;
|
triggerCheck = trigger;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
@ -211,13 +179,23 @@ public class AnswerTimer<M extends Message> extends MainUnit<M> {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Builder<M> accessibility(Accessibility val) {
|
public Builder<M> unitTrue(MainUnit unitTrue) {
|
||||||
accessibility = val;
|
this.unitTrue = unitTrue;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Builder<M> notSaveHistory() {
|
public Builder<M> unitFalse(MainUnit unitFalse) {
|
||||||
notSaveHistory = true;
|
this.unitFalse = unitFalse;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder<M> check(CheckData<M> check) {
|
||||||
|
this.check = check;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder<M> accessibility(Accessibility val) {
|
||||||
|
accessibility = val;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -226,9 +204,15 @@ public class AnswerTimer<M extends Message> extends MainUnit<M> {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public AnswerTimer<M> build() {
|
public Builder<M> notSaveHistory() {
|
||||||
isNotNull(unitAnswer, unitConfigException("Необходимо указать юнит, обработка которого будет отложена."));
|
notSaveHistory = true;
|
||||||
return new AnswerTimer<>(this);
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AnswerCheck<M> build() {
|
||||||
|
// isNotNull(check, unitConfigException("Необходимо установить параметр проверки."));
|
||||||
|
// Inspector.isAnyNotNull(unitConfigException("Необходимо задать хотя бы один unit результата проверки."));
|
||||||
|
return new AnswerCheck<>(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -0,0 +1,283 @@
|
|||||||
|
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.content.Message;
|
||||||
|
import dev.struchkov.godfather.simple.context.service.Accessibility;
|
||||||
|
import dev.struchkov.godfather.simple.context.service.Pusher;
|
||||||
|
import dev.struchkov.godfather.simple.core.unit.func.CheckSave;
|
||||||
|
import dev.struchkov.godfather.simple.core.unit.func.PreservableData;
|
||||||
|
import dev.struchkov.godfather.simple.data.preser.AnswerSavePreservable;
|
||||||
|
import dev.struchkov.haiti.utils.Checker;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.UUID;
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Обработчик для сохранения ответов пользователя. Так же допускается скрытое сохранение.
|
||||||
|
*
|
||||||
|
* @author upagge [08/07/2019]
|
||||||
|
*/
|
||||||
|
public class AnswerSave<M extends Message, D> extends MainUnit<M> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Объект отвечающий за сохранение - репозиторий.
|
||||||
|
*/
|
||||||
|
private final AnswerSavePreservable<D> preservable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ключ для данных.
|
||||||
|
*/
|
||||||
|
private final String key;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Отправка результатов.
|
||||||
|
*/
|
||||||
|
private final Pusher<D> pusher;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Данные для скрытого сохранения.
|
||||||
|
*/
|
||||||
|
private final PreservableData<D, M> preservableData;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Скрытое сохранение.
|
||||||
|
*/
|
||||||
|
private final boolean hidden;
|
||||||
|
|
||||||
|
private final CheckSave<M> checkSave;
|
||||||
|
|
||||||
|
private AnswerSave(Builder<M, D> builder) {
|
||||||
|
super(
|
||||||
|
builder.name,
|
||||||
|
builder.description,
|
||||||
|
builder.triggerWords,
|
||||||
|
builder.triggerPhrases,
|
||||||
|
builder.triggerCheck,
|
||||||
|
builder.triggerPatterns,
|
||||||
|
builder.matchThreshold,
|
||||||
|
builder.priority,
|
||||||
|
builder.nextUnits,
|
||||||
|
(builder.hidden) ? UnitActiveType.AFTER : UnitActiveType.DEFAULT,
|
||||||
|
builder.notSaveHistory,
|
||||||
|
builder.accessibility,
|
||||||
|
TypeUnit.SAVE
|
||||||
|
);
|
||||||
|
maintenanceNextUnit(nextUnits);
|
||||||
|
preservable = builder.preservable;
|
||||||
|
key = builder.key;
|
||||||
|
pusher = builder.pusher;
|
||||||
|
preservableData = builder.preservableData;
|
||||||
|
hidden = builder.hidden;
|
||||||
|
checkSave = builder.checkSave;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <M extends Message, D> Builder<M, D> builder() {
|
||||||
|
return new Builder<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void maintenanceNextUnit(Collection<MainUnit<M>> units) {
|
||||||
|
if (units != null) {
|
||||||
|
units.forEach(mainUnit -> mainUnit.setActiveType(UnitActiveType.AFTER));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public AnswerSavePreservable<D> getPreservable() {
|
||||||
|
return preservable;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getKey() {
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Pusher<D> getPusher() {
|
||||||
|
return pusher;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PreservableData<D, M> getPreservableData() {
|
||||||
|
return preservableData;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isHidden() {
|
||||||
|
return hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
public CheckSave<M> getCheckSave() {
|
||||||
|
return checkSave;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final class Builder<M extends Message, D> {
|
||||||
|
private String name = UUID.randomUUID().toString();
|
||||||
|
private String description;
|
||||||
|
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 Accessibility accessibility;
|
||||||
|
private boolean notSaveHistory;
|
||||||
|
|
||||||
|
private AnswerSavePreservable<D> preservable;
|
||||||
|
private String key;
|
||||||
|
private Pusher<D> pusher;
|
||||||
|
private PreservableData<D, M> preservableData;
|
||||||
|
private boolean hidden;
|
||||||
|
private CheckSave<M> checkSave;
|
||||||
|
|
||||||
|
private Builder() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder<M, D> name(String name) {
|
||||||
|
this.name = name;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder<M, D> description(String description) {
|
||||||
|
this.description = description;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder<M, D> triggerWords(Set<KeyWord> val) {
|
||||||
|
if (Checker.checkNull(triggerWords)) {
|
||||||
|
triggerWords = new HashSet<>();
|
||||||
|
}
|
||||||
|
triggerWords.addAll(val);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder<M, D> triggerWord(KeyWord val) {
|
||||||
|
if (Checker.checkNull(triggerWords)) {
|
||||||
|
triggerWords = new HashSet<>();
|
||||||
|
}
|
||||||
|
triggerWords.add(val);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder<M, D> 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<M, D> triggerWord(String val) {
|
||||||
|
if (Checker.checkNull(triggerWords)) {
|
||||||
|
triggerWords = new HashSet<>();
|
||||||
|
}
|
||||||
|
triggerWords.add(KeyWord.of(val));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder<M, D> triggerPhrase(String... val) {
|
||||||
|
if (Checker.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<M, D> 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<M, D> triggerCheck(Predicate<M> trigger) {
|
||||||
|
triggerCheck = trigger;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder<M, D> matchThreshold(Integer val) {
|
||||||
|
matchThreshold = val;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder<M, D> priority(Integer val) {
|
||||||
|
priority = val;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder<M, D> next(MainUnit<M> val) {
|
||||||
|
if (Checker.checkNull(nextUnits)) {
|
||||||
|
nextUnits = new HashSet<>();
|
||||||
|
}
|
||||||
|
nextUnits.add(val);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder<M, D> preservable(AnswerSavePreservable<D> val) {
|
||||||
|
this.preservable = val;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder<M, D> key(String val) {
|
||||||
|
this.key = val;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder<M, D> pusher(Pusher<D> val) {
|
||||||
|
this.pusher = val;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder<M, D> preservableData(PreservableData<D, M> val) {
|
||||||
|
this.preservableData = val;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder<M, D> hidden(boolean val) {
|
||||||
|
this.hidden = val;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder<M, D> checkSave(CheckSave<M> val) {
|
||||||
|
this.checkSave = val;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder<M, D> accessibility(Accessibility val) {
|
||||||
|
accessibility = val;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder<M, D> notSaveHistory() {
|
||||||
|
notSaveHistory = true;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AnswerSave<M, D> build() {
|
||||||
|
// Inspector.isNotNull(preservable, "Не указан репозиторий для сохранения формы пользователя");
|
||||||
|
// if (Checker.checkNull(pusher)) {
|
||||||
|
// Inspector.isNotNull(preservableData, "Не указаны данные для сохранения");
|
||||||
|
// isNotNull(key, "Не указан ключ для сохранения");
|
||||||
|
// }
|
||||||
|
return new AnswerSave<>(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,14 +1,14 @@
|
|||||||
package dev.struchkov.godfather.context.domain.unit;
|
package dev.struchkov.godfather.simple.core.unit;
|
||||||
|
|
||||||
import dev.struchkov.autoresponder.entity.KeyWord;
|
import dev.struchkov.autoresponder.entity.KeyWord;
|
||||||
import dev.struchkov.godfather.context.domain.BoxAnswer;
|
import dev.struchkov.godfather.main.core.unit.TypeUnit;
|
||||||
import dev.struchkov.godfather.context.domain.TypeUnit;
|
import dev.struchkov.godfather.main.core.unit.UnitActiveType;
|
||||||
import dev.struchkov.godfather.context.domain.content.Message;
|
import dev.struchkov.godfather.main.domain.BoxAnswer;
|
||||||
import dev.struchkov.godfather.context.exception.UnitConfigException;
|
import dev.struchkov.godfather.main.domain.content.Message;
|
||||||
import dev.struchkov.godfather.context.service.Accessibility;
|
import dev.struchkov.godfather.simple.context.service.Accessibility;
|
||||||
import dev.struchkov.godfather.context.service.sender.Sending;
|
import dev.struchkov.godfather.simple.context.service.Sending;
|
||||||
import dev.struchkov.godfather.context.service.usercode.Insert;
|
import dev.struchkov.godfather.simple.core.unit.func.Insert;
|
||||||
import dev.struchkov.godfather.context.service.usercode.ProcessingData;
|
import dev.struchkov.godfather.simple.core.unit.func.ProcessingData;
|
||||||
|
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -22,8 +22,6 @@ import java.util.function.Supplier;
|
|||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import static dev.struchkov.haiti.utils.Inspector.isNotNull;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Используется для отправки ответа пользователю.
|
* Используется для отправки ответа пользователю.
|
||||||
*
|
*
|
||||||
@ -128,23 +126,23 @@ public class AnswerText<M extends Message> extends MainUnit<M> {
|
|||||||
public Builder<M> processing(Consumer<M> answer) {
|
public Builder<M> processing(Consumer<M> answer) {
|
||||||
this.boxAnswer = message -> {
|
this.boxAnswer = message -> {
|
||||||
answer.accept(message);
|
answer.accept(message);
|
||||||
return Optional.empty();
|
return null;
|
||||||
};
|
};
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Builder<M> answer(Function<M, BoxAnswer> answer) {
|
public Builder<M> answer(Function<M, BoxAnswer> answer) {
|
||||||
this.boxAnswer = message -> Optional.of(answer.apply(message));
|
this.boxAnswer = message -> Optional.ofNullable(answer.apply(message));
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Builder<M> answer(BoxAnswer answer) {
|
public Builder<M> answer(BoxAnswer answer) {
|
||||||
this.boxAnswer = message -> Optional.of(answer);
|
this.boxAnswer = message -> Optional.ofNullable(answer);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Builder<M> answer(Supplier<BoxAnswer> answer) {
|
public Builder<M> answer(Supplier<BoxAnswer> answer) {
|
||||||
this.boxAnswer = message -> Optional.of(answer.get());
|
this.boxAnswer = message -> Optional.ofNullable(answer.get());
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -255,7 +253,7 @@ public class AnswerText<M extends Message> extends MainUnit<M> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public AnswerText<M> build() {
|
public AnswerText<M> build() {
|
||||||
isNotNull(boxAnswer, UnitConfigException.unitConfigException("BoxAnswer обязательный параметр юнита"));
|
// isNotNull(boxAnswer, UnitConfigException.unitConfigException("BoxAnswer обязательный параметр юнита"));
|
||||||
return new AnswerText<>(this);
|
return new AnswerText<>(this);
|
||||||
}
|
}
|
||||||
|
|
@ -1,9 +1,10 @@
|
|||||||
package dev.struchkov.godfather.context.domain.unit;
|
package dev.struchkov.godfather.simple.core.unit;
|
||||||
|
|
||||||
import dev.struchkov.autoresponder.entity.KeyWord;
|
import dev.struchkov.autoresponder.entity.KeyWord;
|
||||||
import dev.struchkov.autoresponder.entity.Unit;
|
import dev.struchkov.autoresponder.entity.Unit;
|
||||||
import dev.struchkov.godfather.context.domain.content.Message;
|
import dev.struchkov.godfather.main.core.unit.UnitActiveType;
|
||||||
import dev.struchkov.godfather.context.service.Accessibility;
|
import dev.struchkov.godfather.main.domain.content.Message;
|
||||||
|
import dev.struchkov.godfather.simple.context.service.Accessibility;
|
||||||
|
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
@ -0,0 +1,33 @@
|
|||||||
|
package dev.struchkov.godfather.simple.core.unit;
|
||||||
|
|
||||||
|
import dev.struchkov.godfather.main.domain.content.Message;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Сущность инкапсулирует в себе данные, необходимые для обработки сценария.
|
||||||
|
*
|
||||||
|
* @param <U> Тип юнита
|
||||||
|
* @param <M> Тип сообщения
|
||||||
|
*/
|
||||||
|
public class UnitRequest<U extends MainUnit, M extends Message> {
|
||||||
|
|
||||||
|
private final U unit;
|
||||||
|
private final M message;
|
||||||
|
|
||||||
|
private UnitRequest(U unit, M message) {
|
||||||
|
this.unit = unit;
|
||||||
|
this.message = message;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <U extends MainUnit<M>, M extends Message> UnitRequest<U, M> of(U mainUnit, M message) {
|
||||||
|
return new UnitRequest<>(mainUnit, message);
|
||||||
|
}
|
||||||
|
|
||||||
|
public U getUnit() {
|
||||||
|
return unit;
|
||||||
|
}
|
||||||
|
|
||||||
|
public M getMessage() {
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,164 @@
|
|||||||
|
package dev.struchkov.godfather.simple.core.unit.cmd;
|
||||||
|
|
||||||
|
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.content.Message;
|
||||||
|
import dev.struchkov.godfather.simple.core.unit.MainUnit;
|
||||||
|
import dev.struchkov.haiti.utils.Checker;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.UUID;
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
public class ReplaceCmd<M extends Message> extends MainUnit<M> {
|
||||||
|
|
||||||
|
private final MainUnit thisUnit;
|
||||||
|
|
||||||
|
private ReplaceCmd(Builder<M> builder) {
|
||||||
|
super(
|
||||||
|
builder.name,
|
||||||
|
builder.description,
|
||||||
|
builder.triggerWords,
|
||||||
|
builder.triggerPhrases,
|
||||||
|
builder.triggerCheck,
|
||||||
|
builder.triggerPatterns,
|
||||||
|
builder.matchThreshold,
|
||||||
|
builder.priority,
|
||||||
|
new HashSet<>(),
|
||||||
|
builder.activeType,
|
||||||
|
true,
|
||||||
|
null,
|
||||||
|
TypeUnit.REPLACE_CMD
|
||||||
|
);
|
||||||
|
this.thisUnit = builder.thisUnit;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <M extends Message> Builder<M> builder() {
|
||||||
|
return new Builder<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public MainUnit getThisUnit() {
|
||||||
|
return thisUnit;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final class Builder<M extends Message> {
|
||||||
|
private String name = UUID.randomUUID().toString();
|
||||||
|
private String description;
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
private MainUnit thisUnit;
|
||||||
|
|
||||||
|
private Builder() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder<M> name(String name) {
|
||||||
|
this.name = name;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder<M> description(String description) {
|
||||||
|
this.description = description;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder<M> triggerWords(Set<KeyWord> val) {
|
||||||
|
if (Checker.checkNull(triggerWords)) {
|
||||||
|
triggerWords = new HashSet<>();
|
||||||
|
}
|
||||||
|
triggerWords.addAll(val);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder<M> triggerWord(KeyWord val) {
|
||||||
|
if (Checker.checkNull(triggerWords)) {
|
||||||
|
triggerWords = new HashSet<>();
|
||||||
|
}
|
||||||
|
triggerWords.add(val);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
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<M> triggerWord(String val) {
|
||||||
|
if (Checker.checkNull(triggerWords)) {
|
||||||
|
triggerWords = new HashSet<>();
|
||||||
|
}
|
||||||
|
triggerWords.add(KeyWord.of(val));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
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<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<M> triggerCheck(Predicate<M> trigger) {
|
||||||
|
triggerCheck = trigger;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder<M> matchThreshold(Integer val) {
|
||||||
|
matchThreshold = val;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder<M> priority(Integer val) {
|
||||||
|
priority = val;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder<M> activeType(UnitActiveType val) {
|
||||||
|
activeType = val;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder<M> thisUnit(MainUnit val) {
|
||||||
|
thisUnit = val;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ReplaceCmd<M> build() {
|
||||||
|
return new ReplaceCmd<>(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,11 +1,11 @@
|
|||||||
package dev.struchkov.godfather.context.domain.unit.cmd;
|
package dev.struchkov.godfather.simple.core.unit.cmd;
|
||||||
|
|
||||||
import dev.struchkov.autoresponder.entity.KeyWord;
|
import dev.struchkov.autoresponder.entity.KeyWord;
|
||||||
import dev.struchkov.godfather.context.domain.TypeUnit;
|
import dev.struchkov.godfather.exception.UnitConfigException;
|
||||||
import dev.struchkov.godfather.context.domain.content.Message;
|
import dev.struchkov.godfather.main.core.unit.TypeUnit;
|
||||||
import dev.struchkov.godfather.context.domain.unit.MainUnit;
|
import dev.struchkov.godfather.main.core.unit.UnitActiveType;
|
||||||
import dev.struchkov.godfather.context.domain.unit.UnitActiveType;
|
import dev.struchkov.godfather.main.domain.content.Message;
|
||||||
import dev.struchkov.godfather.context.exception.UnitConfigException;
|
import dev.struchkov.godfather.simple.core.unit.MainUnit;
|
||||||
|
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
@ -0,0 +1,10 @@
|
|||||||
|
package dev.struchkov.godfather.simple.core.unit.func;
|
||||||
|
|
||||||
|
import dev.struchkov.godfather.main.domain.content.Message;
|
||||||
|
|
||||||
|
@FunctionalInterface
|
||||||
|
public interface CheckData<C extends Message> {
|
||||||
|
|
||||||
|
boolean checked(C content);
|
||||||
|
|
||||||
|
}
|
@ -1,7 +1,7 @@
|
|||||||
package dev.struchkov.godfather.context.service.save;
|
package dev.struchkov.godfather.simple.core.unit.func;
|
||||||
|
|
||||||
import dev.struchkov.godfather.context.domain.content.Message;
|
import dev.struchkov.godfather.main.domain.content.Message;
|
||||||
import dev.struchkov.godfather.context.domain.unit.MainUnit;
|
import dev.struchkov.godfather.simple.core.unit.MainUnit;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TODO: Добавить описание интерфейса.
|
* TODO: Добавить описание интерфейса.
|
@ -1,4 +1,4 @@
|
|||||||
package dev.struchkov.godfather.context.service.usercode;
|
package dev.struchkov.godfather.simple.core.unit.func;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
@ -0,0 +1,10 @@
|
|||||||
|
package dev.struchkov.godfather.simple.core.unit.func;
|
||||||
|
|
||||||
|
import dev.struchkov.godfather.main.domain.content.Message;
|
||||||
|
|
||||||
|
@FunctionalInterface
|
||||||
|
public interface PreservableData<D, M extends Message> {
|
||||||
|
|
||||||
|
D getData(M content);
|
||||||
|
|
||||||
|
}
|
@ -1,7 +1,6 @@
|
|||||||
package dev.struchkov.godfather.core.service.save.data;
|
package dev.struchkov.godfather.simple.core.unit.func;
|
||||||
|
|
||||||
import dev.struchkov.godfather.context.domain.content.Message;
|
import dev.struchkov.godfather.main.domain.content.Message;
|
||||||
import dev.struchkov.godfather.context.service.save.PreservableData;
|
|
||||||
import dev.struchkov.haiti.utils.Pair;
|
import dev.struchkov.haiti.utils.Pair;
|
||||||
|
|
||||||
/**
|
/**
|
@ -1,6 +1,6 @@
|
|||||||
package dev.struchkov.godfather.context.service.usercode;
|
package dev.struchkov.godfather.simple.core.unit.func;
|
||||||
|
|
||||||
import dev.struchkov.godfather.context.domain.BoxAnswer;
|
import dev.struchkov.godfather.main.domain.BoxAnswer;
|
||||||
|
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
@ -1,8 +1,8 @@
|
|||||||
package dev.struchkov.godfather.context.utils;
|
package dev.struchkov.godfather.simple.core.utils;
|
||||||
|
|
||||||
import dev.struchkov.godfather.context.domain.BoxAnswer;
|
import dev.struchkov.godfather.main.domain.BoxAnswer;
|
||||||
import dev.struchkov.godfather.context.domain.content.Message;
|
import dev.struchkov.godfather.main.domain.content.Message;
|
||||||
import dev.struchkov.godfather.context.service.sender.Sending;
|
import dev.struchkov.godfather.simple.context.service.Sending;
|
||||||
|
|
||||||
import static dev.struchkov.haiti.utils.Exceptions.utilityClass;
|
import static dev.struchkov.haiti.utils.Exceptions.utilityClass;
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user