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}
};
}