@@ -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; | |||||
} | |||||
} | } | ||||
); | ); | ||||
} | } | ||||