using System.Collections; using Milimoe.FunGame.Core.Entity; using Milimoe.FunGame.Core.Library.Constant; namespace Milimoe.FunGame.Core.Model { public class RoomList : IEnumerable { private readonly Dictionary _List = []; private readonly Dictionary> _UserList = []; private readonly Dictionary> _ReadyUserList = []; public Room this[string roomid] => GetRoom(roomid); public int Count => _List.Count; public int GetUserCount(string roomid) => this[roomid].UserAndIsReady.Count; public int GetReadyUserCount(string roomid) => GetReadyUserList(roomid).Count; public List ListRoom => [.. _List.Values]; public List ListRoomID => [.. _List.Keys]; public User GetRoomMaster(string roomid) => this[roomid].RoomMaster; public List GetUsers(string roomid) => [.. this[roomid].UserAndIsReady.Keys]; public List GetReadyUserList(string roomid) => this[roomid].UserAndIsReady.Where(kv => kv.Value && kv.Key.Id != GetRoomMaster(roomid).Id).Select(kv => kv.Key).ToList(); public List GetNotReadyUserList(string roomid) => this[roomid].UserAndIsReady.Where(kv => !kv.Value && kv.Key.Id != GetRoomMaster(roomid).Id).Select(kv => kv.Key).ToList(); public void Clear() { _List.Clear(); _UserList.Clear(); _ReadyUserList.Clear(); } public void AddRoom(Room room) { _List.Add(room.Roomid, room); _UserList.Add(room.Roomid, []); _ReadyUserList.Add(room.Roomid, []); } public void AddRooms(List rooms) { foreach (Room room in rooms) { AddRoom(room); } } public void RemoveRoom(string roomid) { _List.Remove(roomid); _UserList.Remove(roomid); _ReadyUserList.Remove(roomid); } public void RemoveRoom(Room room) => RemoveRoom(room.Roomid); public void IntoRoom(string roomid, User user) { if (roomid != "-1" && user.Id != 0) { if (!this[roomid].UserAndIsReady.TryAdd(user, false)) { this[roomid].UserAndIsReady[user] = false; } } } public void QuitRoom(string roomid, User user) { if (roomid != "-1" && user.Id != 0) { this[roomid].UserAndIsReady.Remove(user); } } public void SetReady(string roomid, User user) { if (roomid != "-1" && user.Id != 0 && this[roomid].UserAndIsReady.ContainsKey(user)) { this[roomid].UserAndIsReady[user] = true; } } public void CancelReady(string roomid, User user) { if (roomid != "-1" && user.Id != 0 && this[roomid].UserAndIsReady.ContainsKey(user)) { this[roomid].UserAndIsReady[user] = false; } } public Room GetRoom(string roomid) => _List.TryGetValue(roomid, out Room? room) ? room : General.HallInstance; public bool IsExist(string roomid) => _List.ContainsKey(roomid); public void SetRoomMaster(string roomid, User user) { if (roomid != "-1" && user.Id != 0) { this[roomid].RoomMaster = user; } } public IEnumerator GetEnumerator() { foreach (Room room in ListRoom) { yield return room; } } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } } }