示例#1
0
        private static Activity RequestToActivity(AlexaRequestBody skillRequest)
        {
            var system = skillRequest.Context.System;

            var activity = new Activity
            {
                ChannelId    = "alexa",
                ServiceUrl   = $"{system.ApiEndpoint}?token ={system.ApiAccessToken}",
                Recipient    = new ChannelAccount(system.Application.ApplicationId, "skill"),
                From         = new ChannelAccount(system.User.UserId, "user"),
                Conversation = new ConversationAccount(false, "conversation", skillRequest.Session.SessionId),
                Type         = skillRequest.Request.Type,
                Id           = skillRequest.Request.RequestId,
                Timestamp    = DateTime.ParseExact(skillRequest.Request.Timestamp, "MM/dd/yyyy HH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal),
                Locale       = skillRequest.Request.Locale
            };

            switch (activity.Type)
            {
            case AlexaRequestTypes.IntentRequest:
                activity.Value = (skillRequest.Request as AlexaIntentRequest)?.Intent;
                activity.Code  = (skillRequest.Request as AlexaIntentRequest)?.DialogState.ToString();
                break;

            case AlexaRequestTypes.SessionEndedRequest:
                activity.Code  = (skillRequest.Request as AlexaSessionEndRequest)?.Reason;
                activity.Value = (skillRequest.Request as AlexaSessionEndRequest)?.Error;
                break;
            }

            activity.ChannelData = skillRequest;

            return(activity);
        }
        public async Task <AlexaResponseBody> ProcessActivity(AlexaRequestBody alexaRequest, AlexaOptions alexaOptions, BotCallbackHandler callback)
        {
            TurnContext context = null;

            try
            {
                Options = alexaOptions;

                var activity = RequestToActivity(alexaRequest);
                BotAssert.ActivityNotNull(activity);

                context = new TurnContext(this, activity);

                if (alexaRequest.Session.Attributes != null && alexaRequest.Session.Attributes.Any())
                {
                    context.TurnState.Add("AlexaSessionAttributes", alexaRequest.Session.Attributes);
                }
                else
                {
                    context.TurnState.Add("AlexaSessionAttributes", new Dictionary <string, string>());
                }

                context.TurnState.Add("AlexaResponseDirectives", new List <IAlexaDirective>());

                Responses = new Dictionary <string, List <Activity> >();

                await base.RunPipelineAsync(context, callback, default(CancellationToken)).ConfigureAwait(false);

                var key = $"{activity.Conversation.Id}:{activity.Id}";

                try
                {
                    AlexaResponseBody response = null;
                    var activities             = Responses.ContainsKey(key) ? Responses[key] : new List <Activity>();
                    response = CreateResponseFromLastActivity(activities, context);
                    response.SessionAttributes = context.AlexaSessionAttributes();
                    return(response);
                }
                finally
                {
                    if (Responses.ContainsKey(key))
                    {
                        Responses.Remove(key);
                    }
                }
            }
            catch (Exception ex)
            {
                await alexaOptions.OnTurnError(context, ex);

                throw;
            }
        }