В редакторе диалога необходимо указать название диалога и добавить как минимум 1 элемент диалога (перетащить мышкой элемент из списка элементов на панели справа).
При необходимости данный диалог можно добавить в одну или несколько групп диалогов.
Группы диалогов создаются на панели "Группы диалогов".
В простом варианте диалог - это набор текста и кнопок, которые могут отображать другие диалоги, но в более сложном алгоритме, где нужны, например, проверки введённых пользователем данных, нужно указывать реализацию в дин.коде в виде класса-реализации интерфейса ru.bitel.bgbilling.modules.botmanager.common.bean.DialogProcessing
/**
* Реализация действий до отображения диалога и после
*/
public interface DialogProcessing
{
/**
* Ключ для хранение id договора, который будет сохранён в кэше бота, как авторизованный договор
*/
String CONTRACT_ID = "contractId";
/**
* Сообщение об ошибке
*/
String ERROR_MESSAGE = "responseErrorMessage";
/** Удалить привязку договора к чату */
String REMOVE_CONTRACT = "idContractRemove";
/** ID нового диалога, на который нужно перенаправить пользователя */
String NEXT_DIALOG_ID = "nextDialogId";
/**
* Макросы для элементов диалога с типом Текст.
* Для добавления нужно создать JSONObject, в котором ключи должныть быть самими макросами,
* а значение - содержимое, которое нужно установить
*/
String MACROS = "macros";
/**
* Предобработка перед отображением диалога пользователю
* @param botData пользовательские данные для определённого диалога
*/
void preDialog( ServerContext serverContext, JSONObject botData )
throws BGException;
/**
* Обработка сообщений от пользователя в момент, когда диалог отображён на экране.
* @param botData пользовательские данные для определённого диалога
* @param inputTextOfUser данные от пользователя
*/
void processDialog( ServerContext serverContext, JSONObject botData, String inputTextOfUser )
throws BGException;
/**
* @return читабельное название данного класса для понятного отображения в интерфейсе модуя
*/
String title();
}
Свою реализацию указать для диалога можно в реакторе диалога, где после нажатия на "Выбрать класс-обработчик" будет отображена панель с списком классов из дин.кода, которые реализуют интерфейс DialogProcessing
Как пример реализации интерфейса DialogProcessing ниже приведён пример класса-реализации логики авторизации пользователя по названию договора. Данный класс отрабатывает после запроса названия договора от пользователя, полученный текст передаётся в метод processDialog(), в котором происходит поиск договора и в случае, если договор был найден, указывается, что следующим диалогом должен быть показан заранее созданный диалог с запросом пароля от личного кабинета.
package ru.bitel.bgbilling.modules.botmanager.dyn;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.json.JSONObject;
import ru.bitel.bgbilling.kernel.container.managed.ServerContext;
import ru.bitel.bgbilling.modules.botmanager.common.bean.DialogProcessing;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class AuthProcessing
implements DialogProcessing
{
private static final Logger logger = LogManager.getLogger();
/**
* ID диалога с запросом пароля для авторизации
*/
private final int REQUEST_PASS_DIALOG = 9;
/**
* ID диалога с ошибкой
*/
private final int ERROR_DIALOG = 8;
@Override
public void preDialog( ServerContext serverContext, JSONObject botData )
{
}
@Override
public void processDialog( ServerContext serverContext, JSONObject botData, String inputTextOfUser )
{
int cid = findContract( serverContext.getConnection(), inputTextOfUser );
if( cid > 0 )
{
botData.put( CONTRACT_ID, cid );
//если договор найден, то указываем, что следующим надо показать диалог с запросом пароля от ЛК
botData.put( NEXT_DIALOG_ID, REQUEST_PASS_DIALOG );
if( logger.isDebugEnabled() )
{
logger.debug( "Substring for search contract=" + inputTextOfUser + " Contract was find" );
}
}
else
{
botData.put( NEXT_DIALOG_ID, ERROR_DIALOG );
if( logger.isDebugEnabled() )
{
logger.debug( "Cannot to find contract for substring: " + inputTextOfUser );
}
}
}
//поиск договора по названию договора
private int findContract( Connection connection, String contractTitle )
{
int result = -1;
String query = "select id from contract where title like '%" + contractTitle + "%'";
try(Statement statement = connection.createStatement();
ResultSet rs = statement.executeQuery( query ))
{
if( rs.next() )
{
result = rs.getInt( "id" );
}
}
catch( SQLException ex )
{
logger.error( ex );
}
return result;
}
@Override
public String title()
{
return "Обработка авторизации";
}
}