diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index e18c9d92..36a5d4da 100755 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -305,6 +305,7 @@ namespace TShockAPI if (exr[0] == encrPass) { args.Player.Group = Tools.GetGroup(exr[1]); + args.Player.UserName = args.Parameters[0]; args.Player.SendMessage("Authenticated as " + args.Parameters[0] + " successfully.", Color.LimeGreen); return; } @@ -964,16 +965,18 @@ namespace TShockAPI if (args.Parameters.Count > 1) int.TryParse(args.Parameters[1], out page); var sb = new StringBuilder(); - if (TShock.Warps.Warps.Count > (15 * (page - 1))) + List Warps = TShock.Warps.ListAllWarps(); + + if (Warps.Count > (15 * (page - 1))) { for (int j = (15 * (page - 1)); j < (15 * page); j++) { - if (TShock.Warps.Warps[j].WorldWarpName == Main.worldName) + if (Warps[j].WorldWarpID == Main.worldID.ToString()) { if (sb.Length != 0) sb.Append(", "); - sb.Append("/").Append(TShock.Warps.Warps[j].WarpName); - if (j == TShock.Warps.Warps.Count - 1) + sb.Append("/").Append(Warps[j].WarpName); + if (j == Warps.Count - 1) { args.Player.SendMessage(sb.ToString(), Color.Yellow); break; @@ -986,7 +989,7 @@ namespace TShockAPI } } } - if (TShock.Warps.Warps.Count > (15 * page)) + if (Warps.Count > (15 * page)) { args.Player.SendMessage(string.Format("Type /warp list {0} for more warps.", (page + 1)), Color.Yellow); } @@ -1315,7 +1318,7 @@ namespace TShockAPI { string playerName = args.Parameters[1]; string regionName = ""; - string playerIP = null; + string playerID = "0"; for (int i = 2; i < args.Parameters.Count; i++) { @@ -1328,9 +1331,18 @@ namespace TShockAPI regionName = regionName + " " + args.Parameters[i]; } } - if ((playerIP = Tools.GetPlayerIP(playerName)) != null) + if ((playerID = TShock.Users.GetUserID(Tools.FindPlayer(playerName)[0].UserName)) != "0") { - if (TShock.Regions.AddNewUser(regionName, playerIP)) + if (TShock.Regions.AddNewUser(regionName, playerID)) + { + args.Player.SendMessage("Added user " + playerName + " to " + regionName, Color.Yellow); + } + else + args.Player.SendMessage("Region " + regionName + " not found", Color.Red); + } + else if ((playerID = TShock.Users.GetUserID("",Tools.FindPlayer(playerName)[0].IP)) != "0") + { + if (TShock.Regions.AddNewUser(regionName, playerID)) { args.Player.SendMessage("Added user " + playerName + " to " + regionName, Color.Yellow); } @@ -1346,6 +1358,44 @@ namespace TShockAPI args.Player.SendMessage("Invalid syntax! Proper syntax: /region allow [name] [region]", Color.Red); break; } + case "list": + { + args.Player.SendMessage("Current Regions:", Color.Green); + int page = 1; + 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 (Regions[j].RegionWorldID == Main.worldID.ToString()) + { + 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(); + } + } + } + } + if (Regions.Count > (15 * page)) + { + args.Player.SendMessage(string.Format("Type /warp list {0} for more warps.", (page + 1)), Color.Yellow); + } + break; + } case "help": default: { diff --git a/TShockAPI/DB/RegionManager.cs b/TShockAPI/DB/RegionManager.cs index 5da10316..d8b00782 100644 --- a/TShockAPI/DB/RegionManager.cs +++ b/TShockAPI/DB/RegionManager.cs @@ -43,7 +43,7 @@ namespace TShockAPI.DB using (var com = database.CreateCommand()) { com.CommandText = - "CREATE TABLE IF NOT EXISTS 'Regions' ('X1' INTEGER(11) NOT NULL, 'Y1' INTEGER(11) NOT NULL, 'X2' INTEGER(11) NOT NULL, 'Y2' INTEGER(11) NOT NULL, 'RegionName' VARCHAR(32) NOT NULL, 'WorldID' VARCHAR(255) NOT NULL, 'UserIds' VARCHAR(255) NOT NULL, 'Protected' INTEGER(1));"; + "CREATE TABLE IF NOT EXISTS 'Regions' ('X1' NUMERIC, 'Y1' NUMERIC, 'X2' NUMERIC, 'Y2' NUMERIC, 'RegionName' TEXT, 'WorldID' TEXT, 'UserIds' TEXT, 'Protected' NUMERIC);"; com.ExecuteNonQuery(); } } @@ -139,7 +139,9 @@ namespace TShockAPI.DB int Y2 = reader.Get("Y2"); int Protected = reader.Get("Protected"); string MergedIDs = DbExt.Get(reader, "UserIds"); - List SplitIDs = ListIDs(MergedIDs); + + string[] SplitIDs = MergedIDs.Split(','); + if (X >= X1 && X <= X2 && Y >= Y1 && @@ -190,7 +192,7 @@ namespace TShockAPI.DB { using (var com = database.CreateCommand()) { - com.CommandText = "SELECT * FROM Regions WHERE RegionName=@name WorldID=@worldid"; + com.CommandText = "SELECT * FROM Regions WHERE RegionName=@name AND WorldID=@worldid"; com.AddParameter("@name", regionName); com.AddParameter("@worldid", Main.worldID.ToString()); @@ -198,7 +200,7 @@ namespace TShockAPI.DB { if (reader.Read()) { - MergedIDs = DbExt.Get(reader, "UserIds"); + MergedIDs = reader.Get("UserIds"); } } @@ -207,10 +209,8 @@ namespace TShockAPI.DB else MergedIDs = MergedIDs + "," + ID; - com.CommandText = "UPDATE Regions SET UserIds='@ids' WHERE RegionName=@name WorldID=@worldid"; + com.CommandText = "UPDATE Regions SET UserIds=@ids"; com.AddParameter("@ids", MergedIDs); - com.AddParameter("@name", regionName); - com.AddParameter("@worldid", Main.worldID.ToString()); if (com.ExecuteNonQuery() > 0) return true; else @@ -223,30 +223,51 @@ namespace TShockAPI.DB return false; } } + + public List ListAllRegions() + { + List Regions = new List(); + try + { + using (var com = database.CreateCommand()) + { + com.CommandText = "SELECT * FROM Regions"; + using (var reader = com.ExecuteReader()) + { + while (reader.Read()) + Regions.Add(new Region(new Rectangle(reader.Get("X1"), reader.Get("Y1"), reader.Get("X2"), reader.Get("Y2")), reader.Get("RegionName"), reader.Get("Protected"), reader.Get("WorldID"))); + } + } + } + catch (SqliteExecutionException ex) + { + } + return Regions; + } } public class Region { public Rectangle RegionArea { get; set; } public string RegionName { get; set; } - public bool DisableBuild { get; set; } - public string WorldRegionName { get; set; } + public int DisableBuild { get; set; } + public string RegionWorldID { get; set; } public string RegionAllowedIDs { get; set; } - public Region(Rectangle region, string name, bool disablebuild, string worldname) + public Region(Rectangle region, string name, int disablebuild, string worldname) { RegionArea = region; RegionName = name; DisableBuild = disablebuild; - WorldRegionName = worldname; + RegionWorldID = worldname; } public Region() { RegionArea = Rectangle.Empty; RegionName = string.Empty; - DisableBuild = true; - WorldRegionName = string.Empty; + DisableBuild = 1; + RegionWorldID = string.Empty; } } } diff --git a/TShockAPI/DB/UserManager.cs b/TShockAPI/DB/UserManager.cs index 59c8419d..a5db2965 100644 --- a/TShockAPI/DB/UserManager.cs +++ b/TShockAPI/DB/UserManager.cs @@ -137,8 +137,45 @@ namespace TShockAPI.DB } catch (SqliteExecutionException ex) { + } return Tools.GetGroup("default"); } + + public string GetUserID(string username = "", string IP = "") + { + try + { + using (var com = database.CreateCommand()) + { + if (username != "" && username != null) + { + com.CommandText = "SELECT * FROM Users WHERE Username=@name"; + com.AddParameter("@name", username); + } + else if (IP != "" && IP != null) + { + com.CommandText = "SELECT * FROM Users WHERE IP=@ip"; + com.AddParameter("@ip", IP); + } + else + return "0"; + + using (var reader = com.ExecuteReader()) + { + if (reader.Read()) + { + string ID = reader.Get("ID"); + return ID; + } + } + } + } + catch (SqliteExecutionException ex) + { + + } + return "0"; + } } } diff --git a/TShockAPI/DB/WarpsManager.cs b/TShockAPI/DB/WarpsManager.cs index e52e8b1d..fa3d6f39 100644 --- a/TShockAPI/DB/WarpsManager.cs +++ b/TShockAPI/DB/WarpsManager.cs @@ -34,8 +34,6 @@ namespace TShockAPI.DB { private IDbConnection database; - public List Warps = new List(); - public WarpManager(IDbConnection db) { database = db; @@ -43,7 +41,7 @@ namespace TShockAPI.DB using (var com = database.CreateCommand()) { com.CommandText = - "CREATE TABLE IF NOT EXISTS 'Warps' ('X' INTEGER(11) NOT NULL, 'Y' INTEGER(11) NOT NULL, 'WarpName' TEXT UNIQUE, 'WorldID' TEXT);"; + "CREATE TABLE IF NOT EXISTS 'Warps' ('X' NUMERIC, 'Y' NUMERIC, 'WarpName' TEXT UNIQUE, 'WorldID' TEXT);"; com.ExecuteNonQuery(); } } @@ -109,26 +107,47 @@ namespace TShockAPI.DB } return new Warp(); } + + public List ListAllWarps() + { + List Warps = new List(); + try + { + using (var com = database.CreateCommand()) + { + com.CommandText = "SELECT * FROM Warps"; + 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"))); + } + } + } + catch (SqliteExecutionException ex) + { + } + return Warps; + } } public class Warp { public Vector2 WarpPos { get; set; } public string WarpName { get; set; } - public string WorldWarpName { get; set; } + public string WorldWarpID { get; set; } public Warp(Vector2 warppos, string name, string worldname) { WarpPos = warppos; WarpName = name; - WorldWarpName = worldname; + WorldWarpID = worldname; } public Warp() { WarpPos = Vector2.Zero; WarpName = null; - WorldWarpName = string.Empty; + WorldWarpID = string.Empty; } } } diff --git a/TShockAPI/GetDataHandlers.cs b/TShockAPI/GetDataHandlers.cs index 318f8b7a..561254b2 100755 --- a/TShockAPI/GetDataHandlers.cs +++ b/TShockAPI/GetDataHandlers.cs @@ -259,7 +259,7 @@ namespace TShockAPI return true; } } - if (!args.Player.Group.HasPermission("editspawn") && RegionManager.InProtectedArea(x, y, Tools.GetPlayerIP(args.Player.Name))) + if (!args.Player.Group.HasPermission("editspawn") && TShock.Regions.InProtectedArea(x, y, TShock.Users.GetUserID(args.Player.UserName,args.Player.IP))) { args.Player.SendMessage("Region protected from changes.", Color.Red); args.Player.SendTileSquare(x, y); diff --git a/TShockAPI/TSPlayer.cs b/TShockAPI/TSPlayer.cs index a3384dd1..caadc643 100644 --- a/TShockAPI/TSPlayer.cs +++ b/TShockAPI/TSPlayer.cs @@ -42,6 +42,7 @@ namespace TShockAPI public Vector2 oldSpawn = Vector2.Zero; public TSPlayer LastWhisper; public int LoginAttempts { get; set; } + public string UserName { get; set; } Player FakePlayer = null;