Clean up orphaned non-global admins on the expire timer

This commit is contained in:
Ravid-A 2026-05-31 17:47:13 +03:00
parent e028441b56
commit fd94ac8d2b
5 changed files with 29 additions and 1 deletions

View file

@ -30,6 +30,7 @@ public interface IDatabaseProvider
string GetAddGroupServerQuery();
string GetDeleteGroupQuery();
string GetDeleteOldAdminsQuery();
string GetDeleteOrphanedAdminsQuery();
// BanManager
string GetAddBanQuery();

View file

@ -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()
{

View file

@ -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

View file

@ -677,4 +677,24 @@ public class PermissionManager(IDatabaseProvider? databaseProvider)
CS2_SimpleAdmin._logger?.LogCritical("Unable to remove expired admins");
}
}
/// <summary>
/// Deletes orphaned admins that are not global and have no server assignments left.
/// </summary>
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");
}
}
}

View file

@ -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);