public async Task Join(PlayerViewModel request) { string errorMsg = string.Empty; request.ConnectionId = Context.ConnectionId; if (!string.IsNullOrEmpty(request.UID)) { var expiredRooms = rooms.Where(r => r.TimeRemain < 300).ToList(); expiredRooms.ForEach(r => rooms.Remove(r)); var connectingUser = await PlayerViewModel.JoinGameAsync(request, rooms); if (connectingUser.IsSucceed) { string ip = Context.Connection.RemoteIpAddress.ToString(); connectingUser.Data.IsOnline = true; connectingUser.Data.Ip = ip; var data = new ConnectViewModel() { Player = connectingUser.Data, Others = PlayerViewModel.Repository.GetModelListBy(p => p.Uid != connectingUser.Data.UID && p.Room == connectingUser.Data.Room && !string.IsNullOrEmpty(p.ConnectionId)).Data }; SendToClient(data, GameReponseKey.Connect, Context.ConnectionId); await UpdateOnlineStatus(connectingUser.Data); } else { await Clients.Client(Context.ConnectionId).SendAsync(receiveMethod, connectingUser); } } }