From c5b8d07378c7a8f277d5d7df1035809d6b2603e8 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Mon, 22 Nov 2021 04:16:44 -0400 Subject: [PATCH] Add UseInteractionSnowflakeDate to config #286 --- src/Discord.Net.Core/DiscordConfig.cs | 12 ++++++++++++ src/Discord.Net.Rest/BaseDiscordClient.cs | 3 +++ .../Entities/Interactions/RestInteraction.cs | 7 ++++--- .../SocketMessageComponent.cs | 18 +++++++++--------- .../SocketAutocompleteInteraction.cs | 6 +++--- .../SocketBaseCommand/SocketCommandBase.cs | 10 +++++----- .../Entities/Interaction/SocketInteraction.cs | 16 +++++++++++++--- 7 files changed, 49 insertions(+), 23 deletions(-) diff --git a/src/Discord.Net.Core/DiscordConfig.cs b/src/Discord.Net.Core/DiscordConfig.cs index 03994a3c7..238b45aea 100644 --- a/src/Discord.Net.Core/DiscordConfig.cs +++ b/src/Discord.Net.Core/DiscordConfig.cs @@ -165,5 +165,17 @@ namespace Discord /// clock. Your system will still need a stable clock. /// public bool UseSystemClock { get; set; } = true; + + /// + /// Gets or sets whether or not the internal experation check uses the system date + /// + snowflake date to check if an interaction can be responded to. + /// + /// + /// If set to then the CreatedAt property in an interaction + /// will be set to when it was received instead of the snowflakes date. + ///
+ /// This will still require a stable clock on your system. + ///
+ public bool UseInteractionSnowflakeDate { get; set; } = true; } } diff --git a/src/Discord.Net.Rest/BaseDiscordClient.cs b/src/Discord.Net.Rest/BaseDiscordClient.cs index 431859a10..525875232 100644 --- a/src/Discord.Net.Rest/BaseDiscordClient.cs +++ b/src/Discord.Net.Rest/BaseDiscordClient.cs @@ -35,6 +35,7 @@ namespace Discord.Rest public ISelfUser CurrentUser { get; protected set; } /// public TokenType TokenType => ApiClient.AuthTokenType; + internal bool UseInteractionSnowflakeDate { get; private set; } /// Creates a new REST-only Discord client. internal BaseDiscordClient(DiscordRestConfig config, API.DiscordRestApiClient client) @@ -47,6 +48,8 @@ namespace Discord.Rest _restLogger = LogManager.CreateLogger("Rest"); _isFirstLogin = config.DisplayInitialLog; + UseInteractionSnowflakeDate = config.UseInteractionSnowflakeDate; + ApiClient.RequestQueue.RateLimitTriggered += async (id, info, endpoint) => { if (info == null) diff --git a/src/Discord.Net.Rest/Entities/Interactions/RestInteraction.cs b/src/Discord.Net.Rest/Entities/Interactions/RestInteraction.cs index 4f9343878..103c43ffb 100644 --- a/src/Discord.Net.Rest/Entities/Interactions/RestInteraction.cs +++ b/src/Discord.Net.Rest/Entities/Interactions/RestInteraction.cs @@ -33,8 +33,7 @@ namespace Discord.Rest public RestUser User { get; private set; } /// - public DateTimeOffset CreatedAt - => SnowflakeUtils.FromSnowflake(Id); + public DateTimeOffset CreatedAt { get; private set; } internal abstract bool _hasResponded { get; set; } @@ -57,7 +56,9 @@ namespace Discord.Rest internal RestInteraction(BaseDiscordClient discord, ulong id) : base(discord, id) { - + CreatedAt = discord.UseInteractionSnowflakeDate + ? SnowflakeUtils.FromSnowflake(Id) + : DateTime.UtcNow; } internal static async Task CreateAsync(DiscordRestClient client, Model model) diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/MessageComponents/SocketMessageComponent.cs b/src/Discord.Net.WebSocket/Entities/Interaction/MessageComponents/SocketMessageComponent.cs index 4cb096e3e..928a4302a 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/MessageComponents/SocketMessageComponent.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/MessageComponents/SocketMessageComponent.cs @@ -26,7 +26,7 @@ namespace Discord.WebSocket public SocketUserMessage Message { get; private set; } private object _lock = new object(); - internal override bool _hasResponded { get; set; } = false; + public override bool HasResponded { get; internal set; } = false; internal SocketMessageComponent(DiscordSocketClient client, Model model, ISocketMessageChannel channel) : base(client, model.Id, channel) @@ -130,7 +130,7 @@ namespace Discord.WebSocket lock (_lock) { - if (_hasResponded) + if (HasResponded) { throw new InvalidOperationException("Cannot respond, update, or defer twice to the same interaction"); } @@ -140,7 +140,7 @@ namespace Discord.WebSocket lock (_lock) { - _hasResponded = true; + HasResponded = true; } } @@ -225,7 +225,7 @@ namespace Discord.WebSocket lock (_lock) { - if (_hasResponded) + if (HasResponded) { throw new InvalidOperationException("Cannot respond, update, or defer twice to the same interaction"); } @@ -235,7 +235,7 @@ namespace Discord.WebSocket lock (_lock) { - _hasResponded = true; + HasResponded = true; } } @@ -380,7 +380,7 @@ namespace Discord.WebSocket lock (_lock) { - if (_hasResponded) + if (HasResponded) { throw new InvalidOperationException("Cannot respond or defer twice to the same interaction"); } @@ -390,7 +390,7 @@ namespace Discord.WebSocket lock (_lock) { - _hasResponded = true; + HasResponded = true; } } @@ -408,7 +408,7 @@ namespace Discord.WebSocket lock (_lock) { - if (_hasResponded) + if (HasResponded) { throw new InvalidOperationException("Cannot respond or defer twice to the same interaction"); } @@ -418,7 +418,7 @@ namespace Discord.WebSocket lock (_lock) { - _hasResponded = true; + HasResponded = true; } } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SlashCommands/SocketAutocompleteInteraction.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SlashCommands/SocketAutocompleteInteraction.cs index 13ef87aa6..5637cb6f0 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SlashCommands/SocketAutocompleteInteraction.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SlashCommands/SocketAutocompleteInteraction.cs @@ -18,7 +18,7 @@ namespace Discord.WebSocket /// public new SocketAutocompleteInteractionData Data { get; } - internal override bool _hasResponded { get; set; } + public override bool HasResponded { get; internal set; } private object _lock = new object(); internal SocketAutocompleteInteraction(DiscordSocketClient client, Model model, ISocketMessageChannel channel) @@ -60,7 +60,7 @@ namespace Discord.WebSocket lock (_lock) { - if (_hasResponded) + if (HasResponded) { throw new InvalidOperationException("Cannot respond twice to the same interaction"); } @@ -69,7 +69,7 @@ namespace Discord.WebSocket await InteractionHelper.SendAutocompleteResultAsync(Discord, result, Id, Token, options).ConfigureAwait(false); lock (_lock) { - _hasResponded = true; + HasResponded = true; } } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs index de9193e35..92303d488 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketCommandBase.cs @@ -31,7 +31,7 @@ namespace Discord.WebSocket /// internal new SocketCommandBaseData Data { get; } - internal override bool _hasResponded { get; set; } + public override bool HasResponded { get; internal set; } private object _lock = new object(); @@ -124,7 +124,7 @@ namespace Discord.WebSocket lock (_lock) { - if (_hasResponded) + if (HasResponded) { throw new InvalidOperationException("Cannot respond twice to the same interaction"); } @@ -134,7 +134,7 @@ namespace Discord.WebSocket lock (_lock) { - _hasResponded = true; + HasResponded = true; } } @@ -283,7 +283,7 @@ namespace Discord.WebSocket lock (_lock) { - if (_hasResponded) + if (HasResponded) { throw new InvalidOperationException("Cannot respond or defer twice to the same interaction"); } @@ -293,7 +293,7 @@ namespace Discord.WebSocket lock (_lock) { - _hasResponded = true; + HasResponded = true; } } } diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs index 20d8fa0f5..f0465d336 100644 --- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs +++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs @@ -44,10 +44,16 @@ namespace Discord.WebSocket public int Version { get; private set; } /// - public DateTimeOffset CreatedAt - => SnowflakeUtils.FromSnowflake(Id); + public DateTimeOffset CreatedAt { get; private set; } - internal abstract bool _hasResponded { get; set; } + /// + /// Gets whether or not this interaction has been responded to. + /// + /// + /// This property is locally set -- if you're running multiple bots + /// off the same token then this property won't be in sync with them. + /// + public abstract bool HasResponded { get; internal set; } /// /// if the token is valid for replying to, otherwise . @@ -59,6 +65,10 @@ namespace Discord.WebSocket : base(client, id) { Channel = channel; + + CreatedAt = client.UseInteractionSnowflakeDate + ? SnowflakeUtils.FromSnowflake(Id) + : DateTime.UtcNow; } internal static SocketInteraction Create(DiscordSocketClient client, Model model, ISocketMessageChannel channel)