From d43c25bd1efb5d90ebc17cd9e1d174c60592f085 Mon Sep 17 00:00:00 2001 From: Brandon Smith Date: Sat, 22 Aug 2015 20:53:54 -0300 Subject: [PATCH] Added nonce and a few API response adjustments --- src/Discord.Net/API/DiscordAPI.cs | 4 ++-- src/Discord.Net/API/Models/APIRequests.cs | 2 ++ src/Discord.Net/API/Models/Common.cs | 15 ++++++++++----- src/Discord.Net/DiscordClient.cs | 13 +++++++++++-- src/Discord.Net/Server.cs | 8 ++++++-- 5 files changed, 31 insertions(+), 11 deletions(-) diff --git a/src/Discord.Net/API/DiscordAPI.cs b/src/Discord.Net/API/DiscordAPI.cs index 18773aa09..07e629a0e 100644 --- a/src/Discord.Net/API/DiscordAPI.cs +++ b/src/Discord.Net/API/DiscordAPI.cs @@ -73,9 +73,9 @@ namespace Discord.API => Http.Delete(Endpoints.Invite(id)); //Chat - public static Task SendMessage(string channelId, string message, string[] mentions) + public static Task SendMessage(string channelId, string message, string[] mentions, string nonce) { - var request = new APIRequests.SendMessage { Content = message, Mentions = mentions }; + var request = new APIRequests.SendMessage { Content = message, Mentions = mentions, Nonce = nonce }; return Http.Post(Endpoints.ChannelMessages(channelId), request); } public static Task EditMessage(string channelId, string messageId, string message, string[] mentions) diff --git a/src/Discord.Net/API/Models/APIRequests.cs b/src/Discord.Net/API/Models/APIRequests.cs index f74bb77d1..a2c172ab9 100644 --- a/src/Discord.Net/API/Models/APIRequests.cs +++ b/src/Discord.Net/API/Models/APIRequests.cs @@ -62,6 +62,8 @@ namespace Discord.API.Models public string Content; [JsonProperty(PropertyName = "mentions")] public string[] Mentions; + [JsonProperty(PropertyName = "nonce")] + public string Nonce; } public class EditMessage : SendMessage { } diff --git a/src/Discord.Net/API/Models/Common.cs b/src/Discord.Net/API/Models/Common.cs index 2552c5033..a630f37c4 100644 --- a/src/Discord.Net/API/Models/Common.cs +++ b/src/Discord.Net/API/Models/Common.cs @@ -60,6 +60,13 @@ namespace Discord.API.Models [JsonProperty(PropertyName = "guild_id")] public string ServerId; } + internal class InitialMemberInfo : RoleMemberInfo + { + [JsonProperty(PropertyName = "mute")] + public bool IsMuted; + [JsonProperty(PropertyName = "deaf")] + public bool IsDeafened; + } internal class PresenceMemberInfo : MemberInfo { [JsonProperty(PropertyName = "game_id")] @@ -88,10 +95,6 @@ namespace Discord.API.Models } internal class RoleMemberInfo : MemberInfo { - [JsonProperty(PropertyName = "mute")] - public bool IsMuted; - [JsonProperty(PropertyName = "deaf")] - public bool IsDeafened; [JsonProperty(PropertyName = "joined_at")] public DateTime? JoinedAt; [JsonProperty(PropertyName = "roles")] @@ -170,7 +173,7 @@ namespace Discord.API.Models [JsonProperty(PropertyName = "channels")] public ChannelInfo[] Channels; [JsonProperty(PropertyName = "members")] - public RoleMemberInfo[] Members; + public InitialMemberInfo[] Members; [JsonProperty(PropertyName = "presences")] public PresenceMemberInfo[] Presences; [JsonProperty(PropertyName = "voice_states")] @@ -259,6 +262,8 @@ namespace Discord.API.Models public string Content; [JsonProperty(PropertyName = "author")] public UserReference Author; + [JsonProperty(PropertyName = "nonce")] + public string Nonce; } //Roles diff --git a/src/Discord.Net/DiscordClient.cs b/src/Discord.Net/DiscordClient.cs index b0a790a00..c3f47842e 100644 --- a/src/Discord.Net/DiscordClient.cs +++ b/src/Discord.Net/DiscordClient.cs @@ -21,6 +21,7 @@ namespace Discord private readonly Regex _userRegex, _channelRegex; private readonly MatchEvaluator _userRegexEvaluator, _channelRegexEvaluator; private readonly JsonSerializer _serializer; + private readonly Random _rand; /// Returns the User object for the current logged in user. public User User { get; private set; } @@ -66,6 +67,7 @@ namespace Discord /// Initializes a new instance of the DiscordClient class. public DiscordClient() { + _rand = new Random(); _isStopping = new ManualResetEventSlim(false); _serializer = new JsonSerializer(); @@ -1004,7 +1006,8 @@ namespace Discord if (text.Length <= 2000) { - var msg = await DiscordAPI.SendMessage(channelId, text, mentions); + var nonce = GenerateNonce(); + var msg = await DiscordAPI.SendMessage(channelId, text, mentions, nonce); return new Message[] { _messages.Update(msg.Id, channelId, msg) }; } else @@ -1014,7 +1017,8 @@ namespace Discord for (int i = 0; i < blockCount; i++) { int index = i * DiscordAPI.MaxMessageSize; - var msg = await DiscordAPI.SendMessage(channelId, text.Substring(index, Math.Min(2000, text.Length - index)), mentions); + var nonce = GenerateNonce(); + var msg = await DiscordAPI.SendMessage(channelId, text.Substring(index, Math.Min(2000, text.Length - index)), mentions, nonce); result[i] = _messages.Update(msg.Id, channelId, msg); await Task.Delay(1000); } @@ -1185,6 +1189,11 @@ namespace Discord text = _channelRegex.Replace(text, _channelRegexEvaluator); return text; } + private string GenerateNonce() + { + lock (_rand) + return _rand.Next(0, int.MaxValue).ToString(); + } /// Blocking call that will not return until client has been stopped. This is mainly intended for use in console applications. public void Block() diff --git a/src/Discord.Net/Server.cs b/src/Discord.Net/Server.cs index 9e2bf851e..f007b21a5 100644 --- a/src/Discord.Net/Server.cs +++ b/src/Discord.Net/Server.cs @@ -85,12 +85,16 @@ namespace Discord if (model is API.Models.RoleMemberInfo) { var extendedModel = model as API.Models.RoleMemberInfo; - member.IsDeafened = extendedModel.IsDeafened; - member.IsMuted = extendedModel.IsMuted; member.RoleIds = extendedModel.Roles; if (extendedModel.JoinedAt.HasValue) member.JoinedAt = extendedModel.JoinedAt.Value; } + if (model is API.Models.InitialMemberInfo) + { + var extendedModel = model as API.Models.InitialMemberInfo; + member.IsDeafened = extendedModel.IsDeafened; + member.IsMuted = extendedModel.IsMuted; + } } ); }