Browse Source

net: add token support to rest client

pull/1435/head
Christopher Felegy 5 years ago
parent
commit
c51bb4cda3
No known key found for this signature in database GPG Key ID: 3AB2CA980DDC61A9
10 changed files with 67 additions and 25 deletions
  1. +5
    -0
      TODO
  2. +10
    -0
      src/Discord.Net/Discord.Net.csproj
  3. +4
    -9
      src/Discord.Net/DiscordClient.cs
  4. +3
    -1
      src/Discord.Net/DiscordConfig.cs
  5. +9
    -7
      src/Discord.Net/IDiscordClient.cs
  6. +23
    -0
      src/Discord.Net/Rest/DiscordHttpClientHandler.cs
  7. +2
    -1
      src/Discord.Net/Rest/DiscordRestApi.cs
  8. +0
    -3
      src/Discord.Net/Rest/JsonContentSerializer.cs
  9. +9
    -4
      src/Discord.Net/Socket/DiscordGatewayApi.cs
  10. +2
    -0
      src/Discord.Net/Socket/Providers/DefaultSocket.cs

+ 5
- 0
TODO View File

@@ -9,10 +9,12 @@
- User
- Voice
- Webhook
- Ratelimiter with refit
- Gateway
- Models
- Client
- Socket
- use token
* Receive
* Compression
- Voice (long)
@@ -24,8 +26,11 @@
- Emoji
- Guild
- User
- Utilities
- Token Validation (port from @ChrisJ)
- Tests
- Unit test Gateway stability / deadlockability?
- Port ChrisJ's token validator tests
- Extensions
- Commands
? design - use finite's or quahu's


+ 10
- 0
src/Discord.Net/Discord.Net.csproj View File

@@ -7,4 +7,14 @@
<RootNamespace>Discord</RootNamespace>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="refit" Version="5.0.23" />
<PackageReference Include="System.Text.Json" Version="4.7.0" />
</ItemGroup>

<ItemGroup>
<Folder Include="Entities\" />
<Folder Include="..\..\..\..\..\%2540discord\%2540next\Discord.Net\src\Discord.Net\Rest\Requests\" />
</ItemGroup>

</Project>

+ 4
- 9
src/Discord.Net/DiscordClient.cs View File

@@ -1,25 +1,20 @@
using Discord.Rest;
using Discord.Socket;
using System;
using System.Collections.Generic;
using System.Text;

namespace Discord
{
internal class DiscordClient : IDiscordClient
{
public DiscordRestApi Rest => _restApi;
public DiscordGatewayApi Gateway => _gatewayApi;
public DiscordRestApi Rest { get; }
public DiscordGatewayApi Gateway { get; }

private readonly DiscordConfig _config;
private readonly DiscordRestApi _restApi;
private readonly DiscordGatewayApi _gatewayApi;

public DiscordClient(DiscordConfig config, DiscordRestApi restApi, DiscordGatewayApi gatewayApi)
{
_config = config;
_restApi = restApi;
_gatewayApi = gatewayApi;
Rest = restApi;
Gateway = gatewayApi;
}
}
}

+ 3
- 1
src/Discord.Net/DiscordConfig.cs View File

@@ -27,7 +27,9 @@ namespace Discord
/// The URI to use when connecting to the gateway. If specified, this will override the URI Discord instructs us to use.
/// </summary>
public Uri? GatewayUri = null;

/// <summary>
/// SocketFactory gets or sets how a WebSocket will be created.
/// </summary>
public SocketFactory SocketFactory { get; set; } = DefaultSocketFactory.Create;
}
}

+ 9
- 7
src/Discord.Net/IDiscordClient.cs View File

@@ -1,7 +1,4 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using System.Net.Http.Headers;
using Discord.Rest;
using Discord.Socket;

@@ -9,10 +6,15 @@ namespace Discord
{
internal interface IDiscordClient
{
static IDiscordClient Create(DiscordConfig config)
static IDiscordClient Create(string token, DiscordConfig? config = default)
{
var rest = new DiscordRestApi(config);
var gateway = new DiscordGatewayApi(config);
config = config ?? new DiscordConfig();

// todo: validate token
var tokenHeader = AuthenticationHeaderValue.Parse(token);

var rest = new DiscordRestApi(config, tokenHeader);
var gateway = new DiscordGatewayApi(config, token);

return new DiscordClient(config, rest, gateway);
}


+ 23
- 0
src/Discord.Net/Rest/DiscordHttpClientHandler.cs View File

@@ -0,0 +1,23 @@
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading;
using System.Threading.Tasks;

namespace Discord.Rest
{
internal sealed class DiscordHttpClientHandler : HttpClientHandler
{
private readonly AuthenticationHeaderValue _token;

public DiscordHttpClientHandler(AuthenticationHeaderValue token)
{
_token = token;
}

protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
request.Headers.Authorization = _token;
return base.SendAsync(request, cancellationToken);
}
}
}

+ 2
- 1
src/Discord.Net/Rest/DiscordRestApi.cs View File

@@ -2,6 +2,7 @@ using System.Text.Json;
using System.Threading.Tasks;
using Refit;
using Discord.Rest.Models;
using System.Net.Http.Headers;

// This is essentially a reimplementation of Wumpus.Net.Rest
namespace Discord.Rest
@@ -10,7 +11,7 @@ namespace Discord.Rest
{
private readonly IDiscordRestApi _api;

public DiscordRestApi(DiscordConfig config)
public DiscordRestApi(DiscordConfig config, AuthenticationHeaderValue token)
{
var jsonOptions = new JsonSerializerOptions();
var refitSettings = new RefitSettings


+ 0
- 3
src/Discord.Net/Rest/JsonContentSerializer.cs View File

@@ -1,11 +1,8 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Threading.Tasks;
using Refit;



+ 9
- 4
src/Discord.Net/Socket/DiscordGatewayApi.cs View File

@@ -6,18 +6,23 @@ namespace Discord.Socket
{
public class DiscordGatewayApi
{
static readonly Uri DefaultGatewayUri = new Uri("wss://gateway.discord.gg");
private readonly DiscordConfig _config;
private readonly string _token;

ISocket Socket { get; set; }
public ISocket Socket { get; set; }

public DiscordGatewayApi(DiscordConfig config)
public DiscordGatewayApi(DiscordConfig config, string token)
{
_config = config;
_token = token;

Socket = config.SocketFactory(OnAborted, OnPacket);
}

public async Task ConnectAsync(Uri? gatewayUri)
{
await Socket.ConnectAsync(gatewayUri ?? DefaultGatewayUri, CancellationToken.None).ConfigureAwait(false);
var baseUri = _config.GatewayUri ?? (gatewayUri ?? DiscordConfig.DefaultGatewayUri);
await Socket.ConnectAsync(baseUri, CancellationToken.None).ConfigureAwait(false);
}

public void OnAborted(Exception error)


+ 2
- 0
src/Discord.Net/Socket/Providers/DefaultSocket.cs View File

@@ -88,6 +88,8 @@ namespace Discord.Socket.Providers
}
State = SocketState.Open;

_receiveTask = ReceiveAsync();

// TODO: this should not be expected to fail
_stateLock.Release();
openLock.Dispose();


Loading…
Cancel
Save