Browse Source

Improved GlobalUser cache

tags/docs-0.9
RogueException 9 years ago
parent
commit
649db2d8f8
4 changed files with 29 additions and 49 deletions
  1. +1
    -1
      src/Discord.Net/DiscordClient.Members.cs
  2. +4
    -1
      src/Discord.Net/DiscordClient.Messages.cs
  3. +11
    -25
      src/Discord.Net/Models/GlobalUser.cs
  4. +13
    -22
      src/Discord.Net/Models/User.cs

+ 1
- 1
src/Discord.Net/DiscordClient.Members.cs View File

@@ -10,7 +10,7 @@ namespace Discord
public Members(DiscordClient client, object writerLock)
: base(client, writerLock, x => x.OnCached(), x => x.OnUncached()) { }
private string GetKey(string userId, string serverId)
=> (serverId ?? "Private") + '_' + userId;
=> User.GetId(userId, serverId);

public User this[string userId, string serverId]
=> this[GetKey(userId, serverId)];


+ 4
- 1
src/Discord.Net/DiscordClient.Messages.cs View File

@@ -13,7 +13,10 @@ namespace Discord
private bool _isEnabled;

public Messages(DiscordClient client, object writerLock, bool isEnabled)
: base(client, writerLock, x => x.OnCached(), x => x.OnUncached()) { }
: base(client, writerLock, x => x.OnCached(), x => x.OnUncached())
{
_isEnabled = isEnabled;
}

public Message GetOrAdd(string id, string channelId, string userId)
{


+ 11
- 25
src/Discord.Net/Models/GlobalUser.cs View File

@@ -9,9 +9,8 @@ namespace Discord
{
internal sealed class GlobalUser : CachedObject
{
private readonly ConcurrentDictionary<string, bool> _servers;
private int _refCount;
private readonly ConcurrentDictionary<string, User> _users;

/// <summary> Returns the email for this user. </summary>
/// <remarks> This field is only ever populated for the current logged in user. </remarks>
[JsonIgnore]
@@ -27,15 +26,12 @@ namespace Discord

/// <summary> Returns a collection of all server-specific data for every server this user is a member of. </summary>
[JsonIgnore]
public IEnumerable<User> Memberships => _servers.Select(x => _client.Members[Id, x.Key]);
/// <summary> Returns a collection of all servers this user is a member of. </summary>
[JsonIgnore]
public IEnumerable<Server> Servers => _servers.Select(x => _client.Servers[x.Key]);
public IEnumerable<User> Memberships => _users.Select(x => _client.Members[Id, x.Key]);

internal GlobalUser(DiscordClient client, string id)
: base(client, id)
{
_servers = new ConcurrentDictionary<string, bool>();
_users = new ConcurrentDictionary<string, User>();
}
internal override void OnCached() { }
internal override void OnUncached() { }
@@ -48,24 +44,14 @@ namespace Discord
IsVerified = model.IsVerified;
}

internal void AddServer(string serverId)
{
_servers.TryAdd(serverId, true);
}
internal bool RemoveServer(string serverId)
{
bool ignored;
return _servers.TryRemove(serverId, out ignored);
}

internal void AddRef()
{
Interlocked.Increment(ref _refCount);
}
internal void RemoveRef()
internal void AddUser(User user) => _users.TryAdd(user.Id, user);
internal void RemoveUser(User user)
{
if (Interlocked.Decrement(ref _refCount) == 0)
_client.Users.TryRemove(Id);
if (_users.TryRemove(user.Id, out user))
{
if (_users.Count == 0)
_client.Users.TryRemove(Id);
}
}

public override string ToString() => Id;


+ 13
- 22
src/Discord.Net/Models/User.cs View File

@@ -11,12 +11,15 @@ namespace Discord
{
private static readonly string[] _initialRoleIds = new string[0];

internal static string GetId(string userId, string serverId) => (serverId ?? "Private") + '_' + userId;

private ConcurrentDictionary<string, Channel> _channels;
private ConcurrentDictionary<string, ChannelPermissions> _permissions;
private ServerPermissions _serverPermissions;
private bool _hasRef;
private string[] _roleIds;

/// <summary> Returns a unique identifier combining this user's id with its server's. </summary>
internal string UniqueId => GetId(Id, ServerId);
/// <summary> Returns the name of this user on this server. </summary>
public string Name { get; private set; }
/// <summary> Returns a by-name unique identifier separating this user from others with the same name. </summary>
@@ -81,20 +84,13 @@ namespace Discord
internal override void OnCached()
{
var server = Server;
if (server != null)
{
server.AddMember(this);
if (Id == _client.CurrentUserId)
server.CurrentMember = this;
}
server.AddMember(this);
if (Id == _client.CurrentUserId)
server.CurrentMember = this;

var user = GlobalUser;
if (user != null)
{
if (server == null || !server.IsVirtual)
user.AddServer(ServerId);
user.AddRef();
_hasRef = true;
}
if (server == null || !server.IsVirtual)
user.AddUser(this);
}
internal override void OnUncached()
{
@@ -105,14 +101,9 @@ namespace Discord
if (Id == _client.CurrentUserId)
server.CurrentMember = null;
}
var user = GlobalUser;
if (user != null)
{
user.RemoveServer(ServerId);
if (_hasRef)
user.RemoveRef();
}
_hasRef = false;
var globalUser = GlobalUser;
if (globalUser != null)
globalUser.RemoveUser(this);
}

public override string ToString() => Id;


Loading…
Cancel
Save