using Microsoft.Xna.Framework; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Xml; using System.Xml.Linq; namespace Barotrauma.Networking { enum SelectionMode { Manual = 0, Random = 1, Vote = 2 } enum YesNoMaybe { No = 0, Maybe = 1, Yes = 2 } partial class GameServer : NetworkMember, IPropertyObject { private class SavedClientPermission { public readonly string IP; public readonly string Name; public ClientPermissions Permissions; public SavedClientPermission(string name, string ip, ClientPermissions permissions) { this.Name = name; this.IP = ip; this.Permissions = permissions; } } public const string SettingsFile = "serversettings.xml"; public static readonly string ClientPermissionsFile = "Data" + Path.DirectorySeparatorChar + "clientpermissions.txt"; public Dictionary ObjectProperties { get; private set; } public Dictionary extraCargo; public bool ShowNetStats; private TimeSpan refreshMasterInterval = new TimeSpan(0, 0, 30); private TimeSpan sparseUpdateInterval = new TimeSpan(0, 0, 0, 3); private SelectionMode subSelectionMode, modeSelectionMode; private bool registeredToMaster; private WhiteList whitelist; private BanList banList; private string password; private string adminAuthPass = ""; public string AdminAuthPass { set { DebugConsole.NewMessage("Admin auth pass changed!",Color.Yellow); adminAuthPass = ""; if (value.Length > 0) { adminAuthPass = Encoding.UTF8.GetString(Lidgren.Network.NetUtility.ComputeSHAHash(Encoding.UTF8.GetBytes(value))); } } } public float AutoRestartTimer; private bool autoRestart; private List clientPermissions = new List(); [HasDefaultValue(true, true)] public bool RandomizeSeed { get; private set; } [HasDefaultValue(300.0f, true)] public float RespawnInterval { get; private set; } [HasDefaultValue(180.0f, true)] public float MaxTransportTime { get; private set; } [HasDefaultValue(0.2f, true)] public float MinRespawnRatio { get; private set; } [HasDefaultValue(60.0f, true)] public float AutoRestartInterval { get; private set; } [HasDefaultValue(true, true)] public bool AllowSpectating { get; private set; } [HasDefaultValue(true, true)] public bool EndRoundAtLevelEnd { get; private set; } [HasDefaultValue(true, true)] public bool SaveServerLogs { get; private set; } [HasDefaultValue(true, true)] public bool AllowFileTransfers { get; private set; } [HasDefaultValue(800, true)] private int LinesPerLogFile { get { return log.LinesPerFile; } set { log.LinesPerFile = value; } } public bool AutoRestart { get { return (connectedClients.Count != 0) && autoRestart; } set { autoRestart = value; AutoRestartTimer = autoRestart ? AutoRestartInterval : 0.0f; } } public YesNoMaybe TraitorsEnabled { get; set; } [HasDefaultValue(true, true)] public bool AllowRespawn { get; set; } public SelectionMode SubSelectionMode { get { return subSelectionMode; } } public SelectionMode ModeSelectionMode { get { return modeSelectionMode; } } public BanList BanList { get { return banList; } } [HasDefaultValue(true, true)] public bool AllowVoteKick { get; private set; } [HasDefaultValue(0.6f, true)] public float EndVoteRequiredRatio { get; private set; } [HasDefaultValue(0.6f, true)] public float KickVoteRequiredRatio { get; private set; } private void SaveSettings() { XDocument doc = new XDocument(new XElement("serversettings")); ObjectProperty.SaveProperties(this, doc.Root, true); doc.Root.SetAttributeValue("SubSelection", subSelectionMode.ToString()); doc.Root.SetAttributeValue("ModeSelection", modeSelectionMode.ToString()); doc.Root.SetAttributeValue("TraitorsEnabled", TraitorsEnabled.ToString()); if (GameMain.NetLobbyScreen != null #if CLIENT && GameMain.NetLobbyScreen.ServerMessage != null #endif ) { doc.Root.SetAttributeValue("ServerMessage", GameMain.NetLobbyScreen.ServerMessageText); } XmlWriterSettings settings = new XmlWriterSettings(); settings.Indent = true; settings.NewLineOnAttributes = true; using (var writer = XmlWriter.Create(SettingsFile, settings)) { doc.Save(writer); } } private void LoadSettings() { XDocument doc = null; if (File.Exists(SettingsFile)) { doc = ToolBox.TryLoadXml(SettingsFile); } if (doc == null || doc.Root == null) { doc = new XDocument(new XElement("serversettings")); } ObjectProperties = ObjectProperty.InitProperties(this, doc.Root); subSelectionMode = SelectionMode.Manual; Enum.TryParse(ToolBox.GetAttributeString(doc.Root, "SubSelection", "Manual"), out subSelectionMode); Voting.AllowSubVoting = subSelectionMode == SelectionMode.Vote; modeSelectionMode = SelectionMode.Manual; Enum.TryParse(ToolBox.GetAttributeString(doc.Root, "ModeSelection", "Manual"), out modeSelectionMode); Voting.AllowModeVoting = modeSelectionMode == SelectionMode.Vote; var traitorsEnabled = TraitorsEnabled; Enum.TryParse(ToolBox.GetAttributeString(doc.Root, "TraitorsEnabled", "No"), out traitorsEnabled); TraitorsEnabled = traitorsEnabled; GameMain.NetLobbyScreen.SetTraitorsEnabled(traitorsEnabled); if (GameMain.NetLobbyScreen != null #if CLIENT && GameMain.NetLobbyScreen.ServerMessage != null #endif ) { GameMain.NetLobbyScreen.ServerMessageText = ToolBox.GetAttributeString(doc.Root, "ServerMessage", ""); } #if CLIENT showLogButton.Visible = SaveServerLogs; #endif List monsterNames = Directory.GetDirectories("Content/Characters").ToList(); for (int i = 0; i < monsterNames.Count; i++) { monsterNames[i] = monsterNames[i].Replace("Content/Characters", "").Replace("/", "").Replace("\\", ""); } monsterEnabled = new Dictionary(); foreach (string s in monsterNames) { monsterEnabled.Add(s, true); } extraCargo = new Dictionary(); } public void LoadClientPermissions() { if (!File.Exists(ClientPermissionsFile)) return; string[] lines; try { lines = File.ReadAllLines(ClientPermissionsFile); } catch (Exception e) { DebugConsole.ThrowError("Failed to open client permission file " + ClientPermissionsFile, e); return; } clientPermissions.Clear(); foreach (string line in lines) { string[] separatedLine = line.Split('|'); if (separatedLine.Length < 3) continue; string name = String.Join("|", separatedLine.Take(separatedLine.Length - 2)); string ip = separatedLine[separatedLine.Length - 2]; ClientPermissions permissions = ClientPermissions.None; if (Enum.TryParse(separatedLine.Last(), out permissions)) { clientPermissions.Add(new SavedClientPermission(name, ip, permissions)); } } } public void SaveClientPermissions() { GameServer.Log("Saving client permissions", ServerLog.MessageType.ServerMessage); List lines = new List(); foreach (SavedClientPermission clientPermission in clientPermissions) { lines.Add(clientPermission.Name + "|" + clientPermission.IP+"|"+clientPermission.Permissions.ToString()); } try { File.WriteAllLines(ClientPermissionsFile, lines); } catch (Exception e) { DebugConsole.ThrowError("Saving client permissions to " + ClientPermissionsFile + " failed", e); } } } }