public Room(RoomInfo roomInfo) { RoomInfo = roomInfo; IsActive = true; _settings = RoomSettings.Get(RoomInfo.ShortName); if (_settings == null) { _settings = new RoomSettings { Room = RoomInfo.ShortName, Bans = new HashSet<string>(), Mods = new HashSet<string>() }; _settings.Insert(); } _history = new LinkedList<HistoryLine>(); var cmd = new SqlCommand("SELECT * FROM rohbot.chathistory WHERE chat=lower(:chat) ORDER BY date DESC LIMIT 100;"); cmd["chat"] = RoomInfo.ShortName; foreach (var line in cmd.Execute().Reverse().Select(r => HistoryLine.Read(r))) { _history.AddLast(line); } _showLinkTitles = (RoomInfo["LinkTitles"] ?? "").ToLower() == "true"; IsWhitelisted = (RoomInfo["Whitelist"] ?? "").ToLower() == "true"; IsHidden = (RoomInfo["Hidden"] ?? "").ToLower() == "true"; IsPrivate = (RoomInfo["Private"] ?? "").ToLower() == "true"; IsLogging = (RoomInfo["Logging"] ?? "true").ToLower() == "true"; ShowWebStates = (RoomInfo["WebStates"] ?? "true").ToLower() == "true"; DisableBanning = (RoomInfo["DisableBanning"] ?? "").ToLower() == "true"; }
public void Update() { lock (_rooms) { var deadRooms = _rooms.Where(kv => !kv.Value.IsActive); foreach (var dead in deadRooms) { Room removedRoom; _rooms.TryRemove(dead.Key, out removedRoom); } var settings = Program.Settings; try { var oldRooms = _rooms.Where(r1 => settings.Rooms.All(r2 => r2["ShortName"] != r1.Value.RoomInfo.ShortName)); foreach (var room in oldRooms) { room.Value.Leave(); } } catch (Exception e) { Program.Logger.Error("Failed to unload rooms", e); } try { var newRooms = settings.Rooms.Where(r => !_rooms.ContainsKey(r["ShortName"])); foreach (var room in newRooms) { var roomInfo = new RoomInfo(room); var roomObj = (Room)Activator.CreateInstance(RoomTypes[roomInfo.Type], roomInfo); _rooms.TryAdd(room["ShortName"], roomObj); } } catch (Exception e) { Program.Logger.Error("Failed to load rooms", e); } try { foreach (var room in _rooms) { room.Value.Update(); } } catch (Exception e) { Program.Logger.Error("Failed to update rooms", e); } } }