Lettura del Contesto - RetiSpA/botler GitHub Wiki
La lettura del contesto avviene invece nel classe BotStateContextController, questa classe viene chiamata dallo ScenarioRecognizer, quando viene incontrato uno Scenario non propriamente riconosciuto, e quindi c'è bisogno di leggere i contesti precedenti per continuare la conversazione.
In questo metodo viene letto l'ultimo contesto presente nel CosmoDB dell'attuale conversazione, e in base al tipo di scenario si eseguirano determinate azioni.
public async static Task<IScenario> CheckBotState(IScenario scenario, BotlerAccessors accessors, ITurnContext turn, LuisServiceResult luisServiceResult)
{
var lastBotContext = await FindLastUsefulContextAsync(accessors, turn, scenario);
IScenario lastUsefulScenario = null;
if (lastBotContext != null)
{
lastUsefulScenario = ScenarioFactory.FactoryMethod(accessors, turn, lastBotContext.scenarioID, lastBotContext.TopIntent);
}
var userQuery = turn.Activity.Text;
// * (4) * // No context found
if (lastUsefulScenario is null)
{
return scenario;
}
// * (1) * // Authentication Phase.
if (AuthenticationHelper.MagicCodeFound(turn.Activity.Text) && lastUsefulScenario.ScenarioID.Equals(Autenticazione))
{
return ScenarioFactory.FactoryMethod(accessors, turn, Autenticazione, null);
}
// * (2) * // Asking the user for more info or continue/begin a dialog
if (ExecutionScenarios.Contains(lastUsefulScenario.ScenarioID))
{
scenario = await CheckLastExecutionScenario(scenario, (ExecutionScenario) lastUsefulScenario, userQuery, lastBotContext.UserQuery, accessors, turn,
luisServiceResult);
}
// * (3) * // Not enough entities to complete the user query.
if (DescriptionScenarios.Contains(lastUsefulScenario.ScenarioID))
{
scenario = CheckLastDescriptionScenario(scenario, (DescriptionScenario) lastUsefulScenario, accessors, turn, luisServiceResult);
}
return scenario;
}
Il contesto del bot viene ritornato dal metodo :
public static async Task<BotStateContext> FindLastUsefulContextAsync(BotlerAccessors accessors, ITurnContext turn, IScenario scenario)
{
string scenarioID = scenario.ScenarioID;
string convID = turn.Activity.From.Id;
MongoDBService MongoDB = new MongoDBService();
IList<BotStateContext> list = await MongoDB.GetAllBotStateByConvIDAsync(convID);
foreach(var bs in list)
{
if ((ExecutionScenarios.Contains(bs.scenarioID) || (DescriptionScenarios.Contains(bs.scenarioID))) && scenario.ScenarioID.Equals(Default))
{
var json = (JsonConvert.SerializeObject(bs));
return bs;
}
}
return null; // No context found
}
Il quale controllare se in questa conversazione è stato creato uno contesto diverso dallo Scenario Default, il quale è uno scenario dove non vengono eseguite azioni o raccolte entità, percui la conversazione manca di contesto, se non viene trovato uno scenario Esecutivo o Descrittivo.
Leggendo lo scenario si leggerano anche le entità raccolte in precedenza e si deciderà in base a queste se continuare la raccolta di entità o l'esecuzione dell'intento e quindi del dialogo a lui collegato.