From 8b261fbd8ce67d2644e03e02603deeef611a43b8 Mon Sep 17 00:00:00 2001 From: RogueException Date: Sat, 2 Jan 2016 03:00:20 -0400 Subject: [PATCH] Revert "Improved load performance when in many servers" This reverts commit 587ec6fa1399bb1b4377fe2093819105ac9ac4b4. --- src/Discord.Net/DiscordClient.cs | 8 ++- src/Discord.Net/Models/Server.cs | 92 +++++++------------------------- 2 files changed, 22 insertions(+), 78 deletions(-) diff --git a/src/Discord.Net/DiscordClient.cs b/src/Discord.Net/DiscordClient.cs index 3b4552e35..ffae61cfd 100644 --- a/src/Discord.Net/DiscordClient.cs +++ b/src/Discord.Net/DiscordClient.cs @@ -427,9 +427,7 @@ namespace Discord #region Servers private Server AddServer(ulong id) - => _servers.GetOrAdd(id, x => new Server(this, id)); - private Server AddServer(API.Client.ExtendedGuild model) - => _servers.GetOrAdd(model.Id, x => new Server(this, model)); + => _servers.GetOrAdd(id, x => new Server(this, x)); private Server RemoveServer(ulong id) { Server server; @@ -498,7 +496,7 @@ namespace Discord { if (model.Unavailable != true) { - var server = AddServer(model); + var server = AddServer(model.Id); server.Update(model); } } @@ -528,7 +526,7 @@ namespace Discord var data = e.Payload.ToObject(_serializer); if (data.Unavailable != true) { - var server = AddServer(data); + var server = AddServer(data.Id); server.Update(data); if (Config.LogEvents) diff --git a/src/Discord.Net/Models/Server.cs b/src/Discord.Net/Models/Server.cs index 605357e4d..e54680d34 100644 --- a/src/Discord.Net/Models/Server.cs +++ b/src/Discord.Net/Models/Server.cs @@ -29,9 +29,9 @@ namespace Discord } } - private ConcurrentDictionary _roles; - private ConcurrentDictionary _users; - private ConcurrentDictionary _channels; + private readonly ConcurrentDictionary _roles; + private readonly ConcurrentDictionary _users; + private readonly ConcurrentDictionary _channels; private ulong _ownerId; private ulong? _afkChannelId; @@ -39,6 +39,11 @@ namespace Discord /// Gets the unique identifier for this server. public ulong Id { get; } + /// Gets the default channel for this server. + public Channel DefaultChannel { get; } + /// Gets the the role representing all users in a server. + public Role EveryoneRole { get; } + /// Gets the name of this server. public string Name { get; private set; } /// Gets the voice region for this server. @@ -49,10 +54,6 @@ namespace Discord public int AFKTimeout { get; private set; } /// Gets the date and time you joined this server. public DateTime JoinedAt { get; private set; } - /// Gets the default channel for this server. - public Channel DefaultChannel { get; private set; } - /// Gets the the role representing all users in a server. - public Role EveryoneRole { get; private set; } /// Gets the user that created this server. public User Owner => GetUser(_ownerId); @@ -75,23 +76,17 @@ namespace Discord public IEnumerable Users => _users.Select(x => x.Value.User); /// Gets a collection of all roles in this server. public IEnumerable Roles => _roles.Select(x => x.Value); - + internal Server(DiscordClient client, ulong id) { Client = client; Id = id; + _channels = new ConcurrentDictionary(); _roles = new ConcurrentDictionary(); _users = new ConcurrentDictionary(); - - EveryoneRole = new Role(id, this); - DefaultChannel = new Channel(client, id, this); - } - internal Server(DiscordClient client, ExtendedGuild model) - { - Client = client; - Id = model.Id; - Update(model); + DefaultChannel = AddChannel(id); + EveryoneRole = AddRole(id); } internal void Update(GuildReference model) @@ -123,78 +118,28 @@ namespace Discord } internal void Update(ExtendedGuild model) { - var everyone = EveryoneRole; - var defaultChannel = DefaultChannel; - - //Bulk create dictionary items - if (model.Members != null) - { - _users = new ConcurrentDictionary( - model.Members.Select(x => new KeyValuePair(x.User.Id, new Member(new User(Client, x.User.Id, this))))); - } - else - _users = new ConcurrentDictionary(); - if (model.Channels != null) - { - _channels = new ConcurrentDictionary( - model.Channels.Select(x => new KeyValuePair(x.Id, new Channel(Client, x.Id, this)))); - } - else - _channels = new ConcurrentDictionary(); - if (model.Roles != null) - { - _roles = new ConcurrentDictionary( - model.Roles.Select(x => new KeyValuePair(x.Id, new Role(x.Id, this)))); - } - else - _roles = new ConcurrentDictionary(); - - //Preserve old models - if (everyone != null) - _roles[Id] = everyone; - else - EveryoneRole = _roles[Id]; - if (defaultChannel != null) - _channels[Id] = defaultChannel; - else - DefaultChannel = _channels[Id]; + Update(model as Guild); - //Update models if (model.Channels != null) { foreach (var subModel in model.Channels) - { - var channel = _channels[subModel.Id]; - channel.Update(subModel); - Client.AddChannel(channel); - } + AddChannel(subModel.Id).Update(subModel); } if (model.Members != null) { foreach (var subModel in model.Members) - _users[subModel.User.Id].User.Update(subModel); + AddUser(subModel.User.Id).Update(subModel); } if (model.VoiceStates != null) { foreach (var subModel in model.VoiceStates) - _users[subModel.UserId].User.Update(subModel); + GetUser(subModel.UserId)?.Update(subModel); } if (model.Presences != null) { foreach (var subModel in model.Presences) - { - if (subModel.User.Username != null) - _users[subModel.User.Id].User.Update(subModel); - } - } - if (model.Roles != null) - { - foreach (var subModel in model.Roles) - _roles[subModel.Id].Update(subModel); + GetUser(subModel.User.Id)?.Update(subModel); } - - model.Roles = null; //Don't double-process roles - Update(model as Guild); } /// Edits this server, changing only non-null attributes. @@ -262,7 +207,8 @@ namespace Discord { var channel = new Channel(Client, id, this); Client.AddChannel(channel); - return _channels.GetOrAdd(id, x => channel); + channel = _channels.GetOrAdd(id, x => channel); + return channel; } internal Channel RemoveChannel(ulong id) {