현재 IDialogContext 인스턴스를 재설정하거나 종료 (context.Done 사용)하고 새 인스턴스를 만들고 다른 기능에서 사용해야 할 필요가 있습니다. 인터페이스 인 IDialogContext와 같은 인스턴스를 어떻게 만들 수 있습니까? 가능한가? Microsoft Bot Framework에서 새 IDialogContext 인스턴스를 만드는 방법은 무엇입니까?
이
오전 함수 "selfredirect"private async Task ApprovalConfirm(IDialogContext context, IAwaitable<IMessageActivity> result)
{
var message = await result;
xxxticket xxxticketobject = new xxxticket();
if (message.Text.Contains("yes"))
{
xxxticketobject = context.ConversationData.Get<xxxticket>("xxxcard");
if (xxxticketobject.action == "Approve")
await context.PostAsync("Accepted");
else
await context.PostAsync("Rejected");
context.ConversationData.RemoveValue("xxxfinalcard");
context.Reset();// *This is what I want to do...clear context and then call the following function*
await SelfRedirect(context, context.UserData.Get<string>("CurrentQuery"), "Approval");
}
else if (message.Text == "no")
{
await context.PostAsync("Thank you");
context.Done(context);
}
else
await SelfRedirect(context, context.UserData.Get<string>("CurrentQuery"), null);
}
selfredirect 기능
public static async Task SelfRedirect(IDialogContext context, string msg, string intent=null)
{
try
{
DialogLuis LUISDialog = new DialogLuis();
IMessageActivity message = context.MakeMessage();
message.Text = msg;
var tasks = LUISDialog.services.Select(s => s.QueryAsync(message.Text, context.CancellationToken)).ToArray();
var results = await Task.WhenAll(tasks);
var winners = from result in results.Select((value, index) => new { value, index })
let resultWinner = LUISDialog.BestIntentFrom(result.value)
where resultWinner != null
select new LuisServiceResult(result.value, resultWinner, LUISDialog.services[result.index]);
if (intent != null)
{
winners = from result in results.Select((value, index) => new { value, index })
let resultWinner = new IntentRecommendation(intent)
where resultWinner != null
select new LuisServiceResult(result.value, resultWinner, LUISDialog.services[result.index]);
}
var winner = LUISDialog.BestResultFrom(winners);
if (winner == null)
{
throw new InvalidOperationException("No winning intent selected from Luis results.");
}
if (winner.Result.Dialog?.Status == DialogResponse.DialogStatus.Question)
{
var childDialog = await LUISDialog.MakeLuisActionDialog(winner.LuisService,
winner.Result.Dialog.ContextId,
winner.Result.Dialog.Prompt);
context.Call(childDialog, LUISDialog.LuisActionDialogFinished);
}
else
{
IAwaitable<IMessageActivity> item = null;
await LUISDialog.DispatchToIntentHandler(context, item, winner.BestIntent, winner.Result);
}
}
catch (Exception ex) { CommonMethods.LogTime("", ex, context); }
}
전화를 시도되는 기능입니다하지만 난을 사용하지 못할 스택이 비어있을 때 재설정 후 기능을 리디렉션합니다. 내가
private async Task ApprovalConfirm(IDialogContext context, IAwaitable<IMessageActivity> result)
{
var message = await result;
if (message.Text == "no")
{
await context.PostAsync("Thank you");
context.Done(context);
}
else if (message.Text == "yes")
{
await context.PostAsync("yes");
context.Done(context);
}
else
{
context.Wait(MessageReceived);
}
}
내 사용 사례처럼이 작은 기능을 대신 context.wait의 selfredirect 기능 (MessageReceived)을 사용했다 왜
이 경우 사용자 유형 예 다음 봇해야, 내가 자세히 설명하자 도와주세요 return yes, 사용자가 no를 입력하면 bot은 고맙습니다. 사용자가 "Hi"를 입력하면 봇은 새로운 Greeting intent에 도달하여 Hi 사용자를 반환 할 Luis를 통해 Hi에 대한 답을 찾아야합니다. 여기
I 사용자 context.Wait (MessageReceived는) 다음 봇은 단순히 사용자대화 상자의 구조에서 다음 쿼리를 기다릴 것인지!
[LuisIntent("Approval")]
public async Task Approval(IDialogContext context, LuisResult result)
{
context.ConversationData.SetValue("currentIntent", "Approval");
.
.
.
PromptDialog.Choice<string>(context, ApprovalList, ...);
}
private async Task ApprovalList(IDialogContext context, IAwaitable<string> result)
{
try
{
var request_type = await result;
.
.
context.Wait(ApprovalResponse);
}
}
catch (Exception ex)
{
CommonMethods.LogTime("ApprovalList", ex, context);
}
}
private async Task ApprovalResponse(IDialogContext context, IAwaitable<IMessageActivity> result)
{
var message = await result;
.
.
.
context.Wait(AfterApprovalComment);
}
catch (Exception ex)
{
CommonMethods.LogTime("ApprovalResponse", ex, context);
await context.PostAsync("out of approvals...");
context.Done(context);
}
}
private async Task ApprovalConfirm(IDialogContext context, IAwaitable<IMessageActivity> result)
{
var message = await result;
.
.
.
await SelfRedirect(context, context.UserData.Get<string>("CurrentQuery"), "Approval");
}
현재 함수에서 인스턴스를 생성하고 싶습니다. 여러 대화 상자를 처리하고 있기 때문에 그 끝에서 Idialogcontext 인스턴스도 기대하는 다른 함수로 리디렉션해야합니다. –
코드를 표시하십시오. 그렇지 않으면 수행하려는 작업을 이해하기가 정말로 어렵습니다. –
@EzequielJadib 안녕하세요. 코드를 추가했습니다 .. :) –