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); } }
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); } } }
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; } } }