From 16a90f3240d2320556b000ba9db630d34138b8a5 Mon Sep 17 00:00:00 2001 From: Twitchy Date: Fri, 8 Jul 2011 23:36:53 +1200 Subject: [PATCH] Added SQL Regions and Fixed SQL Warps --- TShockAPI/Commands.cs | 15 +- TShockAPI/DB/BanManager.cs | 2 +- TShockAPI/DB/DbExt.cs | 1 + TShockAPI/DB/RegionManager.cs | 252 ++++++++++++++++++++++++++++++++++ TShockAPI/DB/WarpsManager.cs | 102 ++------------ 5 files changed, 271 insertions(+), 101 deletions(-) create mode 100644 TShockAPI/DB/RegionManager.cs diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index a34c10fe..6f5d6d25 100755 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -919,7 +919,7 @@ namespace TShockAPI { args.Player.SendMessage("Name reserved, use a different name", Color.Red); } - else if (TShock.Warps.AddWarp(args.Player.TileX, args.Player.TileY, warpName, Main.worldName)) + else if (TShock.Warps.AddWarp(args.Player.TileX, args.Player.TileY, warpName, Main.worldID.ToString())) { args.Player.SendMessage("Set warp " + warpName, Color.Yellow); } @@ -1237,9 +1237,9 @@ namespace TShockAPI if (!args.Player.TempArea.IsEmpty) { string regionName = String.Join(" ", args.Parameters.GetRange(1, args.Parameters.Count - 1)); - if (RegionManager.AddRegion(args.Player.TempArea.X, args.Player.TempArea.Y, + if (TShock.Regions.AddRegion(args.Player.TempArea.X, args.Player.TempArea.Y, args.Player.TempArea.Width, args.Player.TempArea.Height, - regionName, Main.worldName)) + regionName, Main.worldID.ToString())) { args.Player.TempArea = Rectangle.Empty; args.Player.SendMessage("Set region " + regionName, Color.Yellow); @@ -1263,14 +1263,14 @@ namespace TShockAPI string regionName = args.Parameters[1]; if (args.Parameters[2].ToLower() == "true") { - if (RegionManager.SetRegionState(regionName, true)) + if (TShock.Regions.SetRegionState(regionName, true)) args.Player.SendMessage("Protected region " + regionName, Color.Yellow); else args.Player.SendMessage("Could not find specified region", Color.Red); } else if (args.Parameters[2].ToLower() == "false") { - if (RegionManager.SetRegionState(regionName, false)) + if (TShock.Regions.SetRegionState(regionName, false)) args.Player.SendMessage("Unprotected region " + regionName, Color.Yellow); else args.Player.SendMessage("Could not find specified region", Color.Red); @@ -1287,7 +1287,7 @@ namespace TShockAPI if (args.Parameters.Count > 1) { string regionName = String.Join(" ", args.Parameters.GetRange(1, args.Parameters.Count - 1)); - if (RegionManager.DeleteRegion(regionName)) + if (TShock.Regions.DeleteRegion(regionName)) args.Player.SendMessage("Deleted region " + regionName, Color.Yellow); else args.Player.SendMessage("Could not find specified region", Color.Red); @@ -1323,10 +1323,9 @@ namespace TShockAPI } if ((playerIP = Tools.GetPlayerIP(playerName)) != null) { - if (RegionManager.AddNewUser(regionName, playerIP)) + if (TShock.Regions.AddNewUser(regionName, playerIP)) { args.Player.SendMessage("Added user " + playerName + " to " + regionName, Color.Yellow); - RegionManager.WriteSettings(); } else args.Player.SendMessage("Region " + regionName + " not found", Color.Red); diff --git a/TShockAPI/DB/BanManager.cs b/TShockAPI/DB/BanManager.cs index 37bfa238..a885def8 100644 --- a/TShockAPI/DB/BanManager.cs +++ b/TShockAPI/DB/BanManager.cs @@ -93,7 +93,7 @@ namespace TShockAPI.DB { using (var com = database.CreateCommand()) { - com.CommandText = "INSERT INTO Bans (IP, Name, Reason) VALUES (@ip, @name, @reason)"; + com.CommandText = "INSERT INTO Bans (IP, Name, Reason) VALUES (@ip, @name, @reason);"; com.AddParameter("@ip", ip); com.AddParameter("@name", name); com.AddParameter("@reason", reason); diff --git a/TShockAPI/DB/DbExt.cs b/TShockAPI/DB/DbExt.cs index 3ba4f464..13942cf2 100644 --- a/TShockAPI/DB/DbExt.cs +++ b/TShockAPI/DB/DbExt.cs @@ -34,6 +34,7 @@ namespace TShockAPI.DB { return reader.Get(reader.GetOrdinal(column)); } + public static T Get(this IDataReader reader, int column) { if (ReadFuncs.ContainsKey(typeof(T))) diff --git a/TShockAPI/DB/RegionManager.cs b/TShockAPI/DB/RegionManager.cs new file mode 100644 index 00000000..da09fbbb --- /dev/null +++ b/TShockAPI/DB/RegionManager.cs @@ -0,0 +1,252 @@ +/* +TShock, a server mod for Terraria +Copyright (C) 2011 The TShock Team + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Xml; +using System.IO; +using System.Data; +using TShockAPI.DB; +using Community.CsharpSqlite.SQLiteClient; +using Microsoft.Xna.Framework; +using Terraria; + +namespace TShockAPI.DB +{ + public class RegionManager + { + public static List Regions = new List(); + + private IDbConnection database; + + public RegionManager(IDbConnection db) + { + database = 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));"; + com.ExecuteNonQuery(); + } + } + + public bool AddRegion(int tx, int ty, int width, int height, string regionname, string worldid) + { + try + { + using (var com = database.CreateCommand()) + { + com.CommandText = + "INSERT INTO Regions VALUES (@tx, @ty, @height, @width, @name, @worldid, @userids, @protected);"; + com.AddParameter("@tx", tx); + com.AddParameter("@ty", ty); + com.AddParameter("@height", width + tx); + com.AddParameter("@width", height + ty); + com.AddParameter("@name", regionname.ToLower()); + com.AddParameter("@worldid", worldid); + com.AddParameter("@userids", ""); + com.AddParameter("@protected", 1); + if (com.ExecuteNonQuery() > 0) + return true; + } + } + catch (SqliteExecutionException ex) + { + Log.Error(ex.ToString()); + } + return false; + } + + public bool DeleteRegion(string name) + { + try + { + using (var com = database.CreateCommand()) + { + com.CommandText = "DELETE FROM Regions WHERE RegionName=@name AND WorldID=@worldid"; + com.AddParameter("@name", name.ToLower()); + com.AddParameter("@worldid", Main.worldID.ToString()); + com.ExecuteNonQuery(); + return true; + } + } + catch (SqliteExecutionException ex) + { + Log.Error(ex.ToString()); + } + return false; + } + + public bool SetRegionState(string name, bool state) + { + try + { + using (var com = database.CreateCommand()) + { + com.CommandText = "UPDATE Regions SET Protected='@bool' WHERE RegionName=@name WorldID=@worldid"; + com.AddParameter("@name", name); + if (state) + com.AddParameter("@bool", 1); + else + com.AddParameter("@bool", 0); + com.AddParameter("@worldid", Main.worldID.ToString()); + if (com.ExecuteNonQuery() > 0) + return true; + else + return false; + } + } + catch (SqliteExecutionException ex) + { + Log.Error(ex.ToString()); + return false; + } + } + + public bool InProtectedArea(int X, int Y, string ID) + { + try + { + using (var com = database.CreateCommand()) + { + com.CommandText = "SELECT * FROM Regions WHERE WorldID=@worldid"; + com.AddParameter("@worldid", Main.worldID.ToString()); + using (var reader = com.ExecuteReader()) + { + while (reader.Read()) + { + int X1 = reader.Get("X1"); + int Y1 = reader.Get("Y1"); + int X2 = reader.Get("X2"); + int Y2 = reader.Get("Y2"); + int Protected = reader.Get("Protected"); + string MergedIDs = DbExt.Get(reader, "UserIds"); + List SplitIDs = ListIDs(MergedIDs); + if (X >= X1 && + X <= X2 && + Y >= Y1 && + Y <= Y2 && + Protected == 1) + { + if (!SplitIDs.Contains(ID)) + return true; + } + } + } + } + return false; + } + catch (SqliteExecutionException ex) + { + Log.Error(ex.ToString()); + return false; + } + } + + public static List ListIDs(string MergedIDs) + { + List SplitIDs = new List(); + var sb = new StringBuilder(); + for (int i = 0; i < MergedIDs.Length; i++) + { + char c = MergedIDs[i]; + + if (c != ',') + { + sb.Append(c); + } + else if (sb.Length > 0) + { + SplitIDs.Add(sb.ToString()); + sb.Clear(); + } + } + return SplitIDs; + } + + public bool AddNewUser(string regionName, string ID) + { + string MergedIDs = string.Empty; + + try + { + using (var com = database.CreateCommand()) + { + com.CommandText = "SELECT * FROM Regions WHERE RegionName=@name WorldID=@worldid"; + com.AddParameter("@name", regionName); + com.AddParameter("@worldid", Main.worldID.ToString()); + + using (var reader = com.ExecuteReader()) + { + if (reader.Read()) + { + MergedIDs = DbExt.Get(reader, "UserIds"); + } + } + + if (MergedIDs == string.Empty) + MergedIDs = ID; + else + MergedIDs = MergedIDs + "," + ID; + + com.CommandText = "UPDATE Regions SET UserIds='@ids' WHERE RegionName=@name WorldID=@worldid"; + com.AddParameter("@ids", MergedIDs); + com.AddParameter("@name", regionName); + com.AddParameter("@worldid", Main.worldID.ToString()); + if (com.ExecuteNonQuery() > 0) + return true; + else + return false; + } + } + catch (SqliteExecutionException ex) + { + Log.Error(ex.ToString()); + return false; + } + } + } + + public class Region + { + public Rectangle RegionArea { get; set; } + public string RegionName { get; set; } + public bool DisableBuild { get; set; } + public string WorldRegionName { get; set; } + public string RegionAllowedIDs { get; set; } + + public Region(Rectangle region, string name, bool disablebuild, string worldname) + { + RegionArea = region; + RegionName = name; + DisableBuild = disablebuild; + WorldRegionName = worldname; + } + + public Region() + { + RegionArea = Rectangle.Empty; + RegionName = string.Empty; + DisableBuild = true; + WorldRegionName = string.Empty; + } + } +} diff --git a/TShockAPI/DB/WarpsManager.cs b/TShockAPI/DB/WarpsManager.cs index 5658efdb..cb543b87 100644 --- a/TShockAPI/DB/WarpsManager.cs +++ b/TShockAPI/DB/WarpsManager.cs @@ -43,33 +43,25 @@ namespace TShockAPI.DB using (var com = database.CreateCommand()) { com.CommandText = - "CREATE TABLE IF NOT EXISTS \"Warps\" (\"X\" INTEGER(11) NOT NULL UNIQUE, \"Y\" INTEGER(11) NOT NULL UNIQUE , \"WarpName\" VARCHAR(32) NOT NULL UNIQUE , \"WorldName\" VARCHAR(255) NOT NULL );"; + "CREATE TABLE IF NOT EXISTS \"Warps\" (\"X\" INTEGER(11) NOT NULL, \"Y\" INTEGER(11) NOT NULL, \"WarpName\" VARCHAR(32) NOT NULL UNIQUE, \"WorldID\" VARCHAR(255) NOT NULL );"; com.ExecuteNonQuery(); } - - if(!File.Exists(FileTools.WarpsPath)) - { - ReadWarps(); - File.Delete(FileTools.WarpsPath); - } } - - - public bool AddWarp(int x, int y, string name, string worldname) + public bool AddWarp(int x, int y, string name, string worldid) { try { using (var com = database.CreateCommand()) { - com.CommandText = "INSERT INTO Warps (X, Y, WarpName, WorldName) VALUES (@x, @y, @name, @worldname)"; + com.CommandText = "INSERT INTO Warps (X, Y, WarpName, WorldID) VALUES (@x, @y, @name, @worldid);"; com.AddParameter("@x", x); com.AddParameter("@y", y); com.AddParameter("@name", name.ToLower()); - com.AddParameter("@worldname", worldname); + com.AddParameter("@worldid", worldid); com.ExecuteNonQuery(); + return true; } - return true; } catch (SqliteExecutionException ex) { @@ -83,9 +75,9 @@ namespace TShockAPI.DB { using (var com = database.CreateCommand()) { - com.CommandText = "DELETE FROM Warps WHERE WarpName=@name AND WorldName=@worldname"; + com.CommandText = "DELETE FROM Warps WHERE WarpName=@name AND WorldID=@worldid"; com.AddParameter("@name", name.ToLower()); - com.AddParameter("@worldname", Main.worldName); + com.AddParameter("@worldid", Main.worldID.ToString()); com.ExecuteNonQuery(); return true; } @@ -102,13 +94,13 @@ namespace TShockAPI.DB { using (var com = database.CreateCommand()) { - com.CommandText = "SELECT * FROM Warps WHERE WarpName=@name AND WorldName=@worldname"; + com.CommandText = "SELECT * FROM Warps WHERE WarpName=@name AND WorldID=@worldid"; com.AddParameter("@name", name.ToLower()); - com.AddParameter("@worldname", Main.worldName); + com.AddParameter("@worldid", Main.worldID.ToString()); using (var reader = com.ExecuteReader()) { if (reader.Read()) - return new Warp(new Vector2(reader.Get("X"),reader.Get("Y")), reader.Get("WarpName"), reader.Get("WorldName")); + return new Warp(new Vector2(reader.Get("X"), reader.Get("Y")), reader.Get("WarpName"), reader.Get("WorldID")); } } } @@ -117,80 +109,6 @@ namespace TShockAPI.DB } return new Warp(); } - - public static void ReadWarps() - { - try - { - XmlReaderSettings xmlReaderSettings = new XmlReaderSettings(); - xmlReaderSettings.IgnoreWhitespace = true; - - using (XmlReader settingr = XmlReader.Create(FileTools.WarpsPath, xmlReaderSettings)) - { - while (settingr.Read()) - { - if (settingr.IsStartElement()) - { - switch (settingr.Name) - { - case "Warps": - { - break; - } - case "Warp": - { - if (settingr.Read()) - { - string name = string.Empty; - int x = 0; - int y = 0; - string worldname = string.Empty; - - settingr.Read(); - if (settingr.Value != "" || settingr.Value != null) - name = settingr.Value; - else - Log.Warn("Warp name is empty, This warp will not work"); - - settingr.Read(); - settingr.Read(); - settingr.Read(); - if (settingr.Value != "" || settingr.Value != null) - Int32.TryParse(settingr.Value, out x); - else - Log.Warn("x for warp " + name + " is empty"); - - settingr.Read(); - settingr.Read(); - settingr.Read(); - if (settingr.Value != "" || settingr.Value != null) - Int32.TryParse(settingr.Value, out y); - else - Log.Warn("y for warp " + name + " is empty"); - - settingr.Read(); - settingr.Read(); - settingr.Read(); - if (settingr.Value != "" || settingr.Value != null) - worldname = settingr.Value; - else - Log.Warn("Worldname for warp " + name + " is empty"); - - TShock.Warps.AddWarp(x, y, name, worldname); - } - break; - } - } - } - } - } - Log.Info("Read Warps"); - } - catch - { - Log.Info("Could not read Warps"); - } - } } public class Warp