public async Task <InternalModels.Dialog> GetResponseAsync(InternalModels.Request request)
        {
            var dialog = await _sessionsClientBalancer.Invoke(request.SessionId,
                                                              (sessionClient, context) => GetResponseInternalAsync(request, sessionClient, context), request.ScopeKey);

            return(dialog);
        }
        private async Task <InternalModels.Dialog> GetResponseInternalAsync(InternalModels.Request request, SessionsClient client, ScopeContext context)
        {
            var intentRequest = CreateQuery(request, context);

            bool.TryParse(context.Parameters["LogQuery"], out var isLogQuery);

            if (isLogQuery)
            {
                _log.Trace($"Request:{System.Environment.NewLine}{intentRequest.Serialize()}");
            }

            DetectIntentResponse intentResponse = await client.DetectIntentAsync(intentRequest);

            if (isLogQuery)
            {
                _log.Trace($"Response:{System.Environment.NewLine}{intentResponse.Serialize()}");
            }

            var queryResult = intentResponse.QueryResult;

            var response = _mapper.Map <InternalModels.Dialog>(queryResult);

            response.ScopeKey = context.Parameters["ProjectId"];

            return(response);
        }
        public async Task <InternalModels.Dialog> GetResponseAsync(string text, string sessionId, string requiredContext = null)
        {
            var request = new InternalModels.Request
            {
                Text      = text,
                SessionId = sessionId,
            };

            return(await GetResponseAsync(request));
        }
        private EventInput ResolveEvent(InternalModels.Request request, string languageCode)
        {
            EventInput result;

            var sourceMessenger = request?.Source;

            if (sourceMessenger != null && _eventResolvers.ContainsKey(sourceMessenger.Value))
            {
                result = _eventResolvers[sourceMessenger.Value].Invoke(request, languageCode);
            }
            else
            {
                result = EventByCommand(request?.Text, languageCode);
            }

            return(result);
        }
        private DetectIntentRequest CreateQuery(InternalModels.Request request, ScopeContext context)
        {
            var session = CreateSession(context.Parameters["ProjectId"], request.SessionId);

            var languageCode = context.Parameters["LanguageCode"];

            var eventInput = ResolveEvent(request, languageCode);

            var text = request.Text;

            if (text?.Length > MaximumRequestTextLength)
            {
                text = request.Text.Substring(0, MaximumRequestTextLength);
            }

            var query = new QueryInput
            {
                Text = new TextInput
                {
                    Text         = text ?? string.Empty,
                    LanguageCode = languageCode
                }
            };

            if (eventInput != null)
            {
                query.Event = eventInput;
            }

            var intentRequest = new DetectIntentRequest
            {
                SessionAsSessionName = session,
                QueryInput           = query,
                QueryParams          = new QueryParameters()
            };

            var contexts = request.RequiredContexts.Select(c =>
                                                           GetContext(context.Parameters["ProjectId"], session, c.Name, c.LifeSpan, c.Parameters)).ToList();

            intentRequest.QueryParams.Contexts.AddRange(contexts);

            return(intentRequest);
        }
        private EventInput DefaultWelcomeEventResolve(InternalModels.Request request, string languageCode)
        {
            EventInput result;

            // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
            if (string.IsNullOrEmpty(request.Text))
            {
                if (request.IsOldUser)
                {
                    result = GetEvent(EasyWelcomeEventName, languageCode);
                }
                else
                {
                    result = GetEvent(WelcomeEventName, languageCode);
                }
            }
            else
            {
                result = EventByCommand(request.Text, languageCode);
            }

            return(result);
        }
 public Task DeleteAllContextsAsync(InternalModels.Request request)
 {
     return(_contextsClientBalancer.Invoke(request.SessionId,
                                           (client, context) => DeleteAllContextsInternalAsync(request.SessionId, context.Parameters["ProjectId"], client),
                                           request.ScopeKey));
 }