Esempio n. 1
0
        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();
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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;
        }