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)