diff --git a/Commands/World/CmdLockdown.cs b/Commands/World/CmdLockdown.cs index b41d47742..02a58cebb 100644 --- a/Commands/World/CmdLockdown.cs +++ b/Commands/World/CmdLockdown.cs @@ -38,19 +38,20 @@ namespace MCGalaxy.Commands { } if (args[0].CaselessEq("map")) { - args[1] = args[1].ToLower(); if (!Formatter.ValidName(p, args[1], "level")) return; - string path = "text/lockdown/map/" + args[1]; - if (!File.Exists(path)) { - File.Create(path).Dispose(); - Chat.MessageAll("The map {0} has been locked", args[1]); - Chat.MessageOps("Locked by: " + ((p == null) ? "Console" : p.name)); + bool unlocking = Server.lockdown.Contains(args[1]); + Chat.MessageAll("The map {0} has been {0}locked", args[1], unlocking ? "un" : ""); + string srcName = (p == null) ? "(console)" : p.ColoredName; + + if (unlocking) { + Server.lockdown.Remove(args[1]); + Chat.MessageOps("Unlocked by: " + srcName); } else { - File.Delete(path); - Chat.MessageAll("The map {0} has been unlocked", args[1]); - Chat.MessageOps("Unlocked by: " + ((p == null) ? "Console" : p.name)); + Server.lockdown.AddOrReplace(args[1]); + Chat.MessageOps("Locked by: " + srcName); } + Server.lockdown.Save(); } else { Player who = PlayerInfo.FindMatches(p, args[1]); if (who == null) return; @@ -67,7 +68,7 @@ namespace MCGalaxy.Commands { Chat.MessageAll("{0} %Shas been locked down!", who.ColoredName); Chat.MessageOps("Locked by: " + ((p == null) ? "Console" : p.name)); } else { - Chat.MessageAll("{0} %Shas been unlocked.", who.ColoredName); + Chat.MessageAll("{0} %Shas been unlocked.", who.ColoredName); Chat.MessageOps("Unlocked by: " + ((p == null) ? "Console" : p.name)); } who.jailed = !who.jailed; @@ -75,9 +76,9 @@ namespace MCGalaxy.Commands { } public override void Help(Player p) { - Player.Message(p, "%T/lockdown [map/player] [name]"); - Player.Message(p, "%H'map' - prevents new players from joining that map."); - Player.Message(p, "%H'player' - prevents that player from using commands."); + Player.Message(p, "%T/lockdown map/player [name]"); + Player.Message(p, "%H\"map\" - prevents new players from joining that map."); + Player.Message(p, "%H\"player\" - prevents that player from using commands."); Player.Message(p, "%HUsing /lockdown again will unlock that map/player."); } } diff --git a/Levels/Level.cs b/Levels/Level.cs index cff912916..2b5e63775 100644 --- a/Levels/Level.cs +++ b/Levels/Level.cs @@ -147,7 +147,7 @@ namespace MCGalaxy { public bool CanJoin(Player p, bool ignorePerms = false) { if (p == null) return true; if (!VisitAccess.CheckDetailed(p, ignorePerms)) return false; - if (File.Exists("text/lockdown/map/" + name)) { + if (Server.lockdown.Contains(name)) { Player.Message(p, "The level " + name + " is locked."); return false; } return true; diff --git a/MCGalaxy_.csproj b/MCGalaxy_.csproj index 4219f4c72..0571703e0 100644 --- a/MCGalaxy_.csproj +++ b/MCGalaxy_.csproj @@ -608,6 +608,7 @@ + @@ -731,6 +732,7 @@ + diff --git a/Server/Server.Fields.cs b/Server/Server.Fields.cs index 24af5f91f..dad8dd5de 100644 --- a/Server/Server.Fields.cs +++ b/Server/Server.Fields.cs @@ -79,7 +79,7 @@ namespace MCGalaxy { public static bool ServerSetupFinished = false; public static Auto_CTF ctf = null; public static PlayerList bannedIP, whiteList, ircControllers, muted; - public static PlayerList ignored, frozen, hidden, agreed, vip, noEmotes; + public static PlayerList ignored, frozen, hidden, agreed, vip, noEmotes, lockdown; public static PlayerExtList jailed, models, skins, reach; public static readonly List Devs = new List(), Mods = new List(); diff --git a/Server/Server.Init.cs b/Server/Server.Init.cs index f4ad2fe76..485ccab16 100644 --- a/Server/Server.Init.cs +++ b/Server/Server.Init.cs @@ -23,6 +23,7 @@ using System.Threading; using MCGalaxy.Commands.World; using MCGalaxy.Games; using MCGalaxy.Generator; +using MCGalaxy.Tasks; namespace MCGalaxy { @@ -70,7 +71,7 @@ namespace MCGalaxy { void LoadPlayerLists() { agreed = new PlayerList("ranks/agreed.txt"); try { - UpgradeOldAgreed(); + UpgradeTasks.UpgradeOldAgreed(); agreed = PlayerList.Load("agreed.txt"); } catch (Exception ex) { Server.ErrorLog(ex); @@ -83,6 +84,7 @@ namespace MCGalaxy { hidden = PlayerList.Load("hidden.txt"); vip = PlayerList.Load("text/vip.txt"); noEmotes = PlayerList.Load("text/emotelist.txt"); + lockdown = PlayerList.Load("text/lockdown.txt"); jailed = PlayerExtList.Load("ranks/jailed.txt"); models = PlayerExtList.Load("extra/models.txt"); @@ -95,46 +97,6 @@ namespace MCGalaxy { whiteList = PlayerList.Load("whitelist.txt"); } - static void UpgradeOldBlacklist() { - if (!Directory.Exists("levels/blacklists")) return; - string[] files = Directory.GetFiles("levels/blacklists"); - for (int i = 0; i < files.Length; i++) { - string[] blacklist = File.ReadAllLines(files[i]); - List names = new List(); - - // Lines are in the format: day.month.year name+ - foreach (string entry in blacklist) { - string[] parts = entry.Split(' '); - string name = parts[parts.Length - 1]; - name = name.Substring(0, name.Length - 1); - names.Add(name); - } - - if (names.Count > 0) { - string lvlName = Path.GetFileNameWithoutExtension(files[i]); - string propsPath = LevelInfo.PropertiesPath(lvlName); - using (StreamWriter w = new StreamWriter(propsPath, true)) { - w.WriteLine("VisitBlacklist = " + names.Join()); - } - } - File.Delete(files[i]); - } - Directory.Delete("levels/blacklists"); - } - - static void UpgradeOldAgreed() { - // agreed.txt format used to be names separated by spaces, we need to fix that up. - if (!File.Exists("ranks/agreed.txt")) return; - - string data = null; - using (FileStream fs = File.OpenRead("ranks/agreed.txt")) { - if (fs.ReadByte() != ' ') return; - data = new StreamReader(fs).ReadToEnd(); - data = data.Replace(" ", Environment.NewLine); - } - File.WriteAllText("ranks/agreed.txt", data); - } - void LoadAutoloadCommands() { if (File.Exists("text/autoload.txt")) { try { @@ -165,69 +127,6 @@ namespace MCGalaxy { } } } - - void MovePreviousLevelFiles() { - if (!Directory.Exists("levels")) return; - try { - string[] files = Directory.GetFiles("levels", "*.prev"); - if (files.Length == 0) return; - if (!Directory.Exists("levels/prev")) - Directory.CreateDirectory("levels/prev"); - - foreach (string file in files) { - string name = Path.GetFileName(file); - string newFile = "levels/prev/" + name; - - try { - File.Move(file, newFile); - } catch (Exception ex) { - Server.s.Log("Error while trying to move .lvl.prev file"); - Server.ErrorLog(ex); - } - } - } catch (Exception ex) { - Server.ErrorLog(ex); - } - } - - void CombineEnvFiles() { - if (!Directory.Exists("levels/level properties")) return; - try { - string[] files = Directory.GetFiles("levels/level properties", "*.env"); - if (files.Length == 0) return; - - Server.s.Log("Combining " + files.Length + " .env and .properties files.."); - foreach (string envFile in files) { - try { - Combine(envFile); - } catch (Exception ex) { - Server.s.Log("Error while trying to combine .env and .properties file"); - Server.ErrorLog(ex); - } - } - Server.s.Log("Finished combining .env and .properties files."); - } catch (Exception ex) { - Server.ErrorLog(ex); - } - } - - static void Combine(string envFile) { - string name = Path.GetFileNameWithoutExtension(envFile); - string propFile = LevelInfo.FindPropertiesFile(name); - List lines = new List(); - if (propFile != null) - lines = CP437Reader.ReadAllLines(propFile); - - using (StreamReader r = new StreamReader(envFile)) { - string line = null; - while ((line = r.ReadLine()) != null) - lines.Add(line); - } - - propFile = LevelInfo.PropertiesPath(name); - CP437Writer.WriteAllLines(propFile, lines.ToArray()); - File.Delete(envFile); - } void SetupSocket() { Log("Creating listening socket on port " + port + "... "); diff --git a/Server/Server.cs b/Server/Server.cs index 06ecdf5ab..abef302e6 100644 --- a/Server/Server.cs +++ b/Server/Server.cs @@ -20,6 +20,7 @@ using System.IO; using System.Net; using System.Net.Sockets; using MCGalaxy.Games; +using MCGalaxy.Tasks; using Newtonsoft.Json; namespace MCGalaxy { @@ -99,13 +100,14 @@ namespace MCGalaxy { foreach (Level l in loaded) l.Unload(); - Background.QueueOnce(CombineEnvFiles); + Background.QueueOnce(UpgradeTasks.CombineEnvFiles); Background.QueueOnce(LoadMainLevel); Plugin.Load(); - Background.QueueOnce(UpgradeOldBlacklist); + Background.QueueOnce(UpgradeTasks.UpgradeOldBlacklist); Background.QueueOnce(LoadPlayerLists); Background.QueueOnce(LoadAutoloadCommands); - Background.QueueOnce(MovePreviousLevelFiles); + Background.QueueOnce(UpgradeTasks.MovePreviousLevelFiles); + Background.QueueOnce(UpgradeTasks.UpgradeOldLockdown); Background.QueueOnce(SetupSocket); Background.QueueOnce(InitTimers); diff --git a/Server/Tasks/UpgradeTasks.cs b/Server/Tasks/UpgradeTasks.cs new file mode 100644 index 000000000..98ad2d77e --- /dev/null +++ b/Server/Tasks/UpgradeTasks.cs @@ -0,0 +1,147 @@ +/* + Copyright 2015 MCGalaxy + + Dual-licensed under the Educational Community License, Version 2.0 and + the GNU General Public License, Version 3 (the "Licenses"); you may + not use this file except in compliance with the Licenses. You may + obtain a copy of the Licenses at + + http://www.opensource.org/licenses/ecl2.php + http://www.gnu.org/licenses/gpl-3.0.html + + Unless required by applicable law or agreed to in writing, + software distributed under the Licenses are distributed on an "AS IS" + BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + or implied. See the Licenses for the specific language governing + permissions and limitations under the Licenses. + */ +using System; +using System.Collections.Generic; +using System.IO; +using System.Net; +using System.Threading; +using MCGalaxy.Commands.World; +using MCGalaxy.Games; +using MCGalaxy.Generator; + +namespace MCGalaxy.Tasks { + internal static class UpgradeTasks { + + internal static void UpgradeOldBlacklist() { + if (!Directory.Exists("levels/blacklists")) return; + string[] files = Directory.GetFiles("levels/blacklists"); + for (int i = 0; i < files.Length; i++) { + string[] blacklist = File.ReadAllLines(files[i]); + List names = new List(); + + // Lines are in the format: day.month.year name+ + foreach (string entry in blacklist) { + string[] parts = entry.Split(' '); + string name = parts[parts.Length - 1]; + name = name.Substring(0, name.Length - 1); + names.Add(name); + } + + if (names.Count > 0) { + string lvlName = Path.GetFileNameWithoutExtension(files[i]); + string propsPath = LevelInfo.PropertiesPath(lvlName); + using (StreamWriter w = new StreamWriter(propsPath, true)) { + w.WriteLine("VisitBlacklist = " + names.Join()); + } + } + File.Delete(files[i]); + } + Directory.Delete("levels/blacklists"); + } + + internal static void UpgradeOldAgreed() { + // agreed.txt format used to be names separated by spaces, we need to fix that up. + if (!File.Exists("ranks/agreed.txt")) return; + + string data = null; + using (FileStream fs = File.OpenRead("ranks/agreed.txt")) { + if (fs.ReadByte() != ' ') return; + data = new StreamReader(fs).ReadToEnd(); + data = data.Replace(" ", Environment.NewLine); + } + File.WriteAllText("ranks/agreed.txt", data); + } + + internal static void MovePreviousLevelFiles() { + if (!Directory.Exists("levels")) return; + try { + string[] files = Directory.GetFiles("levels", "*.prev"); + if (files.Length == 0) return; + if (!Directory.Exists("levels/prev")) + Directory.CreateDirectory("levels/prev"); + + foreach (string file in files) { + string name = Path.GetFileName(file); + string newFile = "levels/prev/" + name; + + try { + File.Move(file, newFile); + } catch (Exception ex) { + Server.s.Log("Error while trying to move .lvl.prev file"); + Server.ErrorLog(ex); + } + } + } catch (Exception ex) { + Server.ErrorLog(ex); + } + } + + internal static void CombineEnvFiles() { + if (!Directory.Exists("levels/level properties")) return; + try { + string[] files = Directory.GetFiles("levels/level properties", "*.env"); + if (files.Length == 0) return; + + Server.s.Log("Combining " + files.Length + " .env and .properties files.."); + foreach (string envFile in files) { + try { + Combine(envFile); + } catch (Exception ex) { + Server.s.Log("Error while trying to combine .env and .properties file"); + Server.ErrorLog(ex); + } + } + Server.s.Log("Finished combining .env and .properties files."); + } catch (Exception ex) { + Server.ErrorLog(ex); + } + } + + static void Combine(string envFile) { + string name = Path.GetFileNameWithoutExtension(envFile); + string propFile = LevelInfo.FindPropertiesFile(name); + List lines = new List(); + if (propFile != null) + lines = CP437Reader.ReadAllLines(propFile); + + using (StreamReader r = new StreamReader(envFile)) { + string line = null; + while ((line = r.ReadLine()) != null) + lines.Add(line); + } + + propFile = LevelInfo.PropertiesPath(name); + CP437Writer.WriteAllLines(propFile, lines.ToArray()); + File.Delete(envFile); + } + + internal static void UpgradeOldLockdown() { + if (!Directory.Exists("text/lockdown/map")) return; + + string[] files = Directory.GetFiles("text/lockdown/map"); + for (int i = 0; i < files.Length; i++) { + File.Delete(files[i]); + string level = Path.GetFileName(files[i]); + Server.lockdown.AddOrReplace(level); + } + + Server.lockdown.Save(); + Directory.Delete("text/lockdown/map"); + } + } +} \ No newline at end of file