From 727ae2322bacc4da6ca3ec372d64e33a68ec1f4f Mon Sep 17 00:00:00 2001 From: Zack Piispanen Date: Fri, 22 Jul 2011 23:14:56 -0400 Subject: [PATCH] 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