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