Added bot_perm support to medusa system

This commit is contained in:
Kwoth
2023-01-15 04:07:04 +01:00
parent e71708f5e8
commit 737bbb8ec1
5 changed files with 55 additions and 13 deletions

View File

@@ -0,0 +1,10 @@
namespace Nadeko.Snake;
/// <summary>
/// Used as a marker class for bot_perm and user_perm Attributes
/// Has no functionality.
/// </summary>
public abstract class MedusaPermAttribute : Attribute
{
}

View File

@@ -0,0 +1,23 @@
using Discord;
namespace Nadeko.Snake;
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public sealed class bot_permAttribute : MedusaPermAttribute
{
public GuildPermission? GuildPerm { get; }
public ChannelPermission? ChannelPerm { get; }
public bot_permAttribute(GuildPermission perm)
{
GuildPerm = perm;
ChannelPerm = null;
}
public bot_permAttribute(ChannelPermission perm)
{
ChannelPerm = perm;
GuildPerm = null;
}
}

View File

@@ -3,12 +3,11 @@
namespace Nadeko.Snake; namespace Nadeko.Snake;
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public sealed class user_permAttribute : Attribute public sealed class user_permAttribute : MedusaPermAttribute
{ {
public GuildPermission? GuildPerm { get; } public GuildPermission? GuildPerm { get; }
public ChannelPermission? ChannelPerm { get; } public ChannelPermission? ChannelPerm { get; }
public user_permAttribute(GuildPermission perm) public user_permAttribute(GuildPermission perm)
{ {
GuildPerm = perm; GuildPerm = perm;
@@ -21,4 +20,3 @@ public sealed class user_permAttribute : Attribute
GuildPerm = null; GuildPerm = null;
} }
} }

View File

@@ -418,12 +418,22 @@ public sealed class MedusaLoaderService : IMedusaLoaderService, IReadyExecutor,
foreach (var f in cmd.Filters) foreach (var f in cmd.Filters)
cb.AddPrecondition(new FilterAdapter(f, strings)); cb.AddPrecondition(new FilterAdapter(f, strings));
foreach (var up in cmd.UserPerms) foreach (var ubp in cmd.UserAndBotPerms)
{ {
if (up.GuildPerm is { } gp) if (ubp is user_permAttribute up)
cb.AddPrecondition(new UserPermAttribute(gp)); {
else if (up.ChannelPerm is { } cp) if (up.GuildPerm is { } gp)
cb.AddPrecondition(new UserPermAttribute(cp)); cb.AddPrecondition(new UserPermAttribute(gp));
else if (up.ChannelPerm is { } cp)
cb.AddPrecondition(new UserPermAttribute(cp));
}
else if (ubp is bot_permAttribute bp)
{
if (bp.GuildPerm is { } gp)
cb.AddPrecondition(new BotPermAttribute(gp));
else if (bp.ChannelPerm is { } cp)
cb.AddPrecondition(new BotPermAttribute(cp));
}
} }
cb.WithPriority(cmd.Priority); cb.WithPriority(cmd.Priority);
@@ -768,7 +778,8 @@ public sealed class MedusaLoaderService : IMedusaLoaderService, IReadyExecutor,
foreach (var method in methodInfos) foreach (var method in methodInfos)
{ {
var filters = method.GetCustomAttributes<FilterAttribute>(true).ToArray(); var filters = method.GetCustomAttributes<FilterAttribute>(true).ToArray();
var userPerms = method.GetCustomAttributes<user_permAttribute>(false).ToArray(); var userAndBotPerms = method.GetCustomAttributes<MedusaPermAttribute>(true)
.ToArray();
var prio = method.GetCustomAttribute<prioAttribute>(true)?.Priority ?? 0; var prio = method.GetCustomAttribute<prioAttribute>(true)?.Priority ?? 0;
var paramInfos = method.GetParameters(); var paramInfos = method.GetParameters();
@@ -856,7 +867,7 @@ public sealed class MedusaLoaderService : IMedusaLoaderService, IReadyExecutor,
method, method,
instance, instance,
filters, filters,
userPerms, userAndBotPerms,
cmdContext, cmdContext,
diParams, diParams,
cmdParams, cmdParams,

View File

@@ -11,7 +11,7 @@ public sealed class SnekCommandData
MethodInfo methodInfo, MethodInfo methodInfo,
Snek module, Snek module,
FilterAttribute[] filters, FilterAttribute[] filters,
user_permAttribute[] userPerms, MedusaPermAttribute[] userAndBotPerms,
CommandContextType contextType, CommandContextType contextType,
IReadOnlyList<Type> injectedParams, IReadOnlyList<Type> injectedParams,
IReadOnlyList<ParamData> parameters, IReadOnlyList<ParamData> parameters,
@@ -22,7 +22,7 @@ public sealed class SnekCommandData
MethodInfo = methodInfo; MethodInfo = methodInfo;
Module = module; Module = module;
Filters = filters; Filters = filters;
UserPerms = userPerms; UserAndBotPerms = userAndBotPerms;
ContextType = contextType; ContextType = contextType;
InjectedParams = injectedParams; InjectedParams = injectedParams;
Parameters = parameters; Parameters = parameters;
@@ -30,7 +30,7 @@ public sealed class SnekCommandData
OptionalStrings = strings; OptionalStrings = strings;
} }
public user_permAttribute[] UserPerms { get; set; } public MedusaPermAttribute[] UserAndBotPerms { get; set; }
public CommandStrings OptionalStrings { get; set; } public CommandStrings OptionalStrings { get; set; }