From c644fcd45ccb6a9f3e032537f0095a4de22534c3 Mon Sep 17 00:00:00 2001 From: high Date: Fri, 1 Jul 2011 15:54:52 -0400 Subject: [PATCH 01/21] Sqlite added BanManager now uses sqlite (imcomplete) --- TShockAPI/BanManager.cs | 122 +++++++++++++++---------------------- TShockAPI/ConfigFile.cs | 5 ++ TShockAPI/TShock.cs | 40 ++++++++---- TShockAPI/TShockAPI.csproj | 3 + 4 files changed, 84 insertions(+), 86 deletions(-) diff --git a/TShockAPI/BanManager.cs b/TShockAPI/BanManager.cs index 649387c7..04d5a945 100644 --- a/TShockAPI/BanManager.cs +++ b/TShockAPI/BanManager.cs @@ -18,118 +18,92 @@ along with this program. If not, see . using System; using System.Collections.Generic; +using System.Data; using System.IO; using System.Text; +using Community.CsharpSqlite.SQLiteClient; namespace TShockAPI { public class BanManager { private DateTime LastLoad; - private string Path; + private IDbConnection database; /// /// IP - Name - Reason /// private List Bans = new List(); - public BanManager(string path) + public BanManager(IDbConnection db) { - Path = path; + database = db; + + using (var com = database.CreateCommand()) + { + com.CommandText = + "CREATE TABLE IF NOT EXISTS \"Bans\" (\"IP\" VARCHAR(15) NOT NULL UNIQUE , \"Name\" VARCHAR(32) NOT NULL , \"Reason\" VARCHAR(255) NOT NULL );"; + com.ExecuteNonQuery(); + } } public Ban GetBanByIp(string ip) { - EnsureChanges(); - foreach (var ban in Bans) + using (var com = database.CreateCommand()) { - if (ban.IP.Equals(ip)) - return ban; + com.CommandText = "SELECT * FROM Bans WHERE IP=@ip"; + AddParameter(com, "@ip", ip); + using (var reader = com.ExecuteReader()) + { + if (reader.Read()) + return new Ban((string)reader["IP"], (string)reader["Name"], (string)reader["Reason"]); + } } return null; } + IDbDataParameter AddParameter(IDbCommand command, string name, object data) + { + var parm = command.CreateParameter(); + parm.ParameterName = name; + parm.Value = data; + command.Parameters.Add(parm); + return parm; + } + public Ban GetBanByName(string name, bool casesensitive = true) { - EnsureChanges(); - foreach (var ban in Bans) + using (var com = database.CreateCommand()) { - if (ban.Name.Equals(name, - casesensitive - ? StringComparison.Ordinal - : StringComparison.InvariantCultureIgnoreCase)) - return ban; + var namecol = casesensitive ? "Name" : "UPPER(Name)"; + if (!casesensitive) + name = name.ToUpper(); + com.CommandText = "SELECT *, COUNT(*) FROM Bans WHERE " + namecol + "=@name LIMIT 5"; + AddParameter(com, "@name", name); + using (var reader = com.ExecuteReader()) + { + if (reader.Read()) + return new Ban((string)reader["IP"], (string)reader["Name"], (string)reader["Reason"]); + } } return null; } public void AddBan(string ip, string name = "", string reason = "") { - if (GetBanByIp(ip) != null) - return; - Bans.Add(new Ban(ip, name, reason)); - SaveBans(); + using (var com = database.CreateCommand()) + { + com.CommandText = "INSERT INTO Bans (IP, Name, Reason) VALUES (@ip, @name, @reason)"; + AddParameter(com, "@ip", ip); + AddParameter(com, "@name", name); + AddParameter(com, "@reason", reason); + com.ExecuteNonQuery(); + } } public void RemoveBan(Ban ban) { - Bans.Remove(ban); - SaveBans(); - } - /// - /// Reloads the file if it was changed - /// - public void EnsureChanges() - { - if (File.Exists(Path)) - { - if (new FileInfo(Path).LastWriteTime > LastLoad) - LoadBans(); - } - else - { - Bans.Clear(); - } - } - - /// - /// Removes | from the string - /// - /// - /// - public string MakeSafe(string str) - { - return str.Replace("|", " "); - } - - public void LoadBans() - { - Bans.Clear(); - - if (!File.Exists(Path)) - return; - - LastLoad = new FileInfo(Path).LastWriteTime; - - foreach (var line in File.ReadAllLines(Path)) - { - var bansp = line.Split('|'); - if (bansp.Length != 3) - continue; - Bans.Add(new Ban(bansp[0], bansp[1], bansp[2])); - } - } - - public void SaveBans() - { - var output = new StringBuilder(); - foreach (var ban in Bans) - { - output.AppendFormat("{0}|{1}|{2}\r\n", MakeSafe(ban.IP), MakeSafe(ban.Name), MakeSafe(ban.Reason)); - } - - File.WriteAllText(Path, output.ToString()); } } diff --git a/TShockAPI/ConfigFile.cs b/TShockAPI/ConfigFile.cs index 88f82be0..4c83cc91 100644 --- a/TShockAPI/ConfigFile.cs +++ b/TShockAPI/ConfigFile.cs @@ -67,6 +67,11 @@ namespace TShockAPI public int MaximumLoginAttempts = 3; + /// + /// Valid types are "sqlite" and "mysql" + /// + public string StorageType = "sqlite"; + public static ConfigFile Read(string path) { if (!File.Exists(path)) diff --git a/TShockAPI/TShock.cs b/TShockAPI/TShock.cs index 70a3dccd..bb6fed51 100755 --- a/TShockAPI/TShock.cs +++ b/TShockAPI/TShock.cs @@ -23,6 +23,7 @@ using System.Diagnostics; using System.IO; using System.Net; using System.Reflection; +using Community.CsharpSqlite.SQLiteClient; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Content; using Terraria; @@ -46,7 +47,7 @@ namespace TShockAPI public static ConfigFile Config { get; set; } - public static IDbConnection Sql; + public static IDbConnection DB; public override Version Version { @@ -77,21 +78,38 @@ namespace TShockAPI public override void Initialize() { - HandleCommandLine(Environment.GetCommandLineArgs()); - + AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; ConfigFile.ConfigRead += OnConfigRead; - Bans = new BanManager(FileTools.BansPath); - Backups = new BackupManager(Path.Combine(SavePath, "backups")); - - FileTools.SetupConfig(); - #if DEBUG Log.Initialize(Path.Combine(SavePath, "log.txt"), LogLevel.All, false); #else Log.Initialize(Path.Combine(SavePath, "log.txt"), LogLevel.All & ~LogLevel.Debug, false); #endif + HandleCommandLine(Environment.GetCommandLineArgs()); + + Backups = new BackupManager(Path.Combine(SavePath, "backups")); + + FileTools.SetupConfig(); + + if (Config.StorageType.ToLower() == "sqlite") + { + string sql = Path.Combine(SavePath, "tshock.sqlite"); + DB = new SqliteConnection(string.Format("uri=file://{0},Version=3", sql)); + DB.Open(); + } + else if (Config.StorageType.ToLower() == "mysql") + { + throw new NotSupportedException("Mysql is not yet supported"); + } + else + { + throw new Exception("Invalid storage type"); + } + + Bans = new BanManager(DB); + Log.ConsoleInfo(string.Format("TShock Version {0} ({1}) now running.", Version, VersionCodename)); @@ -104,9 +122,7 @@ namespace TShockAPI NetHooks.GetData += GetData; NetHooks.GreetPlayer += OnGreetPlayer; NpcHooks.StrikeNpc += NpcHooks_OnStrikeNpc; - AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; - Bans.LoadBans(); GetDataHandlers.InitGetDataHandler(); Commands.InitCommands(); RegionManager.ReadAllSettings(); @@ -119,7 +135,7 @@ namespace TShockAPI public override void DeInitialize() { - Bans.SaveBans(); + DB.Close(); GameHooks.PostInitialize -= OnPostInit; GameHooks.Update -= OnUpdate; ServerHooks.Join -= OnJoin; @@ -274,7 +290,7 @@ namespace TShockAPI Players[ply] = player; - + } private void OnLeave(int ply) diff --git a/TShockAPI/TShockAPI.csproj b/TShockAPI/TShockAPI.csproj index 9a054663..52530b7b 100644 --- a/TShockAPI/TShockAPI.csproj +++ b/TShockAPI/TShockAPI.csproj @@ -48,6 +48,9 @@ true + + SqlBins\Community.CsharpSqlite.SQLiteClient.dll + From f1c86a6216c767f8cab87f9cfd63c958f357e8ac Mon Sep 17 00:00:00 2001 From: high Date: Fri, 1 Jul 2011 17:08:42 -0400 Subject: [PATCH 02/21] BanManager now fully sql based --- TShockAPI/BanManager.cs | 89 +++++++++++++++++++++++++++-------------- TShockAPI/Commands.cs | 12 ++++-- 2 files changed, 66 insertions(+), 35 deletions(-) diff --git a/TShockAPI/BanManager.cs b/TShockAPI/BanManager.cs index 04d5a945..f62883ca 100644 --- a/TShockAPI/BanManager.cs +++ b/TShockAPI/BanManager.cs @@ -27,14 +27,8 @@ namespace TShockAPI { public class BanManager { - private DateTime LastLoad; private IDbConnection database; - /// - /// IP - Name - Reason - /// - private List Bans = new List(); - public BanManager(IDbConnection db) { database = db; @@ -49,19 +43,25 @@ namespace TShockAPI public Ban GetBanByIp(string ip) { - using (var com = database.CreateCommand()) + try { - com.CommandText = "SELECT * FROM Bans WHERE IP=@ip"; - AddParameter(com, "@ip", ip); - using (var reader = com.ExecuteReader()) + using (var com = database.CreateCommand()) { - if (reader.Read()) - return new Ban((string)reader["IP"], (string)reader["Name"], (string)reader["Reason"]); + com.CommandText = "SELECT * FROM Bans WHERE IP=@ip"; + AddParameter(com, "@ip", ip); + using (var reader = com.ExecuteReader()) + { + if (reader.Read()) + return new Ban((string)reader["IP"], (string)reader["Name"], (string)reader["Reason"]); + } } } + catch (SqliteExecutionException ex) + { + } return null; } - IDbDataParameter AddParameter(IDbCommand command, string name, object data) + static IDbDataParameter AddParameter(IDbCommand command, string name, object data) { var parm = command.CreateParameter(); parm.ParameterName = name; @@ -73,37 +73,64 @@ namespace TShockAPI public Ban GetBanByName(string name, bool casesensitive = true) { - using (var com = database.CreateCommand()) + try { - var namecol = casesensitive ? "Name" : "UPPER(Name)"; - if (!casesensitive) - name = name.ToUpper(); - com.CommandText = "SELECT *, COUNT(*) FROM Bans WHERE " + namecol + "=@name LIMIT 5"; - AddParameter(com, "@name", name); - using (var reader = com.ExecuteReader()) + using (var com = database.CreateCommand()) { - if (reader.Read()) - return new Ban((string)reader["IP"], (string)reader["Name"], (string)reader["Reason"]); + var namecol = casesensitive ? "Name" : "UPPER(Name)"; + if (!casesensitive) + name = name.ToUpper(); + com.CommandText = "SELECT *, COUNT(*) FROM Bans WHERE " + namecol + "=@name LIMIT 5"; + AddParameter(com, "@name", name); + using (var reader = com.ExecuteReader()) + { + if (reader.Read()) + return new Ban((string)reader["IP"], (string)reader["Name"], (string)reader["Reason"]); + } } } + catch (SqliteExecutionException ex) + { + } return null; } - public void AddBan(string ip, string name = "", string reason = "") + public bool AddBan(string ip, string name = "", string reason = "") { - using (var com = database.CreateCommand()) + try { - com.CommandText = "INSERT INTO Bans (IP, Name, Reason) VALUES (@ip, @name, @reason)"; - AddParameter(com, "@ip", ip); - AddParameter(com, "@name", name); - AddParameter(com, "@reason", reason); - com.ExecuteNonQuery(); + using (var com = database.CreateCommand()) + { + com.CommandText = "INSERT INTO Bans (IP, Name, Reason) VALUES (@ip, @name, @reason)"; + AddParameter(com, "@ip", ip); + AddParameter(com, "@name", name); + AddParameter(com, "@reason", reason); + com.ExecuteNonQuery(); + } + return true; } + catch (SqliteExecutionException ex) + { + } + return false; } - public void RemoveBan(Ban ban) + public bool RemoveBan(string ip) { - + try + { + using (var com = database.CreateCommand()) + { + com.CommandText = "DELETE FROM Bans WHERE IP=@ip"; + AddParameter(com, "@ip", ip); + com.ExecuteNonQuery(); + return true; + } + } + catch (SqliteExecutionException ex) + { + } + return false; } } diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index d5056e8a..0fa33de0 100755 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -456,8 +456,10 @@ namespace TShockAPI var ban = TShock.Bans.GetBanByName(plStr); if (ban != null) { - TShock.Bans.RemoveBan(ban); - args.Player.SendMessage(string.Format("Unbanned {0} ({1})!", ban.Name, ban.IP), Color.Red); + if (TShock.Bans.RemoveBan(ban.IP)) + args.Player.SendMessage(string.Format("Unbanned {0} ({1})!", ban.Name, ban.IP), Color.Red); + else + args.Player.SendMessage(string.Format("Failed to Unbanned {0} ({1})!", ban.Name, ban.IP), Color.Red); } else { @@ -482,8 +484,10 @@ namespace TShockAPI var ban = TShock.Bans.GetBanByIp(plStr); if (ban != null) { - TShock.Bans.RemoveBan(ban); - args.Player.SendMessage(string.Format("Unbanned {0} ({1})!", ban.Name, ban.IP), Color.Red); + if (TShock.Bans.RemoveBan(ban.IP)) + args.Player.SendMessage(string.Format("Unbanned {0} ({1})!", ban.Name, ban.IP), Color.Red); + else + args.Player.SendMessage(string.Format("Failed to Unbanned {0} ({1})!", ban.Name, ban.IP), Color.Red); } else { From 2a1b81c86a41c63b471ef6d8b72d31bcf2a176fa Mon Sep 17 00:00:00 2001 From: high Date: Fri, 1 Jul 2011 17:50:33 -0400 Subject: [PATCH 03/21] Added /clearbans fixed sql query in find by name. --- TShockAPI/BanManager.cs | 18 +++++++++++++++++- TShockAPI/Commands.cs | 42 +++++++++++++++++++++++++++++++++++++++++ TShockAPI/Tools.cs | 6 +++--- 3 files changed, 62 insertions(+), 4 deletions(-) diff --git a/TShockAPI/BanManager.cs b/TShockAPI/BanManager.cs index f62883ca..f7c615e0 100644 --- a/TShockAPI/BanManager.cs +++ b/TShockAPI/BanManager.cs @@ -80,7 +80,7 @@ namespace TShockAPI var namecol = casesensitive ? "Name" : "UPPER(Name)"; if (!casesensitive) name = name.ToUpper(); - com.CommandText = "SELECT *, COUNT(*) FROM Bans WHERE " + namecol + "=@name LIMIT 5"; + com.CommandText = "SELECT * FROM Bans WHERE " + namecol + "=@name"; AddParameter(com, "@name", name); using (var reader = com.ExecuteReader()) { @@ -132,6 +132,22 @@ namespace TShockAPI } return false; } + public bool ClearBans() + { + try + { + using (var com = database.CreateCommand()) + { + com.CommandText = "DELETE FROM Bans"; + com.ExecuteNonQuery(); + return true; + } + } + catch (SqliteExecutionException ex) + { + } + return false; + } } public class Ban diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index 0fa33de0..c666e8a3 100755 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -112,6 +112,7 @@ namespace TShockAPI ChatCommands.Add(new Command("ban", BanIP, "banip")); ChatCommands.Add(new Command("unban", UnBan, "unban")); ChatCommands.Add(new Command("unban", UnBanIP, "unbanip")); + ChatCommands.Add(new Command("maintenance", ClearBans, "clearbans")); ChatCommands.Add(new Command("whitelist", Whitelist, "whitelist")); ChatCommands.Add(new Command("maintenance", Off, "off")); ChatCommands.Add(new Command("maintenance", OffNoSave, "off-nosave")); @@ -467,6 +468,47 @@ namespace TShockAPI } } + static int ClearBansCode = -1; + private static void ClearBans(CommandArgs args) + { + if (args.Parameters.Count < 1 && ClearBansCode == -1) + { + ClearBansCode = new Random().Next(0, short.MaxValue); + args.Player.SendMessage("ClearBans Code: " + ClearBansCode, Color.Red); + return; + } + if (args.Parameters.Count < 1) + { + args.Player.SendMessage("Invalid syntax! Proper syntax: /clearbans "); + return; + } + + int num; + if (!int.TryParse(args.Parameters[0], out num)) + { + args.Player.SendMessage("Invalid syntax! Expecting number"); + return; + } + + if (num == ClearBansCode) + { + ClearBansCode = -1; + if (TShock.Bans.ClearBans()) + { + Log.ConsoleInfo("Bans cleared"); + args.Player.SendMessage("Bans cleared"); + } + else + { + args.Player.SendMessage("Failed to clear bans"); + } + } + else + { + args.Player.SendMessage("Incorrect clear code"); + } + } + private static void UnBanIP(CommandArgs args) { if (args.Parameters.Count < 1) diff --git a/TShockAPI/Tools.cs b/TShockAPI/Tools.cs index 7392b8db..5963829c 100755 --- a/TShockAPI/Tools.cs +++ b/TShockAPI/Tools.cs @@ -29,7 +29,7 @@ namespace TShockAPI { internal class Tools { - private static Random random = new Random(); + public static Random Random = new Random(); private static List groups = new List(); /// @@ -191,8 +191,8 @@ namespace TShockAPI break; } - tileX = startTileX + random.Next(tileXRange * -1, tileXRange); - tileY = startTileY + random.Next(tileYRange * -1, tileYRange); + tileX = startTileX + Random.Next(tileXRange * -1, tileXRange); + tileY = startTileY + Random.Next(tileYRange * -1, tileYRange); j++; } while (TileValid(tileX, tileY) && !TileClear(tileX, tileY)); From b090b1fe967635375b53624d5ccbb5ce47955ce2 Mon Sep 17 00:00:00 2001 From: Steven French Date: Tue, 5 Jul 2011 21:08:11 +1200 Subject: [PATCH 04/21] Warps are now SQL based (sql branch) Need to make warps auto copy from old structure --- TShockAPI/Commands.cs | 21 +++-- TShockAPI/TShock.cs | 3 +- TShockAPI/WarpsManager.cs | 167 ++++++++++++-------------------------- 3 files changed, 65 insertions(+), 126 deletions(-) diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index c666e8a3..7e9017cd 100755 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -918,10 +918,9 @@ namespace TShockAPI { args.Player.SendMessage("Name reserved, use a different name", Color.Red); } - else if (WarpsManager.AddWarp(args.Player.TileX, args.Player.TileY, warpName, Main.worldName)) + else if (TShock.Warps.AddWarp(args.Player.TileX, args.Player.TileY, warpName, Main.worldName)) { args.Player.SendMessage("Set warp " + warpName, Color.Yellow); - WarpsManager.WriteSettings(); } else { @@ -937,7 +936,7 @@ namespace TShockAPI if (args.Parameters.Count > 0) { string warpName = String.Join(" ", args.Parameters); - if (WarpsManager.DeleteWarp(warpName)) + if (TShock.Warps.RemoveWarp(warpName)) args.Player.SendMessage("Deleted warp " + warpName, Color.Yellow); else args.Player.SendMessage("Could not find specified warp", Color.Red); @@ -957,16 +956,16 @@ namespace TShockAPI if (args.Parameters.Count > 1) int.TryParse(args.Parameters[1], out page); var sb = new StringBuilder(); - if (WarpsManager.Warps.Count > (15 * (page - 1))) + if (WarpManager.Warps.Count > (15 * (page - 1))) { for (int j = (15 * (page - 1)); j < (15 * page); j++) { - if (WarpsManager.Warps[j].WorldWarpName == Main.worldName) + if (WarpManager.Warps[j].WorldWarpName == Main.worldName) { if (sb.Length != 0) sb.Append(", "); - sb.Append("/").Append(WarpsManager.Warps[j].WarpName); - if (j == WarpsManager.Warps.Count - 1) + sb.Append("/").Append(WarpManager.Warps[j].WarpName); + if (j == WarpManager.Warps.Count - 1) { args.Player.SendMessage(sb.ToString(), Color.Yellow); break; @@ -979,7 +978,7 @@ namespace TShockAPI } } } - if (WarpsManager.Warps.Count > (15 * page)) + if (WarpManager.Warps.Count > (15 * page)) { args.Player.SendMessage(string.Format("Type /warp list {0} for more warps.", (page + 1)), Color.Yellow); } @@ -987,10 +986,10 @@ namespace TShockAPI else { string warpName = String.Join(" ", args.Parameters); - var warp = WarpsManager.FindWarp(warpName); - if (warp != Vector2.Zero) + var warp = TShock.Warps.FindWarp(warpName); + if (warp.WarpPos != Vector2.Zero) { - if (args.Player.Teleport((int)warp.X, (int)warp.Y + 3)) + if (args.Player.Teleport((int)warp.WarpPos.X, (int)warp.WarpPos.Y + 3)) args.Player.SendMessage("Warped to " + warpName, Color.Yellow); } else diff --git a/TShockAPI/TShock.cs b/TShockAPI/TShock.cs index bb6fed51..13788936 100755 --- a/TShockAPI/TShock.cs +++ b/TShockAPI/TShock.cs @@ -43,6 +43,7 @@ namespace TShockAPI public static TSPlayer[] Players = new TSPlayer[Main.maxPlayers]; public static BanManager Bans; + public static WarpManager Warps; public static BackupManager Backups; public static ConfigFile Config { get; set; } @@ -109,6 +110,7 @@ namespace TShockAPI } Bans = new BanManager(DB); + Warps = new WarpManager(DB); Log.ConsoleInfo(string.Format("TShock Version {0} ({1}) now running.", Version, VersionCodename)); @@ -126,7 +128,6 @@ namespace TShockAPI GetDataHandlers.InitGetDataHandler(); Commands.InitCommands(); RegionManager.ReadAllSettings(); - WarpsManager.ReadAllSettings(); ItemManager.LoadBans(); Log.ConsoleInfo("AutoSave " + (TShock.Config.AutoSave ? "Enabled" : "Disabled")); diff --git a/TShockAPI/WarpsManager.cs b/TShockAPI/WarpsManager.cs index a034587a..8e1cd805 100644 --- a/TShockAPI/WarpsManager.cs +++ b/TShockAPI/WarpsManager.cs @@ -20,162 +20,101 @@ using System; using System.Collections.Generic; using System.Linq; using System.Text; +using System.Data; +using Community.CsharpSqlite.SQLiteClient; using Microsoft.Xna.Framework; using System.Xml; using Terraria; namespace TShockAPI { - class WarpsManager + public class WarpManager { + private IDbConnection database; + public static List Warps = new List(); - public static bool AddWarp(int x, int y, string name, string worldname) + public WarpManager(IDbConnection db) { - foreach (Warp nametest in Warps) + database = db; + + using (var com = database.CreateCommand()) { - if (name.ToLower() == nametest.WarpName.ToLower()) - { - return false; - } + com.CommandText = + "CREATE TABLE IF NOT EXISTS \"Warps\" (\"X\" VARCHAR(4) NOT NULL UNIQUE, \"Y\" VARCHAR(4) NOT NULL UNIQUE , \"WarpName\" VARCHAR(32) NOT NULL , \"WorldName\" VARCHAR(255) NOT NULL );"; + com.ExecuteNonQuery(); } - Warps.Add(new Warp(new Vector2(x, y), name, worldname)); - return true; } - public static bool DeleteWarp(string name) + static IDbDataParameter AddParameter(IDbCommand command, string name, object data) { - foreach (Warp nametest in Warps) + var parm = command.CreateParameter(); + parm.ParameterName = name; + parm.Value = data; + command.Parameters.Add(parm); + return parm; + } + + public bool AddWarp(int x, int y, string name, string worldname) + { + try { - if (name.ToLower() == nametest.WarpName.ToLower() && nametest.WorldWarpName == Main.worldName) + using (var com = database.CreateCommand()) { - Warps.Remove(nametest); - WriteSettings(); - return true; + com.CommandText = "INSERT INTO Warps (X, Y, WarpName, WorldName) VALUES (@x, @y, @name, @worldname)"; + AddParameter(com, "@x", x); + AddParameter(com, "@y", y); + AddParameter(com, "@name", name.ToLower()); + AddParameter(com, "@worldname", worldname); + com.ExecuteNonQuery(); } + return true; + } + catch (SqliteExecutionException ex) + { } return false; } - public static Vector2 FindWarp(string name) - { - foreach (Warp nametest in Warps) - { - if (name.ToLower() == nametest.WarpName.ToLower() && nametest.WorldWarpName == Main.worldName) - { - return nametest.WarpPos; - } - } - return Vector2.Zero; - } - - public static void WriteSettings() + public bool RemoveWarp(string name) { try { - XmlWriterSettings xmlWriterSettings = new XmlWriterSettings(); - xmlWriterSettings.Indent = true; - xmlWriterSettings.NewLineChars = Environment.NewLine; - - using (XmlWriter settingsw = XmlWriter.Create(FileTools.WarpsPath, xmlWriterSettings)) + using (var com = database.CreateCommand()) { - settingsw.WriteStartDocument(); - settingsw.WriteStartElement("Warps"); - - foreach (Warp warp in Warps) - { - settingsw.WriteStartElement("Warp"); - settingsw.WriteElementString("WarpName", warp.WarpName); - settingsw.WriteElementString("X", warp.WarpPos.X.ToString()); - settingsw.WriteElementString("Y", warp.WarpPos.Y.ToString()); - settingsw.WriteElementString("WorldName", warp.WorldWarpName); - settingsw.WriteEndElement(); - } - - settingsw.WriteEndElement(); - settingsw.WriteEndDocument(); + com.CommandText = "DELETE FROM Warps WHERE WarpName=@name AND WorldName=@worldname"; + AddParameter(com, "@name", name.ToLower()); + AddParameter(com, "@worldname", Main.worldName); + com.ExecuteNonQuery(); + return true; } - Log.Info("Wrote Warps"); } - catch + catch (SqliteExecutionException ex) { - Log.Info("Could not write Warps"); } + return false; } - public static void ReadAllSettings() + public Warp FindWarp(string name) { try { - XmlReaderSettings xmlReaderSettings = new XmlReaderSettings(); - xmlReaderSettings.IgnoreWhitespace = true; - - using (XmlReader settingr = XmlReader.Create(FileTools.WarpsPath, xmlReaderSettings)) + using (var com = database.CreateCommand()) { - while (settingr.Read()) + com.CommandText = "SELECT * FROM Warps WHERE WarpName=@name AND WorldName=@worldname"; + AddParameter(com, "@name", name.ToLower()); + AddParameter(com, "@worldname", Main.worldName); + using (var reader = com.ExecuteReader()) { - 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"); - - AddWarp(x, y, name, worldname); - } - break; - } - } - } + if (reader.Read()) + return new Warp(new Vector2(Int32.Parse((string)reader["X"]),Int32.Parse((string)reader["Y"])), (string)reader["WarpName"], (string)reader["WorldName"]); } } - Log.Info("Read Warps"); } - catch + catch (SqliteExecutionException ex) { - Log.Info("Could not read Warps"); - WriteSettings(); } + return new Warp(); } } From d83513ca961c67af1867249081236412cf6bd4dc Mon Sep 17 00:00:00 2001 From: Steven French Date: Tue, 5 Jul 2011 21:34:10 +1200 Subject: [PATCH 05/21] Reads old Warps.xml into sql if it exists, then deletes --- TShockAPI/WarpsManager.cs | 81 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/TShockAPI/WarpsManager.cs b/TShockAPI/WarpsManager.cs index 8e1cd805..35a539fa 100644 --- a/TShockAPI/WarpsManager.cs +++ b/TShockAPI/WarpsManager.cs @@ -21,6 +21,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; +using System.IO; using Community.CsharpSqlite.SQLiteClient; using Microsoft.Xna.Framework; using System.Xml; @@ -44,6 +45,12 @@ namespace TShockAPI "CREATE TABLE IF NOT EXISTS \"Warps\" (\"X\" VARCHAR(4) NOT NULL UNIQUE, \"Y\" VARCHAR(4) NOT NULL UNIQUE , \"WarpName\" VARCHAR(32) NOT NULL , \"WorldName\" VARCHAR(255) NOT NULL );"; com.ExecuteNonQuery(); } + + if(!File.Exists(FileTools.WarpsPath)) + { + ReadWarps(); + File.Delete(FileTools.WarpsPath); + } } static IDbDataParameter AddParameter(IDbCommand command, string name, object data) @@ -116,6 +123,80 @@ namespace TShockAPI } 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 From c26867633a796967ee386390d6150b864d14483a Mon Sep 17 00:00:00 2001 From: high Date: Tue, 5 Jul 2011 05:44:58 -0400 Subject: [PATCH 06/21] Added a nice generic method for things like GetString(GetOrdinal(name)) => Get(name) Moved AddParameter to extension --- TShockAPI/DB/DbExt.cs | 45 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 TShockAPI/DB/DbExt.cs diff --git a/TShockAPI/DB/DbExt.cs b/TShockAPI/DB/DbExt.cs new file mode 100644 index 00000000..a280b1a5 --- /dev/null +++ b/TShockAPI/DB/DbExt.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Text; + +namespace TShockAPI.DB +{ + public static class DbExt + { + public static IDbDataParameter AddParameter(this IDbCommand command, string name, object data) + { + var parm = command.CreateParameter(); + parm.ParameterName = name; + parm.Value = data; + command.Parameters.Add(parm); + return parm; + } + + static Dictionary> ReadFuncs = new Dictionary>() + { + {typeof(bool), (s, i) => s.GetBoolean(i)}, + {typeof(byte), (s, i) => s.GetByte(i)}, + {typeof(Int16), (s, i) => s.GetInt16(i)}, + {typeof(Int32), (s, i) => s.GetInt32(i)}, + {typeof(Int64), (s, i) => s.GetInt64(i)}, + {typeof(string), (s, i) => s.GetString(i)}, + {typeof(decimal), (s, i) => s.GetDecimal(i)}, + {typeof(decimal), (s, i) => s.GetFloat(i)}, + {typeof(double), (s, i) => s.GetDouble(i)}, + }; + + public static T Get(this IDataReader reader, string column) + { + return reader.Get(column); + } + public static T Get(this IDataReader reader, int column) + { + if (ReadFuncs.ContainsKey(typeof(T))) + return (T)ReadFuncs[typeof(T)](reader, column); + + throw new NotImplementedException(); + } + } +} From 80b07c5dd81ca8771e43ca610de09aa08e0fd58d Mon Sep 17 00:00:00 2001 From: high Date: Tue, 5 Jul 2011 05:45:34 -0400 Subject: [PATCH 07/21] Warp now uses int(11) instead of char(4). --- TShockAPI/BanManager.cs | 22 +++++++------------- TShockAPI/Properties/AssemblyInfo.cs | 4 ++-- TShockAPI/TShockAPI.csproj | 4 +++- TShockAPI/WarpsManager.cs | 30 +++++++++++----------------- 4 files changed, 24 insertions(+), 36 deletions(-) diff --git a/TShockAPI/BanManager.cs b/TShockAPI/BanManager.cs index f7c615e0..7971dc49 100644 --- a/TShockAPI/BanManager.cs +++ b/TShockAPI/BanManager.cs @@ -22,6 +22,7 @@ using System.Data; using System.IO; using System.Text; using Community.CsharpSqlite.SQLiteClient; +using TShockAPI.DB; namespace TShockAPI { @@ -48,7 +49,7 @@ namespace TShockAPI using (var com = database.CreateCommand()) { com.CommandText = "SELECT * FROM Bans WHERE IP=@ip"; - AddParameter(com, "@ip", ip); + com.AddParameter("@ip", ip); using (var reader = com.ExecuteReader()) { if (reader.Read()) @@ -61,15 +62,6 @@ namespace TShockAPI } return null; } - static IDbDataParameter AddParameter(IDbCommand command, string name, object data) - { - var parm = command.CreateParameter(); - parm.ParameterName = name; - parm.Value = data; - command.Parameters.Add(parm); - return parm; - } - public Ban GetBanByName(string name, bool casesensitive = true) { @@ -81,7 +73,7 @@ namespace TShockAPI if (!casesensitive) name = name.ToUpper(); com.CommandText = "SELECT * FROM Bans WHERE " + namecol + "=@name"; - AddParameter(com, "@name", name); + com.AddParameter("@name", name); using (var reader = com.ExecuteReader()) { if (reader.Read()) @@ -102,9 +94,9 @@ namespace TShockAPI using (var com = database.CreateCommand()) { com.CommandText = "INSERT INTO Bans (IP, Name, Reason) VALUES (@ip, @name, @reason)"; - AddParameter(com, "@ip", ip); - AddParameter(com, "@name", name); - AddParameter(com, "@reason", reason); + com.AddParameter("@ip", ip); + com.AddParameter("@name", name); + com.AddParameter("@reason", reason); com.ExecuteNonQuery(); } return true; @@ -122,7 +114,7 @@ namespace TShockAPI using (var com = database.CreateCommand()) { com.CommandText = "DELETE FROM Bans WHERE IP=@ip"; - AddParameter(com, "@ip", ip); + com.AddParameter("@ip", ip); com.ExecuteNonQuery(); return true; } diff --git a/TShockAPI/Properties/AssemblyInfo.cs b/TShockAPI/Properties/AssemblyInfo.cs index 19f98b1c..01929bb3 100644 --- a/TShockAPI/Properties/AssemblyInfo.cs +++ b/TShockAPI/Properties/AssemblyInfo.cs @@ -35,5 +35,5 @@ using System.Runtime.InteropServices; // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("2.3.2.0701")] -[assembly: AssemblyFileVersion("2.3.2.0701")] +[assembly: AssemblyVersion("2.3.2.0705")] +[assembly: AssemblyFileVersion("2.3.2.0705")] diff --git a/TShockAPI/TShockAPI.csproj b/TShockAPI/TShockAPI.csproj index 52530b7b..3428ab62 100644 --- a/TShockAPI/TShockAPI.csproj +++ b/TShockAPI/TShockAPI.csproj @@ -77,6 +77,7 @@ + @@ -138,6 +139,7 @@ + @@ -148,7 +150,7 @@ - +