diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index ba53f6b9..e3a6ed6b 100644 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -327,7 +327,8 @@ namespace TShockAPI args.Player.LoginAttempts++; return; } - } catch (Exception) + } + catch (Exception) { args.Player.SendMessage("There was an error processing your request. Maybe your account doesn't exist?", Color.Red); return; @@ -389,7 +390,7 @@ namespace TShockAPI else { args.Player.SendMessage("Account " + user.Name + " has already been registered.", Color.Green); - Log.ConsoleInfo(args.Player.Name + " failed to register an existing Account: " + user.Name); + Log.ConsoleInfo(args.Player.Name + " failed to register an existing Account: " + user.Name); } } @@ -727,7 +728,8 @@ namespace TShockAPI args.Player.SendMessage("This command will also change all Worlds to reference this WorldID."); args.Player.SendMessage("You must manually fix multi-world configurations."); args.Player.SendMessage("To confirm this: /convert yes"); - } else if (args.Parameters[0] == "yes") + } + else if (args.Parameters[0] == "yes") { TShock.Warps.ConvertDB(); TShock.Regions.ConvertDB(); @@ -1124,61 +1126,79 @@ namespace TShockAPI private static void UseWarp(CommandArgs args) { - if (args.Parameters.Count > 0) + if (args.Parameters.Count < 1) { - if (args.Parameters[0].Equals("list")) - { - args.Player.SendMessage("Current Warps:", Color.Green); - int page = 1; - if (args.Parameters.Count > 1) - int.TryParse(args.Parameters[1], out page); - var sb = new StringBuilder(); - List Warps = TShock.Warps.ListAllWarps(); + args.Player.SendMessage("Invalid syntax! Proper syntax: /warp [name] or /warp list ", Color.Red); + return; + } - if (Warps.Count > (15 * (page - 1))) - { - for (int j = (15 * (page - 1)); j < (15 * page); j++) - { - if (Warps[j].WorldWarpID == Main.worldName) - { - if (sb.Length != 0) - sb.Append(", "); - sb.Append(Warps[j].WarpName); - if (j == Warps.Count - 1) - { - args.Player.SendMessage(sb.ToString(), Color.Yellow); - break; - } - if ((j + 1) % 5 == 0) - { - args.Player.SendMessage(sb.ToString(), Color.Yellow); - sb.Clear(); - } - } - } - } - if (Warps.Count > (15 * page)) - { - args.Player.SendMessage(string.Format("Type /warp list {0} for more warps.", (page + 1)), Color.Yellow); - } - } - else + if (args.Parameters[0].Equals("list")) + { + //How many warps per page + const int pagelimit = 15; + //How many warps per line + const int perline = 5; + //Pages start at 0 but are displayed and parsed at 1 + int page = 0; + + + if (args.Parameters.Count > 1) { - string warpName = String.Join(" ", args.Parameters); - var warp = TShock.Warps.FindWarp(warpName); - if (warp.WarpPos != Vector2.Zero) + if (!int.TryParse(args.Parameters[1], out page) || page < 1) { - if (args.Player.Teleport((int)warp.WarpPos.X, (int)warp.WarpPos.Y + 3)) - args.Player.SendMessage("Warped to " + warpName, Color.Yellow); - } - else - { - args.Player.SendMessage("Specified warp not found", Color.Red); + args.Player.SendMessage(string.Format("Invalid page number ({0})", page), Color.Red); + return; } + page--; //Substract 1 as pages are parsed starting at 1 and not 0 + } + + var warps = TShock.Warps.ListAllWarps(Main.worldName); + + //Check if they are trying to access a page that doesn't exist. + int pagecount = warps.Count / pagelimit; + if (page > pagecount) + { + args.Player.SendMessage(string.Format("Page number exceeds pages ({0}/{1})", page + 1, pagecount + 1), Color.Red); + return; + } + + //Display the current page and the number of pages. + args.Player.SendMessage(string.Format("Current Warps ({0}/{1}):", page + 1, pagecount + 1), Color.Green); + + //Add up to pagelimit names to a list + var nameslist = new List(); + for (int i = 0; i < pagelimit && i + (page * pagelimit) < warps.Count; i++) + { + nameslist.Add(warps[i].WarpName); + } + + //convert the list to an array for joining + var names = nameslist.ToArray(); + for (int i = 0; i < names.Length; i += perline) + { + args.Player.SendMessage(string.Join(", ", names, i, Math.Min(names.Length - i, perline)), Color.Yellow); + } + + if (page < pagecount) + { + args.Player.SendMessage(string.Format("Type /warp list {0} for more warps.", (page + 1)), Color.Yellow); } } else - args.Player.SendMessage("Invalid syntax! Proper syntax: /warp [name] or warp list", Color.Red); + { + string warpName = String.Join(" ", args.Parameters); + var warp = TShock.Warps.FindWarp(warpName); + if (warp.WarpPos != Vector2.Zero) + { + if (args.Player.Teleport((int)warp.WarpPos.X, (int)warp.WarpPos.Y + 3)) + args.Player.SendMessage("Warped to " + warpName, Color.Yellow); + } + else + { + args.Player.SendMessage("Specified warp not found", Color.Red); + } + } + } #endregion Teleport Commands @@ -1375,7 +1395,7 @@ namespace TShockAPI { foreach (Region r in TShock.Regions.Regions) { - args.Player.SendMessage(r.RegionName + ": P: " + r.DisableBuild + " X: " + r.RegionArea.X + " Y: " + r.RegionArea.Y + " W: " + r.RegionArea.Width + " H: " + r.RegionArea.Height ); + args.Player.SendMessage(r.RegionName + ": P: " + r.DisableBuild + " X: " + r.RegionArea.X + " Y: " + r.RegionArea.Y + " W: " + r.RegionArea.Width + " H: " + r.RegionArea.Height); foreach (int s in r.RegionAllowedIDs) { args.Player.SendMessage(r.RegionName + ": " + s); @@ -1541,40 +1561,56 @@ namespace TShockAPI } case "list": { - args.Player.SendMessage("Current Regions:", Color.Green); - int page = 1; + //How many regions per page + const int pagelimit = 15; + //How many regions per line + const int perline = 5; + //Pages start at 0 but are displayed and parsed at 1 + int page = 0; + + if (args.Parameters.Count > 1) - int.TryParse(args.Parameters[1], out page); - var sb = new StringBuilder(); - - List Regions = TShock.Regions.ListAllRegions(); - - if (Regions.Count > (15 * (page - 1))) { - for (int j = (15 * (page - 1)); j < (15 * page); j++) + if (!int.TryParse(args.Parameters[1], out page) || page < 1) { - if (Regions[j].RegionWorldID == Main.worldName) - { - if (sb.Length != 0) - sb.Append(", "); - sb.Append(Regions[j].RegionName); - if (j == Regions.Count - 1) - { - args.Player.SendMessage(sb.ToString(), Color.Yellow); - break; - } - if ((j + 1) % 5 == 0) - { - args.Player.SendMessage(sb.ToString(), Color.Yellow); - sb.Clear(); - } - } + args.Player.SendMessage(string.Format("Invalid page number ({0})", page), Color.Red); + return; } + page--; //Substract 1 as pages are parsed starting at 1 and not 0 } - if (Regions.Count > (15 * page)) + + var regions = TShock.Regions.ListAllRegions(Main.worldName); + + //Check if they are trying to access a page that doesn't exist. + int pagecount = regions.Count / pagelimit; + if (page > pagecount) + { + args.Player.SendMessage(string.Format("Page number exceeds pages ({0}/{1})", page + 1, pagecount + 1), Color.Red); + return; + } + + //Display the current page and the number of pages. + args.Player.SendMessage(string.Format("Current Regions ({0}/{1}):", page + 1, pagecount + 1), Color.Green); + + //Add up to pagelimit names to a list + var nameslist = new List(); + for (int i = 0; i < pagelimit && i + (page * pagelimit) < regions.Count; i++) + { + nameslist.Add(regions[i].RegionName); + } + + //convert the list to an array for joining + var names = nameslist.ToArray(); + for (int i = 0; i < names.Length; i += perline) + { + args.Player.SendMessage(string.Join(", ", names, i, Math.Min(names.Length - i, perline)), Color.Yellow); + } + + if (page < pagecount) { args.Player.SendMessage(string.Format("Type /region list {0} for more regions.", (page + 1)), Color.Yellow); } + break; } case "help": @@ -1877,7 +1913,7 @@ namespace TShockAPI return; } int itemAmount = 0; - int.TryParse( args.Parameters[args.Parameters.Count - 1 ], out itemAmount ); + int.TryParse(args.Parameters[args.Parameters.Count - 1], out itemAmount); var items = Tools.GetItemByIdOrName(args.Parameters[0]); if (items.Count == 0) { @@ -1894,7 +1930,7 @@ namespace TShockAPI { if (args.Player.InventorySlotAvailable || item.name.Contains("Coin")) { - if( itemAmount == 0 || itemAmount > item.maxStack ) + if (itemAmount == 0 || itemAmount > item.maxStack) itemAmount = item.maxStack; args.Player.GiveItem(item.type, item.name, item.width, item.height, itemAmount); args.Player.SendMessage(string.Format("Gave {0} {1}(s).", itemAmount.ToString(), item.name)); diff --git a/TShockAPI/DB/GroupManager.cs b/TShockAPI/DB/GroupManager.cs index 8c8d0c45..f9072f76 100644 --- a/TShockAPI/DB/GroupManager.cs +++ b/TShockAPI/DB/GroupManager.cs @@ -28,101 +28,84 @@ namespace TShockAPI.DB "CREATE TABLE IF NOT EXISTS GroupList (GroupName VARCHAR(255) PRIMARY, Commands VARCHAR(255), OrderBy VARCHAR(255));"; com.ExecuteNonQuery(); + } - if (TShock.Config.StorageType.ToLower() == "sqlite") - com.CommandText = "INSERT OR IGNORE INTO GroupList (GroupName, Commands, OrderBy) VALUES (@groupname, @commands, @order);"; - else if (TShock.Config.StorageType.ToLower() == "mysql") - com.CommandText = "INSERT IGNORE INTO GroupList SET GroupName=@groupname, Commands=@commands, OrderBy=@order;"; - com.AddParameter("@groupname", "trustedadmin"); - com.AddParameter("@commands", "admin,maintenance,cfg,butcher,item,heal,immunetoban,ignorecheatdetection,ignoregriefdetection,usebanneditem,manageusers"); - com.AddParameter("@order", "0"); - com.ExecuteNonQuery(); - com.Parameters.Clear(); - - if (TShock.Config.StorageType.ToLower() == "sqlite") - com.CommandText = "INSERT OR IGNORE INTO GroupList (GroupName, Commands, OrderBy) VALUES (@groupname, @commands, @order);"; - else if (TShock.Config.StorageType.ToLower() == "mysql") - com.CommandText = "INSERT IGNORE INTO GroupList SET GroupName=@groupname, Commands=@commands, OrderBy=@order;"; - com.AddParameter("@groupname", "admin"); - com.AddParameter("@commands", "newadmin,ban,unban,whitelist,causeevents,spawnboss,spawnmob,managewarp,time,tp,pvpfun,kill,logs,immunetokick,tphere"); - com.AddParameter("@order", "0"); - com.ExecuteNonQuery(); - com.Parameters.Clear(); - - if (TShock.Config.StorageType.ToLower() == "sqlite") - com.CommandText = "INSERT OR IGNORE INTO GroupList (GroupName, Commands, OrderBy) VALUES (@groupname, @commands, @order);"; - else if (TShock.Config.StorageType.ToLower() == "mysql") - com.CommandText = "INSERT IGNORE INTO GroupList SET GroupName=@groupname, Commands=@commands, OrderBy=@order;"; - com.AddParameter("@groupname", "newadmin"); - com.AddParameter("@commands", "default,kick,editspawn,reservedslot"); - com.AddParameter("@order", "0"); - com.ExecuteNonQuery(); - com.Parameters.Clear(); - - if (TShock.Config.StorageType.ToLower() == "sqlite") - com.CommandText = "INSERT OR IGNORE INTO GroupList (GroupName, Commands, OrderBy) VALUES (@groupname, @commands, @order);"; - else if (TShock.Config.StorageType.ToLower() == "mysql") - com.CommandText = "INSERT IGNORE INTO GroupList SET GroupName=@groupname, Commands=@commands, OrderBy=@order;"; - com.AddParameter("@groupname", "default"); - com.AddParameter("@commands", "canwater,canlava,warp,canbuild"); - com.AddParameter("@order", "0"); - com.ExecuteNonQuery(); - com.Parameters.Clear(); + //Add default groups + AddGroup("trustedadmin", "admin,maintenance,cfg,butcher,item,heal,immunetoban,ignorecheatdetection,ignoregriefdetection,usebanneditem,manageusers"); + AddGroup("admin", "newadmin,ban,unban,whitelist,causeevents,spawnboss,spawnmob,managewarp,time,tp,pvpfun,kill,logs,immunetokick,tphere"); + AddGroup("newadmin", "default,kick,editspawn,reservedslot"); + AddGroup("default", "canwater,canlava,warp,canbuild"); + AddGroup("vip", "default,canwater,canlava,warp,canbuild,reservedslot"); - if (TShock.Config.StorageType.ToLower() == "sqlite") - com.CommandText = "INSERT OR IGNORE INTO GroupList (GroupName, Commands, OrderBy) VALUES (@groupname, @commands, @order);"; - else if (TShock.Config.StorageType.ToLower() == "mysql") - com.CommandText = "INSERT IGNORE INTO GroupList SET GroupName=@groupname, Commands=@commands, OrderBy=@order;"; - com.AddParameter("@groupname", "vip"); - com.AddParameter("@commands", "default,canwater,canlava,warp,canbuild,reservedslot"); - com.AddParameter("@order", "0"); - com.ExecuteNonQuery(); - com.Parameters.Clear(); - - String file = Path.Combine(TShock.SavePath, "groups.txt"); - if (File.Exists(file)) + String file = Path.Combine(TShock.SavePath, "groups.txt"); + if (File.Exists(file)) + { + using (StreamReader sr = new StreamReader(file)) { - using (StreamReader sr = new StreamReader(file)) + String line; + while ((line = sr.ReadLine()) != null) { - String line; - while ((line = sr.ReadLine()) != null) + if (!line.Equals("") && !line.Substring(0, 1).Equals("#")) { - if( !line.Equals("") && !line.Substring( 0,1 ).Equals( "#" ) ) + String[] info = line.Split(' '); + String comms = ""; + int size = info.Length; + int test = 0; + bool hasOrder = int.TryParse(info[info.Length - 1], out test); + if (hasOrder) + size = info.Length - 1; + for (int i = 1; i < size; i++) + { + if (!comms.Equals("")) + comms = comms + ","; + comms = comms + info[i].Trim(); + } + using (var com = database.CreateCommand()) { - String[] info = line.Split(' '); if (TShock.Config.StorageType.ToLower() == "sqlite") com.CommandText = "INSERT OR IGNORE INTO GroupList (GroupName, Commands, OrderBy) VALUES (@groupname, @commands, @order);"; else if (TShock.Config.StorageType.ToLower() == "mysql") com.CommandText = "INSERT IGNORE INTO GroupList SET GroupName=@groupname, Commands=@commands, OrderBy=@order;"; - String comms = ""; - int size = info.Length; - int test = 0; - bool hasOrder = int.TryParse(info[info.Length - 1], out test); - if( hasOrder ) - size = info.Length - 1; - for (int i = 1; i < size; i++) - { - if (!comms.Equals("")) - comms = comms + ","; - comms = comms + info[i].Trim(); - } - com.AddParameter("@groupname", info[0].Trim().ToString()); + + com.AddParameter("@groupname", info[0].Trim()); com.AddParameter("@commands", comms); - com.AddParameter("@order", hasOrder ? info[info.Length-1] : "0"); + com.AddParameter("@order", hasOrder ? info[info.Length - 1] : "0"); com.ExecuteNonQuery(); - com.Parameters.Clear(); } } } - String path = Path.Combine(TShock.SavePath, "old_configs"); - String file2 = Path.Combine(path, "groups.txt"); - if (!Directory.Exists(path)) - System.IO.Directory.CreateDirectory(path); - if (File.Exists(file2)) - File.Delete(file2); - File.Move(file, file2); } + String path = Path.Combine(TShock.SavePath, "old_configs"); + String file2 = Path.Combine(path, "groups.txt"); + if (!Directory.Exists(path)) + System.IO.Directory.CreateDirectory(path); + if (File.Exists(file2)) + File.Delete(file2); + File.Move(file, file2); + } + + } + + /// + /// Adds group with name and permissions if it does not exist. + /// + /// name of group + /// permissions + public void AddGroup(string name, string commands) + { + using (var com = database.CreateCommand()) + { + if (TShock.Config.StorageType.ToLower() == "sqlite") + com.CommandText = + "INSERT OR IGNORE INTO GroupList (GroupName, Commands, OrderBy) VALUES (@groupname, @commands, @order);"; + else if (TShock.Config.StorageType.ToLower() == "mysql") + com.CommandText = + "INSERT IGNORE INTO GroupList SET GroupName=@groupname, Commands=@commands, OrderBy=@order;"; + com.AddParameter("@groupname", name); + com.AddParameter("@commands", commands); + com.AddParameter("@order", "0"); + com.ExecuteNonQuery(); } } @@ -166,7 +149,7 @@ namespace TShockAPI.DB //Inherit Given commands String[] commands = reader.Get("Commands").Split(','); - for( int i = 0; i < commands.Length; i++ ) + for (int i = 0; i < commands.Length; i++) { group.AddPermission(commands[i].Trim()); } diff --git a/TShockAPI/DB/RegionManager.cs b/TShockAPI/DB/RegionManager.cs index f5d33d9d..3c42eeb4 100644 --- a/TShockAPI/DB/RegionManager.cs +++ b/TShockAPI/DB/RegionManager.cs @@ -74,7 +74,7 @@ namespace TShockAPI.DB switch (reader.NodeType) { case XmlNodeType.Element: - switch( reader.Name ) + switch (reader.Name) { case "ProtectedRegion": name = ""; @@ -96,22 +96,22 @@ namespace TShockAPI.DB case "Point1X": while (reader.NodeType != XmlNodeType.Text) reader.Read(); - int.TryParse( reader.Value, out x1 ); + int.TryParse(reader.Value, out x1); break; case "Point1Y": while (reader.NodeType != XmlNodeType.Text) reader.Read(); - int.TryParse(reader.Value, out y1); + int.TryParse(reader.Value, out y1); break; case "Point2X": while (reader.NodeType != XmlNodeType.Text) reader.Read(); - int.TryParse(reader.Value, out x2); + int.TryParse(reader.Value, out x2); break; case "Point2Y": while (reader.NodeType != XmlNodeType.Text) reader.Read(); - int.TryParse(reader.Value, out y2); + int.TryParse(reader.Value, out y2); break; case "Protected": while (reader.NodeType != XmlNodeType.Text) @@ -120,10 +120,11 @@ namespace TShockAPI.DB { prot = 0; } - else{ + else + { prot = 1; } - break; + break; case "WorldName": while (reader.NodeType != XmlNodeType.Text) reader.Read(); @@ -144,18 +145,19 @@ namespace TShockAPI.DB ips[i] = reader.Value; } ipstr = ""; - for( int i = 0; i < ips.Length; i++ ) + for (int i = 0; i < ips.Length; i++) { try { if (ipstr != "") ipstr += ","; ipstr += TShock.Users.GetUserID(ips[i]); - } catch (Exception) + } + catch (Exception) { Log.Error("An IP address failed to import. It wasn't a user in the new user system."); } - + } } @@ -166,7 +168,7 @@ namespace TShockAPI.DB com.AddParameter("@tx", x1); com.AddParameter("@ty", y1); com.AddParameter("@width", x2); - com.AddParameter("@height",y2); + com.AddParameter("@height", y2); com.AddParameter("@name", name); com.AddParameter("@worldid", world); com.AddParameter("@userids", ipstr); @@ -200,7 +202,7 @@ namespace TShockAPI.DB //File.Move(file, file2); } - if( updates > 0 ) + if (updates > 0) ReloadAllRegions(); } } @@ -225,7 +227,7 @@ namespace TShockAPI.DB { Log.Error(ex.ToString()); } - } + } public void ReloadAllRegions() { @@ -262,7 +264,8 @@ namespace TShockAPI.DB } r.RegionAllowedIDs[i] = Convert.ToInt32(SplitIDs[i]); } - } catch (Exception e) + } + catch (Exception e) { Log.Error("Your database contains invalid UserIDs (they should be ints)."); Log.Error("A lot of things will fail because of this. You must manually delete and re-create the allowed field."); @@ -374,7 +377,7 @@ namespace TShockAPI.DB public bool InArea(int x, int y) { - foreach(Region region in Regions) + foreach (Region region in Regions) { if (x >= region.RegionArea.Left && x <= region.RegionArea.Right && y >= region.RegionArea.Top && y <= region.RegionArea.Bottom && @@ -438,7 +441,8 @@ namespace TShockAPI.DB { ReloadAllRegions(); return true; - } else + } + else { return false; } @@ -451,19 +455,24 @@ namespace TShockAPI.DB } } - public List ListAllRegions() + /// + /// Gets all the regions names from world + /// + /// World name to get regions from + /// List of regions with only their names + public List ListAllRegions(string worldid) { - List Regions = new List(); + var regions = new List(); try { using (var com = database.CreateCommand()) { - com.CommandText = "SELECT * FROM Regions"; + com.CommandText = "SELECT RegionName FROM Regions WHERE WorldID=@worldid"; + com.AddParameter("@worldid", worldid); using (var reader = com.ExecuteReader()) { while (reader.Read()) - Regions.Add(new Region(new Rectangle(reader.Get("X1"), reader.Get("Y1"), reader.Get("height"), reader.Get("width")), reader.Get("RegionName"), reader.Get("Protected"), reader.Get("WorldID"))); - reader.Close(); + regions.Add(new Region { RegionName = reader.Get("RegionName") }); } } } @@ -471,7 +480,7 @@ namespace TShockAPI.DB { Log.Error(ex.ToString()); } - return Regions; + return regions; } } diff --git a/TShockAPI/DB/WarpsManager.cs b/TShockAPI/DB/WarpsManager.cs index bbcafc8a..0187f16f 100644 --- a/TShockAPI/DB/WarpsManager.cs +++ b/TShockAPI/DB/WarpsManager.cs @@ -116,7 +116,7 @@ namespace TShockAPI.DB break; } } - + } reader.Close(); String path = Path.Combine(TShock.SavePath, "old_configs"); @@ -145,7 +145,7 @@ namespace TShockAPI.DB { Log.Error(ex.ToString()); } - } + } public bool AddWarp(int x, int y, string name, string worldid) { @@ -202,7 +202,7 @@ namespace TShockAPI.DB { if (reader.Read()) { - return new Warp(new Vector2(reader.Get("X"), reader.Get("Y")), reader.Get("WarpName"), reader.Get("WorldID")); + return new Warp(new Vector2(reader.Get("X"), reader.Get("Y")), reader.Get("WarpName"), reader.Get("WorldID")); } reader.Close(); } @@ -215,20 +215,24 @@ namespace TShockAPI.DB return new Warp(); } - public List ListAllWarps() + /// + /// Gets all the warps names from world + /// + /// World name to get warps from + /// List of warps with only their names + public List ListAllWarps(string worldid) { - List Warps = new List(); + var warps = new List(); try { using (var com = database.CreateCommand()) { - com.CommandText = "SELECT * FROM Warps"; + com.CommandText = "SELECT WarpName FROM Warps WHERE WorldID=@worldid"; + com.AddParameter("@worldid", worldid); using (var reader = com.ExecuteReader()) { while (reader.Read()) - Warps.Add(new Warp(new Vector2(reader.Get("X"), reader.Get("Y")), reader.Get("WarpName"), reader.Get("WorldID"))); - - reader.Close(); + warps.Add(new Warp { WarpName = reader.Get("WarpName") }); } } } @@ -236,7 +240,7 @@ namespace TShockAPI.DB { Log.Error(ex.ToString()); } - return Warps; + return warps; } }