Skip to content

Commit 893cc7a

Browse files
authored
Implement enforced nonces (#113)
* Implement enforced nonces * Update extension, param name and docs * Opps * Review changes
1 parent 43934e5 commit 893cc7a

File tree

4 files changed

+39
-3
lines changed

4 files changed

+39
-3
lines changed

src/Disqord.Core/Entities/Local/Message/Extensions/LocalMessageExtensions.cs

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,15 +61,37 @@ public static TMessage WithReply<TMessage>(this TMessage message, Snowflake mess
6161
/// </remarks>
6262
/// <param name="message"> The <see cref="LocalMessage"/> instance. </param>
6363
/// <param name="nonce"> The nonce. </param>
64+
/// <param name="shouldEnforceNonce"> Whether the nonce should be enforced. </param>
6465
/// <typeparam name="TMessage"> The <see cref="LocalMessage"/> type. </typeparam>
6566
/// <returns>
6667
/// The input instance.
6768
/// </returns>
6869
/// <seealso cref="LocalMessage.Nonce"/>
69-
public static TMessage WithNonce<TMessage>(this TMessage message, string nonce)
70+
public static TMessage WithNonce<TMessage>(this TMessage message, string nonce, bool shouldEnforceNonce = false)
7071
where TMessage : LocalMessage
7172
{
7273
message.Nonce = nonce;
74+
message.ShouldEnforceNonce = Optional.Conditional(shouldEnforceNonce, true);
75+
return message;
76+
}
77+
78+
/// <summary>
79+
/// Sets whether the uniqueness check of a nonce should be enforced on this message.
80+
/// </summary>
81+
/// <remarks>
82+
/// <inheritdoc cref="LocalMessage.ShouldEnforceNonce"/>
83+
/// </remarks>
84+
/// <param name="message"> The <see cref="LocalMessage"/> instance. </param>
85+
/// <param name="shouldEnforceNonce"> Whether the nonce should be enforced. </param>
86+
/// <typeparam name="TMessage"> The <see cref="LocalMessage"/> type. </typeparam>
87+
/// <returns>
88+
/// The input instance.
89+
/// </returns>
90+
/// <seealso cref="LocalMessage.ShouldEnforceNonce"/>
91+
public static TMessage WithShouldEnforceNonce<TMessage>(this TMessage message, bool shouldEnforceNonce = true)
92+
where TMessage : LocalMessage
93+
{
94+
message.ShouldEnforceNonce = shouldEnforceNonce;
7395
return message;
7496
}
7597
}

src/Disqord.Core/Entities/Local/Message/LocalMessage.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,14 @@ public class LocalMessage : LocalMessageBase, ILocalConstruct<LocalMessage>
2525
/// </remarks>
2626
public Optional<string> Nonce { get; set; }
2727

28+
/// <summary>
29+
/// Gets or sets whether the uniqueness check of a nonce should be enforced.
30+
/// </summary>
31+
/// <remarks>
32+
/// If set to true and another message with the same nonce was sent recently, the message will not be sent.
33+
/// </remarks>
34+
public Optional<bool> ShouldEnforceNonce { get; set; }
35+
2836
/// <summary>
2937
/// Instantiates a new <see cref="LocalMessage"/>.
3038
/// </summary>
@@ -40,6 +48,7 @@ protected LocalMessage(LocalMessage other)
4048
{
4149
Reference = other.Reference.Clone();
4250
Nonce = other.Nonce;
51+
ShouldEnforceNonce = other.ShouldEnforceNonce;
4352
}
4453

4554
/// <inheritdoc/>

src/Disqord.Rest.Api/Content/Json/CreateMessageJsonRestRequestContent.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ public class CreateMessageJsonRestRequestContent : JsonModelRestRequestContent,
3737
[JsonProperty("flags")]
3838
public Optional<MessageFlags> Flags;
3939

40+
[JsonProperty("enforce_nonce")]
41+
public Optional<bool> EnforceNonce;
42+
4043
IList<PartialAttachmentJsonModel> IAttachmentRestRequestContent.Attachments
4144
{
4245
set => Attachments = new(value);

src/Disqord.Rest/Extensions/RestClientExtensions.Channel.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,8 @@ public static async Task<IUserMessage> SendMessageAsync(this IRestClient client,
261261
MessageReference = Optional.Convert(message.Reference, reference => reference.ToModel()),
262262
Components = Optional.Convert(message.Components, components => components.Select(component => component.ToModel()).ToArray()),
263263
StickerIds = Optional.Convert(message.StickerIds, stickerIds => stickerIds.ToArray()),
264-
Flags = message.Flags
264+
Flags = message.Flags,
265+
EnforceNonce = message.ShouldEnforceNonce
265266
};
266267

267268
Task<MessageJsonModel> task;
@@ -649,7 +650,8 @@ public static async Task<IThreadChannel> CreateForumThreadAsync(this IRestClient
649650
MessageReference = Optional.Convert(message.Reference, reference => reference.ToModel()),
650651
Components = Optional.Convert(message.Components, components => components.Select(component => component.ToModel()).ToArray()),
651652
StickerIds = Optional.Convert(message.StickerIds, stickerIds => stickerIds.ToArray()),
652-
Flags = message.Flags
653+
Flags = message.Flags,
654+
EnforceNonce = message.ShouldEnforceNonce
653655
};
654656

655657
var forumContent = new CreateForumThreadJsonRestRequestContent

0 commit comments

Comments
 (0)