From 0dfedabf4dea54b42aeb7af4401cd18bf62e2cd0 Mon Sep 17 00:00:00 2001 From: RogueException Date: Sun, 12 Jun 2016 16:08:43 -0300 Subject: [PATCH] Sync'd several entities to the API docs --- src/Discord.Net/API/Common/Attachment.cs | 4 +- src/Discord.Net/API/Common/Channel.cs | 18 +++---- src/Discord.Net/API/Common/EmbedThumbnail.cs | 4 +- src/Discord.Net/API/Common/Game.cs | 4 +- src/Discord.Net/API/Common/GuildEmbed.cs | 2 +- src/Discord.Net/API/Common/GuildMember.cs | 8 ++-- src/Discord.Net/API/Common/Presence.cs | 4 +- src/Discord.Net/API/Common/ReadState.cs | 2 +- src/Discord.Net/API/Common/Role.cs | 10 ++-- src/Discord.Net/API/DiscordAPIClient.cs | 2 +- src/Discord.Net/DiscordClient.cs | 6 +-- src/Discord.Net/DiscordSocketClient.cs | 20 ++++---- .../Entities/Channels/DMChannel.cs | 2 +- .../Entities/Channels/GuildChannel.cs | 12 ++--- .../Entities/Channels/TextChannel.cs | 2 +- .../Entities/Channels/VoiceChannel.cs | 4 +- src/Discord.Net/Entities/Guilds/Guild.cs | 4 +- .../Entities/Invites/IInviteMetadata.cs | 2 + .../Entities/Invites/InviteMetadata.cs | 2 + src/Discord.Net/Entities/Roles/Role.cs | 10 ++-- src/Discord.Net/Entities/Users/Game.cs | 2 +- src/Discord.Net/Entities/Users/GuildUser.cs | 47 +++++++++++-------- .../Entities/WebSocket/CachedGuild.cs | 16 +++---- src/Discord.Net/project.json | 1 - 24 files changed, 100 insertions(+), 88 deletions(-) diff --git a/src/Discord.Net/API/Common/Attachment.cs b/src/Discord.Net/API/Common/Attachment.cs index 1f2c4b8b7..e1561eb84 100644 --- a/src/Discord.Net/API/Common/Attachment.cs +++ b/src/Discord.Net/API/Common/Attachment.cs @@ -15,8 +15,8 @@ namespace Discord.API [JsonProperty("proxy_url")] public string ProxyUrl { get; set; } [JsonProperty("height")] - public int? Height { get; set; } + public Optional Height { get; set; } [JsonProperty("width")] - public int? Width { get; set; } + public Optional Width { get; set; } } } diff --git a/src/Discord.Net/API/Common/Channel.cs b/src/Discord.Net/API/Common/Channel.cs index f50c31a09..b0789b111 100644 --- a/src/Discord.Net/API/Common/Channel.cs +++ b/src/Discord.Net/API/Common/Channel.cs @@ -14,28 +14,28 @@ namespace Discord.API //GuildChannel [JsonProperty("guild_id")] - public ulong? GuildId { get; set; } + public Optional GuildId { get; set; } [JsonProperty("name")] - public string Name { get; set; } + public Optional Name { get; set; } [JsonProperty("type")] - public ChannelType Type { get; set; } + public Optional Type { get; set; } [JsonProperty("position")] - public int Position { get; set; } + public Optional Position { get; set; } [JsonProperty("permission_overwrites")] - public Overwrite[] PermissionOverwrites { get; set; } + public Optional PermissionOverwrites { get; set; } //TextChannel [JsonProperty("topic")] - public string Topic { get; set; } + public Optional Topic { get; set; } //VoiceChannel [JsonProperty("bitrate")] - public int Bitrate { get; set; } + public Optional Bitrate { get; set; } [JsonProperty("user_limit")] - public int UserLimit { get; set; } + public Optional UserLimit { get; set; } //DMChannel [JsonProperty("recipient")] - public User Recipient { get; set; } + public Optional Recipient { get; set; } } } diff --git a/src/Discord.Net/API/Common/EmbedThumbnail.cs b/src/Discord.Net/API/Common/EmbedThumbnail.cs index 73fe3472d..9933183af 100644 --- a/src/Discord.Net/API/Common/EmbedThumbnail.cs +++ b/src/Discord.Net/API/Common/EmbedThumbnail.cs @@ -9,8 +9,8 @@ namespace Discord.API [JsonProperty("proxy_url")] public string ProxyUrl { get; set; } [JsonProperty("height")] - public int? Height { get; set; } + public int Height { get; set; } [JsonProperty("width")] - public int? Width { get; set; } + public int Width { get; set; } } } diff --git a/src/Discord.Net/API/Common/Game.cs b/src/Discord.Net/API/Common/Game.cs index 76a18483c..ec0fccc84 100644 --- a/src/Discord.Net/API/Common/Game.cs +++ b/src/Discord.Net/API/Common/Game.cs @@ -7,8 +7,8 @@ namespace Discord.API [JsonProperty("name")] public string Name { get; set; } [JsonProperty("url")] - public string StreamUrl { get; set; } + public Optional StreamUrl { get; set; } [JsonProperty("type")] - public StreamType? StreamType { get; set; } + public Optional StreamType { get; set; } } } diff --git a/src/Discord.Net/API/Common/GuildEmbed.cs b/src/Discord.Net/API/Common/GuildEmbed.cs index 9aceaa472..59f933f31 100644 --- a/src/Discord.Net/API/Common/GuildEmbed.cs +++ b/src/Discord.Net/API/Common/GuildEmbed.cs @@ -7,6 +7,6 @@ namespace Discord.API [JsonProperty("enabled")] public bool Enabled { get; set; } [JsonProperty("channel_id")] - public ulong? ChannelId { get; set; } + public ulong ChannelId { get; set; } } } diff --git a/src/Discord.Net/API/Common/GuildMember.cs b/src/Discord.Net/API/Common/GuildMember.cs index fb0157a90..b97775c81 100644 --- a/src/Discord.Net/API/Common/GuildMember.cs +++ b/src/Discord.Net/API/Common/GuildMember.cs @@ -10,12 +10,12 @@ namespace Discord.API [JsonProperty("nick")] public Optional Nick { get; set; } [JsonProperty("roles")] - public Optional Roles { get; set; } + public ulong[] Roles { get; set; } [JsonProperty("joined_at")] - public Optional JoinedAt { get; set; } + public DateTime JoinedAt { get; set; } [JsonProperty("deaf")] - public Optional Deaf { get; set; } + public bool Deaf { get; set; } [JsonProperty("mute")] - public Optional Mute { get; set; } + public bool Mute { get; set; } } } diff --git a/src/Discord.Net/API/Common/Presence.cs b/src/Discord.Net/API/Common/Presence.cs index ce4edfb0f..9cf5e1d5b 100644 --- a/src/Discord.Net/API/Common/Presence.cs +++ b/src/Discord.Net/API/Common/Presence.cs @@ -7,7 +7,9 @@ namespace Discord.API [JsonProperty("user")] public User User { get; set; } [JsonProperty("guild_id")] - public ulong? GuildId { get; set; } + public Optional GuildId { get; set; } + [JsonProperty("roles")] + public Optional Roles { get; set; } [JsonProperty("status")] public UserStatus Status { get; set; } [JsonProperty("game")] diff --git a/src/Discord.Net/API/Common/ReadState.cs b/src/Discord.Net/API/Common/ReadState.cs index e4177bedf..4a5fa26ef 100644 --- a/src/Discord.Net/API/Common/ReadState.cs +++ b/src/Discord.Net/API/Common/ReadState.cs @@ -9,6 +9,6 @@ namespace Discord.API [JsonProperty("mention_count")] public int MentionCount { get; set; } [JsonProperty("last_message_id")] - public ulong? LastMessageId { get; set; } + public Optional LastMessageId { get; set; } } } diff --git a/src/Discord.Net/API/Common/Role.cs b/src/Discord.Net/API/Common/Role.cs index 721b2a50b..90931c182 100644 --- a/src/Discord.Net/API/Common/Role.cs +++ b/src/Discord.Net/API/Common/Role.cs @@ -9,14 +9,14 @@ namespace Discord.API [JsonProperty("name")] public string Name { get; set; } [JsonProperty("color")] - public uint? Color { get; set; } + public uint Color { get; set; } [JsonProperty("hoist")] - public bool? Hoist { get; set; } + public bool Hoist { get; set; } [JsonProperty("position")] - public int? Position { get; set; } + public int Position { get; set; } [JsonProperty("permissions"), Int53] - public ulong? Permissions { get; set; } + public ulong Permissions { get; set; } [JsonProperty("managed")] - public bool? Managed { get; set; } + public bool Managed { get; set; } } } diff --git a/src/Discord.Net/API/DiscordAPIClient.cs b/src/Discord.Net/API/DiscordAPIClient.cs index 95b331b1e..04ba4a549 100644 --- a/src/Discord.Net/API/DiscordAPIClient.cs +++ b/src/Discord.Net/API/DiscordAPIClient.cs @@ -391,7 +391,7 @@ namespace Discord.API try { var model = await SendAsync("GET", $"channels/{channelId}", options: options).ConfigureAwait(false); - if (model.GuildId != guildId) + if (!model.GuildId.IsSpecified || model.GuildId.Value != guildId) return null; return model; } diff --git a/src/Discord.Net/DiscordClient.cs b/src/Discord.Net/DiscordClient.cs index 0a33d9f4c..ec170c1b1 100644 --- a/src/Discord.Net/DiscordClient.cs +++ b/src/Discord.Net/DiscordClient.cs @@ -133,7 +133,7 @@ namespace Discord var model = await ApiClient.GetChannelAsync(id).ConfigureAwait(false); if (model != null) { - if (model.GuildId != null) + if (model.GuildId.IsSpecified) { var guildModel = await ApiClient.GetGuildAsync(model.GuildId.Value).ConfigureAwait(false); if (guildModel != null) @@ -143,7 +143,7 @@ namespace Discord } } else - return new DMChannel(this, new User(this, model.Recipient), model); + return new DMChannel(this, new User(this, model.Recipient.Value), model); } return null; } @@ -151,7 +151,7 @@ namespace Discord public virtual async Task> GetDMChannelsAsync() { var models = await ApiClient.GetMyDMsAsync().ConfigureAwait(false); - return models.Select(x => new DMChannel(this, new User(this, x.Recipient), x)).ToImmutableArray(); + return models.Select(x => new DMChannel(this, new User(this, x.Recipient.Value), x)).ToImmutableArray(); } /// diff --git a/src/Discord.Net/DiscordSocketClient.cs b/src/Discord.Net/DiscordSocketClient.cs index 509139ca7..d1fb90302 100644 --- a/src/Discord.Net/DiscordSocketClient.cs +++ b/src/Discord.Net/DiscordSocketClient.cs @@ -239,7 +239,7 @@ namespace Discord } internal CachedDMChannel AddDMChannel(API.Channel model, DataStore dataStore) { - var recipient = GetOrAddUser(model.Recipient, dataStore); + var recipient = GetOrAddUser(model.Recipient.Value, dataStore); var channel = recipient.AddDMChannel(model); dataStore.AddChannel(channel); return channel; @@ -457,7 +457,7 @@ namespace Discord var data = (payload as JToken).ToObject(_serializer); ICachedChannel channel = null; - if (data.GuildId != null) + if (data.GuildId.IsSpecified) { var guild = DataStore.GetGuild(data.GuildId.Value); if (guild != null) @@ -499,7 +499,7 @@ namespace Discord ICachedChannel channel = null; var data = (payload as JToken).ToObject(_serializer); - if (data.GuildId != null) + if (data.GuildId.IsSpecified) { var guild = DataStore.GetGuild(data.GuildId.Value); if (guild != null) @@ -812,13 +812,7 @@ namespace Discord await _gatewayLogger.DebugAsync("Received Dispatch (PRESENCE_UPDATE)").ConfigureAwait(false); var data = (payload as JToken).ToObject(_serializer); - if (data.GuildId == null) - { - var user = DataStore.GetUser(data.User.Id); - if (user == null) - user.Update(data, UpdateSource.WebSocket); - } - else + if (data.GuildId.IsSpecified) { var guild = DataStore.GetGuild(data.GuildId.Value); if (guild == null) @@ -831,6 +825,12 @@ namespace Discord else guild.AddOrUpdatePresence(data); } + else + { + var user = DataStore.GetUser(data.User.Id); + if (user == null) + user.Update(data, UpdateSource.WebSocket); + } } break; case "TYPING_START": diff --git a/src/Discord.Net/Entities/Channels/DMChannel.cs b/src/Discord.Net/Entities/Channels/DMChannel.cs index ca9d1c1f3..50d275f44 100644 --- a/src/Discord.Net/Entities/Channels/DMChannel.cs +++ b/src/Discord.Net/Entities/Channels/DMChannel.cs @@ -30,7 +30,7 @@ namespace Discord { if (source == UpdateSource.Rest && IsAttached) return; - Recipient.Update(model.Recipient, UpdateSource.Rest); + Recipient.Update(model.Recipient.Value, UpdateSource.Rest); } public async Task UpdateAsync() diff --git a/src/Discord.Net/Entities/Channels/GuildChannel.cs b/src/Discord.Net/Entities/Channels/GuildChannel.cs index 2459b3103..2bb752078 100644 --- a/src/Discord.Net/Entities/Channels/GuildChannel.cs +++ b/src/Discord.Net/Entities/Channels/GuildChannel.cs @@ -34,15 +34,13 @@ namespace Discord { if (source == UpdateSource.Rest && IsAttached) return; - Name = model.Name; - Position = model.Position; + Name = model.Name.Value; + Position = model.Position.Value; + var overwrites = model.PermissionOverwrites.Value; var newOverwrites = new ConcurrentDictionary(); - for (int i = 0; i < model.PermissionOverwrites.Length; i++) - { - var overwrite = model.PermissionOverwrites[i]; - newOverwrites[overwrite.TargetId] = new Overwrite(overwrite); - } + for (int i = 0; i < overwrites.Length; i++) + newOverwrites[overwrites[i].TargetId] = new Overwrite(overwrites[i]); _overwrites = newOverwrites; } diff --git a/src/Discord.Net/Entities/Channels/TextChannel.cs b/src/Discord.Net/Entities/Channels/TextChannel.cs index 78ec865fe..6f01a263a 100644 --- a/src/Discord.Net/Entities/Channels/TextChannel.cs +++ b/src/Discord.Net/Entities/Channels/TextChannel.cs @@ -26,7 +26,7 @@ namespace Discord { if (source == UpdateSource.Rest && IsAttached) return; - Topic = model.Topic; + Topic = model.Topic.Value; base.Update(model, source); } diff --git a/src/Discord.Net/Entities/Channels/VoiceChannel.cs b/src/Discord.Net/Entities/Channels/VoiceChannel.cs index dd6653942..745762876 100644 --- a/src/Discord.Net/Entities/Channels/VoiceChannel.cs +++ b/src/Discord.Net/Entities/Channels/VoiceChannel.cs @@ -22,8 +22,8 @@ namespace Discord if (source == UpdateSource.Rest && IsAttached) return; base.Update(model, source); - Bitrate = model.Bitrate; - UserLimit = model.UserLimit; + Bitrate = model.Bitrate.Value; + UserLimit = model.UserLimit.Value; } public async Task ModifyAsync(Action func) diff --git a/src/Discord.Net/Entities/Guilds/Guild.cs b/src/Discord.Net/Entities/Guilds/Guild.cs index 0778d3597..3291a4e7d 100644 --- a/src/Discord.Net/Entities/Guilds/Guild.cs +++ b/src/Discord.Net/Entities/Guilds/Guild.cs @@ -288,14 +288,14 @@ namespace Discord internal GuildChannel ToChannel(API.Channel model) { - switch (model.Type) + switch (model.Type.Value) { case ChannelType.Text: return new TextChannel(this, model); case ChannelType.Voice: return new VoiceChannel(this, model); default: - throw new InvalidOperationException($"Unknown channel type: {model.Type}"); + throw new InvalidOperationException($"Unknown channel type: {model.Type.Value}"); } } diff --git a/src/Discord.Net/Entities/Invites/IInviteMetadata.cs b/src/Discord.Net/Entities/Invites/IInviteMetadata.cs index 45b936b22..eb897c994 100644 --- a/src/Discord.Net/Entities/Invites/IInviteMetadata.cs +++ b/src/Discord.Net/Entities/Invites/IInviteMetadata.cs @@ -4,6 +4,8 @@ namespace Discord { public interface IInviteMetadata : IInvite { + /// Gets the user that created this invite. + IUser Inviter { get; } /// Returns true if this invite was revoked. bool IsRevoked { get; } /// Returns true if users accepting this invite will be removed from the guild when they log off. diff --git a/src/Discord.Net/Entities/Invites/InviteMetadata.cs b/src/Discord.Net/Entities/Invites/InviteMetadata.cs index 1661f45d5..2f33efdd4 100644 --- a/src/Discord.Net/Entities/Invites/InviteMetadata.cs +++ b/src/Discord.Net/Entities/Invites/InviteMetadata.cs @@ -11,6 +11,7 @@ namespace Discord public int? MaxUses { get; private set; } public int Uses { get; private set; } public DateTime CreatedAt { get; private set; } + public IUser Inviter { get; private set; } public InviteMetadata(DiscordClient client, Model model) : base(client, model) @@ -21,6 +22,7 @@ namespace Discord { if (source == UpdateSource.Rest && IsAttached) return; + Inviter = new User(Discord, model.Inviter); IsRevoked = model.Revoked; IsTemporary = model.Temporary; MaxAge = model.MaxAge != 0 ? model.MaxAge : (int?)null; diff --git a/src/Discord.Net/Entities/Roles/Role.cs b/src/Discord.Net/Entities/Roles/Role.cs index 9511ce67e..dd06cc507 100644 --- a/src/Discord.Net/Entities/Roles/Role.cs +++ b/src/Discord.Net/Entities/Roles/Role.cs @@ -37,11 +37,11 @@ namespace Discord if (source == UpdateSource.Rest && IsAttached) return; Name = model.Name; - IsHoisted = model.Hoist.Value; - IsManaged = model.Managed.Value; - Position = model.Position.Value; - Color = new Color(model.Color.Value); - Permissions = new GuildPermissions(model.Permissions.Value); + IsHoisted = model.Hoist; + IsManaged = model.Managed; + Position = model.Position; + Color = new Color(model.Color); + Permissions = new GuildPermissions(model.Permissions); } public async Task ModifyAsync(Action func) diff --git a/src/Discord.Net/Entities/Users/Game.cs b/src/Discord.Net/Entities/Users/Game.cs index 18cc4665a..c54ca2342 100644 --- a/src/Discord.Net/Entities/Users/Game.cs +++ b/src/Discord.Net/Entities/Users/Game.cs @@ -17,6 +17,6 @@ namespace Discord public Game(string name) : this(name, null, StreamType.NotStreaming) { } internal Game(Model model) - : this(model.Name, model.StreamUrl, model.StreamType ?? StreamType.NotStreaming) { } + : this(model.Name, model.StreamUrl.GetValueOrDefault(null), model.StreamType.GetValueOrDefault(null) ?? StreamType.NotStreaming) { } } } diff --git a/src/Discord.Net/Entities/Users/GuildUser.cs b/src/Discord.Net/Entities/Users/GuildUser.cs index 0ea00639d..90e19614c 100644 --- a/src/Discord.Net/Entities/Users/GuildUser.cs +++ b/src/Discord.Net/Entities/Users/GuildUser.cs @@ -6,6 +6,7 @@ using System.Diagnostics; using System.Linq; using System.Threading.Tasks; using Model = Discord.API.GuildMember; +using PresenceModel = Discord.API.Presence; using VoiceStateModel = Discord.API.VoiceState; namespace Discord @@ -47,29 +48,24 @@ namespace Discord { if (source == UpdateSource.Rest && IsAttached) return; - if (model.Deaf.IsSpecified) - IsDeaf = model.Deaf.Value; - if (model.Mute.IsSpecified) - IsMute = model.Mute.Value; - if (model.JoinedAt.IsSpecified) - JoinedAt = model.JoinedAt.Value; + //if (model.Deaf.IsSpecified) + IsDeaf = model.Deaf; + //if (model.Mute.IsSpecified) + IsMute = model.Mute; + //if (model.JoinedAt.IsSpecified) + JoinedAt = model.JoinedAt; if (model.Nick.IsSpecified) Nickname = model.Nick.Value; + //if (model.Roles.IsSpecified) + UpdateRoles(model.Roles); + } + public void Update(PresenceModel model, UpdateSource source) + { + if (source == UpdateSource.Rest && IsAttached) return; + if (model.Roles.IsSpecified) - { - var value = model.Roles.Value; - var roles = ImmutableArray.CreateBuilder(value.Length + 1); - roles.Add(Guild.EveryoneRole); - for (int i = 0; i < value.Length; i++) - { - var role = Guild.GetRole(value[i]); - if (role != null) - roles.Add(role); - } - Roles = roles.ToImmutable(); - GuildPermissions = new GuildPermissions(Permissions.ResolveGuild(this)); - } + UpdateRoles(model.Roles.Value); } public void Update(VoiceStateModel model, UpdateSource source) { @@ -78,6 +74,19 @@ namespace Discord IsDeaf = model.Deaf; IsMute = model.Mute; } + private void UpdateRoles(ulong[] roleIds) + { + var roles = ImmutableArray.CreateBuilder(roleIds.Length + 1); + roles.Add(Guild.EveryoneRole); + for (int i = 0; i < roleIds.Length; i++) + { + var role = Guild.GetRole(roleIds[i]); + if (role != null) + roles.Add(role); + } + Roles = roles.ToImmutable(); + GuildPermissions = new GuildPermissions(Permissions.ResolveGuild(this)); + } public async Task UpdateAsync() { diff --git a/src/Discord.Net/Entities/WebSocket/CachedGuild.cs b/src/Discord.Net/Entities/WebSocket/CachedGuild.cs index f8e3c3da0..08c9b2d38 100644 --- a/src/Discord.Net/Entities/WebSocket/CachedGuild.cs +++ b/src/Discord.Net/Entities/WebSocket/CachedGuild.cs @@ -79,23 +79,22 @@ namespace Discord _channels = channels; var presences = new ConcurrentDictionary(); + var members = new ConcurrentDictionary(); if (model.Presences != null) { for (int i = 0; i < model.Presences.Length; i++) - AddOrUpdatePresence(model.Presences[i], presences); + AddOrUpdatePresence(model.Presences[i], presences, members); } - _presences = presences; - - var members = new ConcurrentDictionary(); if (model.Members != null) { for (int i = 0; i < model.Members.Length; i++) AddUser(model.Members[i], dataStore, members); - _downloaderPromise = new TaskCompletionSource(); DownloadedMemberCount = model.Members.Length; + _downloaderPromise = new TaskCompletionSource(); if (!model.Large) _downloaderPromise.SetResult(true); } + _presences = presences; _members = members; var voiceStates = new ConcurrentDictionary(); @@ -125,7 +124,8 @@ namespace Discord return Discord.DataStore.RemoveChannel(id) as ICachedGuildChannel; } - public Presence AddOrUpdatePresence(PresenceModel model, ConcurrentDictionary presences = null) + public Presence AddOrUpdatePresence(PresenceModel model, ConcurrentDictionary presences = null, + ConcurrentDictionary members = null) { var game = model.Game != null ? new Game(model.Game) : (Game?)null; var presence = new Presence(model.Status, game); @@ -229,14 +229,14 @@ namespace Discord new internal ICachedGuildChannel ToChannel(ChannelModel model) { - switch (model.Type) + switch (model.Type.Value) { case ChannelType.Text: return new CachedTextChannel(this, model); case ChannelType.Voice: return new CachedVoiceChannel(this, model); default: - throw new InvalidOperationException($"Unknown channel type: {model.Type}"); + throw new InvalidOperationException($"Unknown channel type: {model.Type.Value}"); } } } diff --git a/src/Discord.Net/project.json b/src/Discord.Net/project.json index c2cb3b6c8..7f202690e 100644 --- a/src/Discord.Net/project.json +++ b/src/Discord.Net/project.json @@ -15,7 +15,6 @@ "buildOptions": { "allowUnsafe": true, - "define": [ "BENCHMARK" ], "warningsAsErrors": false },