diff --git a/src/Discord.Net/API/DiscordRawClient.cs b/src/Discord.Net/API/DiscordRawClient.cs index d641c7947..c01696448 100644 --- a/src/Discord.Net/API/DiscordRawClient.cs +++ b/src/Discord.Net/API/DiscordRawClient.cs @@ -25,10 +25,15 @@ namespace Discord.API private readonly IRestClient _restClient; private readonly CancellationToken _cancelToken; private readonly JsonSerializer _serializer; + + public TokenType AuthTokenType { get; private set; } + public IRestClient RestClient { get; private set; } + public IRequestQueue RequestQueue { get; private set; } internal DiscordRawClient(RestClientProvider restClientProvider, CancellationToken cancelToken, TokenType authTokenType, string authToken) { _cancelToken = cancelToken; + AuthTokenType = authTokenType; switch (authTokenType) { diff --git a/src/Discord.Net/Common/Entities/Guilds/IGuild.cs b/src/Discord.Net/Common/Entities/Guilds/IGuild.cs index 48b1a2dcd..9d6518612 100644 --- a/src/Discord.Net/Common/Entities/Guilds/IGuild.cs +++ b/src/Discord.Net/Common/Entities/Guilds/IGuild.cs @@ -11,8 +11,6 @@ namespace Discord int AFKTimeout { get; } /// Returns true if this guild is embeddable (e.g. widget) bool IsEmbeddable { get; } - /// Returns true if the current user owns this guild. - bool IsOwner { get; } /// Gets the name of this guild. string Name { get; } int VerificationLevel { get; } diff --git a/src/Discord.Net/Common/Entities/Messages/IMessage.cs b/src/Discord.Net/Common/Entities/Messages/IMessage.cs index 54f2df870..1e5eb3b3f 100644 --- a/src/Discord.Net/Common/Entities/Messages/IMessage.cs +++ b/src/Discord.Net/Common/Entities/Messages/IMessage.cs @@ -9,8 +9,6 @@ namespace Discord { /// Gets the time of this message's last edit, if any. DateTime? EditedTimestamp { get; } - /// Returns true if this message originated from the logged-in account. - bool IsAuthor { get; } /// Returns true if this message was sent as a text-to-speech message. bool IsTTS { get; } /// Returns the original, unprocessed text for this message. diff --git a/src/Discord.Net/Common/Entities/Users/IUser.cs b/src/Discord.Net/Common/Entities/Users/IUser.cs index 4998d0419..550c53e8b 100644 --- a/src/Discord.Net/Common/Entities/Users/IUser.cs +++ b/src/Discord.Net/Common/Entities/Users/IUser.cs @@ -12,8 +12,6 @@ namespace Discord ushort Discriminator { get; } /// Returns true if this user is a bot account. bool IsBot { get; } - /// Returns true is this user is the current logged-in account. - bool IsCurrentUser { get; } /// Gets the current status of this user. UserStatus Status { get; } /// Gets the username for this user. diff --git a/src/Discord.Net/IDiscordClient.cs b/src/Discord.Net/IDiscordClient.cs index 2d583126e..b78fb02c6 100644 --- a/src/Discord.Net/IDiscordClient.cs +++ b/src/Discord.Net/IDiscordClient.cs @@ -1,15 +1,18 @@ using Discord.API; +using Discord.Net.Rest; using System.Collections.Generic; using System.IO; using System.Threading.Tasks; namespace Discord { + //TODO: Add docstrings public interface IDiscordClient { - ISelfUser CurrentUser { get; } + TokenType AuthTokenType { get; } DiscordRawClient BaseClient { get; } - //IMessageQueue MessageQueue { get; } + IRestClient RestClient { get; } + IRequestQueue RequestQueue { get; } Task Login(TokenType tokenType, string token); Task Logout(); diff --git a/src/Discord.Net/Net/Rest/IRestClient.cs b/src/Discord.Net/Net/Rest/IRestClient.cs index 6ebc360b2..3f99a2f7e 100644 --- a/src/Discord.Net/Net/Rest/IRestClient.cs +++ b/src/Discord.Net/Net/Rest/IRestClient.cs @@ -4,6 +4,7 @@ using System.Threading.Tasks; namespace Discord.Net.Rest { + //TODO: Add docstrings public interface IRestClient { void SetHeader(string key, string value); diff --git a/src/Discord.Net/Net/Rest/RequestQueue/IRequestQueue.cs b/src/Discord.Net/Net/Rest/RequestQueue/IRequestQueue.cs index 27231a334..67adbf924 100644 --- a/src/Discord.Net/Net/Rest/RequestQueue/IRequestQueue.cs +++ b/src/Discord.Net/Net/Rest/RequestQueue/IRequestQueue.cs @@ -2,6 +2,7 @@ using System.Threading.Tasks; namespace Discord.Net.Rest { + //TODO: Add docstrings public interface IRequestQueue { Task Clear(GlobalBucket type); diff --git a/src/Discord.Net/Rest/DiscordClient.cs b/src/Discord.Net/Rest/DiscordClient.cs index ac1bc0762..9a6e0cb36 100644 --- a/src/Discord.Net/Rest/DiscordClient.cs +++ b/src/Discord.Net/Rest/DiscordClient.cs @@ -1,11 +1,13 @@ using Discord.API.Rest; using Discord.Logging; +using Discord.Net; using Discord.Net.Rest; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.IO; using System.Linq; +using System.Net; using System.Threading; using System.Threading.Tasks; @@ -22,10 +24,14 @@ namespace Discord.Rest private CancellationTokenSource _cancelTokenSource; private bool _isDisposed; private string _userAgent; - + private SelfUser _currentUser; + public bool IsLoggedIn { get; private set; } - internal API.DiscordRawClient BaseClient { get; private set; } - internal SelfUser CurrentUser { get; private set; } + public API.DiscordRawClient BaseClient { get; private set; } + + public TokenType AuthTokenType => BaseClient.AuthTokenType; + public IRestClient RestClient => BaseClient.RestClient; + public IRequestQueue RequestQueue => BaseClient.RequestQueue; public DiscordClient(DiscordConfig config = null) { @@ -64,9 +70,13 @@ namespace Discord.Rest //MessageQueue = new MessageQueue(RestClient, _restLogger); //await MessageQueue.Start(_cancelTokenSource.Token).ConfigureAwait(false); - - var currentUser = await BaseClient.GetCurrentUser().ConfigureAwait(false); - CurrentUser = new SelfUser(this, currentUser); + + try + { + var currentUser = await BaseClient.GetCurrentUser().ConfigureAwait(false); + _currentUser = new SelfUser(this, currentUser); + } + catch (HttpException ex) when (ex.StatusCode == HttpStatusCode.Unauthorized && tokenType == TokenType.Bearer) { } //Ignore 401 if Bearer doesnt have identity _cancelTokenSource = cancelTokenSource; IsLoggedIn = true; @@ -173,25 +183,25 @@ namespace Discord.Rest return new PublicUser(this, model); return null; } - public async Task GetUser(string username, ushort discriminator) + public async Task GetUser(string username, ushort discriminator) { var model = await BaseClient.GetUser(username, discriminator).ConfigureAwait(false); if (model != null) return new PublicUser(this, model); return null; } - public async Task GetCurrentUser() + public async Task GetCurrentUser() { - var currentUser = CurrentUser; - if (currentUser == null) + var user = _currentUser; + if (user == null) { var model = await BaseClient.GetCurrentUser().ConfigureAwait(false); - currentUser = new SelfUser(this, model); - CurrentUser = currentUser; + user = new SelfUser(this, model); + _currentUser = user; } - return currentUser; + return user; } - public async Task> QueryUsers(string query, int limit) + public async Task> QueryUsers(string query, int limit) { var models = await BaseClient.QueryUsers(query, limit).ConfigureAwait(false); return models.Select(x => new PublicUser(this, x)); @@ -225,7 +235,6 @@ namespace Discord.Rest public void Dispose() => Dispose(true); API.DiscordRawClient IDiscordClient.BaseClient => BaseClient; - ISelfUser IDiscordClient.CurrentUser => CurrentUser; async Task IDiscordClient.GetChannel(ulong id) => await GetChannel(id).ConfigureAwait(false); @@ -243,6 +252,10 @@ namespace Discord.Rest => await CreateGuild(name, region, jpegIcon).ConfigureAwait(false); async Task IDiscordClient.GetUser(ulong id) => await GetUser(id).ConfigureAwait(false); + async Task IDiscordClient.GetUser(string username, ushort discriminator) + => await GetUser(username, discriminator).ConfigureAwait(false); + async Task IDiscordClient.GetCurrentUser() + => await GetCurrentUser().ConfigureAwait(false); async Task> IDiscordClient.QueryUsers(string query, int limit) => await QueryUsers(query, limit).ConfigureAwait(false); async Task> IDiscordClient.GetVoiceRegions() diff --git a/src/Discord.Net/Rest/Entities/Channels/DMChannel.cs b/src/Discord.Net/Rest/Entities/Channels/DMChannel.cs index 743af93ab..3a76aa702 100644 --- a/src/Discord.Net/Rest/Entities/Channels/DMChannel.cs +++ b/src/Discord.Net/Rest/Entities/Channels/DMChannel.cs @@ -20,8 +20,6 @@ namespace Discord.Rest /// public DateTime CreatedAt => DateTimeHelper.FromSnowflake(Id); - /// - public IEnumerable Users => ImmutableArray.Create(Discord.CurrentUser, Recipient); internal DMChannel(DiscordClient discord, Model model) { @@ -39,20 +37,23 @@ namespace Discord.Rest } /// - public IUser GetUser(ulong id) + public async Task GetUser(ulong id) { + var currentUser = await Discord.GetCurrentUser().ConfigureAwait(false); if (id == Recipient.Id) return Recipient; - else if (id == Discord.CurrentUser.Id) - return Discord.CurrentUser; + else if (id == currentUser.Id) + return currentUser; else return null; } - public IEnumerable GetUsers() + /// + public async Task> GetUsers() { - return ImmutableArray.Create(Discord.CurrentUser, Recipient); + var currentUser = await Discord.GetCurrentUser().ConfigureAwait(false); + return ImmutableArray.Create(currentUser, Recipient); } - + /// public async Task> GetMessages(int limit = DiscordConfig.MaxMessagesPerBatch) { @@ -124,10 +125,10 @@ namespace Discord.Rest IDMUser IDMChannel.Recipient => Recipient; - Task> IChannel.GetUsers() - => Task.FromResult(GetUsers()); - Task IChannel.GetUser(ulong id) - => Task.FromResult(GetUser(id)); + async Task> IChannel.GetUsers() + => await GetUsers().ConfigureAwait(false); + async Task IChannel.GetUser(ulong id) + => await GetUser(id).ConfigureAwait(false); Task IMessageChannel.GetMessage(ulong id) => throw new NotSupportedException(); async Task> IMessageChannel.GetMessages(int limit) diff --git a/src/Discord.Net/Rest/Entities/Guilds/Guild.cs b/src/Discord.Net/Rest/Entities/Guilds/Guild.cs index ce530d0e2..5763193bc 100644 --- a/src/Discord.Net/Rest/Entities/Guilds/Guild.cs +++ b/src/Discord.Net/Rest/Entities/Guilds/Guild.cs @@ -46,8 +46,6 @@ namespace Discord.Rest /// public DateTime CreatedAt => DateTimeHelper.FromSnowflake(Id); /// - public bool IsOwner => OwnerId == Discord.CurrentUser.Id; - /// public string IconUrl => API.CDN.GetGuildIconUrl(Id, _iconId); /// public string SplashUrl => API.CDN.GetGuildSplashUrl(Id, _splashId); @@ -157,15 +155,11 @@ namespace Discord.Rest /// public async Task Leave() { - if (IsOwner) - throw new InvalidOperationException("Unable to leave a guild the current user owns."); await Discord.BaseClient.LeaveGuild(Id).ConfigureAwait(false); } /// public async Task Delete() { - if (!IsOwner) - throw new InvalidOperationException("Unable to delete a guild the current user does not own."); await Discord.BaseClient.DeleteGuild(Id).ConfigureAwait(false); } @@ -317,7 +311,8 @@ namespace Discord.Rest /// Gets a the current user. public async Task GetCurrentUser() { - return await GetUser(Discord.CurrentUser.Id).ConfigureAwait(false); + var currentUser = await Discord.GetCurrentUser().ConfigureAwait(false); + return await GetUser(currentUser.Id).ConfigureAwait(false); } public async Task PruneUsers(int days = 30, bool simulate = false) { diff --git a/src/Discord.Net/Rest/Entities/Message.cs b/src/Discord.Net/Rest/Entities/Message.cs index 97ed04512..24c3eb4df 100644 --- a/src/Discord.Net/Rest/Entities/Message.cs +++ b/src/Discord.Net/Rest/Entities/Message.cs @@ -41,8 +41,6 @@ namespace Discord.Rest /// public DateTime CreatedAt => DateTimeHelper.FromSnowflake(Id); - /// - public bool IsAuthor => Discord.CurrentUser.Id == Author.Id; internal DiscordClient Discord => (Channel as TextChannel)?.Discord ?? (Channel as DMChannel).Discord; internal Message(IMessageChannel channel, Model model) diff --git a/src/Discord.Net/Rest/Entities/Users/GuildUser.cs b/src/Discord.Net/Rest/Entities/Users/GuildUser.cs index 79aa60093..2e2b11c5c 100644 --- a/src/Discord.Net/Rest/Entities/Users/GuildUser.cs +++ b/src/Discord.Net/Rest/Entities/Users/GuildUser.cs @@ -84,7 +84,7 @@ namespace Discord.Rest var args = new ModifyGuildMemberParams(); func(args); - bool isCurrentUser = IsCurrentUser; + bool isCurrentUser = (await Discord.GetCurrentUser().ConfigureAwait(false)).Id == Id; if (isCurrentUser && args.Nickname.IsSpecified) { var nickArgs = new ModifyCurrentUserNickParams @@ -92,6 +92,7 @@ namespace Discord.Rest Nickname = args.Nickname.Value }; await Discord.BaseClient.ModifyCurrentUserNick(Guild.Id, nickArgs).ConfigureAwait(false); + args.Nickname = new API.Optional(); //Remove } if (!isCurrentUser || args.Deaf.IsSpecified || args.Mute.IsSpecified || args.Roles.IsSpecified) diff --git a/src/Discord.Net/Rest/Entities/Users/User.cs b/src/Discord.Net/Rest/Entities/Users/User.cs index 70e199378..9572c6620 100644 --- a/src/Discord.Net/Rest/Entities/Users/User.cs +++ b/src/Discord.Net/Rest/Entities/Users/User.cs @@ -28,8 +28,6 @@ namespace Discord.Rest public string Mention => MentionHelper.Mention(this, false); /// public string NicknameMention => MentionHelper.Mention(this, true); - /// - public bool IsCurrentUser => Id == Discord.CurrentUser.Id; internal User(Model model) {