public async Task SkipChat(int userID, string username) { WaitUser user = new WaitUser { ConnectionID = Context.ConnectionId, UserID = userID, UserName = username }; RandomRoom usrroom = RoomManager.Instance.GetRoom(user.ConnectionID); if (usrroom != null) { foreach (WaitUser usr in usrroom.Members) { if (usr.ConnectionID != user.ConnectionID) { user.SkipID.Add(usr.ConnectionID); } } ; } RandomRoom room = RoomManager.Instance.RemoveRoom(user); if (room != null) { foreach (WaitUser usr in room.Members) { await Clients.Group(room.ID).BroadcastMessage($"Người dùng {usr.ConnectionID} đã rời khỏi phòng chat {room.ID}."); await Groups.RemoveFromGroupAsync(usr.ConnectionID, room.ID); // Join possible room after leave old room RandomRoom newroom = RoomManager.Instance.GetRoom(usr.ConnectionID); if (newroom != null) { foreach (WaitUser usr1 in newroom.Members) { await Groups.AddToGroupAsync(usr1.ConnectionID, newroom.ID); await Clients.Group(newroom.ID).BroadcastMessage($"Người dùng {usr1.ConnectionID} đã tham gia phòng chat {newroom.ID}."); } } } } // DEBUG Debug(); }
public RandomRoom RemoveRoom(WaitUser user) { for (int i = 0; i < RoomList.Count; i++) { for (int j = 0; j < RoomList[i].Members.Length; j++) { if (RoomList[i].Members[j].ConnectionID == user.ConnectionID) { RoomList[i].Members.SetValue(user, j); RandomRoom room = RoomList[i]; RoomList.RemoveAt(i); // Enqueue room memebers after removal foreach (WaitUser usr1 in room.Members) { if (user.SkipID.Count > 0) { QueueManager.Instance.Enqueue(usr1); } else { if (usr1.ConnectionID != user.ConnectionID) { QueueManager.Instance.Enqueue(usr1); } } } // return old room before removal return(room); } } } return(null); }
public RandomRoom Enqueue(WaitUser usr) { int maxScore = 0; WaitUser targetUser = new WaitUser(); if (usr.Filter != null) { string[] filterData = usr.Filter.Split(","); for (int i = 0; i < UserQueue.Count; i++) { // Match conditions with filter if (usr.ConnectionID != UserQueue[i].ConnectionID && !usr.SkipID.Contains(UserQueue[i].ConnectionID) && !UserQueue[i].SkipID.Contains(usr.ConnectionID)) { // Filter if (UserQueue[i].Filter != null) { string[] filterDataI = UserQueue[i].Filter.Split(","); int score = Similarity(filterData, filterDataI); if (score > maxScore) { maxScore = score; targetUser = UserQueue[i]; } } // RandomRoom room = RoomManager.Instance.CreateRoom(new WaitUser[] { // usr, // UserQueue[i] // }); // Dequeue(i); // return room; } } } if (maxScore == 0) { // In case no filter found for (int i = 0; i < UserQueue.Count; i++) { if (usr.ConnectionID != UserQueue[i].ConnectionID && !usr.SkipID.Contains(UserQueue[i].ConnectionID) && !UserQueue[i].SkipID.Contains(usr.ConnectionID)) { RandomRoom room = RoomManager.Instance.CreateRoom(new WaitUser[] { usr, UserQueue[i] }); Dequeue(i); return room; } } } else { // In case match filter found RandomRoom room = RoomManager.Instance.CreateRoom(new WaitUser[] { usr, targetUser }); Dequeue(targetUser.ConnectionID); return room; } UserQueue.Add(usr); return null; }