diff --git a/TShockAPI/DB/UserManager.cs b/TShockAPI/DB/UserManager.cs index 0b6ba990..afb0d8dc 100644 --- a/TShockAPI/DB/UserManager.cs +++ b/TShockAPI/DB/UserManager.cs @@ -19,6 +19,7 @@ using System; using System.Data; using System.IO; using System.Collections.Generic; +using System.Linq; using MySql.Data.MySqlClient; using System.Text.RegularExpressions; @@ -130,11 +131,18 @@ namespace TShockAPI.DB { try { - if (!TShock.Groups.GroupExists(group)) + Group grp = TShock.Groups.GetGroupByName(group); + if (null == grp) throw new GroupNotExistsException(group); if (database.Query("UPDATE Users SET UserGroup = @0 WHERE Username = @1;", group, user.Name) == 0) throw new UserNotExistException(user.Name); + + // Update player group reference for any logged in player + foreach (var player in TShock.Players.Where(p => null != p && p.UserAccountName == user.Name)) + { + player.Group = grp; + } } catch (Exception ex) { diff --git a/TShockAPI/Group.cs b/TShockAPI/Group.cs index b1a44a5e..8e36e51d 100644 --- a/TShockAPI/Group.cs +++ b/TShockAPI/Group.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.Linq; using System.Collections.Generic; namespace TShockAPI @@ -59,7 +60,7 @@ namespace TShockAPI get { List all = new List(permissions); - permissions.ForEach(p => all.Add("!" + p)); + negatedpermissions.ForEach(p => all.Add("!" + p)); return string.Join(",", all); } set @@ -71,6 +72,36 @@ namespace TShockAPI } } + public List TotalPermissions + { + get + { + var cur = this; + var traversed = new List(); + HashSet all = new HashSet(); + while (cur != null) + { + foreach (var perm in cur.permissions) + { + all.Add(perm); + } + + foreach (var perm in cur.negatedpermissions) + { + all.Remove(perm); + } + + if (traversed.Contains(cur)) + { + throw new Exception("Infinite group parenting ({0})".SFormat(cur.Name)); + } + traversed.Add(cur); + cur = cur.Parent; + } + return all.ToList(); + } + } + public byte R = 255; public byte G = 255; public byte B = 255; @@ -85,12 +116,13 @@ namespace TShockAPI public virtual bool HasPermission(string permission) { + if (string.IsNullOrEmpty(permission)) + return true; + var cur = this; var traversed = new List(); while (cur != null) { - if (string.IsNullOrEmpty(permission)) - return true; if (cur.negatedpermissions.Contains(permission)) return false; if (cur.permissions.Contains(permission)) diff --git a/TShockAPI/Rest/RestManager.cs b/TShockAPI/Rest/RestManager.cs index ed79492e..2efd2d65 100644 --- a/TShockAPI/Rest/RestManager.cs +++ b/TShockAPI/Rest/RestManager.cs @@ -584,7 +584,8 @@ namespace TShockAPI {"parent", group.ParentName}, {"chatcolor", group.ChatColor}, {"permissions", group.permissions}, - {"negatedpermissions", group.negatedpermissions} + {"negatedpermissions", group.negatedpermissions}, + {"totalpermissions", group.TotalPermissions} }; }