コード例 #1
0
        public async Task <Message> SaveMessage(TGMessageDTO dto)
        {
            var message = new Message
            {
                Created      = dto.Date.ToDateTime().Value,
                Updated      = dto.EditDate.ToDateTime(),
                FromTGUserId = dto.From.Id,
                Text         = dto.Text,
                TGChatId     = dto.Chat.Id,
                TGMessageId  = dto.MessageId
            };

            if (dto.Entities != null && dto.Entities.Any())
            {
                foreach (var entityDTO in dto.Entities)
                {
                    message.MessageEntities.Add(new MessageEntity
                    {
                        Language = entityDTO.Language,
                        Length   = entityDTO.Length,
                        Offset   = entityDTO.Offset,
                        Type     = entityDTO.GetEntityType(),
                        Url      = entityDTO.Url
                    });
                }
            }
            await _repository.AddAsync(message);

            return(message);
        }
コード例 #2
0
        public async Task FeedMessage(TGMessageDTO dto)
        {
            await _chatService.GetOrCreateChat(dto.Chat, dto.From.Id);

            var user = await _userService.GetOrCreateUser(dto.From);

            var message = await this.SaveMessage(dto);

            await this.HandleMessage(dto, user, message);
        }
コード例 #3
0
        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));
            }
        }
コード例 #4
0
        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;
            }
            }
        }
コード例 #5
0
 public TelegramMessageEvent(TGMessageDTO message)
 {
     Message = message;
 }