@@ -487,6 +487,9 @@ | |||
<Compile Include="..\Discord.Net\Legacy.cs"> | |||
<Link>Legacy.cs</Link> | |||
</Compile> | |||
<Compile Include="..\Discord.Net\Logging\ILogger.cs"> | |||
<Link>Logging\ILogger.cs</Link> | |||
</Compile> | |||
<Compile Include="..\Discord.Net\Logging\Logger.cs"> | |||
<Link>Logging\Logger.cs</Link> | |||
</Compile> | |||
@@ -0,0 +1,44 @@ | |||
using System; | |||
namespace Discord.Logging | |||
{ | |||
public interface ILogger | |||
{ | |||
LogSeverity Level { get; } | |||
void Log(LogSeverity severity, string message, Exception exception = null); | |||
#if !NET45 | |||
void Log(LogSeverity severity, FormattableString message, Exception exception = null); | |||
#endif | |||
void Error(string message, Exception exception = null); | |||
#if !NET45 | |||
void Error(FormattableString message, Exception exception = null); | |||
#endif | |||
void Error(Exception exception); | |||
void Warning(string message, Exception exception = null); | |||
#if !NET45 | |||
void Warning(FormattableString message, Exception exception = null); | |||
#endif | |||
void Warning(Exception exception); | |||
void Info(string message, Exception exception = null); | |||
#if !NET45 | |||
void Info(FormattableString message, Exception exception = null); | |||
#endif | |||
void Info(Exception exception); | |||
void Verbose(string message, Exception exception = null); | |||
#if !NET45 | |||
void Verbose(FormattableString message, Exception exception = null); | |||
#endif | |||
void Verbose(Exception exception); | |||
void Debug(string message, Exception exception = null); | |||
#if !NET45 | |||
void Debug(FormattableString message, Exception exception = null); | |||
#endif | |||
void Debug(Exception exception); | |||
} | |||
} |
@@ -2,7 +2,7 @@ | |||
namespace Discord.Logging | |||
{ | |||
public class Logger | |||
public class Logger : ILogger | |||
{ | |||
private readonly LogManager _manager; | |||
@@ -22,15 +22,15 @@ namespace Discord.Net.Rest | |||
private readonly string _baseUrl; | |||
private readonly AsyncLock _rateLimitLock; | |||
private readonly ILogger _logger; | |||
private DateTime _rateLimitTime; | |||
internal Logger Logger { get; } | |||
public BuiltInEngine(DiscordConfig config, string baseUrl, Logger logger) | |||
public BuiltInEngine(DiscordConfig config, string baseUrl, ILogger logger) | |||
{ | |||
_config = config; | |||
_baseUrl = baseUrl; | |||
Logger = logger; | |||
_logger = logger; | |||
_rateLimitLock = new AsyncLock(); | |||
_client = new HttpClient(new HttpClientHandler | |||
@@ -100,15 +100,18 @@ namespace Discord.Net.Rest | |||
int milliseconds; | |||
if (retryAfter != null && int.TryParse(retryAfter, out milliseconds)) | |||
{ | |||
var now = DateTime.UtcNow; | |||
if (now >= _rateLimitTime) | |||
if (_logger != null) | |||
{ | |||
using (await _rateLimitLock.LockAsync().ConfigureAwait(false)) | |||
var now = DateTime.UtcNow; | |||
if (now >= _rateLimitTime) | |||
{ | |||
if (now >= _rateLimitTime) | |||
using (await _rateLimitLock.LockAsync().ConfigureAwait(false)) | |||
{ | |||
_rateLimitTime = now.AddMilliseconds(milliseconds); | |||
Logger.Warning($"Rate limit hit, waiting {Math.Round(milliseconds / 1000.0f, 2)} seconds"); | |||
if (now >= _rateLimitTime) | |||
{ | |||
_rateLimitTime = now.AddMilliseconds(milliseconds); | |||
_logger.Warning($"Rate limit hit, waiting {Math.Round(milliseconds / 1000.0f, 2)} seconds"); | |||
} | |||
} | |||
} | |||
} | |||
@@ -9,7 +9,7 @@ namespace Discord.Net.Rest | |||
{ | |||
private readonly ETFWriter _serializer; | |||
public ETFRestClient(DiscordConfig config, string baseUrl, Logger logger) | |||
public ETFRestClient(DiscordConfig config, string baseUrl, ILogger logger = null) | |||
: base(config, baseUrl, logger) | |||
{ | |||
_serializer = new ETFWriter(new MemoryStream()); | |||
@@ -8,7 +8,7 @@ namespace Discord.Net.Rest | |||
{ | |||
private JsonSerializer _serializer; | |||
public JsonRestClient(DiscordConfig config, string baseUrl, Logger logger) | |||
public JsonRestClient(DiscordConfig config, string baseUrl, ILogger logger = null) | |||
: base(config, baseUrl, logger) | |||
{ | |||
_serializer = new JsonSerializer(); | |||
@@ -38,10 +38,9 @@ namespace Discord.Net.Rest | |||
private readonly DiscordConfig _config; | |||
private readonly IRestEngine _engine; | |||
private readonly ETFWriter _serializer; | |||
private readonly ILogger _logger; | |||
private string _token; | |||
internal Logger Logger { get; } | |||
public CancellationToken CancelToken { get; set; } | |||
public string Token | |||
@@ -54,10 +53,10 @@ namespace Discord.Net.Rest | |||
} | |||
} | |||
protected RestClient(DiscordConfig config, string baseUrl, Logger logger) | |||
protected RestClient(DiscordConfig config, string baseUrl, ILogger logger = null) | |||
{ | |||
_config = config; | |||
Logger = logger; | |||
_logger = logger; | |||
#if !DOTNET5_4 | |||
_engine = new RestSharpEngine(config, baseUrl, logger); | |||
@@ -65,7 +64,7 @@ namespace Discord.Net.Rest | |||
_engine = new BuiltInEngine(config, baseUrl, logger); | |||
#endif | |||
if (Logger.Level >= LogSeverity.Verbose) | |||
if (_logger != null && _logger.Level >= LogSeverity.Verbose) | |||
{ | |||
this.SentRequest += (s, e) => | |||
{ | |||
@@ -82,7 +81,7 @@ namespace Discord.Net.Rest | |||
log += $" {e.ResponseJson}"; | |||
} | |||
} | |||
Logger.Verbose(log); | |||
_logger.Verbose(log); | |||
}; | |||
} | |||
} | |||
@@ -19,14 +19,13 @@ namespace Discord.Net.Rest | |||
private readonly RestSharpClient _client; | |||
private readonly AsyncLock _rateLimitLock; | |||
private readonly ILogger _logger; | |||
private DateTime _rateLimitTime; | |||
internal Logger Logger { get; } | |||
public RestSharpEngine(DiscordConfig config, string baseUrl, Logger logger) | |||
public RestSharpEngine(DiscordConfig config, string baseUrl, ILogger logger) | |||
{ | |||
_config = config; | |||
Logger = logger; | |||
_logger = logger; | |||
_rateLimitLock = new AsyncLock(); | |||
_client = new RestSharpClient(baseUrl) | |||
@@ -89,15 +88,18 @@ namespace Discord.Net.Rest | |||
int milliseconds; | |||
if (retryAfter != null && int.TryParse((string)retryAfter.Value, out milliseconds)) | |||
{ | |||
var now = DateTime.UtcNow; | |||
if (now >= _rateLimitTime) | |||
if (_logger != null) | |||
{ | |||
using (await _rateLimitLock.LockAsync().ConfigureAwait(false)) | |||
var now = DateTime.UtcNow; | |||
if (now >= _rateLimitTime) | |||
{ | |||
if (now >= _rateLimitTime) | |||
using (await _rateLimitLock.LockAsync().ConfigureAwait(false)) | |||
{ | |||
_rateLimitTime = now.AddMilliseconds(milliseconds); | |||
Logger.Warning($"Rate limit hit, waiting {Math.Round(milliseconds / 1000.0f, 2)} seconds"); | |||
if (now >= _rateLimitTime) | |||
{ | |||
_rateLimitTime = now.AddMilliseconds(milliseconds); | |||
_logger.Warning($"Rate limit hit, waiting {Math.Round(milliseconds / 1000.0f, 2)} seconds"); | |||
} | |||
} | |||
} | |||
} | |||