feat: add channel-specific permcheck
This commit is contained in:
parent
9914dd719c
commit
d005358acc
@ -39,6 +39,17 @@ namespace PluralKit.Bot
|
|||||||
_matcher = matcher;
|
_matcher = matcher;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private readonly PermissionSet[] requiredPermissions = new[]
|
||||||
|
{
|
||||||
|
PermissionSet.ViewChannel,
|
||||||
|
PermissionSet.SendMessages,
|
||||||
|
PermissionSet.AddReactions,
|
||||||
|
PermissionSet.AttachFiles,
|
||||||
|
PermissionSet.EmbedLinks,
|
||||||
|
PermissionSet.ManageMessages,
|
||||||
|
PermissionSet.ManageWebhooks
|
||||||
|
};
|
||||||
|
|
||||||
public async Task PermCheckGuild(Context ctx)
|
public async Task PermCheckGuild(Context ctx)
|
||||||
{
|
{
|
||||||
Guild guild;
|
Guild guild;
|
||||||
@ -70,17 +81,6 @@ namespace PluralKit.Bot
|
|||||||
throw Errors.GuildNotFound(guildId);
|
throw Errors.GuildNotFound(guildId);
|
||||||
}
|
}
|
||||||
|
|
||||||
var requiredPermissions = new[]
|
|
||||||
{
|
|
||||||
PermissionSet.ViewChannel,
|
|
||||||
PermissionSet.SendMessages,
|
|
||||||
PermissionSet.AddReactions,
|
|
||||||
PermissionSet.AttachFiles,
|
|
||||||
PermissionSet.EmbedLinks,
|
|
||||||
PermissionSet.ManageMessages,
|
|
||||||
PermissionSet.ManageWebhooks
|
|
||||||
};
|
|
||||||
|
|
||||||
// Loop through every channel and group them by sets of permissions missing
|
// Loop through every channel and group them by sets of permissions missing
|
||||||
var permissionsMissing = new Dictionary<ulong, List<Channel>>();
|
var permissionsMissing = new Dictionary<ulong, List<Channel>>();
|
||||||
var hiddenChannels = false;
|
var hiddenChannels = false;
|
||||||
@ -163,6 +163,66 @@ namespace PluralKit.Bot
|
|||||||
await ctx.Reply(embed: eb.Build());
|
await ctx.Reply(embed: eb.Build());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task PermCheckChannel(Context ctx)
|
||||||
|
{
|
||||||
|
var error = "";
|
||||||
|
|
||||||
|
var channel = await ctx.MatchChannel();
|
||||||
|
if (channel == null || channel.GuildId == null)
|
||||||
|
throw new PKError(error);
|
||||||
|
|
||||||
|
var guild = _cache.GetGuild(channel.GuildId.Value);
|
||||||
|
if (guild == null)
|
||||||
|
throw new PKError(error);
|
||||||
|
|
||||||
|
var guildMember = await _rest.GetGuildMember(channel.GuildId.Value, ctx.Author.Id);
|
||||||
|
if (guildMember == null)
|
||||||
|
throw new PKError(error);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
var botPermissions = _bot.PermissionsIn(channel.Id);
|
||||||
|
var webhookPermissions = _cache.EveryonePermissions(channel);
|
||||||
|
var userPermissions = PermissionExtensions.PermissionsFor(guild, channel, ctx.Author.Id, guildMember);
|
||||||
|
|
||||||
|
if ((userPermissions & PermissionSet.ViewChannel) == 0)
|
||||||
|
throw new PKError(error);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// We use a bitfield so we can set individual permission bits
|
||||||
|
ulong missingPermissions = 0;
|
||||||
|
|
||||||
|
foreach (var requiredPermission in requiredPermissions)
|
||||||
|
if ((botPermissions & requiredPermission) == 0)
|
||||||
|
missingPermissions |= (ulong)requiredPermission;
|
||||||
|
|
||||||
|
if ((webhookPermissions & PermissionSet.UseExternalEmojis) == 0)
|
||||||
|
missingPermissions |= (ulong)PermissionSet.UseExternalEmojis;
|
||||||
|
|
||||||
|
// Generate the output embed
|
||||||
|
var eb = new EmbedBuilder()
|
||||||
|
.Title($"Permission check for **{channel.Name}**");
|
||||||
|
|
||||||
|
if (missingPermissions == 0)
|
||||||
|
eb.Description("No issues found, channel is proxyable :)");
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var missing = "";
|
||||||
|
|
||||||
|
foreach (var permission in requiredPermissions)
|
||||||
|
if (((ulong)permission & missingPermissions) == (ulong)permission)
|
||||||
|
missing += $"\n- **{permission.ToPermissionString()}**";
|
||||||
|
|
||||||
|
if (((ulong)PermissionSet.UseExternalEmojis & missingPermissions) == (ulong)PermissionSet.UseExternalEmojis)
|
||||||
|
missing += $"\n- **{PermissionSet.UseExternalEmojis.ToPermissionString()}**";
|
||||||
|
|
||||||
|
eb.Description($"Missing permissions:\n{missing}");
|
||||||
|
}
|
||||||
|
|
||||||
|
await ctx.Reply(embed: eb.Build());
|
||||||
|
}
|
||||||
|
|
||||||
public async Task MessageProxyCheck(Context ctx)
|
public async Task MessageProxyCheck(Context ctx)
|
||||||
{
|
{
|
||||||
if (!ctx.HasNext() && ctx.Message.MessageReference == null)
|
if (!ctx.HasNext() && ctx.Message.MessageReference == null)
|
||||||
|
@ -244,7 +244,12 @@ namespace PluralKit.Bot
|
|||||||
var availableCommandsStr = "Available debug targets: `permissions`, `proxying`";
|
var availableCommandsStr = "Available debug targets: `permissions`, `proxying`";
|
||||||
|
|
||||||
if (ctx.Match("permissions", "perms", "permcheck"))
|
if (ctx.Match("permissions", "perms", "permcheck"))
|
||||||
await ctx.Execute<Checks>(PermCheck, m => m.PermCheckGuild(ctx));
|
if (ctx.Match("channel", "ch"))
|
||||||
|
await ctx.Execute<Checks>(PermCheck, m => m.PermCheckChannel(ctx));
|
||||||
|
else
|
||||||
|
await ctx.Execute<Checks>(PermCheck, m => m.PermCheckGuild(ctx));
|
||||||
|
else if (ctx.Match("channel"))
|
||||||
|
await ctx.Execute<Checks>(PermCheck, m => m.PermCheckChannel(ctx));
|
||||||
else if (ctx.Match("proxy", "proxying", "proxycheck"))
|
else if (ctx.Match("proxy", "proxying", "proxycheck"))
|
||||||
await ctx.Execute<Checks>(ProxyCheck, m => m.MessageProxyCheck(ctx));
|
await ctx.Execute<Checks>(ProxyCheck, m => m.MessageProxyCheck(ctx));
|
||||||
else if (!ctx.HasNext())
|
else if (!ctx.HasNext())
|
||||||
|
Loading…
Reference in New Issue
Block a user