diff --git a/src/Discord.Net/Collections/AsyncCollection.cs b/src/Discord.Net/Collections/AsyncCollection.cs index 9d4a2d79b..63eb5513b 100644 --- a/src/Discord.Net/Collections/AsyncCollection.cs +++ b/src/Discord.Net/Collections/AsyncCollection.cs @@ -60,15 +60,18 @@ namespace Discord.Collections _dictionary = new ConcurrentDictionary(); } - protected TValue Get(string key) + public TValue this[string key] { - if (key == null) - return null; + get + { + if (key == null) + return null; - TValue result; - if (!_dictionary.TryGetValue(key, out result)) - return null; - return result; + TValue result; + if (!_dictionary.TryGetValue(key, out result)) + return null; + return result; + } } protected TValue GetOrAdd(string key, Func createFunc) { @@ -88,7 +91,7 @@ namespace Discord.Collections } return result; } - protected TValue TryRemove(string key) + public TValue TryRemove(string key) { if (_dictionary.ContainsKey(key)) { @@ -104,7 +107,7 @@ namespace Discord.Collections } return null; } - protected TValue Remap(string oldKey, string newKey) + public TValue Remap(string oldKey, string newKey) { if (_dictionary.ContainsKey(oldKey)) { diff --git a/src/Discord.Net/Collections/Channels.cs b/src/Discord.Net/Collections/Channels.cs index a2fb81b24..ec9d28c1c 100644 --- a/src/Discord.Net/Collections/Channels.cs +++ b/src/Discord.Net/Collections/Channels.cs @@ -2,13 +2,13 @@ namespace Discord.Collections { - public sealed class Channels : AsyncCollection - { - internal Channels(DiscordClient client, object writerLock) + internal sealed class Channels : AsyncCollection + { + public Channels(DiscordClient client, object writerLock) : base(client, writerLock) { } - - internal Channel GetOrAdd(string id, string serverId, string recipientId = null) => GetOrAdd(id, () => new Channel(_client, id, serverId, recipientId)); - internal new Channel TryRemove(string id) => base.TryRemove(id); + + public Channel GetOrAdd(string id, string serverId, string recipientId = null) + => GetOrAdd(id, () => new Channel(_client, id, serverId, recipientId)); protected override void OnCreated(Channel item) { @@ -43,14 +43,5 @@ namespace Discord.Collections } } } - - internal Channel this[string id] - { - get - { - if (id == null) throw new ArgumentNullException(nameof(id)); - return Get(id); - } - } } } diff --git a/src/Discord.Net/Collections/Members.cs b/src/Discord.Net/Collections/Members.cs index 363a5d37c..7801b8aa3 100644 --- a/src/Discord.Net/Collections/Members.cs +++ b/src/Discord.Net/Collections/Members.cs @@ -1,16 +1,18 @@ -using System; - -namespace Discord.Collections +namespace Discord.Collections { - public sealed class Members : AsyncCollection + internal sealed class Members : AsyncCollection { - internal Members(DiscordClient client, object writerLock) + public Members(DiscordClient client, object writerLock) : base(client, writerLock) { } + private string GetKey(string userId, string serverId) + => serverId + '_' + userId; - private string GetKey(string userId, string serverId) => serverId + '_' + userId; - - internal Member GetOrAdd(string userId, string serverId) => GetOrAdd(GetKey(userId, serverId), () => new Member(_client, userId, serverId)); - internal Member TryRemove(string userId, string serverId) => base.TryRemove(GetKey(userId, serverId)); + public Member this[string userId, string serverId] + => this[GetKey(userId, serverId)]; + public Member GetOrAdd(string userId, string serverId) + => GetOrAdd(GetKey(userId, serverId), () => new Member(_client, userId, serverId)); + public Member TryRemove(string userId, string serverId) + => TryRemove(GetKey(userId, serverId)); protected override void OnCreated(Member item) { @@ -36,15 +38,5 @@ namespace Discord.Collections user.RemoveRef(); } } - - internal Member this[string userId, string serverId] - { - get - { - if (serverId == null) throw new ArgumentNullException(nameof(serverId)); - if (userId == null) throw new ArgumentNullException(nameof(userId)); - return Get(GetKey(userId, serverId)); - } - } } } diff --git a/src/Discord.Net/Collections/Messages.cs b/src/Discord.Net/Collections/Messages.cs index 16b2d32a7..5e2b38ce3 100644 --- a/src/Discord.Net/Collections/Messages.cs +++ b/src/Discord.Net/Collections/Messages.cs @@ -1,15 +1,12 @@ -using System; - -namespace Discord.Collections +namespace Discord.Collections { - public sealed class Messages : AsyncCollection + internal sealed class Messages : AsyncCollection { - internal Messages(DiscordClient client, object writerLock) + public Messages(DiscordClient client, object writerLock) : base(client, writerLock) { } - - internal Message GetOrAdd(string id, string channelId, string userId) => GetOrAdd(id, () => new Message(_client, id, channelId, userId)); - internal new Message TryRemove(string id) => base.TryRemove(id); - internal new Message Remap(string oldKey, string newKey) => base.Remap(oldKey, newKey); + + public Message GetOrAdd(string id, string channelId, string userId) + => GetOrAdd(id, () => new Message(_client, id, channelId, userId)); protected override void OnCreated(Message item) { @@ -25,14 +22,5 @@ namespace Discord.Collections if (user != null) user.RemoveRef(); } - - internal Message this[string id] - { - get - { - if (id == null) throw new ArgumentNullException(nameof(id)); - return Get(id); - } - } } } diff --git a/src/Discord.Net/Collections/Roles.cs b/src/Discord.Net/Collections/Roles.cs index fd83a7c1e..4bc4bd1d8 100644 --- a/src/Discord.Net/Collections/Roles.cs +++ b/src/Discord.Net/Collections/Roles.cs @@ -1,14 +1,12 @@ -using System; - -namespace Discord.Collections +namespace Discord.Collections { - public sealed class Roles : AsyncCollection + internal sealed class Roles : AsyncCollection { - internal Roles(DiscordClient client, object writerLock) + public Roles(DiscordClient client, object writerLock) : base(client, writerLock) { } - internal Role GetOrAdd(string id, string serverId) => GetOrAdd(id, () => new Role(_client, id, serverId)); - internal new Role TryRemove(string id) => base.TryRemove(id); + public Role GetOrAdd(string id, string serverId) + => GetOrAdd(id, () => new Role(_client, id, serverId)); protected override void OnCreated(Role item) { @@ -20,14 +18,5 @@ namespace Discord.Collections if (server != null) item.Server.RemoveRole(item.Id); } - - internal Role this[string id] - { - get - { - if (id == null) throw new ArgumentNullException(nameof(id)); - return Get(id); - } - } } } diff --git a/src/Discord.Net/Collections/Servers.cs b/src/Discord.Net/Collections/Servers.cs index ddd44071a..977c3b99f 100644 --- a/src/Discord.Net/Collections/Servers.cs +++ b/src/Discord.Net/Collections/Servers.cs @@ -4,13 +4,13 @@ using System.Linq; namespace Discord.Collections { - public sealed class Servers : AsyncCollection + internal sealed class Servers : AsyncCollection { - internal Servers(DiscordClient client, object writerLock) + public Servers(DiscordClient client, object writerLock) : base(client, writerLock) { } - internal Server GetOrAdd(string id) => base.GetOrAdd(id, () => new Server(_client, id)); - internal new Server TryRemove(string id) => base.TryRemove(id); + public Server GetOrAdd(string id) + => base.GetOrAdd(id, () => new Server(_client, id)); protected override void OnRemoved(Server item) { @@ -26,7 +26,5 @@ namespace Discord.Collections foreach (var roleId in item.RoleIds) roles.TryRemove(roleId); } - - internal Server this[string id] => Get(id); } } diff --git a/src/Discord.Net/Collections/Users.cs b/src/Discord.Net/Collections/Users.cs index 90317b65b..31d12c1e2 100644 --- a/src/Discord.Net/Collections/Users.cs +++ b/src/Discord.Net/Collections/Users.cs @@ -1,25 +1,10 @@ -using System; - -namespace Discord.Collections +namespace Discord.Collections { - public sealed class Users : AsyncCollection + internal sealed class Users : AsyncCollection { - internal Users(DiscordClient client, object writerLock) + public Users(DiscordClient client, object writerLock) : base(client, writerLock) { } - internal User GetOrAdd(string id) => GetOrAdd(id, () => new User(_client, id)); - internal new User TryRemove(string id) => base.TryRemove(id); - - protected override void OnCreated(User item) { } - protected override void OnRemoved(User item) { } - - internal User this[string id] - { - get - { - if (id == null) throw new ArgumentNullException(nameof(id)); - return Get(id); - } - } + public User GetOrAdd(string id) => GetOrAdd(id, () => new User(_client, id)); } } diff --git a/src/Discord.Net/DiscordClient.Channels.cs b/src/Discord.Net/DiscordClient.Channels.cs index fa1902d7f..8b98cc395 100644 --- a/src/Discord.Net/DiscordClient.Channels.cs +++ b/src/Discord.Net/DiscordClient.Channels.cs @@ -20,8 +20,7 @@ namespace Discord public partial class DiscordClient { - /// Returns a collection of all channels this client is a member of. - public Channels Channels => _channels; + internal Channels Channels => _channels; private readonly Channels _channels; public event EventHandler ChannelCreated; diff --git a/src/Discord.Net/DiscordClient.Invites.cs b/src/Discord.Net/DiscordClient.Invites.cs index 115d9b7ce..cda080e19 100644 --- a/src/Discord.Net/DiscordClient.Invites.cs +++ b/src/Discord.Net/DiscordClient.Invites.cs @@ -7,6 +7,19 @@ namespace Discord { public partial class DiscordClient { + /// Gets more info about the provided invite code. + /// Supported formats: inviteCode, xkcdCode, https://discord.gg/inviteCode, https://discord.gg/xkcdCode + public async Task GetInvite(string inviteIdOrXkcd) + { + CheckReady(); + if (inviteIdOrXkcd == null) throw new ArgumentNullException(nameof(inviteIdOrXkcd)); + + var response = await _api.GetInvite(inviteIdOrXkcd).ConfigureAwait(false); + var invite = new Invite(this, response.Code, response.XkcdPass, response.Guild.Id); + invite.Update(response); + return invite; + } + /// Creates a new invite to the default channel of the provided server. /// Time (in seconds) until the invite expires. Set to 0 to never expire. /// If true, a user accepting this invite will be kicked from the server after closing their client. @@ -53,20 +66,7 @@ namespace Discord } catch (HttpException ex) when (ex.StatusCode == HttpStatusCode.NotFound) { } } - - /// Gets more info about the provided invite code. - /// Supported formats: inviteCode, xkcdCode, https://discord.gg/inviteCode, https://discord.gg/xkcdCode - public async Task GetInvite(string inviteIdOrXkcd) - { - CheckReady(); - if (inviteIdOrXkcd == null) throw new ArgumentNullException(nameof(inviteIdOrXkcd)); - - var response = await _api.GetInvite(inviteIdOrXkcd).ConfigureAwait(false); - var invite = new Invite(this, response.Code, response.XkcdPass, response.Guild.Id); - invite.Update(response); - return invite; - } - + /// Accepts the provided invite. public Task AcceptInvite(Invite invite) { diff --git a/src/Discord.Net/DiscordClient.Members.cs b/src/Discord.Net/DiscordClient.Members.cs index 562deb744..235eb704f 100644 --- a/src/Discord.Net/DiscordClient.Members.cs +++ b/src/Discord.Net/DiscordClient.Members.cs @@ -55,9 +55,8 @@ namespace Discord if (UserIsSpeaking != null) RaiseEvent(nameof(UserIsSpeaking), () => UserIsSpeaking(this, new MemberIsSpeakingEventArgs(member, isSpeaking))); } - - /// Returns a collection of all user-server pairs this client can currently see. - public Members Members => _members; + + internal Members Members => _members; private readonly Members _members; /// Returns the user with the specified id, along with their server-specific data, or null if none was found. diff --git a/src/Discord.Net/DiscordClient.Messages.cs b/src/Discord.Net/DiscordClient.Messages.cs index 697233c85..fe71dc233 100644 --- a/src/Discord.Net/DiscordClient.Messages.cs +++ b/src/Discord.Net/DiscordClient.Messages.cs @@ -13,10 +13,6 @@ namespace Discord { public const int MaxMessageSize = 2000; - /// Returns a collection of all messages this client has seen since logging in and currently has in cache. - public Messages Messages => _messages; - private readonly Messages _messages; - public event EventHandler MessageCreated; private void RaiseMessageCreated(Message msg) { @@ -47,6 +43,9 @@ namespace Discord if (MessageSent != null) RaiseEvent(nameof(MessageSent), () => MessageSent(this, new MessageEventArgs(msg))); } + + internal Messages Messages => _messages; + private readonly Messages _messages; /// Returns the message with the specified id, or null if none was found. public Message GetMessage(string id) => _messages[id]; diff --git a/src/Discord.Net/DiscordClient.Roles.cs b/src/Discord.Net/DiscordClient.Roles.cs index 4fbdd3cd5..35802fb6d 100644 --- a/src/Discord.Net/DiscordClient.Roles.cs +++ b/src/Discord.Net/DiscordClient.Roles.cs @@ -27,8 +27,7 @@ namespace Discord RaiseEvent(nameof(RoleUpdated), () => RoleUpdated(this, new RoleEventArgs(role))); } - /// Returns a collection of all role-server pairs this client can currently see. - public Roles Roles => _roles; + internal Roles Roles => _roles; private readonly Roles _roles; /// Returns the role with the specified id, or null if none was found. diff --git a/src/Discord.Net/DiscordClient.Servers.cs b/src/Discord.Net/DiscordClient.Servers.cs index ae3c6a5f9..c52be5c42 100644 --- a/src/Discord.Net/DiscordClient.Servers.cs +++ b/src/Discord.Net/DiscordClient.Servers.cs @@ -1,3 +1,4 @@ +using Discord.Collections; using Discord.Net; using System; using System.Collections.Generic; @@ -48,8 +49,14 @@ namespace Discord RaiseEvent(nameof(ServerAvailable), () => ServerAvailable(this, new ServerEventArgs(server))); } + /// Returns a collection of all servers this client is a member of. + public IEnumerable AllServers => _servers; + internal Servers Servers => _servers; + private readonly Servers _servers; + /// Returns the server with the specified id, or null if none was found. public Server GetServer(string id) => _servers[id]; + /// Returns all servers with the specified name. /// Search is case-insensitive. public IEnumerable FindServers(string name) diff --git a/src/Discord.Net/DiscordClient.Users.cs b/src/Discord.Net/DiscordClient.Users.cs index 829f60c80..29b9a3bb5 100644 --- a/src/Discord.Net/DiscordClient.Users.cs +++ b/src/Discord.Net/DiscordClient.Users.cs @@ -55,8 +55,9 @@ namespace Discord } /// Returns a collection of all users this client can currently see. - public Users Users => _users; + internal Users Users => _users; private readonly Users _users; + /// Returns the current logged-in user. public User CurrentUser => _currentUser; private User _currentUser; diff --git a/src/Discord.Net/DiscordClient.cs b/src/Discord.Net/DiscordClient.cs index 6244b3962..a1fe71841 100644 --- a/src/Discord.Net/DiscordClient.cs +++ b/src/Discord.Net/DiscordClient.cs @@ -76,11 +76,6 @@ namespace Discord public new DiscordClientConfig Config => _config as DiscordClientConfig; - - /// Returns a collection of all servers this client is a member of. - public Servers Servers => _servers; - private readonly Servers _servers; - /// Initializes a new instance of the DiscordClient class. public DiscordClient(DiscordClientConfig config = null) : base(config ?? new DiscordClientConfig()) @@ -98,8 +93,8 @@ namespace Discord _messages = new Messages(this, cacheLock); _roles = new Roles(this, cacheLock); _servers = new Servers(this, cacheLock); - _status = UserStatus.Online; _users = new Users(this, cacheLock); + _status = UserStatus.Online; this.Connected += async (s, e) => { diff --git a/test/Discord.Net.Tests/Tests.cs b/test/Discord.Net.Tests/Tests.cs index 7a673431b..6b947662b 100644 --- a/test/Discord.Net.Tests/Tests.cs +++ b/test/Discord.Net.Tests/Tests.cs @@ -33,9 +33,9 @@ namespace Discord.Net.Tests //Cleanup existing servers WaitMany( - _hostClient.Servers.Select(x => _hostClient.LeaveServer(x)), - _targetBot.Servers.Select(x => _targetBot.LeaveServer(x)), - _observerBot.Servers.Select(x => _observerBot.LeaveServer(x))); + _hostClient.AllServers.Select(x => _hostClient.LeaveServer(x)), + _targetBot.AllServers.Select(x => _targetBot.LeaveServer(x)), + _observerBot.AllServers.Select(x => _observerBot.LeaveServer(x))); //Create new server and invite the other bots to it _testServer = _hostClient.CreateServer("Discord.Net Testing", Regions.US_East).Result; @@ -110,9 +110,9 @@ namespace Discord.Net.Tests public static void Cleanup() { WaitMany( - _hostClient.State == DiscordClientState.Connected ? _hostClient.Servers.Select(x => _hostClient.LeaveServer(x)) : null, - _targetBot.State == DiscordClientState.Connected ? _targetBot.Servers.Select(x => _targetBot.LeaveServer(x)) : null, - _observerBot.State == DiscordClientState.Connected ? _observerBot.Servers.Select(x => _observerBot.LeaveServer(x)) : null); + _hostClient.State == DiscordClientState.Connected ? _hostClient.AllServers.Select(x => _hostClient.LeaveServer(x)) : null, + _targetBot.State == DiscordClientState.Connected ? _targetBot.AllServers.Select(x => _targetBot.LeaveServer(x)) : null, + _observerBot.State == DiscordClientState.Connected ? _observerBot.AllServers.Select(x => _observerBot.LeaveServer(x)) : null); WaitAll( _hostClient.Disconnect(),