public async Task HandleCallbackQuery(TGCallbackQueryDTO dto)
        {
            var queryData = JsonConvert.DeserializeObject <TGCallbackQueryDTO.TGCallbackQueryDataDTO>(dto.Data);

            if (queryData.PageIndex == 0)
            {
                return;
            }
            var command = await _userService.FindLastCommandByTGUserId(dto.From.Id);

            var message = await _repository.TableNoTracking.FirstOrDefaultAsync(s => s.TGMessageId == queryData.MessageId);

            if (command == null || message == null)
            {
                return;
            }
            if (command.Type == UserCommandType.List)
            {
                var category = command.Text;
                if (!string.IsNullOrWhiteSpace(category) && category.StartsWith("全部群组", StringComparison.OrdinalIgnoreCase))
                {
                    category = null;
                }

                var paged         = _chatService.GetChatsPaged(pagedIndex: queryData.PageIndex, pageSize: 20, category: category);
                var messageDTO    = TGSendMessageDTO.BuildChatListMessage(paged, dto.Message.Chat.Id, queryData.MessageId);
                var editedMessage = TGSendMessageDTO.BuildChatListEditMessage(messageDTO, message.ResponseId);
                await _telegramHttpClient.EditMessage(editedMessage);
            }
        }
        public async Task HandleMessage(TGMessageDTO dto, User user, Message message)
        {
            var chatType = dto.Chat.GetChatType();

            if (chatType != ChatType.Private)
            {
                if (dto.Text.ToUpper().Contains(ApplicationDefaults.CNBotUserName))
                {
                    // Only use command in private chat
                    await _telegramHttpClient.SendMessage(TGSendMessageDTO.BuildOnlyUseInPrivateMessage(dto.Chat.Id, dto.MessageId));
                }
                //If not my command. Nothing to do
                return;
            }
            var             utcNow      = DateTime.UtcNow;
            UserCommandType commandType = dto.GetCommandType();

            if (commandType == UserCommandType.None)
            {
                var lastCommand = await _userService.FindLastCommand(user.Id);

                if (lastCommand == null || lastCommand.Completed)
                {
                    // No command found. So we just show the default message
                    await _telegramHttpClient.SendMessage(TGSendMessageDTO.BuildUnrecognizedMessage(dto.Chat.Id, dto.MessageId));

                    return;
                }
                else
                {
                    commandType = lastCommand.Type;
                }
            }
            var command = new UserCommand
            {
                Created   = utcNow,
                Completed = false,
                Type      = commandType,
                UserId    = user.Id,
                Text      = dto.Text
            };
            await _userService.AddCommand(command);

            await this.HandleCommand(dto, command, message);

            if (command.Type != UserCommandType.Remove && dto.Entities != null && dto.Entities.Any())
            {
                _eventBus.Publish(new TelegramMessageEntityExtractEvent(dto.Entities));
            }
        }
        public async Task <TGResponseDTO <TGMessageDTO> > SendMessage(TGSendMessageDTO dto)
        {
            var url     = TelegramUrlsConfig.Message.Send(_settings.ApiToken);
            var request = new HttpRequestMessage(HttpMethod.Post, url);

            request.Content = new StringContent(JsonConvert.SerializeObject(dto, new JsonSerializerSettings
            {
                NullValueHandling     = NullValueHandling.Ignore,
                ReferenceLoopHandling = ReferenceLoopHandling.Ignore
            }), Encoding.UTF8, ApplicationDefaults.DefaultContentType);
            var response = await _httpClient.SendAsync(request);

            var responseBody = await response.Content.ReadAsStringAsync();

            return(JsonConvert.DeserializeObject <TGResponseDTO <TGMessageDTO> >(responseBody));
        }
        public async Task Handle(TelegramChatJoinEvent @event)
        {
            try
            {
                var chatResponse = await _telegramHttpClient.GetChatByNameOrLink(@event.ChatUserName);

                var message = new TGSendMessageDTO
                {
                    ChatId = @event.TgChatId
                };
                if (chatResponse.IsOK)
                {
                    var type = chatResponse.Result.GetChatType();
                    if (type == ChatType.Private || type == ChatType.None)
                    {
                        message.Text = "用户名仅支持群组或频道";
                    }
                    else
                    {
                        var chat = await _chatService.GetByTGChatId(chatResponse.Result.Id);

                        if (chat == null)
                        {
                            chat = await _chatService.GetOrCreateChat(chatResponse.Result, @event.TgUserId);

                            message.Text = $"【{chatResponse.Result.Title}】 收录成功! 你可以继续输入其他群组用户名";
                            _eventBus.Publish(new TelegramChatRefreshEvent(chat.Id));
                        }
                        else
                        {
                            message.Text = "此群组已经收录过了,请勿重复操作!";
                        }
                    }
                }
                else
                {
                    message.Text = "未能找到群组或者频道";
                }
                await _telegramHttpClient.SendMessage(message);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "添加群组失败");
            }
        }
        private async Task HandleCommand(TGMessageDTO dto, UserCommand command, Message message)
        {
            switch (command.Type)
            {
            case UserCommandType.Help:
            {
                command.Completed = true;
                await _userService.CompleteCommand(command);

                await _telegramHttpClient.SendMessage(TGSendMessageDTO.BuildHelpMessage(dto.Chat.Id));

                break;
            }

            case UserCommandType.Reset:
            {
                command.Completed = true;
                await _userService.CompleteCommand(command);

                await _telegramHttpClient.SendMessage(TGSendMessageDTO.BuildResetMessage(dto.Chat.Id));

                break;
            }

            case UserCommandType.List:
            {
                if (ApplicationDefaults.Commands.Contains(dto.Text))
                {
                    var categories = await _chatService.GetChatCategories();

                    var messageRequest = TGSendMessageDTO.BuildChatCategoriesMessage(dto.Chat.Id, categories.OrderBy(c => c.DisplayOrder).Select(c => c.Name).ToList());
                    await _telegramHttpClient.SendMessage(messageRequest);
                }
                else
                {
                    var category = dto.Text;
                    if (!string.IsNullOrWhiteSpace(category) && category.StartsWith("全部群组", StringComparison.OrdinalIgnoreCase))
                    {
                        category = null;
                    }
                    var paged           = _chatService.GetChatsPaged(pagedIndex: 1, pageSize: 20, category: category);
                    var messageRequest  = TGSendMessageDTO.BuildChatListMessage(paged, dto.Chat.Id, dto.MessageId);
                    var messageResponse = await _telegramHttpClient.SendMessage(messageRequest);

                    message.ResponseId = messageResponse.Result.MessageId;
                    await _repository.UpdateAsync(message);
                }
                break;
            }

            case UserCommandType.MyList:
            {
                //TODO
                break;
            }

            case UserCommandType.Join:
            {
                if (ApplicationDefaults.Commands.Contains(dto.Text))
                {
                    await _telegramHttpClient.SendMessage(TGSendMessageDTO.BuildChatJoinMessage(dto.Chat.Id));
                }
                else
                {
                    _eventBus.Publish(new TelegramChatJoinEvent(dto.Chat.Id, dto.From.Id, dto.Text));
                }
                break;
            }

            case UserCommandType.Remove:
            {
                await _telegramHttpClient.SendMessage(TGSendMessageDTO.BuildChatRemoveMessage(dto.Chat.Id));

                break;
            }

            case UserCommandType.Update:
            {
                await _telegramHttpClient.SendMessage(TGSendMessageDTO.BuildChatUpdateMessage(dto.Chat.Id));

                break;
            }

            case UserCommandType.Search:
            {
                if (ApplicationDefaults.Commands.Contains(dto.Text))
                {
                    await _telegramHttpClient.SendMessage(TGSendMessageDTO.BuildChatSearchMessage(dto.Chat.Id));
                }
                else
                {
                    var paged           = _chatService.GetChatsPaged(pagedIndex: 1, pageSize: 20, keywords: dto.Text);
                    var messageRequest  = TGSendMessageDTO.BuildChatListMessage(paged, dto.Chat.Id, dto.MessageId);
                    var messageResponse = await _telegramHttpClient.SendMessage(messageRequest);

                    await _repository.UpdateAsync(message);
                }
                break;
            }
            }
        }