/// <inheritdoc />
        public ParsedCommandRequest Parse(Activity activity)
        {
            string commandRequestText = RemoveRecipientMention(activity);

            logger.LogInformation("Parsing command request '{0}'", commandRequestText);

            ParsedCommandRequest parseResult = null;
            Match match = CommandRegex.Match(commandRequestText);

            if (match.Success)
            {
                string name      = match.Groups[NameGroup].Value;
                string arguments = match.Groups[ArgumentsGroup]?.Value ?? string.Empty;

                parseResult = new ParsedCommandRequest(name, arguments);
                logger.LogInformation("Command request parsed to command '{0}' with arguments '{1}'", name, arguments);
            }

            if (parseResult == null)
            {
                logger.LogWarning("Command request '{0}' cannot be parsed", commandRequestText);
            }

            return(parseResult);
        }
        public async Task <OkResult> Post([FromBody] Activity activity)
        {
            if (activity.Type == ActivityTypes.Message)
            {
                DecodeActivityText(activity);

                string replyText = null;
                ParsedCommandRequest parsedCommandRequest = commandRequestParser.Parse(activity);

                if (parsedCommandRequest != null)
                {
                    IBotCommand command = commandSelector.GetCommand(parsedCommandRequest.Name);

                    if (command != null)
                    {
                        ExecutionResult <string> executionResult =
                            await command.ExecuteAsync(activity, parsedCommandRequest.Arguments);

                        replyText = executionResult.IsSuccess
                                                        ? executionResult.Entity
                                                        : executionResult.ErrorMessage;
                    }
                }

                if (replyText == null)
                {
                    replyText = "Sorry, I don't understand you :(";
                }

                logger.LogInformation("Replying with '{0}'", replyText);

                await messageProcessor.ReplyAsync(activity, replyText, CancellationToken.None);
            }

            return(Ok());
        }