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