private Response onWhereCoworker(WhereCoworkerDTO userQuery)
        {
            Console.WriteLine(userQuery.ToJson(true));

            var tp = new TimePeriodDTO()
            {
                StartTime = DateTimeOffset.Now.Date.Add(TimeSpan.Zero),
                EndTime   = DateTimeOffset.Now.Date.Add(new TimeSpan(23, 59, 59))
            };

            Console.WriteLine("Default: " + tp.StartTime.ToString() + " " + tp.EndTime.ToString());

            // if user hasn't entered any data and time -> set to current date and time
            if (userQuery.TimePeriod == null &&
                (!userQuery.Date.HasValue) &&
                userQuery.DateTimeObject == null &&
                (!userQuery.Time.HasValue))
            {
                userQuery.DateTimeObject = new DateTimeWraper(DateTimeOffset.UtcNow);
            }

            // recognize any possible time and data
            tp = RecognizeDate(userQuery.Date, oldTp: tp);
            tp = RecognizeTime(userQuery, oldTp: tp);
            tp = RecognizeDateTime(userQuery, oldTp: tp);

            // create params for Event Server request
            var whereHolderRequest = new HolderLocationPeriodDTO()
            {
                QueryType        = ((DateTime.UtcNow - tp.StartTime)?.TotalMinutes < 15) ? QueryType.Type.WhereNow : QueryType.Type.Where,
                HolderName       = userQuery.TargetName.Trim().Replace("?", ""),
                HolderMiddlename = userQuery.TargetMiddlename.Trim().Replace("?", ""),
                HolderSurname    = userQuery.TargetLastname.Trim().Replace("?", ""),
                TimePeriod       = ((DateTime.UtcNow - tp.StartTime)?.TotalMinutes < 15)
                                        ? new TimePeriodDTO()
                {
                    StartTime = DateTimeOffset.Now.Date.Add(TimeSpan.Zero), EndTime = DateTimeOffset.Now.Date.Add(new TimeSpan(23, 59, 59))
                }
                                        : tp
            };

            Console.WriteLine(whereHolderRequest.ToJson(true));

            foreach (var eventsListener in GlobalScope.CSEventsListeners)
            {
                eventsListener.PostCommand(new RequestHolderLocation(whereHolderRequest));
            }

            // send response to Dialogflow (Dialogflow automatically resend it to Slack, Telegram, Skype, etc.)
            //return new ResponseWebHookIntent() {
            //	FulfillmentText = $"*Буду искать:* '{whereHolderRequest.HolderName} {whereHolderRequest.HolderMiddlename} {whereHolderRequest.HolderSurname}'\n" +
            //				      $"*c :* {whereHolderRequest.TimePeriod.StartTime.ToString()}\n" +
            //					  $"*по:* {whereHolderRequest.TimePeriod.EndTime.ToString()}"
            //}.ToJson();
            return(200);
        }
        private static TimePeriodDTO RecognizeDateTime(WhereCoworkerDTO userQuery, TimePeriodDTO oldTp)
        {
            TimePeriodDTO newTp = new TimePeriodDTO(oldTp);

            // if user input date
            if (userQuery.DateTimeObject != null && userQuery.DateTimeObject.DateTime.HasValue)
            {
                DateTimeOffset newDateTime = userQuery.DateTimeObject.DateTime.Value;                 //extract date and time

                newTp.StartTime = newDateTime.Add(TimeSpan.FromMinutes(-10));
                newTp.EndTime   = newDateTime.Add(TimeSpan.FromMinutes(+10));

                Console.WriteLine("\nNew DateTime:");
                Console.WriteLine("newDateTime: " + newDateTime.ToString());
                Console.WriteLine("DateTimePeriod: " + newTp.StartTime.ToString() + " " + newTp.EndTime.ToString());
            }

            return(newTp);
        }
        public IntentsModule() : base("")
        {
            base.Post("/intents", params_ => {
                try {
                    // body -> json -> RequestWebHookIntent
                    RequestWebHookIntent incomeWebHook = RequestWebHookIntent.FromJson(RequestStream.FromStream(Request.Body).AsString());
                    IntentType.Type intentType         = IntentType.GetType(incomeWebHook?.QueryResult?.Intent?.Name);
                    object Parameters = incomeWebHook?.QueryResult?.Parameters;

                    // Here is a temporary fix of bug in Dialogflow.
                    // Slack have changed api and today (12.09.2019) Dialogflow not correct works with unswers to slack
                    if (intentType == IntentType.Type.Undefined || (incomeWebHook?.QueryResult?.AllRequiredParamsPresent ?? false) == false)
                    {
                        return(buildFulfillmentMessage(incomeWebHook));
                    }

                    switch (intentType)
                    {
                    case IntentType.Type.Undefined:
                        break;

                    case IntentType.Type.WhereCoworker:
                        //return onWhereCoworker(WhereCoworkerDTO.FromObject(Parameters));
                        onWhereCoworker(WhereCoworkerDTO.FromObject(Parameters));
                        break;

                    case IntentType.Type.WhenCoworker:
                        //return onWhenCoworker(WhenCoworkerDTO.FromObject(Parameters));
                        onWhenCoworker(WhenCoworkerDTO.FromObject(Parameters));
                        break;
                    }

                    return(buildFulfillmentMessage(incomeWebHook));
                } catch (Exception e) {
                    Console.WriteLine("Exception: " + e.Message + "\n" + e.StackTrace);
                }

                return(404);
            });
        }
        private static TimePeriodDTO RecognizeTime(WhereCoworkerDTO userQuery, TimePeriodDTO oldTp)
        {
            TimePeriodDTO newTp = new TimePeriodDTO(oldTp);

            // if time period exist
            if (userQuery.TimePeriod != null && userQuery.TimePeriod.StartTime.HasValue)
            {
                newTp.StartTime = oldTp.StartTime?.Date.Add(userQuery.TimePeriod.StartTime.Value.TimeOfDay);
                newTp.EndTime   = oldTp.EndTime?.Date.Add(userQuery.TimePeriod.EndTime.Value.TimeOfDay);
                Console.WriteLine("\nNew TimePeriod:");
                Console.WriteLine("DateTimePeriod: " + newTp.StartTime.ToString() + " " + newTp.EndTime.ToString());
            }
            else if (userQuery.Time.HasValue)                // if time exist
            {
                TimeSpan userQueryTime = userQuery.Time.Value.DateTime.TimeOfDay;
                newTp.StartTime = oldTp.StartTime?.Date.Add(userQueryTime).Add(TimeSpan.FromMinutes(-10));
                newTp.EndTime   = oldTp.EndTime?.Date.Add(userQueryTime).Add(TimeSpan.FromMinutes(+10));
                Console.WriteLine("\nNew Time:");
                Console.WriteLine("DateTimePeriod: " + newTp.StartTime.ToString() + " " + newTp.EndTime.ToString());
            }

            return(newTp);
        }