From 227643c0fc31cce42a80685a19303cdc50750bc8 Mon Sep 17 00:00:00 2001 From: RogueException Date: Sun, 12 Jun 2016 22:06:18 -0300 Subject: [PATCH] Cleaned up docstrings, improved GetUser performance --- src/Discord.Net/API/DiscordAPIClient.cs | 2 +- src/Discord.Net/DiscordClient.cs | 3 +-- src/Discord.Net/DiscordConfig.cs | 2 -- src/Discord.Net/DiscordSocketClient.cs | 9 ++++----- src/Discord.Net/Entities/Guilds/Guild.cs | 1 - src/Discord.Net/Entities/Permissions/Permissions.cs | 2 +- src/Discord.Net/Entities/SnowflakeEntity.cs | 2 +- src/Discord.Net/Entities/Users/IUser.cs | 3 +-- .../Entities/WebSocket/CachedDMChannel.cs | 1 + .../Entities/WebSocket/CachedTextChannel.cs | 13 ++++++++----- .../Entities/WebSocket/ICachedMessageChannel.cs | 2 +- src/Discord.Net/Entities/WebSocket/MessageCache.cs | 2 +- src/Discord.Net/Net/Rest/DefaultRestClient.cs | 2 +- .../Net/WebSockets/DefaultWebsocketClient.cs | 3 +-- 14 files changed, 22 insertions(+), 25 deletions(-) diff --git a/src/Discord.Net/API/DiscordAPIClient.cs b/src/Discord.Net/API/DiscordAPIClient.cs index 70aaa6cfc..119de17d0 100644 --- a/src/Discord.Net/API/DiscordAPIClient.cs +++ b/src/Discord.Net/API/DiscordAPIClient.cs @@ -155,7 +155,7 @@ namespace Discord.API } private async Task LogoutInternalAsync() { - //TODO: An exception here will lock the client into the unusable LoggingOut state. How should we handle? (Add same solution to both DiscordClients too) + //An exception here will lock the client into the unusable LoggingOut state, but that's probably fine since our client is in an undefined state too. if (LoginState == LoginState.LoggedOut) return; LoginState = LoginState.LoggingOut; diff --git a/src/Discord.Net/DiscordClient.cs b/src/Discord.Net/DiscordClient.cs index ec170c1b1..6d80d0df3 100644 --- a/src/Discord.Net/DiscordClient.cs +++ b/src/Discord.Net/DiscordClient.cs @@ -41,8 +41,7 @@ namespace Discord _connectionLock = new SemaphoreSlim(1, 1); _requestQueue = new RequestQueue(); - - //TODO: Is there any better way to do this WebSocketProvider access? + ApiClient = new API.DiscordApiClient(config.RestClientProvider, (config as DiscordSocketConfig)?.WebSocketProvider, requestQueue: _requestQueue); ApiClient.SentRequest += async (method, endpoint, millis) => await _log.VerboseAsync("Rest", $"{method} {endpoint}: {millis} ms").ConfigureAwait(false); } diff --git a/src/Discord.Net/DiscordConfig.cs b/src/Discord.Net/DiscordConfig.cs index 54989ec63..75d5b7a21 100644 --- a/src/Discord.Net/DiscordConfig.cs +++ b/src/Discord.Net/DiscordConfig.cs @@ -3,8 +3,6 @@ using System.Reflection; namespace Discord { - //TODO: Add socket config items in their own class - public class DiscordConfig { public static string Version { get; } = typeof(DiscordConfig).GetTypeInfo().Assembly?.GetName().Version.ToString(3) ?? "Unknown"; diff --git a/src/Discord.Net/DiscordSocketClient.cs b/src/Discord.Net/DiscordSocketClient.cs index 4255a8fa2..351dad850 100644 --- a/src/Discord.Net/DiscordSocketClient.cs +++ b/src/Discord.Net/DiscordSocketClient.cs @@ -361,8 +361,7 @@ namespace Discord case "READY": { await _gatewayLogger.DebugAsync("Received Dispatch (READY)").ConfigureAwait(false); - - //TODO: Make downloading large guilds optional + var data = (payload as JToken).ToObject(_serializer); var dataStore = _dataStoreProvider(ShardId, _totalShards, data.Guilds.Length, data.PrivateChannels.Length); @@ -741,7 +740,7 @@ namespace Discord var channel = DataStore.GetChannel(data.ChannelId) as ICachedMessageChannel; if (channel != null) { - var author = channel.GetUser(data.Author.Value.Id); + var author = channel.GetUser(data.Author.Value.Id, true); if (author != null) { @@ -780,7 +779,7 @@ namespace Discord else if (data.Author.IsSpecified) { //Edited message isnt in cache, create a detached one - var author = channel.GetUser(data.Author.Value.Id); + var author = channel.GetUser(data.Author.Value.Id, true); if (author != null) after = new Message(channel, author, data); } @@ -879,7 +878,7 @@ namespace Discord var channel = DataStore.GetChannel(data.ChannelId) as ICachedMessageChannel; if (channel != null) { - var user = channel.GetUser(data.UserId); + var user = channel.GetUser(data.UserId, true); if (user != null) await UserIsTyping.RaiseAsync(channel, user).ConfigureAwait(false); } diff --git a/src/Discord.Net/Entities/Guilds/Guild.cs b/src/Discord.Net/Entities/Guilds/Guild.cs index 3291a4e7d..44d3fa326 100644 --- a/src/Discord.Net/Entities/Guilds/Guild.cs +++ b/src/Discord.Net/Entities/Guilds/Guild.cs @@ -130,7 +130,6 @@ namespace Discord } public async Task ModifyChannelsAsync(IEnumerable args) { - //TODO: Update channels await Discord.ApiClient.ModifyGuildChannelsAsync(Id, args).ConfigureAwait(false); } public async Task ModifyRolesAsync(IEnumerable args) diff --git a/src/Discord.Net/Entities/Permissions/Permissions.cs b/src/Discord.Net/Entities/Permissions/Permissions.cs index b4a757757..1ce73ccb0 100644 --- a/src/Discord.Net/Entities/Permissions/Permissions.cs +++ b/src/Discord.Net/Entities/Permissions/Permissions.cs @@ -131,7 +131,7 @@ namespace Discord if (perms != null) resolvedPermissions = (resolvedPermissions & ~perms.Value.DenyValue) | perms.Value.AllowValue; - //TODO: C# Typeswitch candidate + //TODO: C#7 Typeswitch candidate var textChannel = channel as ITextChannel; var voiceChannel = channel as IVoiceChannel; if (textChannel != null && !GetValue(resolvedPermissions, ChannelPermission.ReadMessages)) diff --git a/src/Discord.Net/Entities/SnowflakeEntity.cs b/src/Discord.Net/Entities/SnowflakeEntity.cs index 5b67e6e80..2c1788f5b 100644 --- a/src/Discord.Net/Entities/SnowflakeEntity.cs +++ b/src/Discord.Net/Entities/SnowflakeEntity.cs @@ -4,7 +4,7 @@ namespace Discord { internal abstract class SnowflakeEntity : Entity, ISnowflakeEntity { - //TODO: Candidate for Extension Property. Lets us remove this class. + //TODO: C#7 Candidate for Extension Property. Lets us remove this class. public DateTime CreatedAt => DateTimeUtils.FromSnowflake(Id); public SnowflakeEntity(ulong id) diff --git a/src/Discord.Net/Entities/Users/IUser.cs b/src/Discord.Net/Entities/Users/IUser.cs index 9f2709a3d..d877a4d9f 100644 --- a/src/Discord.Net/Entities/Users/IUser.cs +++ b/src/Discord.Net/Entities/Users/IUser.cs @@ -12,8 +12,7 @@ namespace Discord bool IsBot { get; } /// Gets the username for this user. string Username { get; } - - //TODO: CreateDMChannel is a candidate to move to IGuildUser, and User made a common class, depending on next friends list update + /// Returns a private message channel to this user, creating one if it does not already exist. Task CreateDMChannelAsync(); } diff --git a/src/Discord.Net/Entities/WebSocket/CachedDMChannel.cs b/src/Discord.Net/Entities/WebSocket/CachedDMChannel.cs index 7b211bf42..568cef3d9 100644 --- a/src/Discord.Net/Entities/WebSocket/CachedDMChannel.cs +++ b/src/Discord.Net/Entities/WebSocket/CachedDMChannel.cs @@ -66,6 +66,7 @@ namespace Discord public CachedDMChannel Clone() => MemberwiseClone() as CachedDMChannel; IMessage IMessageChannel.GetCachedMessage(ulong id) => GetMessage(id); + ICachedUser ICachedMessageChannel.GetUser(ulong id, bool skipCheck) => GetUser(id); ICachedChannel ICachedChannel.Clone() => Clone(); } } diff --git a/src/Discord.Net/Entities/WebSocket/CachedTextChannel.cs b/src/Discord.Net/Entities/WebSocket/CachedTextChannel.cs index b997ead6d..906b1bb60 100644 --- a/src/Discord.Net/Entities/WebSocket/CachedTextChannel.cs +++ b/src/Discord.Net/Entities/WebSocket/CachedTextChannel.cs @@ -27,12 +27,15 @@ namespace Discord public override Task> GetUsersAsync() => Task.FromResult>(Members); public override Task> GetUsersAsync(int limit, int offset) => Task.FromResult>(Members.Skip(offset).Take(limit).ToImmutableArray()); - public CachedGuildUser GetUser(ulong id) + public CachedGuildUser GetUser(ulong id, bool skipCheck = false) { - //TODO: It's slow to do a perms check here... Maybe only do it on external calls? var user = Guild.GetUser(id); - if (user != null && Permissions.GetValue(Permissions.ResolveChannel(user, this, user.GuildPermissions.RawValue), ChannelPermission.ReadMessages)) - return user; + if (user != null && !skipCheck) + { + ulong perms = Permissions.ResolveChannel(user, this, user.GuildPermissions.RawValue); + if (Permissions.GetValue(perms, ChannelPermission.ReadMessages)) + return user; + } return null; } @@ -69,7 +72,7 @@ namespace Discord IReadOnlyCollection ICachedMessageChannel.Members => Members; IMessage IMessageChannel.GetCachedMessage(ulong id) => GetMessage(id); - ICachedUser ICachedMessageChannel.GetUser(ulong id) => GetUser(id); + ICachedUser ICachedMessageChannel.GetUser(ulong id, bool skipCheck) => GetUser(id, skipCheck); ICachedChannel ICachedChannel.Clone() => Clone(); } } diff --git a/src/Discord.Net/Entities/WebSocket/ICachedMessageChannel.cs b/src/Discord.Net/Entities/WebSocket/ICachedMessageChannel.cs index 06cfd76fd..9704198b0 100644 --- a/src/Discord.Net/Entities/WebSocket/ICachedMessageChannel.cs +++ b/src/Discord.Net/Entities/WebSocket/ICachedMessageChannel.cs @@ -11,6 +11,6 @@ namespace Discord CachedMessage GetMessage(ulong id); CachedMessage RemoveMessage(ulong id); - ICachedUser GetUser(ulong id); + ICachedUser GetUser(ulong id, bool skipCheck = false); } } diff --git a/src/Discord.Net/Entities/WebSocket/MessageCache.cs b/src/Discord.Net/Entities/WebSocket/MessageCache.cs index c51088129..4fd5ea785 100644 --- a/src/Discord.Net/Entities/WebSocket/MessageCache.cs +++ b/src/Discord.Net/Entities/WebSocket/MessageCache.cs @@ -120,7 +120,7 @@ namespace Discord var guild = (_channel as ICachedGuildChannel).Guild; return cachedMessages.Concat(downloadedMessages.Select(x => { - IUser user = _channel.GetUser(x.Author.Value.Id); + IUser user = _channel.GetUser(x.Author.Value.Id, true); if (user == null) { var newUser = new User(_channel.Discord, x.Author.Value); diff --git a/src/Discord.Net/Net/Rest/DefaultRestClient.cs b/src/Discord.Net/Net/Rest/DefaultRestClient.cs index c51c5fa0a..3b133e615 100644 --- a/src/Discord.Net/Net/Rest/DefaultRestClient.cs +++ b/src/Discord.Net/Net/Rest/DefaultRestClient.cs @@ -92,7 +92,7 @@ namespace Discord.Net.Rest { foreach (var p in multipartParams) { - //TODO: C# Typeswitch candidate + //TODO: C#7 Typeswitch candidate var stringValue = p.Value as string; if (stringValue != null) { content.Add(new StringContent(stringValue), p.Key); continue; } var byteArrayValue = p.Value as byte[]; diff --git a/src/Discord.Net/Net/WebSockets/DefaultWebsocketClient.cs b/src/Discord.Net/Net/WebSockets/DefaultWebsocketClient.cs index 7408e1557..f8f8731d9 100644 --- a/src/Discord.Net/Net/WebSockets/DefaultWebsocketClient.cs +++ b/src/Discord.Net/Net/WebSockets/DefaultWebsocketClient.cs @@ -124,8 +124,7 @@ namespace Discord.Net.WebSockets _sendLock.Release(); } } - - //TODO: Check this code + private async Task RunAsync(CancellationToken cancelToken) { var buffer = new ArraySegment(new byte[ReceiveChunkSize]);