diff --git a/src/Discord.Net/DiscordSocketClient.cs b/src/Discord.Net/DiscordSocketClient.cs index c1abfb6d3..8e29b1097 100644 --- a/src/Discord.Net/DiscordSocketClient.cs +++ b/src/Discord.Net/DiscordSocketClient.cs @@ -596,7 +596,7 @@ namespace Discord } } break; - case "GUILD_EMOJIS_UPDATE": //TODO: Add + case "GUILD_EMOJIS_UPDATE": { await _gatewayLogger.DebugAsync("Received Dispatch (GUILD_EMOJIS_UPDATE)").ConfigureAwait(false); diff --git a/src/Discord.Net/Entities/Channels/DMChannel.cs b/src/Discord.Net/Entities/Channels/DMChannel.cs index 7df415b49..b940397ad 100644 --- a/src/Discord.Net/Entities/Channels/DMChannel.cs +++ b/src/Discord.Net/Entities/Channels/DMChannel.cs @@ -28,11 +28,9 @@ namespace Discord } public void Update(Model model, UpdateSource source) { - if (source == UpdateSource.Rest && IsAttached) return; + if (/*source == UpdateSource.Rest && */IsAttached) return; - //TODO: Is this cast okay? - if (Recipient is User) - (Recipient as User).Update(model.Recipient.Value, source); + (Recipient as User).Update(model.Recipient.Value, source); } public async Task UpdateAsync() diff --git a/src/Discord.Net/Entities/WebSocket/CachedDMUser.cs b/src/Discord.Net/Entities/WebSocket/CachedDMUser.cs index cddd91c4f..9cb5ffdb3 100644 --- a/src/Discord.Net/Entities/WebSocket/CachedDMUser.cs +++ b/src/Discord.Net/Entities/WebSocket/CachedDMUser.cs @@ -7,11 +7,12 @@ namespace Discord { public CachedGlobalUser User { get; } - public Game Game { get; private set; } - public UserStatus Status { get; private set; } - public DiscordSocketClient Discord => User.Discord; - + + public Game Game => Presence.Game; + public UserStatus Status => Presence.Status; + public Presence Presence => User.Presence; //{ get; private set; } + public ulong Id => User.Id; public string AvatarUrl => User.AvatarUrl; public DateTimeOffset CreatedAt => User.CreatedAt; @@ -30,8 +31,7 @@ namespace Discord public void Update(PresenceModel model, UpdateSource source) { - Status = model.Status; - Game = model.Game != null ? new Game(model.Game) : null; + User.Update(model, source); } public CachedDMUser Clone() => MemberwiseClone() as CachedDMUser; diff --git a/src/Discord.Net/Entities/WebSocket/CachedGlobalUser.cs b/src/Discord.Net/Entities/WebSocket/CachedGlobalUser.cs index 6d101870e..04ff30eb0 100644 --- a/src/Discord.Net/Entities/WebSocket/CachedGlobalUser.cs +++ b/src/Discord.Net/Entities/WebSocket/CachedGlobalUser.cs @@ -1,6 +1,6 @@ using System; -using Discord.API; using Model = Discord.API.User; +using PresenceModel = Discord.API.Presence; namespace Discord { @@ -8,9 +8,9 @@ namespace Discord { private ushort _references; + public Presence Presence { get; private set; } + public new DiscordSocketClient Discord { get { throw new NotSupportedException(); } } - public override UserStatus Status => UserStatus.Unknown;// _status; - public override Game Game => null; //_game; public CachedGlobalUser(Model model) : base(model) @@ -39,6 +39,16 @@ namespace Discord lock (this) base.Update(model, source); } + public void Update(PresenceModel model, UpdateSource source) + { + //Race conditions are okay here. Multiple shards racing already cant guarantee presence in order. + + //lock (this) + //{ + var game = model.Game != null ? new Game(model.Game) : null; + Presence = new Presence(game, model.Status); + //} + } public CachedGlobalUser Clone() => MemberwiseClone() as CachedGlobalUser; ICachedUser ICachedUser.Clone() => Clone(); diff --git a/src/Discord.Net/Entities/WebSocket/CachedGuildUser.cs b/src/Discord.Net/Entities/WebSocket/CachedGuildUser.cs index 0b84d227b..d165f43c2 100644 --- a/src/Discord.Net/Entities/WebSocket/CachedGuildUser.cs +++ b/src/Discord.Net/Entities/WebSocket/CachedGuildUser.cs @@ -3,28 +3,12 @@ using PresenceModel = Discord.API.Presence; namespace Discord { - //TODO: C#7 Candidate for record type - internal struct Presence : IPresence - { - public Game Game { get; } - public UserStatus Status { get; } - - public Presence(Game game, UserStatus status) - { - Game = game; - Status = status; - } - - public Presence Clone() => this; - } - internal class CachedGuildUser : GuildUser, ICachedUser { - public Presence Presence { get; private set; } - public new DiscordSocketClient Discord => base.Discord as DiscordSocketClient; public new CachedGuild Guild => base.Guild as CachedGuild; public new CachedGlobalUser User => base.User as CachedGlobalUser; + public Presence Presence => User.Presence; //{ get; private set; } public override Game Game => Presence.Game; public override UserStatus Status => Presence.Status; @@ -38,7 +22,7 @@ namespace Discord public CachedGuildUser(CachedGuild guild, CachedGlobalUser user, Model model) : base(guild, user, model) { - Presence = new Presence(null, UserStatus.Offline); + //Presence = new Presence(null, UserStatus.Offline); } public CachedGuildUser(CachedGuild guild, CachedGlobalUser user, PresenceModel model) : base(guild, user, model) @@ -50,7 +34,9 @@ namespace Discord base.Update(model, source); var game = model.Game != null ? new Game(model.Game) : null; - Presence = new Presence(game, model.Status); + //Presence = new Presence(game, model.Status); + + User.Update(model, source); } public CachedGuildUser Clone() => MemberwiseClone() as CachedGuildUser; diff --git a/src/Discord.Net/Entities/WebSocket/Presence.cs b/src/Discord.Net/Entities/WebSocket/Presence.cs new file mode 100644 index 000000000..fa34251f8 --- /dev/null +++ b/src/Discord.Net/Entities/WebSocket/Presence.cs @@ -0,0 +1,17 @@ +namespace Discord +{ + //TODO: C#7 Candidate for record type + internal struct Presence : IPresence + { + public Game Game { get; } + public UserStatus Status { get; } + + public Presence(Game game, UserStatus status) + { + Game = game; + Status = status; + } + + public Presence Clone() => this; + } +}