Files
TorchPlugins/LuckPerms.Torch.Discord/Managers/LuckPermsCalculatorManager.cs
2023-12-17 02:20:50 +07:00

94 lines
3.0 KiB
C#

using LuckPerms.Torch.Api.Managers;
using LuckPerms.Torch.Discord.Abstractions;
using LuckPerms.Torch.Utils.Extensions;
using net.dv8tion.jda.api.entities;
using net.luckperms.api.context;
using Torch.API;
using Torch.API.Managers;
using Torch.Managers;
namespace LuckPerms.Torch.Discord.Managers;
public class LuckPermsCalculatorManager : IManager, ContextCalculator
{
private const string ContextLinked = "discordsrv:linked";
private const string ContextBoosting = "discordsrv:boosting";
private const string ContextRole = "discordsrv:role";
private const string ContextRoleId = "discordsrv:role_id";
private const string ContextServerId = "discordsrv:server_id";
[Manager.Dependency]
private readonly DiscordManager _discordManager = null!;
[Manager.Dependency]
private readonly ILinkManager _linkManager = null!;
[Manager.Dependency]
private readonly ILuckPermsPlatformManager _platformManager = null!;
public void Attach()
{
_platformManager.Api.getContextManager().registerCalculator(this);
}
public void Detach()
{
_platformManager.Api.getContextManager().unregisterCalculator(this);
}
public void calculate(object obj, ContextConsumer consumer)
{
var player = (IPlayer)obj;
var discordId = _linkManager.ResolveDiscordId(player);
consumer.accept(ContextLinked, discordId.HasValue ? "true" : "false");
if (!discordId.HasValue)
return;
var member = _discordManager.Client.getGuildById(_discordManager.MainGuildId)
.getMemberById(discordId.Value);
consumer.accept(ContextBoosting, member?.isBoosting() is true ? "true" : "false");
if (member is null)
return;
consumer.accept(ContextServerId, member.getGuild().getId());
foreach (var role in member.getRoles().iterator().AsEnumerable<Role>())
{
if (string.IsNullOrEmpty(role.getName()))
continue;
consumer.accept(ContextRoleId, role.getId());
consumer.accept(ContextRole, role.getName());
}
}
public ContextSet estimatePotentialContexts()
{
var builder = ImmutableContextSet.builder();
builder.add(ContextLinked, "true");
builder.add(ContextLinked, "false");
builder.add(ContextBoosting, "true");
builder.add(ContextBoosting, "false");
foreach (var role in _discordManager.Client.getGuildById(_discordManager.MainGuildId).getRoles()
.iterator().AsEnumerable<Role>())
{
if (string.IsNullOrEmpty(role.getName()))
continue;
builder.add(ContextRoleId, role.getId());
builder.add(ContextRole, role.getName());
}
builder.add(ContextServerId, _discordManager.MainGuildId.ToString());
return builder.build();
}
}