diff --git a/Commands/Moderation/CmdRenameLvl.cs b/Commands/Moderation/CmdRenameLvl.cs index 541fdcc7b..61063e062 100644 --- a/Commands/Moderation/CmdRenameLvl.cs +++ b/Commands/Moderation/CmdRenameLvl.cs @@ -18,10 +18,9 @@ using System; using System.IO; using MCGalaxy.SQL; -namespace MCGalaxy.Commands -{ - public sealed class CmdRenameLvl : Command - { + +namespace MCGalaxy.Commands { + public sealed class CmdRenameLvl : Command { public override string name { get { return "renamelvl"; } } public override string shortcut { get { return ""; } } public override string type { get { return CommandTypes.Moderation; } } @@ -29,71 +28,47 @@ namespace MCGalaxy.Commands public override LevelPermission defaultRank { get { return LevelPermission.Admin; } } public CmdRenameLvl() { } - public override void Use(Player p, string message) - { + public override void Use(Player p, string message) { if (message == "" || message.IndexOf(' ') == -1) { Help(p); return; } - Level foundLevel = LevelInfo.Find(message.Split(' ')[0]); - if (foundLevel == null) - { - Player.SendMessage(p, "Level not found"); - return; + string[] args = message.Split(' '); + Level lvl = LevelInfo.Find(args[0]); + if (lvl == null) { Player.SendMessage(p, "Level not found"); return; } + string newName = args[1]; + if (!Player.ValidName(newName)) { + Player.SendMessage("\"" + newName + "\" is not a valid level name."); return; } - - string newName = message.Split(' ')[1]; - - if (LevelInfo.ExistsOffline(newName)) { Player.SendMessage(p, "Level already exists."); return; } - if (foundLevel == Server.mainLevel) { Player.SendMessage(p, "Cannot rename the main level."); return; } - - foundLevel.Unload(); - - - File.Move(LevelInfo.LevelPath(foundLevel.name), LevelInfo.LevelPath(newName)); - try - { - File.Move(LevelInfo.LevelPath(foundLevel.name) + ".backup", LevelInfo.LevelPath(newName) + ".backup"); - } catch { } - try - { - File.Move("levels/level properties/" + foundLevel.name + ".properties", "levels/level properties/" + newName + ".properties"); + if (LevelInfo.ExistsOffline(newName)) { Player.SendMessage(p, "Level already exists."); return; } + if (lvl == Server.mainLevel) { Player.SendMessage(p, "Cannot rename the main level."); return; } + lvl.Unload(); + + File.Move(LevelInfo.LevelPath(lvl.name), LevelInfo.LevelPath(newName)); + try { + File.Move(LevelInfo.LevelPath(lvl.name) + ".backup", LevelInfo.LevelPath(newName) + ".backup"); + } catch { } - catch { } - try - { - File.Move("levels/level properties/" + foundLevel.name, "levels/level properties/" + newName + ".properties"); - } - catch { } try { - if (File.Exists("blockdefs/lvl_" + foundLevel.name + ".json")) - File.Move("blockdefs/lvl_" + foundLevel.name + ".json", "blockdefs/lvl_" + newName + ".json"); - } catch {} + File.Move("levels/level properties/" + lvl.name + ".properties", "levels/level properties/" + newName + ".properties"); + } catch { + } + + try { + File.Move("levels/level properties/" + lvl.name, "levels/level properties/" + newName + ".properties"); + } catch { + } + + try { + if (File.Exists("blockdefs/lvl_" + lvl.name + ".json")) + File.Move("blockdefs/lvl_" + lvl.name + ".json", "blockdefs/lvl_" + newName + ".json"); + } catch { + } //Move and rename backups - try - { - string foundLevelDir, newNameDir; - for (int i = 1; ; i++) - { - foundLevelDir = LevelInfo.BackupPath(foundLevel.name, i.ToString()); - newNameDir = LevelInfo.BackupPath(newName, i.ToString()); - - if (File.Exists(foundLevelDir + foundLevel.name + ".lvl")) - { - Directory.CreateDirectory(newNameDir); - File.Move(foundLevelDir + foundLevel.name + ".lvl", newNameDir + newName + ".lvl"); - if (DirectoryEmpty(foundLevelDir)) - Directory.Delete(foundLevelDir); - } - else - { - if (DirectoryEmpty(Server.backupLocation + "/" + foundLevel.name + "/")) - Directory.Delete(Server.backupLocation + "/" + foundLevel.name + "/"); - break; - } - } + try { + MoveBackups(lvl.name, newName); + } catch { } - catch { } //safe against SQL injections because foundLevel is being checked and, //newName is being split and partly checked on illegal characters reserved for Windows. @@ -101,37 +76,48 @@ namespace MCGalaxy.Commands Database.executeQuery(String.Format("RENAME TABLE `Block{0}` TO `Block{1}`, " + "`Portals{0}` TO `Portals{1}`, " + "`Messages{0}` TO `Messages{1}`, " + - "`Zone{0}` TO `Zone{1}`", foundLevel.name.ToLower(), newName.ToLower())); + "`Zone{0}` TO `Zone{1}`", lvl.name.ToLower(), newName.ToLower())); else { using (BulkTransaction helper = SQLiteBulkTransaction.Create()) { // ensures that it's either all work, or none work. - helper.Execute(String.Format("ALTER TABLE `Block{0}` RENAME TO `Block{1}`", foundLevel.name.ToLower(), newName.ToLower())); - helper.Execute(String.Format("ALTER TABLE `Portals{0}` RENAME TO `Portals{1}`", foundLevel.name.ToLower(), newName.ToLower())); - helper.Execute(String.Format("ALTER TABLE `Messages{0}` RENAME TO `Messages{1}`", foundLevel.name.ToLower(), newName.ToLower())); - helper.Execute(String.Format("ALTER TABLE `Zone{0}` RENAME TO `Zone{1}`", foundLevel.name.ToLower(), newName.ToLower())); + helper.Execute(String.Format("ALTER TABLE `Block{0}` RENAME TO `Block{1}`", lvl.name.ToLower(), newName.ToLower())); + helper.Execute(String.Format("ALTER TABLE `Portals{0}` RENAME TO `Portals{1}`", lvl.name.ToLower(), newName.ToLower())); + helper.Execute(String.Format("ALTER TABLE `Messages{0}` RENAME TO `Messages{1}`", lvl.name.ToLower(), newName.ToLower())); + helper.Execute(String.Format("ALTER TABLE `Zone{0}` RENAME TO `Zone{1}`", lvl.name.ToLower(), newName.ToLower())); helper.Commit(); } } try { Command.all.Find("load").Use(p, newName); } catch { } - Player.GlobalMessage("Renamed " + foundLevel.name + " to " + newName); + Player.GlobalMessage("Renamed " + lvl.name + " to " + newName); + } + + static bool DirectoryEmpty(string dir) { + if (!Directory.Exists(dir)) return true; + if (Directory.GetDirectories(dir).Length > 0) return false; + if (Directory.GetFiles(dir).Length > 0) return false; + return true; } - public override void Help(Player p) - { + static void MoveBackups(string oldName, string newName) { + for (int i = 1; ; i++) { + string oldDir = LevelInfo.BackupPath(oldName, i.ToString()); + string newDir = LevelInfo.BackupPath(newName, i.ToString()); + + if (File.Exists(oldDir + oldName + ".lvl")) { + Directory.CreateDirectory(newDir); + File.Move(oldDir + oldName + ".lvl", newDir + newName + ".lvl"); + if (DirectoryEmpty(oldDir)) Directory.Delete(oldDir); + } else { + if (DirectoryEmpty(Server.backupLocation + "/" + oldName + "/")) + Directory.Delete(Server.backupLocation + "/" + oldName + "/"); + break; + } + } + } + + public override void Help(Player p) { Player.SendMessage(p, "/renamelvl - Renames to "); Player.SendMessage(p, "Portals going to will be lost"); } - - public static bool DirectoryEmpty(string dir) - { - if (!Directory.Exists(dir)) - return true; - if (Directory.GetDirectories(dir).Length > 0) - return false; - if (Directory.GetFiles(dir).Length > 0) - return false; - - return true; - } } }