diff --git a/src/Discord.Net/Helpers/Reference.cs b/src/Discord.Net/Helpers/Reference.cs index e02932e9b..4b2aecaa6 100644 --- a/src/Discord.Net/Helpers/Reference.cs +++ b/src/Discord.Net/Helpers/Reference.cs @@ -63,6 +63,6 @@ namespace Discord _getItem = getItem; _onCache = onCache; _onUncache = onUncache; - } + } } } diff --git a/src/Discord.Net/Models/Invite.cs b/src/Discord.Net/Models/Invite.cs index f08f1c6cc..a8f6caf73 100644 --- a/src/Discord.Net/Models/Invite.cs +++ b/src/Discord.Net/Models/Invite.cs @@ -26,24 +26,45 @@ namespace Discord [JsonIgnore] public User Inviter => _inviter.Value; private readonly Reference _inviter; + private User _generatedInviter; /// Returns the server this invite is to. [JsonIgnore] public Server Server => _server.Value; private readonly Reference _server; + private Server _generatedServer; /// Returns the channel this invite is to. [JsonIgnore] public Channel Channel => _channel.Value; private readonly Reference _channel; + private Channel _generatedChannel; internal Invite(DiscordClient client, string code, string xkcdPass, string serverId, string inviterId, string channelId) : base(client, code) { XkcdCode = xkcdPass; - _server = new Reference(serverId, x => _client.Servers[x] ?? new Server(client, x)); - _inviter = new Reference(serverId, x => _client.Users[x, _server.Id] ?? new User(client, x, _server.Id)); - _channel = new Reference(serverId, x => _client.Channels[x] ?? new Channel(client, x, _server.Id, null)); + _server = new Reference(serverId, x => + { + var server = _client.Servers[x]; + if (server == null) + server = _generatedServer = new Server(client, x); + return server; + }); + _inviter = new Reference(serverId, x => + { + var inviter = _client.Users[x, _server.Id]; + if (inviter == null) + inviter = _generatedInviter = new User(client, x, _server.Id); + return inviter; + }); + _channel = new Reference(serverId, x => + { + var channel = _client.Channels[x]; + if (channel == null) + channel = _generatedChannel = new Channel(client, x, _server.Id, null); + return channel; + }); } internal override void LoadReferences() { @@ -58,6 +79,13 @@ namespace Discord internal void Update(InviteInfo model) { + if (model.Guild != null && _generatedServer != null) + _generatedServer.Update(model.Guild); + if (model.Inviter != null && _generatedInviter != null) + _generatedInviter.Update(model.Inviter); + if (model.Channel != null && _generatedChannel != null) + _generatedChannel.Update(model.Channel); + if (model.IsRevoked != null) IsRevoked = model.IsRevoked.Value; if (model.IsTemporary != null) diff --git a/src/Discord.Net/Models/Server.cs b/src/Discord.Net/Models/Server.cs index d6689d1a4..f614be04e 100644 --- a/src/Discord.Net/Models/Server.cs +++ b/src/Discord.Net/Models/Server.cs @@ -123,15 +123,21 @@ namespace Discord _afkChannel.Unload(); } - internal void Update(GuildInfo model) + internal void Update(GuildReference model) { + if (model.Name != null) + Name = model.Name; + } + + internal void Update(GuildInfo model) + { + Update(model as GuildReference); + if (model.AFKTimeout != null) AFKTimeout = model.AFKTimeout.Value; if (model.AFKChannelId != null) if (model.JoinedAt != null) JoinedAt = model.JoinedAt.Value; - if (model.Name != null) - Name = model.Name; if (model.OwnerId != null && _ownerId != model.OwnerId) { _ownerId = model.OwnerId;