Revised the redeem system, activated via channel point redeems. Added OBS transformation to redeems. Logs changed & writes to logs folder as well. Removed most use of IServiceProvider.

This commit is contained in:
Tom
2024-06-24 22:11:36 +00:00
parent 706cd06930
commit 706eecf2d2
45 changed files with 964 additions and 577 deletions

View File

@ -3,10 +3,11 @@ using TwitchChatTTS;
using System.Text.Json;
using HermesSocketLibrary.Requests.Messages;
using TwitchChatTTS.Hermes;
using TwitchChatTTS.Twitch.Redemptions;
public class HermesApiClient
{
private WebClientWrap _web;
private readonly WebClientWrap _web;
public HermesApiClient(Configuration configuration)
{
@ -90,4 +91,26 @@ public class HermesApiClient
return filters;
}
public async Task<IEnumerable<Redemption>> FetchRedemptions()
{
var redemptions = await _web.GetJson<IEnumerable<Redemption>>("https://hermes.goblincaves.com/api/settings/redemptions", new JsonSerializerOptions()
{
PropertyNameCaseInsensitive = false,
PropertyNamingPolicy = JsonNamingPolicy.CamelCase
});
if (redemptions == null)
throw new Exception("Failed to redemptions from Hermes.");
return redemptions;
}
public async Task<IEnumerable<RedeemableAction>> FetchRedeemableActions()
{
var actions = await _web.GetJson<IEnumerable<RedeemableAction>>("https://hermes.goblincaves.com/api/settings/redemptions/actions");
if (actions == null)
throw new Exception("Failed to fetch redeemable actions from Hermes.");
return actions;
}
}

View File

@ -7,17 +7,17 @@ namespace TwitchChatTTS.Hermes.Socket.Handlers
{
public class HeartbeatHandler : IWebSocketHandler
{
private ILogger _logger { get; }
public int OperationCode { get; set; } = 0;
private readonly ILogger _logger;
public int OperationCode { get; } = 0;
public HeartbeatHandler(ILogger logger)
{
_logger = logger;
}
public async Task Execute<Data>(SocketClient<WebSocketMessage> sender, Data message)
public async Task Execute<Data>(SocketClient<WebSocketMessage> sender, Data data)
{
if (message is not HeartbeatMessage obj || obj == null)
if (data is not HeartbeatMessage message || message == null)
return;
if (sender is not HermesSocketClient client)
@ -29,7 +29,7 @@ namespace TwitchChatTTS.Hermes.Socket.Handlers
client.LastHeartbeatReceived = DateTime.UtcNow;
if (obj.Respond)
if (message.Respond)
await sender.Send(0, new HeartbeatMessage()
{
DateTime = DateTime.UtcNow,

View File

@ -8,33 +8,32 @@ namespace TwitchChatTTS.Hermes.Socket.Handlers
{
public class LoginAckHandler : IWebSocketHandler
{
private IServiceProvider _serviceProvider;
private ILogger _logger;
public int OperationCode { get; set; } = 2;
private readonly User _user;
private readonly ILogger _logger;
public int OperationCode { get; } = 2;
public LoginAckHandler(IServiceProvider serviceProvider, ILogger logger)
public LoginAckHandler(User user, ILogger logger)
{
_serviceProvider = serviceProvider;
_user = user;
_logger = logger;
}
public async Task Execute<Data>(SocketClient<WebSocketMessage> sender, Data message)
public async Task Execute<Data>(SocketClient<WebSocketMessage> sender, Data data)
{
if (message is not LoginAckMessage obj || obj == null)
if (data is not LoginAckMessage message || message == null)
return;
if (sender is not HermesSocketClient client)
return;
if (obj.AnotherClient)
if (message.AnotherClient)
{
_logger.Warning("Another client has connected to the same account.");
}
else
{
var user = _serviceProvider.GetRequiredService<User>();
client.UserId = obj.UserId;
_logger.Information($"Logged in as {user.TwitchUsername} (id: {client.UserId}).");
client.UserId = message.UserId;
_logger.Information($"Logged in as {_user.TwitchUsername}.");
}
await client.Send(3, new RequestMessage()
@ -43,11 +42,10 @@ namespace TwitchChatTTS.Hermes.Socket.Handlers
Data = null
});
var token = _serviceProvider.GetRequiredService<User>();
await client.Send(3, new RequestMessage()
{
Type = "get_tts_users",
Data = new Dictionary<string, object>() { { "user", token.HermesUserId } }
Data = new Dictionary<string, object>() { { "user", _user.HermesUserId } }
});
await client.Send(3, new RequestMessage()

View File

@ -18,7 +18,7 @@ namespace TwitchChatTTS.Hermes.Socket.Handlers
private readonly object _voicesAvailableLock = new object();
public int OperationCode { get; set; } = 4;
public int OperationCode { get; } = 4;
public RequestAckHandler(IServiceProvider serviceProvider, JsonSerializerOptions options, ILogger logger)
{
@ -27,20 +27,20 @@ namespace TwitchChatTTS.Hermes.Socket.Handlers
_logger = logger;
}
public async Task Execute<Data>(SocketClient<WebSocketMessage> sender, Data message)
public async Task Execute<Data>(SocketClient<WebSocketMessage> sender, Data data)
{
if (message is not RequestAckMessage obj || obj == null)
if (data is not RequestAckMessage message || message == null)
return;
if (obj.Request == null)
if (message.Request == null)
return;
var context = _serviceProvider.GetRequiredService<User>();
if (context == null)
return;
if (obj.Request.Type == "get_tts_voices")
if (message.Request.Type == "get_tts_voices")
{
_logger.Verbose("Updating all available voices for TTS.");
var voices = JsonSerializer.Deserialize<IEnumerable<VoiceDetails>>(obj.Data.ToString(), _options);
var voices = JsonSerializer.Deserialize<IEnumerable<VoiceDetails>>(message.Data.ToString(), _options);
if (voices == null)
return;
@ -50,33 +50,33 @@ namespace TwitchChatTTS.Hermes.Socket.Handlers
}
_logger.Information("Updated all available voices for TTS.");
}
else if (obj.Request.Type == "create_tts_user")
else if (message.Request.Type == "create_tts_user")
{
_logger.Verbose("Adding new tts voice for user.");
if (!long.TryParse(obj.Request.Data["user"].ToString(), out long chatterId))
if (!long.TryParse(message.Request.Data["user"].ToString(), out long chatterId))
return;
string userId = obj.Request.Data["user"].ToString();
string voice = obj.Request.Data["voice"].ToString();
string userId = message.Request.Data["user"].ToString();
string voice = message.Request.Data["voice"].ToString();
context.VoicesSelected.Add(chatterId, voice);
_logger.Information($"Added new TTS voice [voice: {voice}] for user [user id: {userId}]");
}
else if (obj.Request.Type == "update_tts_user")
else if (message.Request.Type == "update_tts_user")
{
_logger.Verbose("Updating user's voice");
if (!long.TryParse(obj.Request.Data["chatter"].ToString(), out long chatterId))
if (!long.TryParse(message.Request.Data["chatter"].ToString(), out long chatterId))
return;
string userId = obj.Request.Data["user"].ToString();
string voice = obj.Request.Data["voice"].ToString();
string userId = message.Request.Data["user"].ToString();
string voice = message.Request.Data["voice"].ToString();
context.VoicesSelected[chatterId] = voice;
_logger.Information($"Updated TTS voice [voice: {voice}] for user [user id: {userId}]");
}
else if (obj.Request.Type == "create_tts_voice")
else if (message.Request.Type == "create_tts_voice")
{
_logger.Verbose("Creating new tts voice.");
string? voice = obj.Request.Data["voice"].ToString();
string? voiceId = obj.Data.ToString();
string? voice = message.Request.Data["voice"].ToString();
string? voiceId = message.Data.ToString();
if (voice == null || voiceId == null)
return;
@ -88,10 +88,10 @@ namespace TwitchChatTTS.Hermes.Socket.Handlers
}
_logger.Information($"Created new tts voice [voice: {voice}][id: {voiceId}].");
}
else if (obj.Request.Type == "delete_tts_voice")
else if (message.Request.Type == "delete_tts_voice")
{
_logger.Verbose("Deleting tts voice.");
var voice = obj.Request.Data["voice"].ToString();
var voice = message.Request.Data["voice"].ToString();
if (!context.VoicesAvailable.TryGetValue(voice, out string voiceName) || voiceName == null)
return;
@ -103,11 +103,11 @@ namespace TwitchChatTTS.Hermes.Socket.Handlers
}
_logger.Information($"Deleted a voice [voice: {voiceName}]");
}
else if (obj.Request.Type == "update_tts_voice")
else if (message.Request.Type == "update_tts_voice")
{
_logger.Verbose("Updating TTS voice.");
string voiceId = obj.Request.Data["idd"].ToString();
string voice = obj.Request.Data["voice"].ToString();
string voiceId = message.Request.Data["idd"].ToString();
string voice = message.Request.Data["voice"].ToString();
if (!context.VoicesAvailable.TryGetValue(voiceId, out string voiceName) || voiceName == null)
return;
@ -115,10 +115,10 @@ namespace TwitchChatTTS.Hermes.Socket.Handlers
context.VoicesAvailable[voiceId] = voice;
_logger.Information($"Updated TTS voice [voice: {voice}][id: {voiceId}]");
}
else if (obj.Request.Type == "get_tts_users")
else if (message.Request.Type == "get_tts_users")
{
_logger.Verbose("Updating all chatters' selected voice.");
var users = JsonSerializer.Deserialize<IDictionary<long, string>>(obj.Data.ToString(), _options);
var users = JsonSerializer.Deserialize<IDictionary<long, string>>(message.Data.ToString(), _options);
if (users == null)
return;
@ -128,10 +128,10 @@ namespace TwitchChatTTS.Hermes.Socket.Handlers
context.VoicesSelected = temp;
_logger.Information($"Updated {temp.Count()} chatters' selected voice.");
}
else if (obj.Request.Type == "get_chatter_ids")
else if (message.Request.Type == "get_chatter_ids")
{
_logger.Verbose("Fetching all chatters' id.");
var chatters = JsonSerializer.Deserialize<IEnumerable<long>>(obj.Data.ToString(), _options);
var chatters = JsonSerializer.Deserialize<IEnumerable<long>>(message.Data.ToString(), _options);
if (chatters == null)
return;
@ -139,10 +139,10 @@ namespace TwitchChatTTS.Hermes.Socket.Handlers
client.Chatters = [.. chatters];
_logger.Information($"Fetched {chatters.Count()} chatters' id.");
}
else if (obj.Request.Type == "get_emotes")
else if (message.Request.Type == "get_emotes")
{
_logger.Verbose("Updating emotes.");
var emotes = JsonSerializer.Deserialize<IEnumerable<EmoteInfo>>(obj.Data.ToString(), _options);
var emotes = JsonSerializer.Deserialize<IEnumerable<EmoteInfo>>(message.Data.ToString(), _options);
if (emotes == null)
return;
@ -158,11 +158,11 @@ namespace TwitchChatTTS.Hermes.Socket.Handlers
}
_logger.Information($"Fetched {count} emotes from various sources.");
}
else if (obj.Request.Type == "update_tts_voice_state")
else if (message.Request.Type == "update_tts_voice_state")
{
_logger.Verbose("Updating TTS voice states.");
string voiceId = obj.Request.Data["voice"].ToString();
bool state = obj.Request.Data["state"].ToString() == "true";
string voiceId = message.Request.Data["voice"].ToString();
bool state = message.Request.Data["state"].ToString() == "true";
if (!context.VoicesAvailable.TryGetValue(voiceId, out string voiceName) || voiceName == null)
{

View File

@ -74,7 +74,7 @@ namespace TwitchChatTTS.Hermes.Socket
UserId = null;
_heartbeatTimer.Enabled = false;
_logger.Information("Logged off due to disconnection. Attempting to reconnect...");
_logger.Warning("Logged off due to disconnection. Attempting to reconnect...");
_reconnectTimer.Enabled = true;
}
}

View File

@ -9,7 +9,6 @@ namespace TwitchChatTTS.Hermes.Socket.Managers
{
public HermesHandlerManager(ILogger logger, IServiceProvider provider) : base(logger)
{
//Add(provider.GetRequiredService<HeartbeatHandler>());
try
{
var basetype = typeof(IWebSocketHandler);
@ -29,13 +28,13 @@ namespace TwitchChatTTS.Hermes.Socket.Managers
continue;
}
Logger.Debug($"Linked type {type.AssemblyQualifiedName} to hermes websocket handlers.");
_logger.Debug($"Linked type {type.AssemblyQualifiedName} to hermes websocket handlers.");
Add(handler);
}
}
catch (Exception e)
{
Logger.Error(e, "Failed to load hermes websocket handler types.");
_logger.Error(e, "Failed to load hermes websocket handler types.");
}
}
}