Added RestClient.SendingRequest and SentRequest
This commit is contained in:
@@ -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>
|
||||||
|
|||||||
@@ -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));
|
||||||
|
|
||||||
|
|||||||
19
src/Discord.Net/Net/Rest/CompletedRequestEventArgs.cs
Normal file
19
src/Discord.Net/Net/Rest/CompletedRequestEventArgs.cs
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user