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; } }