Added RestClient.SendingRequest and SentRequest

This commit is contained in:
RogueException
2016-01-09 20:51:00 -04:00
parent 993316bdfd
commit 44a36ed97e
6 changed files with 110 additions and 78 deletions

View File

@@ -478,6 +478,9 @@
<Compile Include="..\Discord.Net\Net\HttpException.cs"> <Compile Include="..\Discord.Net\Net\HttpException.cs">
<Link>Net\HttpException.cs</Link> <Link>Net\HttpException.cs</Link>
</Compile> </Compile>
<Compile Include="..\Discord.Net\Net\Rest\CompletedRequestEventArgs.cs">
<Link>Net\Rest\CompletedRequestEventArgs.cs</Link>
</Compile>
<Compile Include="..\Discord.Net\Net\Rest\IRestEngine.cs"> <Compile Include="..\Discord.Net\Net\Rest\IRestEngine.cs">
<Link>Net\Rest\IRestEngine.cs</Link> <Link>Net\Rest\IRestEngine.cs</Link>
</Compile> </Compile>

View File

@@ -51,8 +51,8 @@ namespace Discord
=> OnEvent(MessageDeleted, new MessageEventArgs(msg)); => OnEvent(MessageDeleted, new MessageEventArgs(msg));
private void OnMessageReceived(Message msg) private void OnMessageReceived(Message msg)
=> OnEvent(MessageReceived, new MessageEventArgs(msg)); => OnEvent(MessageReceived, new MessageEventArgs(msg));
/*private void OnMessageSent(Message msg) internal void OnMessageSent(Message msg)
=> OnEvent(MessageSent, new MessageEventArgs(msg));*/ => OnEvent(MessageSent, new MessageEventArgs(msg));
private void OnMessageUpdated(Message msg) private void OnMessageUpdated(Message msg)
=> OnEvent(MessageUpdated, new MessageEventArgs(msg)); => OnEvent(MessageUpdated, new MessageEventArgs(msg));

View File

@@ -0,0 +1,19 @@
using Discord.API;
namespace Discord.Net.Rest
{
public class CompletedRequestEventArgs : RequestEventArgs
{
public object Response { get; set; }
public string ResponseJson { get; set; }
public double Milliseconds { get; set; }
public CompletedRequestEventArgs(IRestRequest request, object response, string responseJson, double milliseconds)
: base(request)
{
Response = response;
ResponseJson = responseJson;
Milliseconds = milliseconds;
}
}
}

View File

@@ -1,20 +1,15 @@
using System; using Discord.API;
using System;
namespace Discord.Net.Rest namespace Discord.Net.Rest
{ {
public class RequestEventArgs : EventArgs public class RequestEventArgs : EventArgs
{ {
public string Method { get; } public IRestRequest Request { get; set; }
public string Path { get; }
public string Payload { get; }
public double ElapsedMilliseconds { get; }
public RequestEventArgs(string method, string path, string payload, double milliseconds) public RequestEventArgs(IRestRequest request)
{ {
Method = method; Request = request;
Path = path;
Payload = payload;
ElapsedMilliseconds = milliseconds;
} }
} }
} }

View File

@@ -10,7 +10,27 @@ namespace Discord.Net.Rest
{ {
public sealed partial class RestClient public sealed partial class RestClient
{ {
private readonly DiscordConfig _config; private struct RestResults
{
public string Response { get; set; }
public double Milliseconds { get; set; }
public RestResults(string response, double milliseconds)
{
Response = response;
Milliseconds = milliseconds;
}
}
public event EventHandler<RequestEventArgs> SendingRequest = delegate { };
public event EventHandler<CompletedRequestEventArgs> SentRequest = delegate { };
private void OnSendingRequest(IRestRequest request)
=> SendingRequest(this, new RequestEventArgs(request));
private void OnSentRequest(IRestRequest request, object response, string responseJson, double milliseconds)
=> SentRequest(this, new CompletedRequestEventArgs(request, response, responseJson, milliseconds));
private readonly DiscordConfig _config;
private readonly IRestEngine _engine; private readonly IRestEngine _engine;
private string _token; private string _token;
private JsonSerializerSettings _deserializeSettings; private JsonSerializerSettings _deserializeSettings;
@@ -48,6 +68,27 @@ namespace Discord.Net.Rest
_deserializeSettings.CheckAdditionalContent = false; _deserializeSettings.CheckAdditionalContent = false;
_deserializeSettings.MissingMemberHandling = MissingMemberHandling.Ignore; _deserializeSettings.MissingMemberHandling = MissingMemberHandling.Ignore;
#endif #endif
if (Logger.Level >= LogSeverity.Verbose)
{
this.SentRequest += (s, e) =>
{
string log = $"{e.Request.Method} {e.Request.Endpoint}: {e.Milliseconds} ms";
if (_config.LogLevel >= LogSeverity.Debug)
{
if (e.Request is IRestFileRequest)
log += $" [{(e.Request as IRestFileRequest).Filename}]";
else if (e.Response != null)
{
if (e.Request.IsPrivate)
log += $" [Hidden]";
else
log += $" {e.ResponseJson}";
}
}
Logger.Verbose(log);
};
}
} }
public async Task<ResponseT> Send<ResponseT>(IRestRequest<ResponseT> request) public async Task<ResponseT> Send<ResponseT>(IRestRequest<ResponseT> request)
@@ -55,14 +96,20 @@ namespace Discord.Net.Rest
{ {
if (request == null) throw new ArgumentNullException(nameof(request)); if (request == null) throw new ArgumentNullException(nameof(request));
string responseJson = await Send(request, true).ConfigureAwait(false); OnSendingRequest(request);
return DeserializeResponse<ResponseT>(responseJson); var results = await Send(request, true).ConfigureAwait(false);
} var response = DeserializeResponse<ResponseT>(results.Response);
public Task Send(IRestRequest request) OnSentRequest(request, response, results.Response, results.Milliseconds);
return response;
}
public async Task Send(IRestRequest request)
{ {
if (request == null) throw new ArgumentNullException(nameof(request)); if (request == null) throw new ArgumentNullException(nameof(request));
return Send(request, false); OnSendingRequest(request);
var results = await Send(request, false).ConfigureAwait(false);
OnSentRequest(request, null, null, results.Milliseconds);
} }
public async Task<ResponseT> Send<ResponseT>(IRestFileRequest<ResponseT> request) public async Task<ResponseT> Send<ResponseT>(IRestFileRequest<ResponseT> request)
@@ -70,80 +117,47 @@ namespace Discord.Net.Rest
{ {
if (request == null) throw new ArgumentNullException(nameof(request)); if (request == null) throw new ArgumentNullException(nameof(request));
string requestJson = JsonConvert.SerializeObject(request.Payload); OnSendingRequest(request);
string responseJson = await SendFile(request, true).ConfigureAwait(false); var requestJson = JsonConvert.SerializeObject(request.Payload);
return DeserializeResponse<ResponseT>(responseJson); var results = await SendFile(request, true).ConfigureAwait(false);
var response = DeserializeResponse<ResponseT>(results.Response);
OnSentRequest(request, response, results.Response, results.Milliseconds);
return response;
} }
public Task Send(IRestFileRequest request) public async Task Send(IRestFileRequest request)
{ {
if (request == null) throw new ArgumentNullException(nameof(request)); if (request == null) throw new ArgumentNullException(nameof(request));
return SendFile(request, false); OnSendingRequest(request);
var results = await SendFile(request, false);
OnSentRequest(request, null, null, results.Milliseconds);
} }
private async Task<string> Send(IRestRequest request, bool hasResponse) private async Task<RestResults> Send(IRestRequest request, bool hasResponse)
{ {
var method = request.Method;
var path = request.Endpoint;
object payload = request.Payload; object payload = request.Payload;
var isPrivate = request.IsPrivate;
string requestJson = null; string requestJson = null;
if (payload != null) if (payload != null)
requestJson = JsonConvert.SerializeObject(payload); requestJson = JsonConvert.SerializeObject(payload);
Stopwatch stopwatch = null; Stopwatch stopwatch = Stopwatch.StartNew();
if (Logger.Level >= LogSeverity.Verbose) string responseJson = await _engine.Send(request.Method, request.Endpoint, requestJson, CancelToken).ConfigureAwait(false);
stopwatch = Stopwatch.StartNew(); stopwatch.Stop();
string responseJson = await _engine.Send(method, path, requestJson, CancelToken).ConfigureAwait(false); double milliseconds = Math.Round((double)stopwatch.ElapsedTicks / (double)Stopwatch.Frequency * 1000.0, 2);
return new RestResults(responseJson, milliseconds);
if (Logger.Level >= LogSeverity.Verbose)
{
stopwatch.Stop();
double milliseconds = Math.Round(stopwatch.ElapsedTicks / (double)TimeSpan.TicksPerMillisecond, 2);
string log = $"{method} {path}: {milliseconds} ms";
if (payload != null && _config.LogLevel >= LogSeverity.Debug)
{
if (isPrivate)
log += $" [Hidden]";
else
log += $" {requestJson}";
}
Logger.Verbose(log);
}
return responseJson;
} }
private async Task<string> SendFile(IRestFileRequest request, bool hasResponse) private async Task<RestResults> SendFile(IRestFileRequest request, bool hasResponse)
{ {
var method = request.Method; Stopwatch stopwatch = Stopwatch.StartNew();
var path = request.Endpoint; string responseJson = await _engine.SendFile(request.Method, request.Endpoint, request.Filename, request.Stream, CancelToken).ConfigureAwait(false);
var filename = request.Filename; stopwatch.Stop();
var stream = request.Stream;
var isPrivate = request.IsPrivate;
Stopwatch stopwatch = null; double milliseconds = Math.Round((double)stopwatch.ElapsedTicks / (double)Stopwatch.Frequency * 1000.0, 2);
if (Logger.Level >= LogSeverity.Verbose) return new RestResults(responseJson, milliseconds);
stopwatch = Stopwatch.StartNew(); }
string responseJson = await _engine.SendFile(method, path, filename, stream, CancelToken).ConfigureAwait(false);
if (Logger.Level >= LogSeverity.Verbose)
{
stopwatch.Stop();
double milliseconds = Math.Round(stopwatch.ElapsedTicks / (double)TimeSpan.TicksPerMillisecond, 2);
string log = $"{method} {path}: {milliseconds} ms";
if (_config.LogLevel >= LogSeverity.Debug && !isPrivate)
log += $" {filename}";
Logger.Verbose(log);
}
return responseJson;
}
private T DeserializeResponse<T>(string json) private T DeserializeResponse<T>(string json)
{ {

View File

@@ -89,6 +89,7 @@ namespace Discord.Net.WebSockets
} }
catch (Exception ex) catch (Exception ex)
{ {
//TODO: Should this be inside the lock?
await _taskManager.SignalError(ex); await _taskManager.SignalError(ex);
throw; throw;
} }