예제 #1
0
        public async Task <ActionResult> Post([FromBody] Activity activity, string partner, string context, string channel, string userId, bool dummyMode, [FromServices] ChatWeb.Services.ChatEngine chatEngine)
        {
            //set the property to our new object
            log4net.LogicalThreadContext.Properties["interactionId"] = Guid.NewGuid().ToString();
            log4net.LogicalThreadContext.Properties["clientIp"]      = NetworkHelpers.GetClientIP(HttpContext);
            log4net.LogicalThreadContext.Properties["SessionData"]   = null;

            if (String.IsNullOrEmpty(channel))
            {
                channel = activity.ChannelId;
            }

            try
            {
                logger.DebugFormat("Internal: MessagesController Request: {0}", JsonConvert.SerializeObject(activity));

                Activity reply = null;

                switch (activity.Type)
                {
                case ActivityTypes.Message:
                {
                    if (String.Equals(activity.Text, "-help", StringComparison.OrdinalIgnoreCase))
                    {
                        reply = activity.CreateReply(HelpText, "en");
                    }
                    else
                    {
                        reply = await ProcessUserMessage(activity, partner, context, channel, userId, dummyMode, chatEngine);
                    }
                    break;
                }

                case ActivityTypes.ConversationUpdate:
                    if (!activity.MembersAdded.Any(m => m.Id != activity.Recipient.Id))
                    {
                        break;
                    }

                    // Start new chat
                    reply = await ProcessUserMessage(activity, partner, context, channel, userId, dummyMode, chatEngine);

                    break;

                default:
                    HandleSystemMessage(activity);
                    break;
                }

                if (reply != null)
                {
                    ConnectorClient connectorClient = new ConnectorClient(new Uri(activity.ServiceUrl));
                    await connectorClient.Conversations.ReplyToActivityAsync(reply);
                }
            }
            catch (Exception ex)
            {
                logger.Error("Internal: MessagesController.Post", ex);
            }

            return(Ok());
        }
예제 #2
0
        public async Task <ActionResult <ChatResponse> > Post([FromServices] ChatWeb.Services.ChatEngine chatEngine, [FromBody] ChatRequest chatRequest, string partner = null)
        {
            // NOTE: We are requiring the partner in the URL so an ALB can easily parse the partner for proper routing through proxies.
            if (chatRequest == null)
            {
                logger.Debug("Chat request is null");
                return(BadRequest());
            }

            if (chatRequest.ClientData == null)
            {
                chatRequest.ClientData = new ChatClientData();
            }

            chatRequest.ClientData.ClientIp  = NetworkHelpers.GetClientIP(HttpContext);
            chatRequest.ClientData.UserAgent = HttpContext.Request.Headers["User-Agent"];

            // Ignore debug data if not allowed
            if (!chatConfiguration.AllowDebugMode)
            {
                chatRequest.DebugData = null;
            }

            bool trustedClient = (!String.IsNullOrEmpty(chatConfiguration.TrustedClientKey) && (HttpContext.Request.Headers["x-api-key"] == chatConfiguration.TrustedClientKey));

            if ((chatRequest.TrustedClientData != null) && !trustedClient)
            {
                logger.WarnFormat("TrustedClientData was present but stripped since the API key did not match.");
                chatRequest.TrustedClientData = null;
            }

            log4net.LogicalThreadContext.Properties["interactionId"] = Guid.NewGuid().ToString();
            log4net.LogicalThreadContext.Properties["clientIp"]      = chatRequest.ClientData.ClientIp;

            if (String.IsNullOrEmpty(partner) || partner != chatRequest.Partner)
            {
                logger.Warn("Request does not contain the partner in URL parameter");
                //return BadRequest("partner is required in URL");
            }

            try
            {
                ChatResponse response = null;

                // Make initial call to get chat Id if missing and userinput was sent
                if (String.IsNullOrEmpty(chatRequest.ChatId) && !String.IsNullOrEmpty(chatRequest.UserInput))
                {
                    response = await chatEngine.HandleRequest(chatRequest);

                    chatRequest.ChatId = response.ChatId;
                }

                if (response == null || String.IsNullOrEmpty(response.Status.Error))
                {
                    response = await chatEngine.HandleRequest(chatRequest);
                }

                if (!trustedClient)
                {
                    response.TrustedClientData = null;
                }

                return(Ok(response));
            }
            catch (Exception ex)
            {
                logger.Error("Post failed.", ex);
            }

            return(BadRequest());
        }