Exemplo n.º 1
0
Arquivo: ChatHub.cs Projeto: Poepon/JK
        public override async Task ReceiveBinaryAsync(WebSocket socket, WebSocketReceiveResult result, BinaryMessage receivedMessage)
        {
            if (!AbpSession.UserId.HasValue)
            {
                throw new AbpException("未登录,请先登录。");
            }
            switch (receivedMessage.CommandType)
            {
            case CommandType.Typing:
                var typingInput = receivedMessage.DeserializeFromBytes <TypingInput>();
                break;

            case CommandType.SendMessage:
            {
                var messageInput = receivedMessage.DeserializeFromBytes <SendMessageModel>();
                await chatAppService.SendMessage(new SendMessageInput
                    {
                        SessionId  = messageInput.SessionId,
                        Message    = messageInput.Message,
                        UserId     = AbpSession.GetUserId(),
                        SenderName = AbpSession.FullName
                    });
            }
            break;

            case CommandType.GetMessage:
            {
                ChatMessageOutput[] list = null;
                var getMessageInput      = receivedMessage.DeserializeFromBytes <GetMessageInput>();
                var lastId = await chatAppService.GetLastReceivedMessageId(new ChatSessionInputBase
                    {
                        SessionId = getMessageInput.SessionId,
                        UserId    = AbpSession.GetUserId()
                    });

                var oldLastId = lastId;
                do
                {
                    var messages = await chatAppService.GetMessages(new GetMessagesInput
                        {
                            MaxResultCount        = getMessageInput.MaxCount,
                            SkipCount             = 0,
                            LastReceivedMessageId = lastId,
                            SessionId             = getMessageInput.SessionId,
                            UserId    = AbpSession.GetUserId(),
                            Direction = getMessageInput.Direction,
                            Sorting   = "Id " + (getMessageInput.Direction == QueryDirection.New ? "asc" : "desc")
                        });

                    if (getMessageInput.Direction == QueryDirection.History)
                    {
                        list = messages.Items.OrderBy(msg => msg.Id)
                               .Select(msg => _objectMapper.Map <ChatMessageOutput>(msg))
                               .ToArray();
                    }
                    else
                    {
                        list = messages.Items
                               .Select(msg => _objectMapper.Map <ChatMessageOutput>(msg))
                               .ToArray();
                    }
                    if (list.Length > 0)
                    {
                        await socket.SendMsgPackAsync(CommandType.GetMessage, list);

                        lastId = getMessageInput.Direction == QueryDirection.New
                                    ? list.Max(x => x.Id)
                                    : list.Min(x => x.Id);
                    }
                    else
                    {
                        break;
                    }
                } while (getMessageInput.Loop);
                if (lastId > oldLastId)
                {
                    await chatAppService.SetLastReceivedMessageId(new SetLastReceivedIdInput
                        {
                            SessionId             = getMessageInput.SessionId,
                            UserId                = AbpSession.GetUserId(),
                            LastReceivedMessageId = lastId
                        });
                }
            }
            break;

            case CommandType.PinMessageToTop:
                var pinMessageToTopInput = receivedMessage.DeserializeFromBytes <PinMessageToTopInput>();
                break;

            case CommandType.UnpinMessageFromTop:
                var unpinMessageFromTopInput = receivedMessage.DeserializeFromBytes <UnpinMessageFromTopInput>();
                break;

            case CommandType.ReadMessage:
                var readMessageInput = receivedMessage.DeserializeFromBytes <ReadMessageInput>();
                break;

            case CommandType.CreatePrivateSession:
            {
                var createPrivateInput = receivedMessage.DeserializeFromBytes <Dto.Input.CreatePrivateSessionInput>();
                if (createPrivateInput.TargetUserId != AbpSession.GetUserId())
                {
                    await chatAppService.CreatePrivateSession(new Dto.CreatePrivateSessionInput
                        {
                            CreatorTenantId = AbpSession.TenantId,
                            CreatorUserId   = AbpSession.GetUserId(),
                            TargetUserId    = createPrivateInput.TargetUserId,
                            TargetTenantId  = createPrivateInput.TargetTenantId
                        });

                    var dtos = await GetSessions(AbpSession.ToUserIdentifier());

                    await socket.SendMsgPackAsync(CommandType.GetSessions, dtos);
                }
                else
                {
                    throw new UserFriendlyException("不能跟自己发起对话。");
                }
            }
            break;

            case CommandType.CreatePublicSession:
            {
                var createGroupInput = receivedMessage.DeserializeFromBytes <Dto.Input.CreatePublicSessionInput>();
                await chatAppService.CreatePublicSession(new Dto.CreatePublicSessionInput
                    {
                        SessionName     = createGroupInput.SessionName,
                        CreatorTenantId = AbpSession.TenantId,
                        CreatorUserId   = AbpSession.GetUserId()
                    });

                var dtos = await GetSessions(AbpSession.ToUserIdentifier());

                await socket.SendMsgPackAsync(CommandType.GetSessions, dtos);
            }
            break;

            case CommandType.DeleteSession:
                var deleteGroupInput = receivedMessage.DeserializeFromBytes <Dto.Input.DeleteSessionInput>();
                await chatAppService.DeleteSession(new Dto.DeleteSessionInput
                {
                    SessionId = deleteGroupInput.SessionId,
                    UserId    = AbpSession.GetUserId()
                });

                //TODO 通知群组成员

                break;

            case CommandType.JoinSession:
                var joinGroupInput = receivedMessage.DeserializeFromBytes <JoinSessionInput>();
                break;

            case CommandType.LeaveSession:
                var leaveGroupInput = receivedMessage.DeserializeFromBytes <LeaveSessionInput>();
                break;

            case CommandType.GetSessions:
            {
                var dtos = await GetSessions(AbpSession.ToUserIdentifier());

                await socket.SendMsgPackAsync(CommandType.GetSessions, dtos);
            }
            break;

            case CommandType.GetSessionUnread:
            {
                var getGroupUnreadInput = receivedMessage.DeserializeFromBytes <GetSessionUnreadInput>();
                var count = await chatAppService.GetSessionUnread(new ChatSessionInputBase
                    {
                        SessionId = getGroupUnreadInput.SessionId,
                        UserId    = AbpSession.GetUserId()
                    });

                var output = new SessionUnreadOutput {
                    Count = count
                };
                await socket.SendMsgPackAsync(CommandType.GetSessionUnread, output, httpContextAccess.HttpContext.RequestAborted);
            }
            break;

            case CommandType.PinToTop:
                var pinToTopInput = receivedMessage.DeserializeFromBytes <PinToTopInput>();
                break;

            case CommandType.UnpinFromTop:
                var unpinFromTopInput = receivedMessage.DeserializeFromBytes <UnpinFromTopInput>();
                break;

            case CommandType.BlockUser:
                var blockUserInput = receivedMessage.DeserializeFromBytes <BlockUserInput>();
                break;

            case CommandType.UnblockUser:
                var unblockUserInput = receivedMessage.DeserializeFromBytes <UnblockUserInput>();
                break;

            case CommandType.UploadFile:
                var uploadFileInput = receivedMessage.DeserializeFromBytes <UploadFileInput>();
                break;

            case CommandType.DownloadFile:
                var downloadFileInput = receivedMessage.DeserializeFromBytes <DownloadFileInput>();
                break;

            case CommandType.GetOnlineUsers:
            {
                var onlineUsers = GetOnlineUsers();
                await socket.SendMsgPackAsync(CommandType.GetOnlineUsers, onlineUsers, httpContextAccess.HttpContext.RequestAborted);
            }
            break;

            default:
                break;
            }
        }