diff --git a/CS2-SimpleAdmin/Database/IDatabaseProvider.cs b/CS2-SimpleAdmin/Database/IDatabaseProvider.cs index 2517ccc..c847245 100644 --- a/CS2-SimpleAdmin/Database/IDatabaseProvider.cs +++ b/CS2-SimpleAdmin/Database/IDatabaseProvider.cs @@ -30,6 +30,7 @@ public interface IDatabaseProvider string GetAddGroupServerQuery(); string GetDeleteGroupQuery(); string GetDeleteOldAdminsQuery(); + string GetDeleteOrphanedAdminsQuery(); // BanManager string GetAddBanQuery(); diff --git a/CS2-SimpleAdmin/Database/MysqlDatabaseProvider.cs b/CS2-SimpleAdmin/Database/MysqlDatabaseProvider.cs index de0bdee..6edaa36 100644 --- a/CS2-SimpleAdmin/Database/MysqlDatabaseProvider.cs +++ b/CS2-SimpleAdmin/Database/MysqlDatabaseProvider.cs @@ -187,6 +187,9 @@ public class MySqlDatabaseProvider(string connectionString) : IDatabaseProvider public string GetDeleteOldAdminsQuery() => "DELETE FROM sa_admins WHERE ends IS NOT NULL AND ends <= @CurrentTime;"; + + public string GetDeleteOrphanedAdminsQuery() => + "DELETE FROM sa_admins WHERE `global` = 0 AND id NOT IN (SELECT admin_id FROM sa_admins_servers);"; public string GetAddBanQuery() { diff --git a/CS2-SimpleAdmin/Database/SqliteDatabaseProvider.cs b/CS2-SimpleAdmin/Database/SqliteDatabaseProvider.cs index fd0bd47..b226451 100644 --- a/CS2-SimpleAdmin/Database/SqliteDatabaseProvider.cs +++ b/CS2-SimpleAdmin/Database/SqliteDatabaseProvider.cs @@ -240,6 +240,9 @@ public class SqliteDatabaseProvider(string filePath) : IDatabaseProvider public string GetDeleteOldAdminsQuery() => "DELETE FROM sa_admins WHERE ends IS NOT NULL AND ends <= @CurrentTime;"; + + public string GetDeleteOrphanedAdminsQuery() => + "DELETE FROM sa_admins WHERE `global` = 0 AND id NOT IN (SELECT admin_id FROM sa_admins_servers);"; public string GetAddMuteQuery(bool includePlayerName) => includePlayerName diff --git a/CS2-SimpleAdmin/Managers/PermissionManager.cs b/CS2-SimpleAdmin/Managers/PermissionManager.cs index ce8c390..34a26ba 100644 --- a/CS2-SimpleAdmin/Managers/PermissionManager.cs +++ b/CS2-SimpleAdmin/Managers/PermissionManager.cs @@ -677,4 +677,24 @@ public class PermissionManager(IDatabaseProvider? databaseProvider) CS2_SimpleAdmin._logger?.LogCritical("Unable to remove expired admins"); } } + + /// + /// Deletes orphaned admins that are not global and have no server assignments left. + /// + public async Task DeleteOrphanedAdmins() + { + if (databaseProvider == null) return; + + try + { + await using var connection = await databaseProvider.CreateConnectionAsync(); + + var sql = databaseProvider.GetDeleteOrphanedAdminsQuery(); + await connection.ExecuteAsync(sql); + } + catch (Exception) + { + CS2_SimpleAdmin._logger?.LogCritical("Unable to remove orphaned admins"); + } + } } \ No newline at end of file diff --git a/CS2-SimpleAdmin/Managers/PlayerManager.cs b/CS2-SimpleAdmin/Managers/PlayerManager.cs index 2f08393..c3132b1 100644 --- a/CS2-SimpleAdmin/Managers/PlayerManager.cs +++ b/CS2-SimpleAdmin/Managers/PlayerManager.cs @@ -306,7 +306,8 @@ internal class PlayerManager pluginInstance.MuteManager.ExpireOldMutes(), pluginInstance.WarnManager.ExpireOldWarns(), pluginInstance.CacheManager?.RefreshCacheAsync() ?? Task.CompletedTask, - pluginInstance.PermissionManager.DeleteOldAdmins() + pluginInstance.PermissionManager.DeleteOldAdmins(), + pluginInstance.PermissionManager.DeleteOrphanedAdmins() }; await Task.WhenAll(expireTasks);