Skip to content

Commit

Permalink
aaaaaaaaaaa x2 & brainfuck
Browse files Browse the repository at this point in the history
  • Loading branch information
Lulalaby authored and TheXorog committed Jul 28, 2023
1 parent ef36a80 commit 0a3b8ef
Show file tree
Hide file tree
Showing 6 changed files with 155 additions and 285 deletions.
18 changes: 9 additions & 9 deletions DisCatSharp.ApplicationCommands/ApplicationCommandsExtension.cs
Original file line number Diff line number Diff line change
Expand Up @@ -77,12 +77,12 @@ public sealed class ApplicationCommandsExtension : BaseExtension
/// <summary>
/// List of global commands on discords backend.
/// </summary>
internal static List<DiscordApplicationCommand> GlobalDiscordCommands { get; set; }
internal static List<DiscordApplicationCommand>? GlobalDiscordCommands { get; set; }

/// <summary>
/// List of guild commands on discords backend.
/// </summary>
internal static Dictionary<ulong, List<DiscordApplicationCommand>> GuildDiscordCommands { get; set; }
internal static Dictionary<ulong, List<DiscordApplicationCommand>>? GuildDiscordCommands { get; set; }

/// <summary>
/// Singleton modules.
Expand Down Expand Up @@ -111,21 +111,21 @@ public sealed class ApplicationCommandsExtension : BaseExtension
=> s_registeredCommands.Select(guild =>
new KeyValuePair<ulong?, IReadOnlyList<RegisteredDiscordApplicationCommand>>(guild.Key, guild.Value
.Select(parent => new RegisteredDiscordApplicationCommand(parent)).ToList())).ToList();
private static List<KeyValuePair<ulong?, IReadOnlyList<DiscordApplicationCommand>>> s_registeredCommands = new();
private static readonly List<KeyValuePair<ulong?, IReadOnlyList<DiscordApplicationCommand>>> s_registeredCommands = new();

/// <summary>
/// Gets a list of registered global commands.
/// </summary>
public IReadOnlyList<DiscordApplicationCommand> GlobalCommands
=> GlobalCommandsInternal;
internal static List<DiscordApplicationCommand> GlobalCommandsInternal = new();
internal static readonly List<DiscordApplicationCommand> GlobalCommandsInternal = new();

/// <summary>
/// Gets a list of registered guild commands mapped by guild id.
/// </summary>
public IReadOnlyDictionary<ulong, IReadOnlyList<DiscordApplicationCommand>> GuildCommands
=> GuildCommandsInternal;
internal static Dictionary<ulong, IReadOnlyList<DiscordApplicationCommand>> GuildCommandsInternal = new();
internal static readonly Dictionary<ulong, IReadOnlyList<DiscordApplicationCommand>> GuildCommandsInternal = new();

/// <summary>
/// Gets the registration count.
Expand Down Expand Up @@ -163,7 +163,7 @@ internal static LogLevel ApplicationCommandsLogLevel
internal static bool ManOr { get; set; }

/// <summary>
/// Gets whether interactions should be automatically deffered.
/// Gets whether interactions should be automatically deferred.
/// </summary>
internal static bool AutoDeferEnabled { get; set; }

Expand All @@ -182,7 +182,7 @@ public IServiceProvider? Services
/// <summary>
/// Gets a list of handled interactions. Fix for double interaction execution bug.
/// </summary>
internal static List<ulong> HandledInteractions = new();
internal static readonly List<ulong> HandledInteractions = new();

/// <summary>
/// Initializes a new instance of the <see cref="ApplicationCommandsExtension"/> class.
Expand Down Expand Up @@ -863,7 +863,7 @@ private async void CheckRegistrationStartup(bool man = false, IReadOnlyCollectio
await fs.DisposeAsync().ConfigureAwait(false);
ms.Close();
await ms.DisposeAsync().ConfigureAwait(false);
this.Client.Logger.LogInformation("Exported base translation to {exppath}", fileName);
this.Client.Logger.LogInformation("Exported base translation to {exportPath}", fileName);
}

if (groupTranslation != null && groupTranslation.Any())
Expand All @@ -881,7 +881,7 @@ private async void CheckRegistrationStartup(bool man = false, IReadOnlyCollectio
await fs.DisposeAsync().ConfigureAwait(false);
ms.Close();
await ms.DisposeAsync().ConfigureAwait(false);
this.Client.Logger.LogInformation("Exported base translation to {exppath}", fileName);
this.Client.Logger.LogInformation("Exported base translation to {exportPath}", fileName);
}
}
catch (Exception ex)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ internal static class ApplicationCommandEqualityChecks
/// <param name="targetApplicationCommand">Command to check against.</param>
/// <param name="client">The discord client.</param>
/// <param name="isGuild">Whether the equal check is performed for a guild command.</param>
internal static bool IsEqualTo(this DiscordApplicationCommand ac1, DiscordApplicationCommand targetApplicationCommand, DiscordClient client, bool isGuild)
internal static bool IsEqualTo(this DiscordApplicationCommand? ac1, DiscordApplicationCommand? targetApplicationCommand, DiscordClient client, bool isGuild)
{
if (targetApplicationCommand is null || ac1 is null)
return false;
Expand Down Expand Up @@ -80,11 +80,26 @@ internal static bool SoftEqual(this DiscordApplicationCommand source, DiscordApp
{
bool? sDmPerm = source.DmPermission ?? true;
bool? tDmPerm = target.DmPermission ?? true;
if (guild)
{
sDmPerm = null;
tDmPerm = null;
}
if (!guild)
return localizationEnabled
? type switch
{
ApplicationCommandType.ChatInput => DeepEqual(source, target, true, sDmPerm, tDmPerm),
_ => source.Name == target.Name
&& source.Type == target.Type && source.NameLocalizations == target.NameLocalizations
&& source.DefaultMemberPermissions == target.DefaultMemberPermissions
&& sDmPerm == tDmPerm && source.IsNsfw == target.IsNsfw
}
: type switch
{
ApplicationCommandType.ChatInput => DeepEqual(source, target, false, sDmPerm, tDmPerm),
_ => source.Name == target.Name
&& source.Type == target.Type
&& source.DefaultMemberPermissions == target.DefaultMemberPermissions
&& sDmPerm == tDmPerm && source.IsNsfw == target.IsNsfw
};
sDmPerm = null;
tDmPerm = null;
return localizationEnabled
? type switch
{
Expand Down Expand Up @@ -135,45 +150,19 @@ internal static bool DeepEqual(DiscordApplicationCommand source, DiscordApplicat
target.Options.Any(o => o.Type == ApplicationCommandOptionType.SubCommandGroup))
{
List<DiscordApplicationCommandOption> minimalSourceOptions = new();
List<DiscordApplicationCommandOption> minimalTargetOptions = new();

foreach (var option in
source.Options.Where(x => x.Type == ApplicationCommandOptionType.SubCommandGroup))
source.Options.Where(x => x.Type == ApplicationCommandOptionType.SubCommandGroup))
{
List<DiscordApplicationCommandOption> minimalSubSourceOptions = new();
if (option.Options != null)
{
foreach (var subOption in option.Options)
{
List<DiscordApplicationCommandOption> minimalSubSubSourceOptions = null;

if (subOption.Options != null)
{
minimalSubSubSourceOptions = new();

foreach (var subSubOption in subOption.Options)
minimalSubSubSourceOptions.Add(new(
subSubOption.Name, subSubOption.Description, subSubOption.Type,
subSubOption.Required,
subSubOption.Choices, null, subSubOption.ChannelTypes?.OrderBy(x => x),
subSubOption.AutoComplete,
subSubOption.MinimumValue, subSubOption.MaximumValue,
localizationEnabled ? subSubOption.NameLocalizations : null,
localizationEnabled ? subSubOption.DescriptionLocalizations : null,
subSubOption.MinimumLength, subSubOption.MaximumLength
));

minimalSubSourceOptions.Add(new(
subOption.Name, subOption.Description, subOption.Type,
options: minimalSubSubSourceOptions,
nameLocalizations: localizationEnabled ? subOption.NameLocalizations : null,
descriptionLocalizations: localizationEnabled
? subOption.DescriptionLocalizations
: null
));
}
}

minimalSubSourceOptions.AddRange(from subOption in option.Options
where subOption.Options != null
let minimalSubSubSourceOptions = subOption.Options.Select(subSubOption => new DiscordApplicationCommandOption(subSubOption.Name, subSubOption.Description, subSubOption.Type, subSubOption.Required, subSubOption.Choices, null, subSubOption.ChannelTypes?.OrderBy(x => x), subSubOption.AutoComplete, subSubOption.MinimumValue, subSubOption.MaximumValue, localizationEnabled ? subSubOption.NameLocalizations : null, localizationEnabled ? subSubOption.DescriptionLocalizations : null, subSubOption.MinimumLength, subSubOption.MaximumLength)).ToList()
select new DiscordApplicationCommandOption(subOption.Name, subOption.Description, subOption.Type, options: minimalSubSubSourceOptions, nameLocalizations: localizationEnabled ? subOption.NameLocalizations : null, descriptionLocalizations: localizationEnabled
? subOption.DescriptionLocalizations
: null));
}

minimalSourceOptions.Add(new(
Expand All @@ -184,57 +173,23 @@ internal static bool DeepEqual(DiscordApplicationCommand source, DiscordApplicat
));
}

foreach (var option in
target.Options.Where(x => x.Type == ApplicationCommandOptionType.SubCommandGroup))
{
List<DiscordApplicationCommandOption> minimalSubTargetOptions = new();

foreach (var subOption in option.Options)
{
List<DiscordApplicationCommandOption> minimalSubSubTargetOptions = null;

if (subOption.Options != null && subOption.Options.Any())
{
minimalSubSubTargetOptions = new();

foreach (var subSubOption in subOption.Options)
minimalSubSubTargetOptions.Add(new(
subSubOption.Name, subSubOption.Description, subSubOption.Type,
subSubOption.Required,
subSubOption.Choices, null, subSubOption.ChannelTypes?.OrderBy(x => x), subSubOption.AutoComplete,
subSubOption.MinimumValue, subSubOption.MaximumValue,
localizationEnabled ? subSubOption.NameLocalizations : null,
localizationEnabled ? subSubOption.DescriptionLocalizations : null,
subSubOption.MinimumLength, subSubOption.MaximumLength
));

minimalSubTargetOptions.Add(new(
subOption.Name, subOption.Description, subOption.Type,
options: minimalSubSubTargetOptions,
nameLocalizations: localizationEnabled ? subOption.NameLocalizations : null,
descriptionLocalizations: localizationEnabled
? subOption.DescriptionLocalizations
: null
));
}
}

minimalTargetOptions.Add(new(
option.Name, option.Description, option.Type,
options: minimalSubTargetOptions,
nameLocalizations: localizationEnabled ? option.NameLocalizations : null,
descriptionLocalizations: localizationEnabled ? option.DescriptionLocalizations : null
));
}
var minimalTargetOptions = (from option in target.Options.Where(x => x.Type == ApplicationCommandOptionType.SubCommandGroup)
let minimalSubTargetOptions = (from subOption in option.Options
where subOption.Options != null && subOption.Options.Any()
let minimalSubSubTargetOptions = subOption.Options.Select(subSubOption => new DiscordApplicationCommandOption(subSubOption.Name, subSubOption.Description, subSubOption.Type, subSubOption.Required, subSubOption.Choices, null, subSubOption.ChannelTypes?.OrderBy(x => x), subSubOption.AutoComplete, subSubOption.MinimumValue, subSubOption.MaximumValue, localizationEnabled ? subSubOption.NameLocalizations : null, localizationEnabled ? subSubOption.DescriptionLocalizations : null, subSubOption.MinimumLength, subSubOption.MaximumLength)).ToList()
select new DiscordApplicationCommandOption(subOption.Name, subOption.Description, subOption.Type, options: minimalSubSubTargetOptions, nameLocalizations: localizationEnabled ? subOption.NameLocalizations : null, descriptionLocalizations: localizationEnabled
? subOption.DescriptionLocalizations
: null)).ToList()
select new DiscordApplicationCommandOption(option.Name, option.Description, option.Type, options: minimalSubTargetOptions, nameLocalizations: localizationEnabled ? option.NameLocalizations : null, descriptionLocalizations: localizationEnabled ? option.DescriptionLocalizations : null)).ToList();

var sOpt = JsonConvert.SerializeObject(minimalSourceOptions, Formatting.None);
var tOpt = JsonConvert.SerializeObject(minimalTargetOptions, Formatting.None);

eqCheck1 = rootCheck && sOpt == tOpt;
}

if (source.Options.Any(o => o.Type == ApplicationCommandOptionType.SubCommand) &&
target.Options.Any(o => o.Type == ApplicationCommandOptionType.SubCommand))
if (source.Options.All(o => o.Type != ApplicationCommandOptionType.SubCommand) || target.Options.All(o => o.Type != ApplicationCommandOptionType.SubCommand))
return eqCheck1 && eqCheck2;
{
List<DiscordApplicationCommandOption> minimalSourceOptions = new();
List<DiscordApplicationCommandOption> minimalTargetOptions = new();
Expand All @@ -244,19 +199,7 @@ internal static bool DeepEqual(DiscordApplicationCommand source, DiscordApplicat
List<DiscordApplicationCommandOption> minimalSubSourceOptions = null;

if (option.Options != null)
{
minimalSubSourceOptions = new();

foreach (var subOption in option.Options)
minimalSubSourceOptions.Add(new(
subOption.Name, subOption.Description, subOption.Type, subOption.Required,
subOption.Choices, null, subOption.ChannelTypes?.OrderBy(x => x), subOption.AutoComplete,
subOption.MinimumValue, subOption.MaximumValue,
localizationEnabled ? subOption.NameLocalizations : null,
localizationEnabled ? subOption.DescriptionLocalizations : null,
subOption.MinimumLength, subOption.MaximumLength
));
}
minimalSubSourceOptions = option.Options.Select(subOption => new DiscordApplicationCommandOption(subOption.Name, subOption.Description, subOption.Type, subOption.Required, subOption.Choices, null, subOption.ChannelTypes?.OrderBy(x => x), subOption.AutoComplete, subOption.MinimumValue, subOption.MaximumValue, localizationEnabled ? subOption.NameLocalizations : null, localizationEnabled ? subOption.DescriptionLocalizations : null, subOption.MinimumLength, subOption.MaximumLength)).ToList();

minimalSourceOptions.Add(new(
option.Name, option.Description, option.Type,
Expand All @@ -271,19 +214,7 @@ internal static bool DeepEqual(DiscordApplicationCommand source, DiscordApplicat
List<DiscordApplicationCommandOption> minimalSubTargetOptions = null;

if (option.Options != null && option.Options.Any())
{
minimalSubTargetOptions = new();

foreach (var subOption in option.Options)
minimalSubTargetOptions.Add(new(
subOption.Name, subOption.Description, subOption.Type, subOption.Required,
subOption.Choices, null, subOption.ChannelTypes?.OrderBy(x => x), subOption.AutoComplete,
subOption.MinimumValue, subOption.MaximumValue,
localizationEnabled ? subOption.NameLocalizations : null,
localizationEnabled ? subOption.DescriptionLocalizations : null,
subOption.MinimumLength, subOption.MaximumLength
));
}
minimalSubTargetOptions = option.Options.Select(subOption => new DiscordApplicationCommandOption(subOption.Name, subOption.Description, subOption.Type, subOption.Required, subOption.Choices, null, subOption.ChannelTypes?.OrderBy(x => x), subOption.AutoComplete, subOption.MinimumValue, subOption.MaximumValue, localizationEnabled ? subOption.NameLocalizations : null, localizationEnabled ? subOption.DescriptionLocalizations : null, subOption.MinimumLength, subOption.MaximumLength)).ToList();

minimalTargetOptions.Add(new(
option.Name, option.Description, option.Type,
Expand All @@ -301,28 +232,12 @@ internal static bool DeepEqual(DiscordApplicationCommand source, DiscordApplicat

return eqCheck1 && eqCheck2;
}
// ReSharper disable once RedundantIfElseBlock
else
{
List<DiscordApplicationCommandOption> minimalSourceOptions = new();
List<DiscordApplicationCommandOption> minimalTargetOptions = new();

foreach (var option in source.Options)
minimalSourceOptions.Add(new(
option.Name, option.Description, option.Type, option.Required,
option.Choices, null, option.ChannelTypes?.OrderBy(x => x), option.AutoComplete, option.MinimumValue, option.MaximumValue,
localizationEnabled ? option.NameLocalizations : null,
localizationEnabled ? option.DescriptionLocalizations : null,
option.MinimumLength, option.MaximumLength
));

foreach (var option in target.Options)
minimalTargetOptions.Add(new(
option.Name, option.Description, option.Type, option.Required,
option.Choices, null, option.ChannelTypes?.OrderBy(x => x), option.AutoComplete, option.MinimumValue, option.MaximumValue,
localizationEnabled ? option.NameLocalizations : null,
localizationEnabled ? option.DescriptionLocalizations : null,
option.MinimumLength, option.MaximumLength
));
var minimalSourceOptions = source.Options.Select(option => new DiscordApplicationCommandOption(option.Name, option.Description, option.Type, option.Required, option.Choices, null, option.ChannelTypes?.OrderBy(x => x), option.AutoComplete, option.MinimumValue, option.MaximumValue, localizationEnabled ? option.NameLocalizations : null, localizationEnabled ? option.DescriptionLocalizations : null, option.MinimumLength, option.MaximumLength)).ToList();

var minimalTargetOptions = target.Options.Select(option => new DiscordApplicationCommandOption(option.Name, option.Description, option.Type, option.Required, option.Choices, null, option.ChannelTypes?.OrderBy(x => x), option.AutoComplete, option.MinimumValue, option.MaximumValue, localizationEnabled ? option.NameLocalizations : null, localizationEnabled ? option.DescriptionLocalizations : null, option.MinimumLength, option.MaximumLength)).ToList();
var sOpt = JsonConvert.SerializeObject(minimalSourceOptions, Formatting.None);
var tOpt = JsonConvert.SerializeObject(minimalTargetOptions, Formatting.None);

Expand Down
Loading

0 comments on commit 0a3b8ef

Please sign in to comment.