mirror of
https://github.com/logos-storage/logos-storage-nim-cs-dist-tests.git
synced 2026-01-09 00:43:11 +00:00
119 lines
3.8 KiB
C#
119 lines
3.8 KiB
C#
using Discord;
|
|
using Discord.WebSocket;
|
|
using DiscordRewards;
|
|
using k8s.KubeConfigModels;
|
|
using Logging;
|
|
using Newtonsoft.Json;
|
|
using Utils;
|
|
|
|
namespace BiblioTech.Rewards
|
|
{
|
|
public class RoleDriver : IDiscordRoleDriver
|
|
{
|
|
private readonly DiscordSocketClient client;
|
|
private readonly UserRepo userRepo;
|
|
private readonly ILog log;
|
|
private readonly SocketTextChannel? rewardsChannel;
|
|
|
|
public RoleDriver(DiscordSocketClient client, UserRepo userRepo, ILog log, SocketTextChannel? rewardsChannel)
|
|
{
|
|
this.client = client;
|
|
this.userRepo = userRepo;
|
|
this.log = log;
|
|
this.rewardsChannel = rewardsChannel;
|
|
}
|
|
|
|
public async Task RunRoleGiver(Func<IRoleGiver, Task> action)
|
|
{
|
|
var context = OpenRoleModifyContext();
|
|
var mapper = new RoleMapper(context);
|
|
await action(mapper);
|
|
}
|
|
|
|
public async Task IterateUsersWithRoles(Func<IRoleGiver, IUser, ulong, Task> onUserWithRole, params ulong[] rolesToIterate)
|
|
{
|
|
await IterateUsersWithRoles(onUserWithRole, g => Task.CompletedTask, rolesToIterate);
|
|
}
|
|
|
|
public async Task IterateUsersWithRoles(Func<IRoleGiver, IUser, ulong, Task> onUserWithRole, Func<IRoleGiver, Task> whenDone, params ulong[] rolesToIterate)
|
|
{
|
|
var context = OpenRoleModifyContext();
|
|
var mapper = new RoleMapper(context);
|
|
foreach (var user in context.Users)
|
|
{
|
|
foreach (var role in rolesToIterate)
|
|
{
|
|
if (user.RoleIds.Contains(role))
|
|
{
|
|
await onUserWithRole(mapper, user, role);
|
|
}
|
|
}
|
|
}
|
|
await whenDone(mapper);
|
|
}
|
|
|
|
private RoleModifyContext OpenRoleModifyContext()
|
|
{
|
|
var context = new RoleModifyContext(GetGuild(), userRepo, log, rewardsChannel);
|
|
context.Initialize();
|
|
return context;
|
|
}
|
|
|
|
private SocketGuild GetGuild()
|
|
{
|
|
var guild = client.Guilds.SingleOrDefault(g => g.Id == Program.Config.ServerId);
|
|
if (guild == null)
|
|
{
|
|
throw new Exception($"Unable to find guild by id: '{Program.Config.ServerId}'. " +
|
|
$"Known guilds: [{string.Join(",", client.Guilds.Select(g => g.Name + " (" + g.Id + ")"))}]");
|
|
}
|
|
return guild;
|
|
}
|
|
}
|
|
|
|
public class RoleMapper : IRoleGiver
|
|
{
|
|
private readonly RoleModifyContext context;
|
|
|
|
public RoleMapper(RoleModifyContext context)
|
|
{
|
|
this.context = context;
|
|
}
|
|
|
|
public async Task GiveActiveClient(ulong userId)
|
|
{
|
|
await context.GiveRole(userId, Program.Config.ActiveClientRoleId);
|
|
}
|
|
|
|
public async Task GiveActiveHost(ulong userId)
|
|
{
|
|
await context.GiveRole(userId, Program.Config.ActiveHostRoleId);
|
|
}
|
|
|
|
public async Task GiveActiveP2pParticipant(ulong userId)
|
|
{
|
|
await context.GiveRole(userId, Program.Config.ActiveP2pParticipantRoleId);
|
|
}
|
|
|
|
public async Task RemoveActiveP2pParticipant(ulong userId)
|
|
{
|
|
await context.RemoveRole(userId, Program.Config.ActiveP2pParticipantRoleId);
|
|
}
|
|
|
|
public async Task GiveAltruisticRole(ulong userId)
|
|
{
|
|
await context.GiveRole(userId, Program.Config.AltruisticRoleId);
|
|
}
|
|
|
|
public async Task RemoveActiveClient(ulong userId)
|
|
{
|
|
await context.RemoveRole(userId, Program.Config.ActiveClientRoleId);
|
|
}
|
|
|
|
public async Task RemoveActiveHost(ulong userId)
|
|
{
|
|
await context.RemoveRole(userId, Program.Config.ActiveHostRoleId);
|
|
}
|
|
}
|
|
}
|