From 22d8575e01bad823c7e6fac60e24413d77bde990 Mon Sep 17 00:00:00 2001
From: AkjaHAsLk1IALk0MasH <46046453+AgaSpace@users.noreply.github.com>
Date: Sun, 14 May 2023 12:04:17 +0700
Subject: [PATCH 1/7] Corrected the `UserAccountNotExistException`
documentation.
---
TShockAPI/DB/UserManager.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/TShockAPI/DB/UserManager.cs b/TShockAPI/DB/UserManager.cs
index 0354989e7..7b8fe4a28 100644
--- a/TShockAPI/DB/UserManager.cs
+++ b/TShockAPI/DB/UserManager.cs
@@ -619,7 +619,7 @@ public UserAccountExistsException(string name)
public class UserAccountNotExistException : UserAccountManagerException
{
/// Creates a new UserAccountNotExistException object, with the user account name in the message.
- /// The user account name to be pasesd in the message.
+ /// The user account name to be passed in the message.
/// A new UserAccountNotExistException object with a message containing the user account name that does not exist.
public UserAccountNotExistException(string name)
: base(GetString($"User account {name} does not exist"))
From 8a0920b6eabadb40bc43cb65a4eb565366ff0f75 Mon Sep 17 00:00:00 2001
From: AkjaHAsLk1IALk0MasH <46046453+AgaSpace@users.noreply.github.com>
Date: Sun, 14 May 2023 12:08:11 +0700
Subject: [PATCH 2/7] Added a hook `AccountHooks.AccountGroupUpdate`.
---
TShockAPI/Hooks/AccountHooks.cs | 52 +++++++++++++++++++++++++++++++++
1 file changed, 52 insertions(+)
diff --git a/TShockAPI/Hooks/AccountHooks.cs b/TShockAPI/Hooks/AccountHooks.cs
index 9c08b26dc..e224b467d 100644
--- a/TShockAPI/Hooks/AccountHooks.cs
+++ b/TShockAPI/Hooks/AccountHooks.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.ComponentModel;
using TShockAPI.DB;
namespace TShockAPI.Hooks
{
@@ -39,6 +40,37 @@ public AccountCreateEventArgs(UserAccount account)
}
}
+ public abstract class AccountGroupUpdateEventArgs : HandledEventArgs
+ {
+ public string AccountName { get; private set; }
+ public Group Group { get; set; }
+
+ public AccountGroupUpdateEventArgs(string accountName, Group group)
+ {
+ this.AccountName = accountName;
+ this.Group = group;
+ }
+ }
+
+ public class AccountGroupUpdateByPluginEventArgs : AccountGroupUpdateEventArgs
+ {
+ public AccountGroupUpdateByPluginEventArgs(string accountName, Group group) : base(accountName, group)
+ {
+ }
+ }
+ public class AccountGroupUpdateByPlayerEventArgs : AccountGroupUpdateEventArgs
+ {
+ ///
+ /// The player who updated the user's group
+ ///
+ public TSPlayer Player { get; private set; }
+
+ public AccountGroupUpdateByPlayerEventArgs(TSPlayer player, string accountName, Group group) : base(accountName, group)
+ {
+ this.Player = player;
+ }
+ }
+
public class AccountHooks
{
public delegate void AccountCreateD(AccountCreateEventArgs e);
@@ -62,5 +94,25 @@ public static void OnAccountDelete(UserAccount u)
AccountDelete(new AccountDeleteEventArgs(u));
}
+
+ public delegate void AccountGroupUpdateD(AccountGroupUpdateEventArgs e);
+ public static event AccountGroupUpdateD AccountGroupUpdate;
+
+ public static bool OnAccountGroupUpdate(UserAccount account, TSPlayer author, ref Group group)
+ {
+ AccountGroupUpdateEventArgs args = new AccountGroupUpdateByPlayerEventArgs(author, account.Name, group);
+ AccountGroupUpdate?.Invoke(args);
+ group = args.Group;
+
+ return args.Handled;
+ }
+ public static bool OnAccountGroupUpdate(UserAccount account, ref Group group)
+ {
+ AccountGroupUpdateEventArgs args = new AccountGroupUpdateByPluginEventArgs(account.Name, group);
+ AccountGroupUpdate?.Invoke(args);
+ group = args.Group;
+
+ return args.Handled;
+ }
}
}
From 1e037748c1d511fdc3449ff6261a55a049b4e96d Mon Sep 17 00:00:00 2001
From: AkjaHAsLk1IALk0MasH <46046453+AgaSpace@users.noreply.github.com>
Date: Sun, 14 May 2023 12:13:56 +0700
Subject: [PATCH 3/7] Updated the `UserManager.SetUserGroup`.
Added an exception `UserGroupUpdateLockedException`, which appears when a hook locks a group change.
Added an overload for `UserManager.SetUserGroup`, with the `TSPlayer` parameter (author)
---
TShockAPI/DB/UserManager.cs | 51 ++++++++++++++++++++++++++++++++++++-
1 file changed, 50 insertions(+), 1 deletion(-)
diff --git a/TShockAPI/DB/UserManager.cs b/TShockAPI/DB/UserManager.cs
index 7b8fe4a28..6411b289e 100644
--- a/TShockAPI/DB/UserManager.cs
+++ b/TShockAPI/DB/UserManager.cs
@@ -25,6 +25,7 @@ You should have received a copy of the GNU General Public License
using System.Text.RegularExpressions;
using BCrypt.Net;
using System.Security.Cryptography;
+using TShockAPI.Hooks;
namespace TShockAPI.DB
{
@@ -166,7 +167,41 @@ public void SetUserGroup(UserAccount account, string group)
if (null == grp)
throw new GroupNotExistsException(group);
- if (_database.Query("UPDATE Users SET UserGroup = @0 WHERE Username = @1;", group, account.Name) == 0)
+ if (AccountHooks.OnAccountGroupUpdate(account, ref grp))
+ throw new UserGroupUpdateLockedException(account.Name);
+
+ if (_database.Query("UPDATE Users SET UserGroup = @0 WHERE Username = @1;", grp.Name, account.Name) == 0)
+ throw new UserAccountNotExistException(account.Name);
+
+ try
+ {
+ // Update player group reference for any logged in player
+ foreach (var player in TShock.Players.Where(p => p != null && p.Account != null && p.Account.Name == account.Name))
+ {
+ player.Group = grp;
+ }
+ }
+ catch (Exception ex)
+ {
+ throw new UserAccountManagerException(GetString("SetUserGroup SQL returned an error"), ex);
+ }
+ }
+ ///
+ /// Sets the group for a given username
+ ///
+ /// Who changes the group
+ /// The user account
+ /// The user account group to be set
+ public void SetUserGroup(TSPlayer author, UserAccount account, string group)
+ {
+ Group grp = TShock.Groups.GetGroupByName(group);
+ if (null == grp)
+ throw new GroupNotExistsException(group);
+
+ if (AccountHooks.OnAccountGroupUpdate(account, author, ref grp))
+ throw new UserGroupUpdateLockedException(account.Name);
+
+ if (_database.Query("UPDATE Users SET UserGroup = @0 WHERE Username = @1;", grp.Name, account.Name) == 0)
throw new UserAccountNotExistException(account.Name);
try
@@ -627,6 +662,20 @@ public UserAccountNotExistException(string name)
}
}
+ /// The UserGroupUpdateLockedException used when the user group update failed and the request failed as a result..
+ [Serializable]
+ public class UserGroupUpdateLockedException : UserAccountManagerException
+ {
+ /// Creates a new UserGroupUpdateLockedException object.
+ /// The name of the user who failed to change the group.
+ /// New UserGroupUpdateLockedException object with a message containing the name of the user account that failed to change the group.
+ public UserGroupUpdateLockedException(string name) :
+ base(GetString($"The user {name} group could not be updated"))
+ {
+ }
+ }
+
+
/// A GroupNotExistsException, used when a group does not exist.
[Serializable]
public class GroupNotExistsException : UserAccountManagerException
From 230d9b094591b196b40aff2905e90d8bf88ec9f8 Mon Sep 17 00:00:00 2001
From: AkjaHAsLk1IALk0MasH <46046453+AgaSpace@users.noreply.github.com>
Date: Sun, 14 May 2023 12:17:47 +0700
Subject: [PATCH 4/7] Updated the `SetUserGroup` in the commands.
---
TShockAPI/Commands.cs | 6 +++++-
TShockAPI/Rest/RestManager.cs | 3 ++-
2 files changed, 7 insertions(+), 2 deletions(-)
diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs
index 2214f252d..164bda891 100644
--- a/TShockAPI/Commands.cs
+++ b/TShockAPI/Commands.cs
@@ -1176,7 +1176,7 @@ private static void ManageUsers(CommandArgs args)
try
{
- TShock.UserAccounts.SetUserGroup(account, args.Parameters[2]);
+ TShock.UserAccounts.SetUserGroup(args.Player, account, args.Parameters[2]);
TShock.Log.ConsoleInfo(GetString("{0} changed account {1} to group {2}.", args.Player.Name, account.Name, args.Parameters[2]));
args.Player.SendSuccessMessage(GetString("Account {0} has been changed to group {1}.", account.Name, args.Parameters[2]));
@@ -1193,6 +1193,10 @@ private static void ManageUsers(CommandArgs args)
{
args.Player.SendErrorMessage(GetString($"User {account.Name} does not exist."));
}
+ catch (UserGroupUpdateLockedException)
+ {
+ args.Player.SendErrorMessage(GetString("Hook blocked the attempt to change the user group."));
+ }
catch (UserAccountManagerException e)
{
args.Player.SendErrorMessage(GetString($"User {account.Name} could not be added. Check console for details."));
diff --git a/TShockAPI/Rest/RestManager.cs b/TShockAPI/Rest/RestManager.cs
index c41e7767b..0a96b004b 100644
--- a/TShockAPI/Rest/RestManager.cs
+++ b/TShockAPI/Rest/RestManager.cs
@@ -555,7 +555,8 @@ private object UserUpdateV2(RestRequestArgs args)
{
try
{
- TShock.UserAccounts.SetUserGroup(account, group);
+ TShock.UserAccounts.SetUserGroup(new TSRestPlayer(args.TokenData.Username, TShock.Groups.GetGroupByName(args.TokenData.UserGroupName)),
+ account, group);
response.Add("group-response", "Group updated successfully");
}
catch (Exception e)
From 4e85c5ddac099fad4ecfb4ae472854d526729d2a Mon Sep 17 00:00:00 2001
From: AkjaHAsLk1IALk0MasH <46046453+AgaSpace@users.noreply.github.com>
Date: Sun, 14 May 2023 12:19:05 +0700
Subject: [PATCH 5/7] Update changelog.md
---
docs/changelog.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/docs/changelog.md b/docs/changelog.md
index 3f64f3554..ebfcd8952 100644
--- a/docs/changelog.md
+++ b/docs/changelog.md
@@ -78,7 +78,7 @@ Use past tense when adding new entries; sign your name off when you add or chang
* If there is no section called "Upcoming changes" below this line, please add one with `## Upcoming changes` as the first line, and then a bulleted item directly after with the first change. -->
## Upcoming changes
-Your changes could be here!
+* Added a hook `AccountHooks.AccountGroupUpdate`, which is called when you change the user group. (@AgaSpace)
## TShock 5.2
* An additional option `pvpwithnoteam` is added at `PvPMode` to enable PVP with no team. (@CelestialAnarchy, #2617, @ATFGK)
From cc753cf1dac747db6dc613d9c0b7faed9045fdda Mon Sep 17 00:00:00 2001
From: AkjaHAsLk1IALk0MasH <46046453+AgaSpace@users.noreply.github.com>
Date: Tue, 6 Jun 2023 16:00:18 +0700
Subject: [PATCH 6/7] Removed unnecessary abstraction.
---
TShockAPI/Hooks/AccountHooks.cs | 10 ++--------
1 file changed, 2 insertions(+), 8 deletions(-)
diff --git a/TShockAPI/Hooks/AccountHooks.cs b/TShockAPI/Hooks/AccountHooks.cs
index e224b467d..ae9fff244 100644
--- a/TShockAPI/Hooks/AccountHooks.cs
+++ b/TShockAPI/Hooks/AccountHooks.cs
@@ -40,7 +40,7 @@ public AccountCreateEventArgs(UserAccount account)
}
}
- public abstract class AccountGroupUpdateEventArgs : HandledEventArgs
+ public class AccountGroupUpdateEventArgs : HandledEventArgs
{
public string AccountName { get; private set; }
public Group Group { get; set; }
@@ -52,12 +52,6 @@ public AccountGroupUpdateEventArgs(string accountName, Group group)
}
}
- public class AccountGroupUpdateByPluginEventArgs : AccountGroupUpdateEventArgs
- {
- public AccountGroupUpdateByPluginEventArgs(string accountName, Group group) : base(accountName, group)
- {
- }
- }
public class AccountGroupUpdateByPlayerEventArgs : AccountGroupUpdateEventArgs
{
///
@@ -108,7 +102,7 @@ public static bool OnAccountGroupUpdate(UserAccount account, TSPlayer author, re
}
public static bool OnAccountGroupUpdate(UserAccount account, ref Group group)
{
- AccountGroupUpdateEventArgs args = new AccountGroupUpdateByPluginEventArgs(account.Name, group);
+ AccountGroupUpdateEventArgs args = new AccountGroupUpdateEventArgs(account.Name, group);
AccountGroupUpdate?.Invoke(args);
group = args.Group;
From a6666ff21abf1d40133a98eb5dfe2e5e0c6b8c58 Mon Sep 17 00:00:00 2001
From: AkjaHAsLk1IALk0MasH <46046453+AgaSpace@users.noreply.github.com>
Date: Sat, 10 Jun 2023 13:59:38 +0700
Subject: [PATCH 7/7] Updated the message
---
TShockAPI/DB/UserManager.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/TShockAPI/DB/UserManager.cs b/TShockAPI/DB/UserManager.cs
index 6411b289e..6fc50d98d 100644
--- a/TShockAPI/DB/UserManager.cs
+++ b/TShockAPI/DB/UserManager.cs
@@ -670,7 +670,7 @@ public class UserGroupUpdateLockedException : UserAccountManagerException
/// The name of the user who failed to change the group.
/// New UserGroupUpdateLockedException object with a message containing the name of the user account that failed to change the group.
public UserGroupUpdateLockedException(string name) :
- base(GetString($"The user {name} group could not be updated"))
+ base(GetString($"Unable to update group of user {name}."))
{
}
}