PluralKit/PluralKit.Bot/CommandSystem/ContextChecks.cs

54 lines
1.8 KiB
C#

using System.Threading.Channels;
using DSharpPlus;
using PluralKit.Core;
namespace PluralKit.Bot
{
public static class ContextChecks
{
public static Context CheckGuildContext(this Context ctx)
{
if (ctx.Channel.Guild != null) return ctx;
throw new PKError("This command can not be run in a DM.");
}
public static Context CheckSystemPrivacy(this Context ctx, PKSystem target, PrivacyLevel level)
{
if (level.CanAccess(ctx.LookupContextFor(target))) return ctx;
throw new PKError("You do not have permission to access this information.");
}
public static Context CheckOwnMember(this Context ctx, PKMember member)
{
if (member.System != ctx.System?.Id)
throw Errors.NotOwnMemberError;
return ctx;
}
public static Context CheckSystem(this Context ctx)
{
if (ctx.System == null)
throw Errors.NoSystemError;
return ctx;
}
public static Context CheckNoSystem(this Context ctx)
{
if (ctx.System != null)
throw Errors.ExistingSystemError;
return ctx;
}
public static Context CheckAuthorPermission(this Context ctx, Permissions neededPerms, string permissionName)
{
// TODO: can we always assume Author is a DiscordMember? I would think so, given they always come from a
// message received event...
var hasPerms = ctx.Channel.PermissionsInSync(ctx.Author);
if ((hasPerms & neededPerms) != neededPerms)
throw new PKError($"You must have the \"{permissionName}\" permission in this server to use this command.");
return ctx;
}
}
}