Пример #1
0
        private async Task SendStatus(int userId, UserConnectionStatus status)
        {
            // Get opponents from this user chats to
            var receiversList = _unitOfWork.Repository <Chat>().Get(x => x.Users.Any(y => y.UserId == userId))
                                .TagWith(nameof(SendStatus) + "_GetReceiversList")
                                .SelectMany(x => x.Users
                                            .Where(y => y.UserId != userId && y.IsActive)
                                            .Select(y => y.UserId))
                                .Distinct()
                                .ToList();

            var socketsData = WebSocketConnectionManager
                              .Get(x => x.Socket.State == WebSocketState.Open && x.Data.UserId != userId && receiversList.Contains(x.Data.UserId))
                              .ToList();

            // Create message
            var message = new WebSocketEventResponseModel
            {
                EventType = WebSocketEventType.OnlineStatusChanged,
                Data      = new UserStatusResponseModel
                {
                    UserId = userId,
                    Status = status
                }
            };

            var serializedMessage = JsonConvert.SerializeObject(message);

            foreach (var socketData in socketsData)
            {
                await SendMessageAsync(socketData.Socket, serializedMessage);
            }
        }
Пример #2
0
        public async Task SendMessageToUserAsync(int userId, WebSocketEventResponseModel message)
        {
            var serializedMessage = JsonConvert.SerializeObject(message);

            var socketsData = WebSocketConnectionManager.Get(w => w.Data.UserId == userId);

            if (socketsData.Count > 0)
            {
                foreach (var socketData in socketsData)
                {
                    if (socketData.Socket.State != WebSocketState.Open)
                    {
                        _log.LogInformation($"WebSocket => socket {socketData.Data.TokenId} is " + Enum.GetName(typeof(WebSocketState), socketData.Socket.State));
                        return;
                    }

                    await SendMessageAsync(socketData.Socket, serializedMessage);
                }
            }
        }
Пример #3
0
        public override async Task ReceiveAsync(WebSocket socket, WebSocketReceiveResult result, byte[] buffer)
        {
            var socketId = WebSocketConnectionManager.GetTokenId(socket);

            if (socketId != null)
            {
                var socketData = WebSocketConnectionManager.GetSocketDataByTokenId(socketId.Value);

                var json = Encoding.UTF8.GetString(buffer, 0, buffer.Length);

                var requestMessage = JsonConvert.DeserializeObject <WebSocketEventResponseModel>(json);

                WebSocketEventResponseModel webSocketResponseMessage = null;
                string responseMessage = null;

                IGroupsItem <int> groupItem = null;

                switch (requestMessage?.EventType?.ToLower())
                {
                case WebSocketEventType.Ping:

                    webSocketResponseMessage = new WebSocketEventResponseModel
                    {
                        EventType = WebSocketEventType.Pong
                    };

                    responseMessage = JsonConvert.SerializeObject(webSocketResponseMessage);

                    await SendMessageAsync(socket, responseMessage);

                    break;

                case WebSocketEventType.Typing:

                    webSocketResponseMessage = new WebSocketEventResponseModel
                    {
                        EventType = WebSocketEventType.Typing
                    };

                    responseMessage = JsonConvert.SerializeObject(webSocketResponseMessage);

                    groupItem = socketData as IGroupsItem <int>;

                    if (groupItem != null)
                    {
                        var opponents = WebSocketConnectionManager.Get(w => w.Data.UserId != socketData.UserId && (w.Data as IGroupsItem <int>) != null && (w.Data as IGroupsItem <int>).GroupIds.Any(x => groupItem.GroupIds.Contains(x)));

                        foreach (var opponent in opponents)
                        {
                            await SendMessageAsync(opponent.Socket, responseMessage);
                        }
                    }

                    break;

                case WebSocketEventType.Message:

                    groupItem = socketData as IGroupsItem <int>;

                    if (groupItem != null)
                    {
                        var opponents = WebSocketConnectionManager.Get(w => w.Data.UserId != socketData.UserId && (w.Data as IGroupsItem <int>) != null && (w.Data as IGroupsItem <int>).GroupIds.Any(x => groupItem.GroupIds.Contains(x)));

                        foreach (var opponent in opponents)
                        {
                            await SendMessageAsync(opponent.Socket, json);
                        }
                    }

                    break;
                }
            }
        }