Skip to content

Commit

Permalink
Add IBinanceApi.GetSystemStatusAsync
Browse files Browse the repository at this point in the history
Update base endpoint URL. Add BinanceStatus enum type. Set HttpClient timeout to 60 seconds (was: default 100 seconds). Update sample application.
  • Loading branch information
sonvister committed Feb 9, 2018
1 parent 5d8686c commit 44bbfd2
Show file tree
Hide file tree
Showing 8 changed files with 120 additions and 29 deletions.
25 changes: 0 additions & 25 deletions samples/BinanceConsoleApp/Controllers/GetAccountStatus.cs

This file was deleted.

47 changes: 47 additions & 0 deletions samples/BinanceConsoleApp/Controllers/GetStatus.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
using System;
using System.Threading;
using System.Threading.Tasks;

namespace BinanceConsoleApp.Controllers
{
internal class GetStatus : IHandleCommand
{
public async Task<bool> HandleAsync(string command, CancellationToken token = default)
{
if (!command.StartsWith("status ", StringComparison.OrdinalIgnoreCase))
return false;

var args = command.Split(' ');

if (args.Length > 1 && args[1].Equals("account", StringComparison.OrdinalIgnoreCase))
{
var status = await Program.Api.GetAccountStatusAsync(Program.User, token);

lock (Program.ConsoleSync)
{
Console.WriteLine();
Console.WriteLine($"Account Status: \"{status}\"");
}
}
else if (args.Length > 1 && args[1].Equals("system", StringComparison.OrdinalIgnoreCase))
{
var status = await Program.Api.GetSystemStatusAsync(token);

lock (Program.ConsoleSync)
{
Console.WriteLine();
Console.WriteLine($"System Status: \"{status}\"");
}
}
else
{
lock (Program.ConsoleSync)
{
Console.WriteLine($"Specify either 'account' or 'system' for status.");
}
}

return true;
}
}
}
2 changes: 1 addition & 1 deletion samples/BinanceConsoleApp/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -212,7 +212,7 @@ private static void PrintHelp()
Console.WriteLine(" deposits [asset] display user deposits of an asset or all deposits.");
Console.WriteLine(" withdrawals [asset] display user withdrawals of an asset or all withdrawals.");
Console.WriteLine(" withdraw <asset> <address> <amount> [description] submit a withdraw request (NOTE: 'test only' does NOT apply).");
Console.WriteLine(" status display account status.");
Console.WriteLine(" status [account|system] display account or system status.");
Console.WriteLine(" test <on|off> determines if orders are test only (default: 'on').");
Console.WriteLine();
Console.WriteLine(" quit | exit terminate the application.");
Expand Down
26 changes: 26 additions & 0 deletions src/Binance/Api/BinanceApi.cs
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,32 @@ public virtual async Task<IEnumerable<RateLimitInfo>> GetRateLimitInfoAsync(Canc
return rateLimits;
}

public virtual async Task<BinanceStatus> GetSystemStatusAsync(CancellationToken token = default)
{
var json = await HttpClient.GetSystemStatusAsync(token)
.ConfigureAwait(false);

try
{
var jObject = JObject.Parse(json);

var status = jObject["status"].Value<int>();
var msg = jObject["msg"].Value<string>();

switch (status)
{
case 0: return BinanceStatus.Normal;
case 1: return BinanceStatus.Maintenance;
default:
throw new BinanceApiException($"Unknown Status ({status}): \"{msg}\"");
}
}
catch (Exception e)
{
throw NewFailedToParseJsonException(nameof(GetSystemStatusAsync), json, e);
}
}

#endregion Connectivity

#region Market Data
Expand Down
7 changes: 4 additions & 3 deletions src/Binance/Api/BinanceHttpClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public sealed class BinanceHttpClient : IBinanceHttpClient
/// <summary>
/// Get the base endpoint URL.
/// </summary>
public static readonly string EndpointUrl = "https://www.binance.com";
public static readonly string EndpointUrl = "https://api.binance.com";

/// <summary>
/// Get the successful test response string.
Expand Down Expand Up @@ -94,7 +94,8 @@ internal BinanceHttpClient(ITimestampProvider timestampProvider = null, IApiRate
{
_httpClient = new HttpClient
{
BaseAddress = uri
BaseAddress = uri,
Timeout = TimeSpan.FromSeconds(60)
};
}
catch (Exception e)
Expand All @@ -108,7 +109,7 @@ internal BinanceHttpClient(ITimestampProvider timestampProvider = null, IApiRate
{
try
{
// Singleton HttpClient doesn't respect DNS changes.
// FIX: Singleton HttpClient doesn't respect DNS changes.
// https://github.com/dotnet/corefx/issues/11224
var sp = ServicePointManager.FindServicePoint(uri);
sp.ConnectionLeaseTimeout = Options.ServicePointManagerConnectionLeaseTimeoutMilliseconds;
Expand Down
7 changes: 7 additions & 0 deletions src/Binance/Api/IBinanceApi.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,13 @@ public interface IBinanceApi
/// <returns></returns>
Task<IEnumerable<RateLimitInfo>> GetRateLimitInfoAsync(CancellationToken token = default);

/// <summary>
/// Get system status.
/// </summary>
/// <param name="token"></param>
/// <returns></returns>
Task<BinanceStatus> GetSystemStatusAsync(CancellationToken token = default);

#endregion Connectivity

#region Market Data
Expand Down
15 changes: 15 additions & 0 deletions src/Binance/BinanceStatus.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
namespace Binance
{
public enum BinanceStatus
{
/// <summary>
/// Normal operation.
/// </summary>
Normal,

/// <summary>
/// System maintenance.
/// </summary>
Maintenance
}
}
20 changes: 20 additions & 0 deletions src/Binance/Extensions/BinanceHttpClientExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,26 @@ await client.RateLimiter.DelayAsync(token: token)
.ConfigureAwait(false);
}

/// <summary>
/// Get system status.
/// </summary>
/// <param name="client"></param>
/// <param name="token"></param>
/// <returns></returns>
public static async Task<string> GetSystemStatusAsync(this IBinanceHttpClient client, CancellationToken token = default)
{
Throw.IfNull(client, nameof(client));

if (client.RateLimiter != null)
{
await client.RateLimiter.DelayAsync(token: token)
.ConfigureAwait(false);
}

return await client.GetAsync("/wapi/v3/systemStatus.html", token)
.ConfigureAwait(false);
}

#endregion General

#region Market Data
Expand Down

0 comments on commit 44bbfd2

Please sign in to comment.