Clean up collections and references properly

This commit is contained in:
RogueException
2015-10-25 02:56:55 -03:00
parent 759506da87
commit b7ad4f603d
5 changed files with 23 additions and 21 deletions

View File

@@ -96,7 +96,6 @@ namespace Discord
var server = _client.Servers[_serverId]; var server = _client.Servers[_serverId];
server.AddChannel(this); server.AddChannel(this);
Server = server; Server = server;
Recipient = null;
} }
} }
internal override void OnUncached() internal override void OnUncached()
@@ -104,12 +103,16 @@ namespace Discord
var server = Server; var server = Server;
if (server != null) if (server != null)
server.RemoveChannel(this); server.RemoveChannel(this);
Server = null;
var recipient = Recipient; var recipient = Recipient;
if (recipient != null) if (recipient != null)
recipient.GlobalUser.PrivateChannel = null; recipient.GlobalUser.PrivateChannel = null;
Recipient = recipient;
var globalMessages = _client.Messages;
var messages = _messages;
foreach (var message in messages)
globalMessages.TryRemove(message.Key);
_messages.Clear();
} }
internal void Update(ChannelReference model) internal void Update(ChannelReference model)
@@ -148,8 +151,11 @@ namespace Discord
{ {
var oldest = _messages.Select(x => x.Value.Id).OrderBy(x => x).FirstOrDefault(); var oldest = _messages.Select(x => x.Value.Id).OrderBy(x => x).FirstOrDefault();
if (oldest != null) if (oldest != null)
{
if (_messages.TryRemove(oldest, out message))
_client.Messages.TryRemove(oldest); _client.Messages.TryRemove(oldest);
} }
}
_messages.TryAdd(message.Id, message); _messages.TryAdd(message.Id, message);
} }
} }

View File

@@ -72,12 +72,7 @@ namespace Discord
Channel = channel; Channel = channel;
} }
} }
internal override void OnUncached() internal override void OnUncached() { }
{
Server = null;
Inviter = null;
Channel = null;
}
public override string ToString() => XkcdCode ?? Id; public override string ToString() => XkcdCode ?? Id;

View File

@@ -167,12 +167,10 @@ namespace Discord
var channel = Channel; var channel = Channel;
if (channel != null) if (channel != null)
channel.RemoveMessage(this); channel.RemoveMessage(this);
Channel = null;
var user = User; /*var user = User;
/*if (user != null) if (user != null)
user.RemoveMessage(this);*/ user.RemoveMessage(this);*/
User = null;
} }
internal void Update(MessageInfo model) internal void Update(MessageInfo model)

View File

@@ -56,7 +56,6 @@ namespace Discord
var server = Server; var server = Server;
if (server != null) if (server != null)
server.RemoveRole(this); server.RemoveRole(this);
Server = null;
} }
internal void Update(RoleInfo model) internal void Update(RoleInfo model)

View File

@@ -82,14 +82,16 @@ namespace Discord
} }
internal override void OnCached() internal override void OnCached()
{ {
var server = _client.Servers[_serverId]; if (_serverId != null)
if (server != null)
{ {
var server = _client.Servers[_serverId];
server.AddMember(this); server.AddMember(this);
if (Id == _client.CurrentUserId) if (Id == _client.CurrentUserId)
server.CurrentMember = this; server.CurrentMember = this;
Server = server; Server = server;
} }
else
UpdateRoles(null);
var user = _client.GlobalUsers.GetOrAdd(Id); var user = _client.GlobalUsers.GetOrAdd(Id);
user.AddUser(this); user.AddUser(this);
@@ -105,12 +107,10 @@ namespace Discord
if (Id == _client.CurrentUserId) if (Id == _client.CurrentUserId)
server.CurrentMember = null; server.CurrentMember = null;
} }
Server = null;
var globalUser = GlobalUser; var globalUser = GlobalUser;
if (globalUser != null) if (globalUser != null)
globalUser.RemoveUser(this); globalUser.RemoveUser(this);
GlobalUser = null;
} }
public override string ToString() => Id; public override string ToString() => Id;
@@ -182,7 +182,11 @@ namespace Discord
} }
private void UpdateRoles(IEnumerable<Role> roles) private void UpdateRoles(IEnumerable<Role> roles)
{ {
var newRoles = roles.ToDictionary(x => x.Id, x => x); Dictionary<string, Role> newRoles;
if (roles != null)
newRoles = roles.ToDictionary(x => x.Id, x => x);
else
newRoles = new Dictionary<string, Role>();
Role everyone; Role everyone;
if (_serverId != null) if (_serverId != null)
everyone = Server.EveryoneRole; everyone = Server.EveryoneRole;