मेरे पास एक बॉट है, जो डेटाबेस में किसी व्यक्ति की तलाश करेगा। यदि वह व्यक्ति एक जाना-पहचाना नाम नहीं है, तो मैं चाहता हूं कि बॉट फिर से पूछे: "नाम अज्ञात है, कृपया फिर से नाम दें"

यहां वे चरण दिए गए हैं जो मैंने अभी किए हैं:

public class MessagesController : ApiController
{
    /// <summary>
    /// POST: api/Messages
    /// Receive a message from a user and reply to it
    /// </summary>
    public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
    {
        await Conversation.SendAsync(activity, () => new RootDialog());   
    }
.... (more code here)

रूटडिअलॉग में:

   public async Task StartAsync(IDialogContext context)
   {
        context.Wait(this.MessageReceivedAsync);

    }
    public virtual async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result)
    {
        var message = await result;
        if (message.Text.ToLower().Contains("help") 
            || message.Text.ToLower().Contains("support") 
            || message.Text.ToLower().Contains("problem"))
        {
            await context.Forward(new SupportDialog(), this.ResumeAfterSupportDialog, message, CancellationToken.None);
        }
        else
        {
            context.Call(new SearchDialog(), this.ResumeAfterOptionDialog);
        }
    }

और सर्चडिअलॉग में:

public async Task StartAsync(IDialogContext context)
    {
        await context.PostAsync($"Hi {context.Activity.From.Name}, Looking for someone?.");
        var SearchFormDialog = FormDialog.FromForm(this.BuildSearchForm, FormOptions.PromptInStart);
        context.Call(SearchFormDialog, this.ResumeAfterSearchFormDialog);
    }


private IForm<SearchQuery> BuildSearchForm()
    {
        OnCompletionAsyncDelegate<SearchQuery> processSearch = async (context, persoon) =>
        {
            await context.PostAsync($"There we go...");
        };

        return new FormBuilder<SearchQuery>()
            .Field(nameof(SearchQuery.Name))
            .Message($"Just a second...")
            .AddRemainingFields()
            .OnCompletion(processSearch)
            .Build();
    }


private async Task ResumeAfterSearchFormDialog(IDialogContext context, IAwaitable<SearchQuery> result)
    {
        try
        {
            var searchQuery = await result;

            var found = await new BotDatabaseEntities().GetAllWithText(searchQuery.Name);
            var resultMessage = context.MakeMessage();

            var listOfPersons = foundPersons as IList<Person> ?? foundPersons.ToList();

            if (!listOfPersons.Any())
            {
                await context.PostASync($"No one found");
            }
            else if (listOfPersons.Count > 1)
            {
                resultMessage.AttachmentLayout = AttachmentLayoutTypes.List;
                resultMessage.Attachments = new List<Attachment>();
                this.ShowNames(context, listOfPersons.Select(foundPerson => foundPerson.FullName.ToString()).ToArray());
            }
            else
            {
                await OnePersonFound(context, listOfPersons.First(), resultMessage);
            }
        }
        catch (FormCanceledException ex)
        {
            string reply;
            reply = ex.InnerException == null ? "You have canceled the operation";
            await context.PostAsync(reply);
        }
    }

और यह SearchQuery है:

[Serializable]
public class SearchQuery
{
    [Prompt("Please give the {&} of the person your looking for.")]
    public string Name { get; set; }
}

अभी। जब मैं कोई ऐसा नाम देता हूं जो मौजूद नहीं है, तो मैं बातचीत को फिर से शुरू नहीं करना चाहता, लेकिन केवल यह कि बॉट इसके बाद फिर से सवाल पूछता है।

if (!listOfPersons.Any())
        {
            await context.PostASync($"No one found");
        }

वास्तव में कोई सुराग नहीं कि इसे कैसे ठीक किया जाए।

2
Rob Joosen 31 जिंदा 2017, 15:05
1
तो, आप SearchFormDialog को फिर से कॉल नहीं करना चाहते हैं?
 – 
Ezequiel Jadib
31 जिंदा 2017, 15:58
खैर, वास्तव में नहीं। क्योंकि तब संवाद फिर से शुरू होगा: - हाय ब्रायन, कृपया नाम दें। "जॉन डो" - नाम नहीं मिला। - हाय ब्रायन, कृपया नाम दें।
 – 
Rob Joosen
31 जिंदा 2017, 16:22

2 जवाब

हम्म, मैंने इसे अब इस तरह तय किया है:

if (!listOfPersons.Any())
            {
                await context.PostAsync($"Sorry, no one was found with this text");
                var SearchFormDialog = FormDialog.FromForm(this.BuildSearchForm, FormOptions.PromptInStart);
                context.Call(SearchFormDialog, this.ResumeAfterSearchFormDialog);
            }
0
Rob Joosen 31 जिंदा 2017, 16:30

आप सत्यापन प्रतिनिधि का उपयोग यह जांचने के लिए कर सकते हैं कि दिया गया नाम मान्य है या नहीं

private IForm<SampleForm> BuildFeedbackModelForm()
    {
        var builder = new FormBuilder<SampleForm>();
        return builder.Field(new FieldReflector<SampleForm>(nameof(SampleForm.Question))
                .SetType(typeof(string))
                .SetDefine(async (state, field) => await SetOptions(state, nameof(SampleForm.Answer), field))
                .SetValidate(async (state, value) => await ValidateFdResponseAsync(value, state, nameof(SampleForm.Answer)))).Build();

    }

    private async Task<bool> SetOptions(SampleForm state, string v, Field<SampleForm> field)
    {
    return true;
    }

    private async Task<ValidateResult> ValidateFdResponseAsync(object response, SyncfusionBotFeedbackForm state, string v)
    {
        bool isValid = false; // chcek if valid


        ValidateResult validateResult = new ValidateResult
        {
            IsValid = isValid,
            Value = isValid?locresult:null
        };
        if (!isValid)
            validateResult.Feedback = $"message to user.";
        return validateResult;
    }
0
Balaji R 23 फरवरी 2017, 20:55