Принятие вложений в диалоге с водопадом и их локальное хранение в среде ботов v4 - PullRequest
1 голос
/ 11 октября 2019

Я пытался добавить функциональность для получения входных вложений от пользователя, в основном пытаясь объединить образец бота processing-attachments из инфраструктуры ботов и мой собственный диалог водопада.

Но как получить доступ к функциям iturncontext в диалоговом окне водопада? ,Ниже приведено объяснение моего кода.

Один из моих шагов с водопадом:

private async Task<DialogTurnResult> DescStepAsync2(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{


    stepContext.Values["Title"] = (string)stepContext.Result;
    await stepContext.Context.SendActivityAsync(MessageFactory.Text("upload a image"), cancellationToken);

    var activity = stepContext.Context.Activity;
    if (activity.Attachments != null && activity.Attachments.Any())
    {

        Activity reply = (Activity)HandleIncomingAttachment(stepContext.Context.Activity);
        return await stepContext.PromptAsync(nameof(TextPrompt), new PromptOptions { Prompt = reply }, cancellationToken);
    }
    else
    {
        var reply = MessageFactory.Text("else image condition thrown");
        //  reply.Attachments.Add(Cards.GetHeroCard().ToAttachment());
        return await stepContext.PromptAsync(nameof(TextPrompt), new PromptOptions { Prompt = reply }, cancellationToken);
    }
}

Вот функция HandleIncomingAttachment, которую я позаимствовал из примеров создателей ботов, указанных выше.

private static IMessageActivity HandleIncomingAttachment(IMessageActivity activity)
{
    string replyText = string.Empty;
    foreach (var file in activity.Attachments)
    {
        // Determine where the file is hosted.
        var remoteFileUrl = file.ContentUrl;

        // Save the attachment to the system temp directory.
        var localFileName = Path.Combine(Path.GetTempPath(), file.Name);

        // Download the actual attachment
        using (var webClient = new WebClient())
        {
            webClient.DownloadFile(remoteFileUrl, localFileName);
        }

        replyText += $"Attachment \"{file.Name}\"" +
                     $" has been received and saved to \"{localFileName}\"\r\n";
    }

    return MessageFactory.Text(replyText);
}

Вот расшифровка разговора: Transcript bot framework

РЕДАКТИРОВАТЬ: я отредактировал свой код для этого, он все еще не ждет, пока я загружу вложение. Просто завершаетшаг.

private async Task<DialogTurnResult> DescStepAsync2(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{
    stepContext.Values["Desc"] = (string)stepContext.Result;
    var reply = (Activity)ProcessInput(stepContext.Context);
    return await stepContext.PromptAsync(nameof(AttachmentPrompt), new PromptOptions { Prompt = reply }, cancellationToken);
}

функция ввода процесса:

private static IMessageActivity ProcessInput(ITurnContext turnContext)
{
    var activity = turnContext.Activity;
    IMessageActivity reply = null;

    if (activity.Attachments != null && activity.Attachments.Any())
    {
        // We know the user is sending an attachment as there is at least one item .
        // in the Attachments list.
        reply = HandleIncomingAttachment(activity);
    }
    else
    {
        reply = MessageFactory.Text("No attachement detected ");
        // Send at attachment to the user.              
    }
    return reply;
}

Ответы [ 2 ]

1 голос
/ 18 октября 2019

так что я понял это, благодаря этому посту: github.com/microsoft/botframework-sdk/issues/5312

как мой код выглядит сейчас:

объявление приглашения вложения:

 public class CancelDialog : ComponentDialog
{

    private static string attachmentPromptId = $"{nameof(CancelDialog)}_attachmentPrompt";
    public CancelDialog()
        : base(nameof(CancelDialog))
    {

        // This array defines how the Waterfall will execute.
        var waterfallSteps = new WaterfallStep[]
        {
            TitleStepAsync,
            DescStepAsync,
          //  AskForAttachmentStepAsync,
            UploadAttachmentAsync,
            UploadCodeAsync,
            SummaryStepAsync,

        };

        // Add named dialogs to the DialogSet. These names are saved in the dialog state.
        AddDialog(new WaterfallDialog(nameof(WaterfallDialog), waterfallSteps));
        AddDialog(new TextPrompt(nameof(TextPrompt)));
        AddDialog(new NumberPrompt<int>(nameof(NumberPrompt<int>), AgePromptValidatorAsync));
        AddDialog(new ChoicePrompt(nameof(ChoicePrompt)));
        AddDialog(new ConfirmPrompt(nameof(ConfirmPrompt)));
        AddDialog(new AttachmentPrompt(attachmentPromptId));

запросить подсказку вложения в водопаде:

private async Task<DialogTurnResult> UploadAttachmentAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
    {

        stepContext.Values["desc"] = (string)stepContext.Result;
     //   if ((bool)stepContext.Result)
        {
            return await stepContext.PromptAsync(
        attachmentPromptId,
        new PromptOptions
        {
            Prompt = MessageFactory.Text($"Can you upload a file?"),
        });
        }
        //else
        //{
        //    return await stepContext.NextAsync(-1, cancellationToken);
        //}

    }

обработка файла и его сохранение:

private async Task<DialogTurnResult> UploadCodeAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
    {
        List<Attachment> attachments = (List<Attachment>)stepContext.Result;
        string replyText = string.Empty;
        foreach (var file in attachments)
        {
            // Determine where the file is hosted.
            var remoteFileUrl = file.ContentUrl;

            // Save the attachment to the system temp directory.
            var localFileName = Path.Combine(Path.GetTempPath(), file.Name);

            // Download the actual attachment
            using (var webClient = new WebClient())
            {
                webClient.DownloadFile(remoteFileUrl, localFileName);
            }

            replyText += $"Attachment \"{file.Name}\"" +
                         $" has been received and saved to \"{localFileName}\"\r\n";
        }}

надеюсь, что у вас есть идея. спасибо @Кайл и @ Майкл

0 голосов
/ 16 октября 2019

A WaterfallStepContext наследуется от DialogContext, и поэтому к ITurnContext можно получить доступ через его свойство Context. Отправленный вами код шага водопада уже делает это, когда использует stepContext.Context.SendActivityAsync или stepContext.Context.Activity.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...