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)
{