From fb11729547d10cf65b47319baac13a9de04c2b1e Mon Sep 17 00:00:00 2001 From: stevenh Date: Mon, 13 Feb 2012 19:23:56 +0000 Subject: [PATCH] Added IEnumerable support to GroupManager to facilitate RestAPI listing groups Added optional exceptions parameter to AddGroup and DeleteGroup to faciliate RestAPI group manipulation. This changes the behaviour of these methods to throw an exception on error instead of returning an error string. Corrected internal lists from being updated in failed DB updates in DeleteGroup and AddGroup Added doc for chatcolor on AddGroup --- TShockAPI/DB/GroupManager.cs | 83 ++++++++++++++++++++++++++++++++---- 1 file changed, 75 insertions(+), 8 deletions(-) diff --git a/TShockAPI/DB/GroupManager.cs b/TShockAPI/DB/GroupManager.cs index da3ce79f..27fee59a 100644 --- a/TShockAPI/DB/GroupManager.cs +++ b/TShockAPI/DB/GroupManager.cs @@ -16,6 +16,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ using System; +using System.Collections; using System.Collections.Generic; using System.Data; using System.IO; @@ -24,7 +25,7 @@ using MySql.Data.MySqlClient; namespace TShockAPI.DB { - public class GroupManager + public class GroupManager : IEnumerable { private IDbConnection database; @@ -64,21 +65,42 @@ namespace TShockAPI.DB if (group == "superadmin") return true; - return groups.Any(g => g.Name.Equals(group)); } + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public IEnumerator GetEnumerator() + { + return groups.GetEnumerator(); + } + + public Group GetGroupByName(string name) + { + var ret = groups.Where(g => g.Name == name); + return 1 == ret.Count() ? ret.ElementAt(0) : null; + } + /// /// Adds group with name and permissions if it does not exist. /// /// name of group /// parent of group /// permissions - public String AddGroup(String name, string parentname, String permissions, String chatcolor) + /// chatcolor + /// exceptions true indicates use exceptions for errors false otherwise + public String AddGroup(String name, string parentname, String permissions, String chatcolor, bool exceptions = false) { String message = ""; if (GroupExists(name)) + { + if (exceptions) + throw new GroupExistsException(name); return "Error: Group already exists. Use /modGroup to change permissions."; + } var group = new Group(name, null, chatcolor); group.permissions.Add(permissions); @@ -88,6 +110,8 @@ namespace TShockAPI.DB if (parent == null) { var error = "Invalid parent {0} for group {1}".SFormat(group.Name, parentname); + if (exceptions) + throw new GroupManagerException(error); Log.ConsoleError(error); return error; } @@ -98,9 +122,12 @@ namespace TShockAPI.DB ? "INSERT OR IGNORE INTO GroupList (GroupName, Parent, Commands, ChatColor) VALUES (@0, @1, @2, @3);" : "INSERT IGNORE INTO GroupList SET GroupName=@0, Parent=@1, Commands=@2, ChatColor=@3"; if (database.Query(query, name, parentname, permissions, chatcolor) == 1) + { message = "Group " + name + " has been created successfully."; - - groups.Add(group); + groups.Add(group); + } + else if (exceptions) + throw new GroupManagerException("Failed to add group '" + name + "'"); return message; } @@ -115,15 +142,23 @@ namespace TShockAPI.DB return AddGroup(name, parent, permissions, "255,255,255"); } - public String DeleteGroup(String name) + public String DeleteGroup(String name, bool exceptions = false) { String message = ""; if (!GroupExists(name)) + { + if (exceptions) + throw new GroupNotExistException(name); return "Error: Group doesn't exists."; + } if (database.Query("DELETE FROM GroupList WHERE GroupName=@0", name) == 1) + { message = "Group " + name + " has been deleted successfully."; - groups.Remove(TShock.Utils.GetGroup(name)); + groups.Remove(TShock.Utils.GetGroup(name)); + } + else if (exceptions) + throw new GroupManagerException("Failed to delete group '" + name + "'"); return message; } @@ -239,4 +274,36 @@ namespace TShockAPI.DB } } } -} \ No newline at end of file + + [Serializable] + public class GroupManagerException : Exception + { + public GroupManagerException(string message) + : base(message) + { + } + + public GroupManagerException(string message, Exception inner) + : base(message, inner) + { + } + } + + [Serializable] + public class GroupExistsException : GroupManagerException + { + public GroupExistsException(string name) + : base("Group '" + name + "' already exists") + { + } + } + + [Serializable] + public class GroupNotExistException : GroupManagerException + { + public GroupNotExistException(string name) + : base("Group '" + name + "' does not exist") + { + } + } +}