From 727ae2322bacc4da6ca3ec372d64e33a68ec1f4f Mon Sep 17 00:00:00 2001 From: Zack Piispanen Date: Fri, 22 Jul 2011 23:14:56 -0400 Subject: [PATCH 1/8] Added new commands to allow users in game to create, delete, modify groups. Added new methods to create, delete, modify groups. Uhhh....dunno why RegionManager.cs was conflicted. Added permission for accessing group commands --- TShockAPI/Commands.cs | 69 ++++++++++++++++++++++++++ TShockAPI/DB/GroupManager.cs | 92 ++++++++++++++++++++++++++++++++++- TShockAPI/DB/RegionManager.cs | 10 ++-- TShockAPI/config/groups.txt | 1 + 4 files changed, 166 insertions(+), 6 deletions(-) diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index 11e7fc32..c48abe6e 100644 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -137,6 +137,9 @@ namespace TShockAPI ChatCommands.Add(new Command("warp", UseWarp, "warp")); ChatCommands.Add(new Command("managewarp", SetWarp, "setwarp")); ChatCommands.Add(new Command("managewarp", DeleteWarp, "delwarp")); + ChatCommands.Add(new Command("managegroup", AddGroup, "addGroup")); + ChatCommands.Add(new Command("managegroup", DeleteGroup, "delGroup")); + ChatCommands.Add(new Command("managegroup", ModifyGroup, "modGroup")); ChatCommands.Add(new Command("cfg", SetSpawn, "setspawn")); ChatCommands.Add(new Command("cfg", Reload, "reload")); ChatCommands.Add(new Command("cfg", DebugConfiguration, "debug-config")); @@ -1183,6 +1186,72 @@ namespace TShockAPI #endregion Teleport Commands + + #region Group Management + + private static void AddGroup(CommandArgs args) + { + if (args.Parameters.Count > 0) + { + String groupname = args.Parameters[0]; + args.Parameters.RemoveAt(0); + String permissions = String.Join(",", args.Parameters ); + + String response = TShock.Groups.addGroup(groupname, permissions); + if( response.Length > 0 ) + args.Player.SendMessage(response, Color.Green); + } + else + { + args.Player.SendMessage("Incorrect format: /addGroup [optional permissions]", Color.Red); + } + } + + private static void DeleteGroup(CommandArgs args) + { + if (args.Parameters.Count > 0) + { + String groupname = args.Parameters[0]; + + String response = TShock.Groups.delGroup(groupname); + if (response.Length > 0) + args.Player.SendMessage(response, Color.Green); + } + else + { + args.Player.SendMessage("Incorrect format: /delGroup ", Color.Red); + } + } + + private static void ModifyGroup(CommandArgs args) + { + if (args.Parameters.Count > 2) + { + String com = args.Parameters[0]; + args.Parameters.RemoveAt(0); + + String groupname = args.Parameters[0]; + args.Parameters.RemoveAt(0); + + if (com.Equals("add")) + { + String response = TShock.Groups.addPermission(groupname, args.Parameters); + if (response.Length > 0) + args.Player.SendMessage(response, Color.Green); + return; + } + else if (com.Equals("del") || com.Equals("delete")) + { + String response = TShock.Groups.delPermission(groupname, args.Parameters); + if (response.Length > 0) + args.Player.SendMessage(response, Color.Green); + return; + } + } + args.Player.SendMessage("Incorrect format: /modGroup add|del ", Color.Red); + } + + #endregion Group Management #region Server Config Commands private static void SetSpawn(CommandArgs args) diff --git a/TShockAPI/DB/GroupManager.cs b/TShockAPI/DB/GroupManager.cs index 8c8d0c45..1c748008 100644 --- a/TShockAPI/DB/GroupManager.cs +++ b/TShockAPI/DB/GroupManager.cs @@ -44,7 +44,7 @@ namespace TShockAPI.DB 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("@commands", "newadmin,ban,unban,whitelist,causeevents,spawnboss,spawnmob,managewarp,time,tp,pvpfun,kill,logs,immunetokick,tphere, managegroup"); com.AddParameter("@order", "0"); com.ExecuteNonQuery(); com.Parameters.Clear(); @@ -141,6 +141,96 @@ namespace TShockAPI.DB return false; } + public String addGroup(String name, String permissions) + { + String message = ""; + if( GroupExists( name ) ) + return "Error: Group already exists. Use /modGroup to change permissions."; + 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", permissions); + com.AddParameter("@order", "0"); + if (com.ExecuteNonQuery() == 1) + message = "Group " + name + " has been created successfully."; + Group g = new Group(name); + g.permissions.Add(permissions); + groups.Add(g); + } + return message; + } + + public String delGroup(String name) + { + String message = ""; + if (!GroupExists(name)) + return "Error: Group doesn't exists."; + using (var com = database.CreateCommand()) + { + com.CommandText = "Delete FROM GroupList WHERE GroupName=@groupname;"; + com.AddParameter("@groupname", name); + if (com.ExecuteNonQuery() == 1) + message = "Group " + name + " has been deleted successfully."; + groups.Remove(Tools.GetGroup(name)); + } + return message; + } + + public String addPermission(String name, List permissions) + { + String message = ""; + if (!GroupExists(name)) + return "Error: Group doesn't exists."; + using (var com = database.CreateCommand()) + { + Group g = Tools.GetGroup(name); + List perm = g.permissions; + foreach (String p in permissions) + { + if (!perm.Contains(p)) + { + if (perm.Count > 0 && perm[0].Equals("")) + perm[0] = p; + else + g.permissions.Add(p); + } + } + com.CommandText = "UPDATE GroupList SET Commands=@perm WHERE GroupName=@name;"; + com.AddParameter("@perm", String.Join(",", perm)); + com.AddParameter("@name", name); + if (com.ExecuteNonQuery() == 1) + message = "Group " + name + " has been modified successfully."; + } + return message; + } + + public String delPermission(String name, List permissions) + { + String message = ""; + if (!GroupExists(name)) + return "Error: Group doesn't exists."; + using (var com = database.CreateCommand()) + { + Group g = Tools.GetGroup(name); + List perm = g.permissions; + foreach (String p in permissions) + { + if (perm.Contains(p)) + g.permissions.Remove(p); + } + com.CommandText = "UPDATE GroupList SET Commands=@perm WHERE GroupName=@name;"; + com.AddParameter("@perm", String.Join(",", perm)); + com.AddParameter("@name", name); + if (com.ExecuteNonQuery() == 1) + message = "Group " + name + " has been modified successfully."; + } + return message; + } + public void LoadPermisions() { groups = new List(); diff --git a/TShockAPI/DB/RegionManager.cs b/TShockAPI/DB/RegionManager.cs index f5d33d9d..a20b05f9 100644 --- a/TShockAPI/DB/RegionManager.cs +++ b/TShockAPI/DB/RegionManager.cs @@ -151,7 +151,7 @@ namespace TShockAPI.DB if (ipstr != "") ipstr += ","; ipstr += TShock.Users.GetUserID(ips[i]); - } catch (Exception) + } catch (Exception e) { Log.Error("An IP address failed to import. It wasn't a user in the new user system."); } @@ -200,8 +200,7 @@ namespace TShockAPI.DB //File.Move(file, file2); } - if( updates > 0 ) - ReloadAllRegions(); + ReloadAllRegions(); } } @@ -247,9 +246,9 @@ namespace TShockAPI.DB int Protected = reader.Get("Protected"); string MergedIDs = DbExt.Get(reader, "UserIds"); string name = DbExt.Get(reader, "RegionName"); - + System.Console.WriteLine(MergedIDs); string[] SplitIDs = MergedIDs.Split(','); - + System.Console.WriteLine(SplitIDs.Length); Region r = new Region(new Rectangle(X1, Y1, width, height), name, Protected, Main.worldName); r.RegionAllowedIDs = new int[SplitIDs.Length]; try @@ -260,6 +259,7 @@ namespace TShockAPI.DB { break; } + //System.Console.WriteLine(SplitIDs[i]); r.RegionAllowedIDs[i] = Convert.ToInt32(SplitIDs[i]); } } catch (Exception e) diff --git a/TShockAPI/config/groups.txt b/TShockAPI/config/groups.txt index 51b67ad0..886e699b 100644 --- a/TShockAPI/config/groups.txt +++ b/TShockAPI/config/groups.txt @@ -24,6 +24,7 @@ #tp - allow player to teleport #tphere - allow a player to teleport players to their position #managewarp - allow player to add/delete warp locations +#managegroup - allow player to add/delete/modify groups #editspawn - allow player to enable/disable build protection #cfg - allow player to view/change tshock configuration #time - allow player to change time From ffd0471326a31afd6abca6d2bd776842cebf6c41 Mon Sep 17 00:00:00 2001 From: Zack Piispanen Date: Sat, 23 Jul 2011 15:21:56 -0400 Subject: [PATCH 2/8] initial unit testing work and a few tweaks to stuff relating to items --- TShockAPI/Commands.cs | 15 +++++++++++---- TShockAPI/DB/ItemManager.cs | 22 +++++++++++++++------- TShockAPI/TShockAPI.csproj | 2 +- Terraria.sln | 22 ++++++++++++++++++++++ 4 files changed, 49 insertions(+), 12 deletions(-) diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index c48abe6e..5ba4201e 100644 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -1945,9 +1945,12 @@ namespace TShockAPI args.Player.SendMessage("Missing item name/id", Color.Red); return; } - int itemAmount = 0; - int.TryParse( args.Parameters[args.Parameters.Count - 1 ], out itemAmount ); var items = Tools.GetItemByIdOrName(args.Parameters[0]); + args.Parameters.RemoveAt(0); + int itemAmount = 0; + if( args.Parameters.Count > 0 ) + int.TryParse( args.Parameters[0], out itemAmount ); + if (items.Count == 0) { args.Player.SendMessage("Invalid item type!", Color.Red); @@ -1998,8 +2001,13 @@ namespace TShockAPI return; } int itemAmount = 0; - int.TryParse(args.Parameters[args.Parameters.Count - 1], out itemAmount); var items = Tools.GetItemByIdOrName(args.Parameters[0]); + args.Parameters.RemoveAt(0); + string plStr = args.Parameters[0]; + args.Parameters.RemoveAt(0); + if( args.Parameters.Count > 0 ) + int.TryParse(args.Parameters[args.Parameters.Count - 1], out itemAmount); + if (items.Count == 0) { @@ -2014,7 +2022,6 @@ namespace TShockAPI var item = items[0]; if (item.type >= 1 && item.type < Main.maxItemTypes) { - string plStr = args.Parameters[1]; var players = Tools.FindPlayer(plStr); if (players.Count == 0) { diff --git a/TShockAPI/DB/ItemManager.cs b/TShockAPI/DB/ItemManager.cs index 91bd66d9..3f3e985c 100644 --- a/TShockAPI/DB/ItemManager.cs +++ b/TShockAPI/DB/ItemManager.cs @@ -36,7 +36,7 @@ namespace TShockAPI.DB String line; while ((line = sr.ReadLine()) != null) { - if (!line.Equals("") && !line.Substring( 0, 1 ).Equals("#") ) + if (!line.Equals("") && !line.Substring(0, 1).Equals("#")) { if (TShock.Config.StorageType.ToLower() == "sqlite") com.CommandText = "INSERT OR IGNORE INTO 'ItemBans' (ItemName) VALUES (@name);"; @@ -44,8 +44,8 @@ namespace TShockAPI.DB com.CommandText = "INSERT IGNORE INTO ItemBans SET ItemName=@name;"; int id = 0; - int.TryParse(line, out id ); - com.AddParameter("@name", Tools.GetItemById( id ).name ); + int.TryParse(line, out id); + com.AddParameter("@name", Tools.GetItemById(id).name); com.ExecuteNonQuery(); com.Parameters.Clear(); } @@ -60,19 +60,25 @@ namespace TShockAPI.DB File.Delete(file2); File.Move(file, file2); } + } + UpdateItemBans(); + } + + public void UpdateItemBans() + { + ItemBans.Clear(); + using (var com = database.CreateCommand()) + { com.CommandText = "SELECT * FROM ItemBans"; using (var reader = com.ExecuteReader()) { - while (reader.Read()) + while (reader!=null&&reader.Read()) ItemBans.Add(reader.Get("ItemName")); - - reader.Close(); } } } - public void AddNewBan(string itemname = "") { try @@ -82,6 +88,7 @@ namespace TShockAPI.DB com.CommandText = "INSERT INTO ItemBans (ItemName) VALUES (@itemname);"; com.AddParameter("@itemname", Tools.GetItemByName(itemname)[0].name); com.ExecuteNonQuery(); + ItemBans.Add(itemname); } } catch (Exception ex) @@ -99,6 +106,7 @@ namespace TShockAPI.DB com.CommandText = "DELETE FROM ItemBans WHERE ItemName=@itemname;"; com.AddParameter("@itemname", Tools.GetItemByName(itemname)[0].name); com.ExecuteNonQuery(); + ItemBans.Remove(itemname); } } catch (Exception ex) diff --git a/TShockAPI/TShockAPI.csproj b/TShockAPI/TShockAPI.csproj index 6cef2940..7f1be464 100644 --- a/TShockAPI/TShockAPI.csproj +++ b/TShockAPI/TShockAPI.csproj @@ -162,7 +162,7 @@ - + + \ No newline at end of file From 347d701b7f5193395f2e50719288d72b352ba6ef Mon Sep 17 00:00:00 2001 From: Zack Piispanen Date: Sat, 23 Jul 2011 16:59:29 -0400 Subject: [PATCH 4/8] push for shank --- TShockAPI/Commands.cs | 9 +++- TShockAPI/DB/ItemManager.cs | 14 ++++-- .../{UnitTest1.cs => ItemManagerTest.cs} | 44 ++++++++++++++----- UnitTests/ItemManagerTest.orderedtest | 7 +++ UnitTests/UnitTests.csproj | 7 ++- 5 files changed, 65 insertions(+), 16 deletions(-) rename UnitTests/{UnitTest1.cs => ItemManagerTest.cs} (58%) create mode 100644 UnitTests/ItemManagerTest.orderedtest diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index 5ba4201e..5ae8fe76 100644 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -1193,13 +1193,18 @@ namespace TShockAPI { if (args.Parameters.Count > 0) { - String groupname = args.Parameters[0]; + /*String groupname = args.Parameters[0]; args.Parameters.RemoveAt(0); String permissions = String.Join(",", args.Parameters ); String response = TShock.Groups.addGroup(groupname, permissions); if( response.Length > 0 ) - args.Player.SendMessage(response, Color.Green); + args.Player.SendMessage(response, Color.Green);*/ + + TShock.Itembans.AddNewBan("Gold Coin"); + Console.WriteLine(String.Join(",", TShock.Itembans.ItemBans)); + TShock.Itembans.RemoveBan("Gold Coin"); + Console.WriteLine(String.Join(",", TShock.Itembans.ItemBans)); } else { diff --git a/TShockAPI/DB/ItemManager.cs b/TShockAPI/DB/ItemManager.cs index 3f3e985c..b59a8881 100644 --- a/TShockAPI/DB/ItemManager.cs +++ b/TShockAPI/DB/ItemManager.cs @@ -88,7 +88,8 @@ namespace TShockAPI.DB com.CommandText = "INSERT INTO ItemBans (ItemName) VALUES (@itemname);"; com.AddParameter("@itemname", Tools.GetItemByName(itemname)[0].name); com.ExecuteNonQuery(); - ItemBans.Add(itemname); + if( !ItemIsBanned( itemname ) ) + ItemBans.Add(itemname); } } catch (Exception ex) @@ -99,18 +100,25 @@ namespace TShockAPI.DB public void RemoveBan(string itemname) { + if (ItemIsBanned(itemname)) + return; + else + { + ItemBans.Remove(itemname); + } try { using (var com = database.CreateCommand()) { - com.CommandText = "DELETE FROM ItemBans WHERE ItemName=@itemname;"; + com.CommandText = "Delete FROM 'ItemBans' WHERE ItemName=@itemname;"; com.AddParameter("@itemname", Tools.GetItemByName(itemname)[0].name); com.ExecuteNonQuery(); - ItemBans.Remove(itemname); + } } catch (Exception ex) { + ItemBans.Remove(itemname); Log.Error(ex.ToString()); } } diff --git a/UnitTests/UnitTest1.cs b/UnitTests/ItemManagerTest.cs similarity index 58% rename from UnitTests/UnitTest1.cs rename to UnitTests/ItemManagerTest.cs index 4f6d826c..7b149e9b 100644 --- a/UnitTests/UnitTest1.cs +++ b/UnitTests/ItemManagerTest.cs @@ -21,7 +21,7 @@ namespace UnitTests /// Summary description for UnitTest1 /// [TestClass] - public class UnitTest1 + public class ItemManagerTest { public static IDbConnection DB; [TestInitialize] @@ -30,8 +30,8 @@ namespace UnitTests TShock.Config = new ConfigFile(); TShock.Config.StorageType = "sqlite"; - UnitTest1.DB = new SqliteConnection(string.Format("uri=file://{0},Version=3", "tshock.test.sqlite")); - UnitTest1.DB.Open(); + DB = new SqliteConnection(string.Format("uri=file://{0},Version=3", "tshock.test.sqlite")); + DB.Open(); /*try { var hostport = Config.MySqlHost.Split(':'); @@ -53,27 +53,51 @@ namespace UnitTests } [TestMethod] - public void SQLiteItemTest() + public void SQLiteItemTest_AddBan() { // // TODO: Add test logic here // ItemManager manager = new ItemManager(DB); Assert.IsNotNull(manager); - Assert.AreEqual( false, manager.ItemIsBanned("Dirt Block") ); + Assert.AreEqual( false, manager.ItemIsBanned("Dirt Block"), "Item isn't banned" ); manager.AddNewBan("Dirt Block"); - Assert.AreEqual(true, manager.ItemIsBanned("Dirt Block")); - Assert.AreEqual(false, manager.ItemIsBanned("Green Brick")); + Assert.AreEqual(true, manager.ItemIsBanned("Dirt Block"), "New item is added"); + Assert.AreEqual(false, manager.ItemIsBanned("Green Brick"), "Item isn't banned"); manager.AddNewBan("Green Brick"); + Assert.AreEqual(true, manager.ItemIsBanned("Green Brick"), "New item is added"); + Assert.AreEqual(2, manager.ItemBans.Count, "Adding both items"); + manager.AddNewBan("Green Brick" ); + Assert.AreEqual(2, manager.ItemBans.Count, "Adding duplicate items"); + } + + [TestMethod] + public void SQLiteItemTest_RemoveBan() + { + // + // TODO: Add test logic here + // + ItemManager manager = new ItemManager(DB); + Assert.IsNotNull(manager); + Assert.AreEqual(2, manager.ItemBans.Count); + manager.AddNewBan("Dirt Block"); + Assert.AreEqual(2, manager.ItemBans.Count); + Assert.AreEqual(true, manager.ItemIsBanned("Dirt Block")); + manager.RemoveBan("Dirt Block"); + manager.UpdateItemBans(); + Assert.AreEqual(1, manager.ItemBans.Count); + Assert.AreEqual(false, manager.ItemIsBanned("Dirt Block")); + manager.RemoveBan("Dirt Block"); + Assert.AreEqual(false, manager.ItemIsBanned("Dirt Block")); Assert.AreEqual(true, manager.ItemIsBanned("Green Brick")); - //manager.UpdateItemBans(); - //Assert.AreEqual(false, manager.ItemIsBanned("Dirt Block")); - DB.Close(); + manager.RemoveBan("Green Brick"); + Assert.AreEqual(false, manager.ItemIsBanned("Green Brick")); } [TestCleanup] public void Cleanup() { + DB.Close(); } } } diff --git a/UnitTests/ItemManagerTest.orderedtest b/UnitTests/ItemManagerTest.orderedtest new file mode 100644 index 00000000..eeb19a9e --- /dev/null +++ b/UnitTests/ItemManagerTest.orderedtest @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/UnitTests/UnitTests.csproj b/UnitTests/UnitTests.csproj index 6f78bf1e..10392952 100644 --- a/UnitTests/UnitTests.csproj +++ b/UnitTests/UnitTests.csproj @@ -64,7 +64,7 @@ - + @@ -72,6 +72,11 @@ TShockAPI + + + Always + +