| @@ -73,9 +73,9 @@ namespace Discord.API | |||
| => Http.Delete(Endpoints.Invite(id)); | |||
| //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); | |||
| } | |||
| 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; | |||
| [JsonProperty(PropertyName = "mentions")] | |||
| public string[] Mentions; | |||
| [JsonProperty(PropertyName = "nonce")] | |||
| public string Nonce; | |||
| } | |||
| public class EditMessage : SendMessage { } | |||
| @@ -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 | |||
| @@ -21,6 +21,7 @@ namespace Discord | |||
| private readonly Regex _userRegex, _channelRegex; | |||
| private readonly MatchEvaluator _userRegexEvaluator, _channelRegexEvaluator; | |||
| private readonly JsonSerializer _serializer; | |||
| private readonly Random _rand; | |||
| /// <summary> Returns the User object for the current logged in user. </summary> | |||
| public User User { get; private set; } | |||
| @@ -66,6 +67,7 @@ namespace Discord | |||
| /// <summary> Initializes a new instance of the DiscordClient class. </summary> | |||
| 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(); | |||
| } | |||
| /// <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() | |||
| @@ -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; | |||
| } | |||
| } | |||
| ); | |||
| } | |||