Selector/Selector.SignalR/NowHubCache.cs

115 lines
3.8 KiB
C#

using System;
using Microsoft.Extensions.Logging;
using SpotifyAPI.Web;
namespace Selector.SignalR;
public class NowHubCache
{
private readonly NowHubClient _connection;
private readonly ILogger<NowHubCache> logger;
public TrackAudioFeatures LastFeature { get; private set; }
public List<Card> LastCards { get; private set; } = new();
private readonly object updateLock = new();
private readonly object bindingLock = new();
private bool isBound = false;
public PlayCount LastPlayCount { get; private set; }
public CurrentlyPlayingDTO LastPlaying { get; private set; }
public event EventHandler NewAudioFeature;
public event EventHandler NewCard;
public event EventHandler NewPlayCount;
public event EventHandler NewNowPlaying;
public NowHubCache(NowHubClient connection, ILogger<NowHubCache> logger)
{
_connection = connection;
this.logger = logger;
}
public void BindClient()
{
lock(bindingLock)
{
if(!isBound)
{
_connection.OnNewAudioFeature(af =>
{
lock (updateLock)
{
logger.LogInformation("New audio features received: {0}", af);
LastFeature = af;
NewAudioFeature?.Invoke(this, null);
}
});
_connection.OnNewCard(c =>
{
lock (updateLock)
{
logger.LogInformation("New card received: {0}", c);
LastCards.Add(c);
NewCard?.Invoke(this, null);
}
});
_connection.OnNewPlayCount(pc =>
{
lock (updateLock)
{
logger.LogInformation("New play count received: {0}", pc);
LastPlayCount = pc;
NewPlayCount?.Invoke(this, null);
}
});
_connection.OnNewPlaying(async np =>
{
try
{
lock (updateLock)
{
logger.LogInformation("New now playing recieved: {0}", np);
LastPlaying = np;
LastCards.Clear();
NewNowPlaying?.Invoke(this, null);
}
if (LastPlaying?.Track is not null)
{
if (!string.IsNullOrWhiteSpace(LastPlaying.Track.Id))
{
await _connection.SendAudioFeatures(LastPlaying.Track.Id);
}
await _connection.SendPlayCount(
LastPlaying.Track.Name,
LastPlaying.Track.Artists.FirstOrDefault()?.Name,
LastPlaying.Track.Album?.Name,
LastPlaying.Track.Album?.Artists.FirstOrDefault()?.Name
);
await _connection.SendFacts(
LastPlaying.Track.Name,
LastPlaying.Track.Artists.FirstOrDefault()?.Name,
LastPlaying.Track.Album?.Name,
LastPlaying.Track.Album?.Artists.FirstOrDefault()?.Name
);
}
}
catch (Exception e)
{
logger.LogError(e, "Error while handling new now playing");
}
});
isBound = true;
}
}
}
}