Skip to content

Commit

Permalink
feat: add signalr api controller
Browse files Browse the repository at this point in the history
  • Loading branch information
revam committed Mar 31, 2024
1 parent 2afc675 commit 3e9074d
Show file tree
Hide file tree
Showing 2 changed files with 115 additions and 10 deletions.
21 changes: 11 additions & 10 deletions Shokofin/SignalR/SignalRConnectionManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,10 @@ public class SignalRConnectionManager : IDisposable

private string LastConfigKey = string.Empty;

public bool IsUsable => CanConnect(Plugin.Instance.Configuration);

public bool IsActive => Connection != null;

public HubConnectionState State => Connection == null ? HubConnectionState.Disconnected : Connection.State;

public SignalRConnectionManager(ILogger<SignalRConnectionManager> logger, ShokoResolveManager resolveManager, ILibraryManager libraryManager, ILibraryMonitor libraryMonitor)
Expand Down Expand Up @@ -121,7 +125,7 @@ private Task OnDisconnected(Exception? exception)
public void Disconnect()
=> DisconnectAsync().ConfigureAwait(false).GetAwaiter().GetResult();

private async Task DisconnectAsync()
public async Task DisconnectAsync()
{
if (Connection == null)
return;
Expand All @@ -133,19 +137,16 @@ private async Task DisconnectAsync()
await connection.DisposeAsync();
}

public void ResetConnection(bool autoConnect)
=> ResetConnection(Plugin.Instance.Configuration, autoConnect);

private void ResetConnection(PluginConfiguration config, bool autoConnect)
=> ResetConnectionAsync(config, autoConnect).ConfigureAwait(false).GetAwaiter().GetResult();
public Task ResetConnectionAsync()
=> ResetConnectionAsync(Plugin.Instance.Configuration, true);

public Task ResetConnectionAsync(bool autoConnect)
=> ResetConnectionAsync(Plugin.Instance.Configuration, autoConnect);
private void ResetConnection(PluginConfiguration config, bool shouldConnect)
=> ResetConnectionAsync(config, shouldConnect).ConfigureAwait(false).GetAwaiter().GetResult();

private async Task ResetConnectionAsync(PluginConfiguration config, bool autoConnect)
private async Task ResetConnectionAsync(PluginConfiguration config, bool shouldConnect)
{
await DisconnectAsync();
if (autoConnect)
if (shouldConnect)
await ConnectAsync(config);
}

Expand Down
104 changes: 104 additions & 0 deletions Shokofin/Web/SignalRApiController.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
using System;
using System.Net.Http;
using System.Net.Mime;
using System.Reflection;
using System.Text.Json.Serialization;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.SignalR.Client;
using Microsoft.Extensions.Logging;
using Shokofin.API;
using Shokofin.API.Models;
using Shokofin.SignalR;

#nullable enable
namespace Shokofin.Web;

/// <summary>
/// Pushbullet notifications controller.
/// </summary>
[ApiController]
[Route("Plugin/Shokofin/SignalR")]
[Produces(MediaTypeNames.Application.Json)]
public class SignalRApiController : ControllerBase
{
private readonly ILogger<SignalRApiController> Logger;

private readonly SignalRConnectionManager ConnectionManager;

/// <summary>
/// Initializes a new instance of the <see cref="SignalRApiController"/> class.
/// </summary>
public SignalRApiController(ILogger<SignalRApiController> logger, SignalRConnectionManager connectionManager)
{
Logger = logger;
ConnectionManager = connectionManager;
}

/// <summary>
/// Get the current status of the connection to Shoko Server.
/// </summary>
[HttpGet("Status")]
public ShokoSignalRStatus GetStatus()
{
return new()
{
IsUsable = ConnectionManager.IsUsable,
IsActive = ConnectionManager.IsActive,
State = ConnectionManager.State,
};
}

/// <summary>
/// Connect or reconnect to Shoko Server.
/// </summary>
[HttpPost("Connect")]
public async Task<ActionResult> ConnectAsync()
{
try {
await ConnectionManager.ResetConnectionAsync();
return Ok();
}
catch (Exception ex) {
Logger.LogError(ex, "Failed to connect to server.");
return StatusCode(StatusCodes.Status500InternalServerError);
}
}

/// <summary>
/// Disconnect from Shoko Server.
/// </summary>
[HttpPost("Disconnect")]
public async Task<ActionResult> DisconnectAsync()
{
try {
await ConnectionManager.DisconnectAsync();
return Ok();
}
catch (Exception ex) {
Logger.LogError(ex, "Failed to disconnect from server.");
return StatusCode(StatusCodes.Status500InternalServerError);

}
}
}

public class ShokoSignalRStatus
{
/// <summary>
/// Determines if we can establish a connection to the server.
/// </summary>
public bool IsUsable { get; set; }

/// <summary>
/// Determines if the connection manager is currently active.
/// </summary>
public bool IsActive { get; set; }

/// <summary>
/// The current state of the connection.
/// </summary>
[JsonConverter(typeof(JsonStringEnumConverter))]
public HubConnectionState State { get; set; }
}

0 comments on commit 3e9074d

Please sign in to comment.