diff --git a/Local.testsettings b/Local.testsettings new file mode 100644 index 00000000..24250d4b --- /dev/null +++ b/Local.testsettings @@ -0,0 +1,10 @@ + + + These are default test settings for a local test run. + + + + + + + \ No newline at end of file diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index 6618839e..230add18 100644 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -138,6 +138,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")); @@ -1204,6 +1207,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) @@ -1966,8 +2035,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) { @@ -1982,7 +2056,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/GroupManager.cs b/TShockAPI/DB/GroupManager.cs index 3f2ad3d5..bd0edb4e 100644 --- a/TShockAPI/DB/GroupManager.cs +++ b/TShockAPI/DB/GroupManager.cs @@ -37,7 +37,6 @@ namespace TShockAPI.DB AddGroup("default", "canwater,canlava,warp,canbuild"); AddGroup("vip", "default,canwater,canlava,warp,canbuild,reservedslot"); - String file = Path.Combine(TShock.SavePath, "groups.txt"); if (File.Exists(file)) { @@ -124,6 +123,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/ItemManager.cs b/TShockAPI/DB/ItemManager.cs index 91bd66d9..12ddb646 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,8 @@ namespace TShockAPI.DB com.CommandText = "INSERT INTO ItemBans (ItemName) VALUES (@itemname);"; com.AddParameter("@itemname", Tools.GetItemByName(itemname)[0].name); com.ExecuteNonQuery(); + if( !ItemIsBanned( itemname ) ) + ItemBans.Add(itemname); } } catch (Exception ex) @@ -92,13 +100,16 @@ namespace TShockAPI.DB public void RemoveBan(string itemname) { + if (!ItemIsBanned(itemname)) + return; 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) diff --git a/TShockAPI/DB/RegionManager.cs b/TShockAPI/DB/RegionManager.cs index 9c3e96e8..75ee9f7e 100644 --- a/TShockAPI/DB/RegionManager.cs +++ b/TShockAPI/DB/RegionManager.cs @@ -201,7 +201,6 @@ namespace TShockAPI.DB File.Delete(file2); //File.Move(file, file2); } - if (updates > 0) ReloadAllRegions(); } @@ -249,7 +248,7 @@ 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(','); Region r = new Region(new Rectangle(X1, Y1, width, height), name, Protected, Main.worldID.ToString()); @@ -262,6 +261,7 @@ namespace TShockAPI.DB { break; } + //System.Console.WriteLine(SplitIDs[i]); r.RegionAllowedIDs[i] = Convert.ToInt32(SplitIDs[i]); } } @@ -303,7 +303,7 @@ namespace TShockAPI.DB com.AddParameter("@protected", 1); if (com.ExecuteNonQuery() > 0) { - ReloadAllRegions(); + Regions.Add(new Region(new Rectangle(tx, ty, width, height), regionname, 0, worldid)); return true; } diff --git a/TShockAPI/Properties/AssemblyInfo.cs b/TShockAPI/Properties/AssemblyInfo.cs index 44d2c898..2471e719 100644 --- a/TShockAPI/Properties/AssemblyInfo.cs +++ b/TShockAPI/Properties/AssemblyInfo.cs @@ -35,5 +35,6 @@ using System.Runtime.InteropServices; // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] + [assembly: AssemblyVersion("3.1.3.0723")] [assembly: AssemblyFileVersion("3.1.3.0723")] diff --git a/TShockAPI/TShockAPI.csproj b/TShockAPI/TShockAPI.csproj index ba145806..ab773528 100644 --- a/TShockAPI/TShockAPI.csproj +++ b/TShockAPI/TShockAPI.csproj @@ -170,7 +170,7 @@ - + + \ No newline at end of file