From 326686d26a17d4fe8779cdcbce318a53bd921514 Mon Sep 17 00:00:00 2001 From: Christopher F Date: Fri, 29 Jul 2016 23:03:39 -0400 Subject: [PATCH 1/6] Add Extension Methods for WebSocket->IGuild For users importing `Discord.WebSocket.Extensions`, there are now non-async extensions for Get(Type)Channel(s) and Get(Current)User(s). These methods point to the appropriate method or member on SocketGuild. --- .../WebSocket/Extensions/GuildExtensions.cs | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 src/Discord.Net/WebSocket/Extensions/GuildExtensions.cs diff --git a/src/Discord.Net/WebSocket/Extensions/GuildExtensions.cs b/src/Discord.Net/WebSocket/Extensions/GuildExtensions.cs new file mode 100644 index 000000000..bf5a636a8 --- /dev/null +++ b/src/Discord.Net/WebSocket/Extensions/GuildExtensions.cs @@ -0,0 +1,44 @@ +using System.Collections.Generic; +using System.Linq; + +namespace Discord.WebSocket.Extensions +{ + // TODO: Docstrings + public static class GuildExtensions + { + // Channels + + public static IGuildChannel GetChannel(this IGuild guild, ulong id) => + (guild as SocketGuild).GetChannel(id); + + public static ITextChannel GetTextChannel(this IGuild guild, ulong id) => + (guild as SocketGuild).GetChannel(id) as ITextChannel; + + public static IEnumerable GetTextChannels(this IGuild guild) => + (guild as SocketGuild).Channels.Select(c => c as ITextChannel).Where(c => c != null); + + + public static IVoiceChannel GetVoiceChannel(this IGuild guild, ulong id) => + (guild as SocketGuild).GetChannel(id) as IVoiceChannel; + + public static IEnumerable GetVoiceChannels(this IGuild guild) => + (guild as SocketGuild).Channels.Select(c => c as IVoiceChannel).Where(c => c != null); + + // Users + + public static IGuildUser GetCurrentUser(this IGuild guild) => + (guild as SocketGuild).CurrentUser; + + public static IGuildUser GetUser(this IGuild guild, ulong id) => + (guild as SocketGuild).GetUser(id); + + public static IEnumerable GetUsers(this IGuild guild) => + (guild as SocketGuild).Members; + + public static int GetUserCount(this IGuild guild) => + (guild as SocketGuild).MemberCount; + + public static int GetCachedUserCount(this IGuild guild) => + (guild as SocketGuild).DownloadedMemberCount; + } +} From ee7bf028f782d3fc39eb514c08b95d498d9b3722 Mon Sep 17 00:00:00 2001 From: Christopher F Date: Fri, 29 Jul 2016 23:17:13 -0400 Subject: [PATCH 2/6] Adjust GuildExtensions per Voltana's feedback Instead of implicitly soft-casting IGuild to SocketGuild, I added a method to soft-cast IGuild to SocketGuild, and throw an InvalidOp if it came up null for some reason. GetUsers was changed from an IEnumerable to an IReadOnlyCollection to allow quick ".Count"-ing on the collection. --- .../WebSocket/Extensions/GuildExtensions.cs | 33 ++++++++++++------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/src/Discord.Net/WebSocket/Extensions/GuildExtensions.cs b/src/Discord.Net/WebSocket/Extensions/GuildExtensions.cs index bf5a636a8..d2e8e1482 100644 --- a/src/Discord.Net/WebSocket/Extensions/GuildExtensions.cs +++ b/src/Discord.Net/WebSocket/Extensions/GuildExtensions.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; namespace Discord.WebSocket.Extensions @@ -9,36 +10,44 @@ namespace Discord.WebSocket.Extensions // Channels public static IGuildChannel GetChannel(this IGuild guild, ulong id) => - (guild as SocketGuild).GetChannel(id); + GetSocketGuild(guild).GetChannel(id); public static ITextChannel GetTextChannel(this IGuild guild, ulong id) => - (guild as SocketGuild).GetChannel(id) as ITextChannel; + GetSocketGuild(guild).GetChannel(id) as ITextChannel; public static IEnumerable GetTextChannels(this IGuild guild) => - (guild as SocketGuild).Channels.Select(c => c as ITextChannel).Where(c => c != null); + GetSocketGuild(guild).Channels.Select(c => c as ITextChannel).Where(c => c != null); public static IVoiceChannel GetVoiceChannel(this IGuild guild, ulong id) => - (guild as SocketGuild).GetChannel(id) as IVoiceChannel; + GetSocketGuild(guild).GetChannel(id) as IVoiceChannel; public static IEnumerable GetVoiceChannels(this IGuild guild) => - (guild as SocketGuild).Channels.Select(c => c as IVoiceChannel).Where(c => c != null); + GetSocketGuild(guild).Channels.Select(c => c as IVoiceChannel).Where(c => c != null); // Users public static IGuildUser GetCurrentUser(this IGuild guild) => - (guild as SocketGuild).CurrentUser; + GetSocketGuild(guild).CurrentUser; public static IGuildUser GetUser(this IGuild guild, ulong id) => - (guild as SocketGuild).GetUser(id); + GetSocketGuild(guild).GetUser(id); - public static IEnumerable GetUsers(this IGuild guild) => - (guild as SocketGuild).Members; + public static IReadOnlyCollection GetUsers(this IGuild guild) => + GetSocketGuild(guild).Members; public static int GetUserCount(this IGuild guild) => - (guild as SocketGuild).MemberCount; + GetSocketGuild(guild).MemberCount; public static int GetCachedUserCount(this IGuild guild) => - (guild as SocketGuild).DownloadedMemberCount; + GetSocketGuild(guild).DownloadedMemberCount; + + internal static SocketGuild GetSocketGuild(IGuild guild) + { + var socketGuild = guild as SocketGuild; + if (socketGuild == null) + throw new InvalidOperationException("This extension method is only valid on WebSocket Entities"); + return socketGuild; + } } } From e5909c49bd4b3ba7e959454efefad2b717347ab7 Mon Sep 17 00:00:00 2001 From: Christopher F Date: Sat, 30 Jul 2016 18:05:01 -0400 Subject: [PATCH 3/6] Added extension methods for WebSocket->Channels For users importing `Discord.WebSocket.Extensions`, there are now non-async extensions for GetUser. These methods point to the appropriate method on the respective SocketgChannel. --- .../WebSocket/Extensions/ChannelExtensions.cs | 48 +++++++++++++++++++ .../WebSocket/Extensions/GuildExtensions.cs | 2 +- 2 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 src/Discord.Net/WebSocket/Extensions/ChannelExtensions.cs diff --git a/src/Discord.Net/WebSocket/Extensions/ChannelExtensions.cs b/src/Discord.Net/WebSocket/Extensions/ChannelExtensions.cs new file mode 100644 index 000000000..ce70d590a --- /dev/null +++ b/src/Discord.Net/WebSocket/Extensions/ChannelExtensions.cs @@ -0,0 +1,48 @@ +using System; + +namespace Discord.WebSocket.Extensions +{ + public static class ChannelExtensions + { + public static IUser GetUser(this IDMChannel channel, ulong id) + => GetSocketDMChannel(channel).GetUser(id); + + public static IGroupUser GetUser(this IGroupChannel channel, ulong id) + => GetSocketGroupChannel(channel).GetUser(id) as IGroupUser; + + public static IGuildUser GetUser(this ITextChannel channel, ulong id) + => GetSocketTextChannel(channel).GetUser(id); + + public static IGuildUser GetUser(this IVoiceChannel channel, ulong id) + => GetSocketVoiceChannel(channel).GetUser(id); + + internal static SocketDMChannel GetSocketDMChannel(IDMChannel channel) + { + var socketChannel = channel as SocketDMChannel; + if (socketChannel == null) + throw new InvalidOperationException("This extension method is only valid on WebSocket Entities"); + return socketChannel; + } + internal static SocketGroupChannel GetSocketGroupChannel(IGroupChannel channel) + { + var socketChannel = channel as SocketGroupChannel; + if (socketChannel == null) + throw new InvalidOperationException("This extension method is only valid on WebSocket Entities"); + return socketChannel; + } + internal static SocketTextChannel GetSocketTextChannel(ITextChannel channel) + { + var socketChannel = channel as SocketTextChannel; + if (socketChannel == null) + throw new InvalidOperationException("This extension method is only valid on WebSocket Entities"); + return socketChannel; + } + internal static SocketVoiceChannel GetSocketVoiceChannel(IVoiceChannel channel) + { + var socketChannel = channel as SocketVoiceChannel; + if (socketChannel == null) + throw new InvalidOperationException("This extension method is only valid on WebSocket Entities"); + return socketChannel; + } + } +} diff --git a/src/Discord.Net/WebSocket/Extensions/GuildExtensions.cs b/src/Discord.Net/WebSocket/Extensions/GuildExtensions.cs index d2e8e1482..a90fd1b56 100644 --- a/src/Discord.Net/WebSocket/Extensions/GuildExtensions.cs +++ b/src/Discord.Net/WebSocket/Extensions/GuildExtensions.cs @@ -4,7 +4,7 @@ using System.Linq; namespace Discord.WebSocket.Extensions { - // TODO: Docstrings + // Todo: Docstrings public static class GuildExtensions { // Channels From beb2cea232ae144d8116ea322eccbb6a0b61e72b Mon Sep 17 00:00:00 2001 From: Christopher F Date: Sat, 30 Jul 2016 21:07:46 -0400 Subject: [PATCH 4/6] Added GetChannels extension to WebSocket->IGuild Adds a sync method to retrieve all cached IGuildChannels on an IGuild. --- src/Discord.Net/WebSocket/Extensions/GuildExtensions.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Discord.Net/WebSocket/Extensions/GuildExtensions.cs b/src/Discord.Net/WebSocket/Extensions/GuildExtensions.cs index a90fd1b56..bccd18265 100644 --- a/src/Discord.Net/WebSocket/Extensions/GuildExtensions.cs +++ b/src/Discord.Net/WebSocket/Extensions/GuildExtensions.cs @@ -12,6 +12,9 @@ namespace Discord.WebSocket.Extensions public static IGuildChannel GetChannel(this IGuild guild, ulong id) => GetSocketGuild(guild).GetChannel(id); + public static IEnumerable GetChannels(this IGuild guild) => + GetSocketGuild(guild).Channels; + public static ITextChannel GetTextChannel(this IGuild guild, ulong id) => GetSocketGuild(guild).GetChannel(id) as ITextChannel; From 3c5788bbfc4434902970744f7414cc5c50653abe Mon Sep 17 00:00:00 2001 From: Christopher F Date: Sat, 30 Jul 2016 21:14:20 -0400 Subject: [PATCH 5/6] Added GetUsers extensions to WebSocket->Channel Cached Channels keep a local cache of the members of that channel. This commit adds a synchronus method to access the cached user stores. It also fixes a bug where the GetUser extension would return an IGroupUser by soft-casting to IGroupUser, which would always return null. ISocketUser does not share an inheritance with IGroupUser, so I now return IUser instead. --- .../WebSocket/Extensions/ChannelExtensions.cs | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/Discord.Net/WebSocket/Extensions/ChannelExtensions.cs b/src/Discord.Net/WebSocket/Extensions/ChannelExtensions.cs index ce70d590a..7dd0da0cb 100644 --- a/src/Discord.Net/WebSocket/Extensions/ChannelExtensions.cs +++ b/src/Discord.Net/WebSocket/Extensions/ChannelExtensions.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; namespace Discord.WebSocket.Extensions { @@ -7,15 +8,27 @@ namespace Discord.WebSocket.Extensions public static IUser GetUser(this IDMChannel channel, ulong id) => GetSocketDMChannel(channel).GetUser(id); - public static IGroupUser GetUser(this IGroupChannel channel, ulong id) - => GetSocketGroupChannel(channel).GetUser(id) as IGroupUser; + public static IEnumerable GetUsers(this IDMChannel channel) + => GetSocketDMChannel(channel).Users; + + public static IUser GetUser(this IGroupChannel channel, ulong id) + => GetSocketGroupChannel(channel).GetUser(id); + + public static IEnumerable GetUsers(this IGroupChannel channel) + => GetSocketGroupChannel(channel).Users; public static IGuildUser GetUser(this ITextChannel channel, ulong id) => GetSocketTextChannel(channel).GetUser(id); + public static IEnumerable GetUsers(this ITextChannel channel) + => GetSocketTextChannel(channel).Members; + public static IGuildUser GetUser(this IVoiceChannel channel, ulong id) => GetSocketVoiceChannel(channel).GetUser(id); + public static IEnumerable GetUsers(this IVoiceChannel channel) + => GetSocketVoiceChannel(channel).Members; + internal static SocketDMChannel GetSocketDMChannel(IDMChannel channel) { var socketChannel = channel as SocketDMChannel; From c54f6addd2845de61aea99563317ec036e2af92b Mon Sep 17 00:00:00 2001 From: Christopher F Date: Sat, 30 Jul 2016 21:37:57 -0400 Subject: [PATCH 6/6] Replace IEnumerable with IReadonlyCollection where possible --- src/Discord.Net/WebSocket/Extensions/ChannelExtensions.cs | 8 ++++---- src/Discord.Net/WebSocket/Extensions/GuildExtensions.cs | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Discord.Net/WebSocket/Extensions/ChannelExtensions.cs b/src/Discord.Net/WebSocket/Extensions/ChannelExtensions.cs index 7dd0da0cb..ce5d13d47 100644 --- a/src/Discord.Net/WebSocket/Extensions/ChannelExtensions.cs +++ b/src/Discord.Net/WebSocket/Extensions/ChannelExtensions.cs @@ -8,25 +8,25 @@ namespace Discord.WebSocket.Extensions public static IUser GetUser(this IDMChannel channel, ulong id) => GetSocketDMChannel(channel).GetUser(id); - public static IEnumerable GetUsers(this IDMChannel channel) + public static IReadOnlyCollection GetUsers(this IDMChannel channel) => GetSocketDMChannel(channel).Users; public static IUser GetUser(this IGroupChannel channel, ulong id) => GetSocketGroupChannel(channel).GetUser(id); - public static IEnumerable GetUsers(this IGroupChannel channel) + public static IReadOnlyCollection GetUsers(this IGroupChannel channel) => GetSocketGroupChannel(channel).Users; public static IGuildUser GetUser(this ITextChannel channel, ulong id) => GetSocketTextChannel(channel).GetUser(id); - public static IEnumerable GetUsers(this ITextChannel channel) + public static IReadOnlyCollection GetUsers(this ITextChannel channel) => GetSocketTextChannel(channel).Members; public static IGuildUser GetUser(this IVoiceChannel channel, ulong id) => GetSocketVoiceChannel(channel).GetUser(id); - public static IEnumerable GetUsers(this IVoiceChannel channel) + public static IReadOnlyCollection GetUsers(this IVoiceChannel channel) => GetSocketVoiceChannel(channel).Members; internal static SocketDMChannel GetSocketDMChannel(IDMChannel channel) diff --git a/src/Discord.Net/WebSocket/Extensions/GuildExtensions.cs b/src/Discord.Net/WebSocket/Extensions/GuildExtensions.cs index bccd18265..8e6a2f878 100644 --- a/src/Discord.Net/WebSocket/Extensions/GuildExtensions.cs +++ b/src/Discord.Net/WebSocket/Extensions/GuildExtensions.cs @@ -12,7 +12,7 @@ namespace Discord.WebSocket.Extensions public static IGuildChannel GetChannel(this IGuild guild, ulong id) => GetSocketGuild(guild).GetChannel(id); - public static IEnumerable GetChannels(this IGuild guild) => + public static IReadOnlyCollection GetChannels(this IGuild guild) => GetSocketGuild(guild).Channels; public static ITextChannel GetTextChannel(this IGuild guild, ulong id) =>