| @@ -73,9 +73,9 @@ namespace Discord.API | |||||
| => Http.Delete(Endpoints.Invite(id)); | => Http.Delete(Endpoints.Invite(id)); | ||||
| //Chat | //Chat | ||||
| public static Task<APIResponses.SendMessage> SendMessage(string channelId, string message, string[] mentions) | |||||
| public static Task<APIResponses.SendMessage> 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<APIResponses.SendMessage>(Endpoints.ChannelMessages(channelId), request); | return Http.Post<APIResponses.SendMessage>(Endpoints.ChannelMessages(channelId), request); | ||||
| } | } | ||||
| public static Task<APIResponses.EditMessage> EditMessage(string channelId, string messageId, string message, string[] mentions) | public static Task<APIResponses.EditMessage> EditMessage(string channelId, string messageId, string message, string[] mentions) | ||||
| @@ -62,6 +62,8 @@ namespace Discord.API.Models | |||||
| public string Content; | public string Content; | ||||
| [JsonProperty(PropertyName = "mentions")] | [JsonProperty(PropertyName = "mentions")] | ||||
| public string[] Mentions; | public string[] Mentions; | ||||
| [JsonProperty(PropertyName = "nonce")] | |||||
| public string Nonce; | |||||
| } | } | ||||
| public class EditMessage : SendMessage { } | public class EditMessage : SendMessage { } | ||||
| @@ -60,6 +60,13 @@ namespace Discord.API.Models | |||||
| [JsonProperty(PropertyName = "guild_id")] | [JsonProperty(PropertyName = "guild_id")] | ||||
| public string ServerId; | public string ServerId; | ||||
| } | } | ||||
| internal class InitialMemberInfo : RoleMemberInfo | |||||
| { | |||||
| [JsonProperty(PropertyName = "mute")] | |||||
| public bool IsMuted; | |||||
| [JsonProperty(PropertyName = "deaf")] | |||||
| public bool IsDeafened; | |||||
| } | |||||
| internal class PresenceMemberInfo : MemberInfo | internal class PresenceMemberInfo : MemberInfo | ||||
| { | { | ||||
| [JsonProperty(PropertyName = "game_id")] | [JsonProperty(PropertyName = "game_id")] | ||||
| @@ -88,10 +95,6 @@ namespace Discord.API.Models | |||||
| } | } | ||||
| internal class RoleMemberInfo : MemberInfo | internal class RoleMemberInfo : MemberInfo | ||||
| { | { | ||||
| [JsonProperty(PropertyName = "mute")] | |||||
| public bool IsMuted; | |||||
| [JsonProperty(PropertyName = "deaf")] | |||||
| public bool IsDeafened; | |||||
| [JsonProperty(PropertyName = "joined_at")] | [JsonProperty(PropertyName = "joined_at")] | ||||
| public DateTime? JoinedAt; | public DateTime? JoinedAt; | ||||
| [JsonProperty(PropertyName = "roles")] | [JsonProperty(PropertyName = "roles")] | ||||
| @@ -170,7 +173,7 @@ namespace Discord.API.Models | |||||
| [JsonProperty(PropertyName = "channels")] | [JsonProperty(PropertyName = "channels")] | ||||
| public ChannelInfo[] Channels; | public ChannelInfo[] Channels; | ||||
| [JsonProperty(PropertyName = "members")] | [JsonProperty(PropertyName = "members")] | ||||
| public RoleMemberInfo[] Members; | |||||
| public InitialMemberInfo[] Members; | |||||
| [JsonProperty(PropertyName = "presences")] | [JsonProperty(PropertyName = "presences")] | ||||
| public PresenceMemberInfo[] Presences; | public PresenceMemberInfo[] Presences; | ||||
| [JsonProperty(PropertyName = "voice_states")] | [JsonProperty(PropertyName = "voice_states")] | ||||
| @@ -259,6 +262,8 @@ namespace Discord.API.Models | |||||
| public string Content; | public string Content; | ||||
| [JsonProperty(PropertyName = "author")] | [JsonProperty(PropertyName = "author")] | ||||
| public UserReference Author; | public UserReference Author; | ||||
| [JsonProperty(PropertyName = "nonce")] | |||||
| public string Nonce; | |||||
| } | } | ||||
| //Roles | //Roles | ||||
| @@ -21,6 +21,7 @@ namespace Discord | |||||
| private readonly Regex _userRegex, _channelRegex; | private readonly Regex _userRegex, _channelRegex; | ||||
| private readonly MatchEvaluator _userRegexEvaluator, _channelRegexEvaluator; | private readonly MatchEvaluator _userRegexEvaluator, _channelRegexEvaluator; | ||||
| private readonly JsonSerializer _serializer; | private readonly JsonSerializer _serializer; | ||||
| private readonly Random _rand; | |||||
| /// <summary> Returns the User object for the current logged in user. </summary> | /// <summary> Returns the User object for the current logged in user. </summary> | ||||
| public User User { get; private set; } | public User User { get; private set; } | ||||
| @@ -66,6 +67,7 @@ namespace Discord | |||||
| /// <summary> Initializes a new instance of the DiscordClient class. </summary> | /// <summary> Initializes a new instance of the DiscordClient class. </summary> | ||||
| public DiscordClient() | public DiscordClient() | ||||
| { | { | ||||
| _rand = new Random(); | |||||
| _isStopping = new ManualResetEventSlim(false); | _isStopping = new ManualResetEventSlim(false); | ||||
| _serializer = new JsonSerializer(); | _serializer = new JsonSerializer(); | ||||
| @@ -1004,7 +1006,8 @@ namespace Discord | |||||
| if (text.Length <= 2000) | 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) }; | return new Message[] { _messages.Update(msg.Id, channelId, msg) }; | ||||
| } | } | ||||
| else | else | ||||
| @@ -1014,7 +1017,8 @@ namespace Discord | |||||
| for (int i = 0; i < blockCount; i++) | for (int i = 0; i < blockCount; i++) | ||||
| { | { | ||||
| int index = i * DiscordAPI.MaxMessageSize; | 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); | result[i] = _messages.Update(msg.Id, channelId, msg); | ||||
| await Task.Delay(1000); | await Task.Delay(1000); | ||||
| } | } | ||||
| @@ -1185,6 +1189,11 @@ namespace Discord | |||||
| text = _channelRegex.Replace(text, _channelRegexEvaluator); | text = _channelRegex.Replace(text, _channelRegexEvaluator); | ||||
| return text; | return text; | ||||
| } | } | ||||
| private string GenerateNonce() | |||||
| { | |||||
| lock (_rand) | |||||
| return _rand.Next(0, int.MaxValue).ToString(); | |||||
| } | |||||
| /// <summary> Blocking call that will not return until client has been stopped. This is mainly intended for use in console applications. </summary> | /// <summary> Blocking call that will not return until client has been stopped. This is mainly intended for use in console applications. </summary> | ||||
| public void Block() | public void Block() | ||||
| @@ -85,12 +85,16 @@ namespace Discord | |||||
| if (model is API.Models.RoleMemberInfo) | if (model is API.Models.RoleMemberInfo) | ||||
| { | { | ||||
| var extendedModel = model as API.Models.RoleMemberInfo; | var extendedModel = model as API.Models.RoleMemberInfo; | ||||
| member.IsDeafened = extendedModel.IsDeafened; | |||||
| member.IsMuted = extendedModel.IsMuted; | |||||
| member.RoleIds = extendedModel.Roles; | member.RoleIds = extendedModel.Roles; | ||||
| if (extendedModel.JoinedAt.HasValue) | if (extendedModel.JoinedAt.HasValue) | ||||
| member.JoinedAt = extendedModel.JoinedAt.Value; | 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; | |||||
| } | |||||
| } | } | ||||
| ); | ); | ||||
| } | } | ||||