Skip to content

Commit

Permalink
Reimplement message parsing as a toggleable feature (#338)
Browse files Browse the repository at this point in the history
#!components: grid-bot, grid-bot-recovery
#!deployable-components: grid-bot

* Initial whitespace changes

* #337: LuaVM changes

~ Drop all type annotations to support #337
~ Update branches to properly handle LuaVMEnabledForAdmins

* #336: Script Logger

~ Reorganize code to support both interaction and command context
~ Add Discord.Net.Commands dependency to Shared.Utility

* Update BacktraceUtility

No longer log trace back, as this feature is not needed.

* Update SocketInteractionExtensions.cs

Add method to get the channel, and ingest it via GetChannelAsString

* #336: Extension methods

~ Create IUserMessageExtensions to add a method to reply with a file.
~ Create ModuleBaseExtensions to add functionality to reply with reference, reply with file, and reply with multiple files easily within module base.

* Update CommandsSettings.cs

~ EnableLockdownCommands: Determines if lockdown commands are enabled, if false then any commands marked with LockdownAttribute will just be passed straight on to the next precondition attribute.
~ LockdownGuildId: The guild permitted to respond to lockdown commands.
~ TextCommandsDisabledWarningText: Warning text to respond with when text commands are disabled, otherwise it will default to a generic message.
~ EnableTextCommands: Determines if text commands should be enabled.
~ ShouldWarnWhenCommandsAreDisabled: Determines if a warning should be responded with when the user tries to use a text command.

* Update ScriptLogger.cs

Drop dependency on client directly and use the context instead.

* Update OnSlashCommandExecuted.cs

~ Drop dependency on discord client directly and use the context client instead.
~ Catch-all on Discord.Net.HttpException

* #336: OnCommandExecutedEvent

~ Text-commands version of on interaction executed

* Update OnLogMessage.cs

Do not handle InteractionException or CommandException as OnInteractionExecuted and OnCommandExecuted events handles it themselves.

* #336: OnMessage

~ Add references to CommandService, DiscordClient and ServiceProvider
~ Update _allowedCommandRegex to support underscores, as well as match only on one line to improve performance.
~ Add hashset to store all command aliases to filter out responses and calls to commands service
~ Update all metrics to remove the idea of deprecation against text commands.
~ Add metric for command processing time.
~ Add initialization method called within on ready event finished that will update the command aliases hashset with the currently registered modules.
~ Move around logger instantiation after command alias validation to introduce better performance when commands are not found.
~ Drop log on the users ingesting "previous phase commands"
~ Add branches to check if commands are enabled or disabled, debating on whether or not to put this before maintenance checks.
~ Call on commands service.

* Update OnInteraction.cs

~ Drop branch out of interaction service execution to a different thread and just run within the current thread (report back later when it causes problems)

* #336: Update Runner.cs

~ Add command service to the container.
~ Add on command executed event.

* #336: OnReady

~ Add references to commands service and on command executed event.
~ Add text commands modules.
~ Initialize the on message event after modules are added.

* #336: Lock Down Attribute

An attribute only allows the command to be executed within the DMs of users within the specified bot role, or within the specified guild (if configured).

* #336: RequireBotRoleAttribute

Drop the interaction one for the commands one

* #336: Private Modules

Move all private modules to text commands to help lock them down to specific guilds etc so that they don't flood out command lists.

* #336: Modules

Port slash commands to text commands.

* Local Testing: Noop Job Manager

Implement a NOOP job manager to allow local debugging for users who are not on infra networks, or do not have software tools available to run grid servers.

* Administration: Bot roles

~ Move around the bot role enum to Shared.Utility.
~ Add a method in admin utility to wrap the individual methods to detect if users are owners, admins or privilaged by using the bot role enum.

* Account for change to BotRole enum.

Update RequireCommandBotRoleAttribute, ClientSettings and Maintenance modules to account for the movement of the enum to Shared.Utility.

* #336: Help Command

Add the help command for text based commands.
This will cache the embeds for each indivual command on the first usage of the command.

* Rewrap on interaction + command service calls

Apparently this will cause thread locks.

* Update on command and interaction executed.

Change case for CommandException

* Bump all mfdlabs packages

LTS changes, all versions are in sync now to better guage future changes

* Reflect package upgrades

All loggers now take in a function getter for the log level instead of hard coding the log level. Trace no longer exists and has been changed to Verbose

* #336: Text commands clean ups

~ Rename references of interactions to commands.
Drop need for summary attribute on command arguments as it is unused within the stack.
~ Clean up constructors of some handlers removing uneeded arguments.

* #336: Settings Text command.

Settings.cs:
~ This command allows you to:
    1. Get environment information about the current application configuration.
    2. List all available settings provider names.
    3. List all values within a settings provider (cached, can optionally be refreshed just before fetch) -- For now it only functions in Vault-based environments.
    4. Get the value of a specific setting in a provider, supported on both Vault and Env var based environments.
    5. Support for setting a specific setting value in a provider, for now only supported by Vault providers as base class is only Vault and the base class does not fall back to EnvVar provider when Vault refresh is not enabled within set commands.
    6. Support for refreshing all registered auto refresh providers immediately, or in turn refreshing a specific provider (will possibly refresh twice if the refresh thread hits is around the same time)

* #336: Minor fix with Help command

Correctly fetch the required permission attribute

* Update recovery to reflect logger changes

* Update recovery log message adaptor

* #336: Settings Command List

Account for the fact that cached values is a dictionary of strings and JsonElements, 1.1.0 of Configuration should address this issue and it will be removed in a future release

* Update Help.cs

Signed-off-by: Nikita Petko <petko@vmminfra.net>

* Update ClientSettings.cs

Signed-off-by: Nikita Petko <petko@vmminfra.net>

* Update OnLogMessage.cs

Signed-off-by: Nikita Petko <petko@vmminfra.net>

* Update OnLogMessage.cs

Signed-off-by: Nikita Petko <petko@vmminfra.net>

* Update ScriptLogger.cs

Signed-off-by: Nikita Petko <petko@vmminfra.net>

* Update IScriptLogger.cs

Signed-off-by: Nikita Petko <petko@vmminfra.net>

---------

Signed-off-by: Nikita Petko <petko@vmminfra.net>
  • Loading branch information
jf-06 authored Oct 9, 2024
1 parent d8bf48d commit e776fd5
Show file tree
Hide file tree
Showing 135 changed files with 2,673 additions and 742 deletions.
Empty file modified .editorconfig
100644 → 100755
Empty file.
Empty file modified .gitattributes
100644 → 100755
Empty file.
Empty file modified .github/ISSUE_TEMPLATE/blacklist_appeal.yml
100644 → 100755
Empty file.
Empty file modified .github/ISSUE_TEMPLATE/bug_report.yml
100644 → 100755
Empty file.
Empty file modified .github/ISSUE_TEMPLATE/config.yml
100644 → 100755
Empty file.
Empty file modified .github/ISSUE_TEMPLATE/feature_request.yml
100644 → 100755
Empty file.
Empty file modified .github/ISSUE_TEMPLATE/security_vulnerabilty.yml
100644 → 100755
Empty file.
Empty file modified .github/workflows/build.yml
100644 → 100755
Empty file.
Empty file modified .github/workflows/deploy.yml
100644 → 100755
Empty file.
Empty file modified .github/workflows/docs.yml
100644 → 100755
Empty file.
Empty file modified .gitignore
100644 → 100755
Empty file.
Empty file modified .gitmodules
100644 → 100755
Empty file.
Empty file modified CODEOWNERS
100644 → 100755
Empty file.
Empty file modified CONTRIBUTING.md
100644 → 100755
Empty file.
Empty file modified LICENSE
100644 → 100755
Empty file.
Empty file modified README.md
100644 → 100755
Empty file.
Empty file modified SECURITY.md
100644 → 100755
Empty file.
Empty file modified docs/CNAME
100644 → 100755
Empty file.
Empty file modified docs/assets/logo.svg
100644 → 100755
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Empty file modified docs/assets/theme.css
100644 → 100755
Empty file.
Empty file modified docs/index.md
100644 → 100755
Empty file.
Empty file modified docs/legal/index.md
100644 → 100755
Empty file.
Empty file modified docs/legal/privacy-policy.md
100644 → 100755
Empty file.
Empty file modified docs/legal/tos.md
100644 → 100755
Empty file.
Empty file modified docs/overrides/assets/stylesheets/main.css
100644 → 100755
Empty file.
Empty file modified docs/overrides/main.html
100644 → 100755
Empty file.
Empty file modified docs/request-data-deletion.md
100644 → 100755
Empty file.
Empty file modified mkdocs.yml
100644 → 100755
Empty file.
Empty file modified proto/grid_bot.proto
100644 → 100755
Empty file.
Empty file modified scripts/clean.sh
100644 → 100755
Empty file.
Empty file modified services/Directory.Build.props
100644 → 100755
Empty file.
Empty file modified services/Directory.Build.targets
100644 → 100755
Empty file.
Empty file modified services/grid-bot/.component.yaml
100644 → 100755
Empty file.
Empty file modified services/grid-bot/.dockerignore
100644 → 100755
Empty file.
Empty file modified services/grid-bot/Dockerfile
100644 → 100755
Empty file.
Empty file modified services/grid-bot/README.md
100644 → 100755
Empty file.
Empty file modified services/grid-bot/grid-bot-bare.sln
100644 → 100755
Empty file.
Empty file modified services/grid-bot/grid-bot.sln
100644 → 100755
Empty file.
Empty file modified services/grid-bot/lib/Directory.Build.props
100644 → 100755
Empty file.
Empty file modified services/grid-bot/lib/Directory.Build.targets
100644 → 100755
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
namespace Grid.Bot.Commands;

using System;
using System.Threading.Tasks;

using Microsoft.Extensions.DependencyInjection;

using Discord.Commands;

using Utility;

/// <summary>
/// An attribute only allows the command to be executed within the DMs of
/// users within the specified bot role, or within the specified guild (if configured).
/// </summary>
/// <remarks>
/// Construct a new instance of <see cref="LockDownCommandAttribute"/>.
/// </remarks>
/// <param name="botRole">The <see cref="BotRole"/>.</param>
public class LockDownCommandAttribute(BotRole botRole = BotRole.Administrator) : PreconditionAttribute
{
private readonly BotRole _botRole = botRole;

/// <summary>
/// The marker to indicate that the command should not respond.
/// </summary>
public const string MarkerDoNotRespond = "___||DO_NOT_RESPOND||___";

/// <inheritdoc cref="PreconditionAttribute.CheckPermissionsAsync(ICommandContext, CommandInfo, IServiceProvider)"/>
public override Task<PreconditionResult> CheckPermissionsAsync(ICommandContext context, CommandInfo commandInfo, IServiceProvider services)
{
var commandsSettings = services.GetRequiredService<CommandsSettings>();
if (!commandsSettings.EnableLockdownCommands)
return Task.FromResult(PreconditionResult.FromSuccess());

if (context.Guild is not null)
return context.Guild.Id == commandsSettings.LockdownGuildId
? Task.FromResult(PreconditionResult.FromSuccess())
: Task.FromResult(PreconditionResult.FromError(MarkerDoNotRespond));

var adminUtility = services.GetRequiredService<IAdminUtility>();

var isInRole = _botRole switch
{
BotRole.Privileged => adminUtility.UserIsPrivilaged(context.User),
BotRole.Administrator => adminUtility.UserIsPrivilaged(context.User),
BotRole.Owner => adminUtility.UserIsOwner(context.User),
_ => throw new ArgumentOutOfRangeException(nameof(_botRole), _botRole, null),
};

return isInRole
? Task.FromResult(PreconditionResult.FromSuccess())
: Task.FromResult(PreconditionResult.FromError(MarkerDoNotRespond));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
namespace Grid.Bot.Commands;

using System;
using System.Threading.Tasks;

using Microsoft.Extensions.DependencyInjection;

using Discord.Commands;

using Utility;

/// <summary>
/// An attribute that validates if the user has the required bot role.
/// </summary>
/// <remarks>
/// Construct a new instance of <see cref="RequireBotRoleAttribute"/>.
/// </remarks>
/// <param name="botRole">The <see cref="Utility.BotRole"/>.</param>
public class RequireBotRoleAttribute(BotRole botRole = BotRole.Privileged) : PreconditionAttribute
{
/// <summary>
/// The role.
/// </summary>
public BotRole BotRole { get; } = botRole;

private const string _permissionDeniedText = "You lack permission to execute this command.";


/// <inheritdoc cref="PreconditionAttribute.CheckPermissionsAsync(ICommandContext, CommandInfo, IServiceProvider)"/>
public override Task<PreconditionResult> CheckPermissionsAsync(ICommandContext context, CommandInfo commandInfo, IServiceProvider services)
{
var adminUtility = services.GetRequiredService<IAdminUtility>();

return BotRole switch
{
BotRole.Privileged => Task.FromResult(!adminUtility.UserIsPrivilaged(context.User)
? PreconditionResult.FromError(_permissionDeniedText)
: PreconditionResult.FromSuccess()),
BotRole.Administrator => Task.FromResult(!adminUtility.UserIsPrivilaged(context.User)
? PreconditionResult.FromError(_permissionDeniedText)
: PreconditionResult.FromSuccess()),
BotRole.Owner => Task.FromResult(!adminUtility.UserIsOwner(context.User)
? PreconditionResult.FromError(_permissionDeniedText)
: PreconditionResult.FromSuccess()),
_ => throw new ArgumentOutOfRangeException(nameof(BotRole), BotRole, null),
};

}
}

This file was deleted.

Loading

0 comments on commit e776fd5

Please sign in to comment.