From abdc7a0ab15d32676c00847b0057a749ecf16bd4 Mon Sep 17 00:00:00 2001 From: Ben Date: Thu, 17 Apr 2025 15:51:20 +0200 Subject: [PATCH] block and lock for loading of discord users --- Tools/BiblioTech/Rewards/RoleDriver.cs | 8 ++++---- Tools/BiblioTech/Rewards/RoleModifyContext.cs | 20 ++++++++++++------- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/Tools/BiblioTech/Rewards/RoleDriver.cs b/Tools/BiblioTech/Rewards/RoleDriver.cs index 41b0e44c..1cc9f3f2 100644 --- a/Tools/BiblioTech/Rewards/RoleDriver.cs +++ b/Tools/BiblioTech/Rewards/RoleDriver.cs @@ -25,7 +25,7 @@ namespace BiblioTech.Rewards public async Task RunRoleGiver(Func action) { - var context = await OpenRoleModifyContext(); + var context = OpenRoleModifyContext(); var mapper = new RoleMapper(context); await action(mapper); } @@ -37,7 +37,7 @@ namespace BiblioTech.Rewards public async Task IterateUsersWithRoles(Func onUserWithRole, Func whenDone, params ulong[] rolesToIterate) { - var context = await OpenRoleModifyContext(); + var context = OpenRoleModifyContext(); var mapper = new RoleMapper(context); foreach (var user in context.Users) { @@ -52,10 +52,10 @@ namespace BiblioTech.Rewards await whenDone(mapper); } - private async Task OpenRoleModifyContext() + private RoleModifyContext OpenRoleModifyContext() { var context = new RoleModifyContext(GetGuild(), userRepo, log, rewardsChannel); - await context.Initialize(); + context.Initialize(); return context; } diff --git a/Tools/BiblioTech/Rewards/RoleModifyContext.cs b/Tools/BiblioTech/Rewards/RoleModifyContext.cs index 9b38dcea..6fd4fb48 100644 --- a/Tools/BiblioTech/Rewards/RoleModifyContext.cs +++ b/Tools/BiblioTech/Rewards/RoleModifyContext.cs @@ -11,6 +11,7 @@ namespace BiblioTech.Rewards private Dictionary users = new(); private Dictionary roles = new(); private DateTime lastLoad = DateTime.MinValue; + private readonly object _lock = new object(); private readonly SocketGuild guild; private readonly UserRepo userRepo; @@ -25,15 +26,20 @@ namespace BiblioTech.Rewards this.rewardsChannel = rewardsChannel; } - public async Task Initialize() + public void Initialize() { - var span = DateTime.UtcNow - lastLoad; - if (span > TimeSpan.FromMinutes(10)) + lock (_lock) { - lastLoad = DateTime.UtcNow; - log.Log("Loading all users and roles..."); - this.users = await LoadAllUsers(guild); - this.roles = LoadAllRoles(guild); + var span = DateTime.UtcNow - lastLoad; + if (span > TimeSpan.FromMinutes(10)) + { + lastLoad = DateTime.UtcNow; + log.Log("Loading all users and roles..."); + var task = LoadAllUsers(guild); + task.Wait(); + this.users = task.Result; + this.roles = LoadAllRoles(guild); + } } }