Cleaned up code

This commit is contained in:
Tom 2024-08-14 18:19:18 +00:00
parent 36ae613736
commit 9fd43502f5
7 changed files with 13 additions and 183 deletions

View File

@ -1,26 +1,23 @@
using TwitchChatTTS.Helpers; using TwitchChatTTS.Helpers;
using TwitchChatTTS; using TwitchChatTTS;
using System.Text.Json; using System.Text.Json;
using HermesSocketLibrary.Requests.Messages;
using TwitchChatTTS.Hermes; using TwitchChatTTS.Hermes;
using Serilog; using Serilog;
public class HermesApiClient public class HermesApiClient
{ {
private readonly TwitchBotAuth _token;
private readonly WebClientWrap _web; private readonly WebClientWrap _web;
private readonly ILogger _logger; private readonly ILogger _logger;
public const string BASE_URL = "tomtospeech.com"; public const string BASE_URL = "tomtospeech.com";
public HermesApiClient(TwitchBotAuth token, Configuration configuration, ILogger logger) public HermesApiClient(Configuration configuration, ILogger logger)
{ {
if (string.IsNullOrWhiteSpace(configuration.Hermes?.Token)) if (string.IsNullOrWhiteSpace(configuration.Hermes?.Token))
{ {
throw new Exception("Ensure you have written your API key in \".token\" file, in the same folder as this application."); throw new Exception("Ensure you have written your API key in \".token\" file, in the same folder as this application.");
} }
_token = token;
_web = new WebClientWrap(new JsonSerializerOptions() _web = new WebClientWrap(new JsonSerializerOptions()
{ {
PropertyNameCaseInsensitive = false, PropertyNameCaseInsensitive = false,
@ -30,42 +27,6 @@ public class HermesApiClient
_logger = logger; _logger = logger;
} }
public async Task<TwitchBotAuth?> AuthorizeTwitch()
{
try
{
_logger.Debug($"Attempting to authorize Twitch API...");
var authorize = await _web.GetJson<TwitchBotAuth>($"https://{HermesApiClient.BASE_URL}/api/account/reauthorize");
if (authorize != null)
{
_token.AccessToken = authorize.AccessToken;
_token.RefreshToken = authorize.RefreshToken;
_token.UserId = authorize.UserId;
_token.BroadcasterId = authorize.BroadcasterId;
_token.ExpiresIn = authorize.ExpiresIn;
_token.UpdatedAt = DateTime.Now;
_logger.Information("Updated Twitch API tokens.");
_logger.Debug($"Twitch API Auth data [user id: {_token.UserId}][id: {_token.BroadcasterId}][expires in: {_token.ExpiresIn}][expires at: {_token.ExpiresAt.ToShortTimeString()}]");
}
else if (authorize != null)
{
_logger.Error("Twitch API Authorization failed: " + authorize.AccessToken + " | " + authorize.RefreshToken + " | " + authorize.UserId + " | " + authorize.BroadcasterId);
return null;
}
return _token;
}
catch (JsonException)
{
_logger.Debug($"Failed to Authorize Twitch API due to JSON error.");
}
catch (Exception e)
{
_logger.Error(e, "Failed to authorize to Twitch API.");
}
return null;
}
public async Task<TTSVersion?> GetLatestTTSVersion() public async Task<TTSVersion?> GetLatestTTSVersion()
{ {
return await _web.GetJson<TTSVersion>($"https://{BASE_URL}/api/info/version"); return await _web.GetJson<TTSVersion>($"https://{BASE_URL}/api/info/version");
@ -81,110 +42,4 @@ public class HermesApiClient
throw new NullReferenceException("Invalid value found while fetching for hermes account data."); throw new NullReferenceException("Invalid value found while fetching for hermes account data.");
return account; return account;
} }
public async Task<TwitchBotToken> FetchTwitchBotToken()
{
var token = await _web.GetJson<TwitchBotToken>($"https://{BASE_URL}/api/token/bot");
if (token == null || token.ClientId == null || token.AccessToken == null || token.RefreshToken == null || token.ClientSecret == null)
throw new Exception("Failed to fetch Twitch API token from Hermes.");
return token;
}
public async Task<string> FetchTTSDefaultVoice()
{
var data = await _web.GetJson<string>($"https://{BASE_URL}/api/settings/tts/default");
if (data == null)
throw new Exception("Failed to fetch TTS default voice from Hermes.");
return data;
}
public async Task<IEnumerable<TTSChatterSelectedVoice>> FetchTTSChatterSelectedVoices()
{
var voices = await _web.GetJson<IEnumerable<TTSChatterSelectedVoice>>($"https://{BASE_URL}/api/settings/tts/selected");
if (voices == null)
throw new Exception("Failed to fetch TTS chatter selected voices from Hermes.");
return voices;
}
public async Task<IEnumerable<string>> FetchTTSEnabledVoices()
{
var voices = await _web.GetJson<IEnumerable<string>>($"https://{BASE_URL}/api/settings/tts");
if (voices == null)
throw new Exception("Failed to fetch TTS enabled voices from Hermes.");
return voices;
}
public async Task<IEnumerable<TTSWordFilter>> FetchTTSWordFilters()
{
var filters = await _web.GetJson<IEnumerable<TTSWordFilter>>($"https://{BASE_URL}/api/settings/tts/filter/words");
if (filters == null)
throw new Exception("Failed to fetch TTS word filters from Hermes.");
return filters;
}
public async Task<IEnumerable<Redemption>> FetchRedemptions()
{
var redemptions = await _web.GetJson<IEnumerable<Redemption>>($"https://{BASE_URL}/api/settings/redemptions", new JsonSerializerOptions()
{
PropertyNameCaseInsensitive = false,
PropertyNamingPolicy = JsonNamingPolicy.CamelCase
});
if (redemptions == null)
throw new Exception("Failed to fetch redemptions from Hermes.");
return redemptions;
}
public async Task<IEnumerable<Group>> FetchGroups()
{
var groups = await _web.GetJson<IEnumerable<Group>>($"https://{BASE_URL}/api/settings/groups", new JsonSerializerOptions()
{
PropertyNameCaseInsensitive = false,
PropertyNamingPolicy = JsonNamingPolicy.CamelCase
});
if (groups == null)
throw new Exception("Failed to fetch groups from Hermes.");
return groups;
}
public async Task<IEnumerable<GroupChatter>> FetchGroupChatters()
{
var chatters = await _web.GetJson<IEnumerable<GroupChatter>>($"https://{BASE_URL}/api/settings/groups/users", new JsonSerializerOptions()
{
PropertyNameCaseInsensitive = false,
PropertyNamingPolicy = JsonNamingPolicy.CamelCase
});
if (chatters == null)
throw new Exception("Failed to fetch groups from Hermes.");
return chatters;
}
public async Task<IEnumerable<GroupPermission>> FetchGroupPermissions()
{
var permissions = await _web.GetJson<IEnumerable<GroupPermission>>($"https://{BASE_URL}/api/settings/groups/permissions", new JsonSerializerOptions()
{
PropertyNameCaseInsensitive = false,
PropertyNamingPolicy = JsonNamingPolicy.CamelCase
});
if (permissions == null)
throw new Exception("Failed to fetch group permissions from Hermes.");
return permissions;
}
public async Task<IEnumerable<RedeemableAction>> FetchRedeemableActions()
{
var actions = await _web.GetJson<IEnumerable<RedeemableAction>>($"https://{BASE_URL}/api/settings/redemptions/actions");
if (actions == null)
throw new Exception("Failed to fetch redeemable actions from Hermes.");
return actions;
}
} }

View File

@ -1,21 +0,0 @@
public class TwitchBotAuth
{
public string? UserId { get; set; }
public string? AccessToken { get; set; }
public string? RefreshToken { get; set; }
public string? BroadcasterId { get; set; }
public long? ExpiresIn
{
get => _expiresIn;
set
{
_expiresIn = value;
if (value != null)
ExpiresAt = DateTime.UtcNow + TimeSpan.FromSeconds((double) value);
}
}
public DateTime ExpiresAt { get; set; }
public DateTime UpdatedAt { get; set; }
private long? _expiresIn;
}

View File

@ -32,6 +32,7 @@ using CommonSocketLibrary.Backoff;
using TwitchChatTTS.Chat.Speech; using TwitchChatTTS.Chat.Speech;
using TwitchChatTTS.Chat.Messaging; using TwitchChatTTS.Chat.Messaging;
using TwitchChatTTS.Chat.Observers; using TwitchChatTTS.Chat.Observers;
using TwitchChatTTS.Chat.Commands.Limits;
// dotnet publish -r linux-x64 -p:PublishSingleFile=true --self-contained true // dotnet publish -r linux-x64 -p:PublishSingleFile=true --self-contained true
// dotnet publish -r win-x64 -p:PublishSingleFile=true --self-contained true // dotnet publish -r win-x64 -p:PublishSingleFile=true --self-contained true
@ -85,7 +86,6 @@ s.AddSingleton<ICommandManager, CommandManager>();
s.AddSingleton<TTSPlayer>(); s.AddSingleton<TTSPlayer>();
s.AddSingleton<IRedemptionManager, RedemptionManager>(); s.AddSingleton<IRedemptionManager, RedemptionManager>();
s.AddSingleton<HermesApiClient>(); s.AddSingleton<HermesApiClient>();
s.AddSingleton<TwitchBotAuth>();
s.AddSingleton<TwitchApiClient>(); s.AddSingleton<TwitchApiClient>();
s.AddSingleton<SevenApiClient>(); s.AddSingleton<SevenApiClient>();
@ -94,6 +94,8 @@ s.AddSingleton<IEmoteDatabase, EmoteDatabase>();
s.AddSingleton<TTSConsumer>(); s.AddSingleton<TTSConsumer>();
s.AddSingleton<TTSPublisher>(); s.AddSingleton<TTSPublisher>();
s.AddSingleton<ChatMessageReader>();
// OBS websocket // OBS websocket
s.AddKeyedSingleton<IWebSocketHandler, HelloHandler>("obs"); s.AddKeyedSingleton<IWebSocketHandler, HelloHandler>("obs");
s.AddKeyedSingleton<IWebSocketHandler, IdentifiedHandler>("obs"); s.AddKeyedSingleton<IWebSocketHandler, IdentifiedHandler>("obs");
@ -118,8 +120,6 @@ s.AddKeyedSingleton<SocketClient<WebSocketMessage>, SevenSocketClient>("7tv");
// Nightbot // Nightbot
s.AddSingleton<NightbotApiClient>(); s.AddSingleton<NightbotApiClient>();
s.AddSingleton<ChatMessageReader>();
// twitch websocket // twitch websocket
s.AddKeyedSingleton<IBackoff>("twitch", new ExponentialBackoff(1000, 120 * 1000)); s.AddKeyedSingleton<IBackoff>("twitch", new ExponentialBackoff(1000, 120 * 1000));
s.AddSingleton<ITwitchConnectionManager, TwitchConnectionManager>(); s.AddSingleton<ITwitchConnectionManager, TwitchConnectionManager>();

View File

@ -110,7 +110,7 @@ namespace TwitchChatTTS
} }
catch (Exception e) catch (Exception e)
{ {
_logger.Error(e, "Failed to fetch TTS message for "); _logger.Error(e, $"Failed to fetch TTS message [message: {message.Message.Trim()}][chatter id: {group.ChatterId}].");
} }
} }

View File

@ -44,9 +44,9 @@ namespace TwitchChatTTS.Twitch.Socket.Handlers
_messageTypes.Add("channel.subscription.gift", typeof(ChannelSubscriptionGiftMessage)); _messageTypes.Add("channel.subscription.gift", typeof(ChannelSubscriptionGiftMessage));
} }
public async Task Execute(TwitchWebsocketClient sender, object data) public Task Execute(TwitchWebsocketClient sender, object data)
{ {
Task.Run(async () => return Task.Run(() =>
{ {
if (sender == null) if (sender == null)
return; return;
@ -66,6 +66,7 @@ namespace TwitchChatTTS.Twitch.Socket.Handlers
} }
var d = JsonSerializer.Deserialize(message.Event.ToString()!, type, _options); var d = JsonSerializer.Deserialize(message.Event.ToString()!, type, _options);
ArgumentNullException.ThrowIfNull(d);
Task.Run(async () => await handler.Execute(sender, d)); Task.Run(async () => await handler.Execute(sender, d));
}); });
} }

View File

@ -78,21 +78,19 @@ namespace TwitchChatTTS.Twitch.Socket
{ {
if (_identified?.UID == client.UID) if (_identified?.UID == client.UID)
{ {
_logger.Warning($"Identified Twitch client has disconnected [client: {client.UID}][main: {_identified.UID}][backup: {_backup?.UID}]"); _logger.Debug($"Identified Twitch client has disconnected [client: {client.UID}][main: {_identified.UID}][backup: {_backup?.UID}]");
_identified = null; _identified = null;
reconnecting = true; reconnecting = true;
} }
else if (_backup?.UID == client.UID) else if (_backup?.UID == client.UID)
{ {
_logger.Warning($"Backup Twitch client has disconnected [client: {client.UID}][main: {_identified?.UID}][backup: {_backup.UID}]"); _logger.Debug($"Backup Twitch client has disconnected [client: {client.UID}][main: {_identified?.UID}][backup: {_backup.UID}]");
_backup = null; _backup = null;
} }
else if (client.ReceivedReconnecting) else if (client.ReceivedReconnecting)
{
_logger.Debug($"Twitch client disconnected due to reconnection [client: {client.UID}][main: {_identified?.UID}][backup: {_backup?.UID}]"); _logger.Debug($"Twitch client disconnected due to reconnection [client: {client.UID}][main: {_identified?.UID}][backup: {_backup?.UID}]");
}
else else
_logger.Error($"Twitch client disconnected from unknown source [client: {client.UID}][main: {_identified?.UID}][backup: {_backup?.UID}]"); _logger.Warning($"Twitch client disconnected from unknown source [client: {client.UID}][main: {_identified?.UID}][backup: {_backup?.UID}]");
} }
if (reconnecting) if (reconnecting)
@ -111,7 +109,7 @@ namespace TwitchChatTTS.Twitch.Socket
{ {
if (_backup != null && _backup.UID == client.UID) if (_backup != null && _backup.UID == client.UID)
{ {
_logger.Information($"Twitch client has been identified [client: {client.UID}][main: {_identified?.UID}][backup: {_backup.UID}]"); _logger.Debug($"Twitch client has been identified [client: {client.UID}][main: {_identified?.UID}][backup: {_backup.UID}]");
_identified = _backup; _identified = _backup;
_backup = null; _backup = null;
} }
@ -120,7 +118,7 @@ namespace TwitchChatTTS.Twitch.Socket
} }
else if (_identified.UID == client.UID) else if (_identified.UID == client.UID)
{ {
_logger.Warning($"Twitch client has been re-identified [client: {client.UID}][main: {_identified.UID}][backup: {_backup?.UID}]"); _logger.Debug($"Twitch client has been re-identified [client: {client.UID}][main: {_identified.UID}][backup: {_backup?.UID}]");
} }
else if (_backup == null || _backup.UID != client.UID) else if (_backup == null || _backup.UID != client.UID)
{ {

View File

@ -17,7 +17,6 @@ namespace TwitchChatTTS.Twitch.Socket
private readonly IDictionary<string, string> _subscriptions; private readonly IDictionary<string, string> _subscriptions;
private readonly IBackoff _backoff; private readonly IBackoff _backoff;
private readonly Configuration _configuration; private readonly Configuration _configuration;
private DateTime _lastReceivedMessageTimestamp;
private bool _disconnected; private bool _disconnected;
private readonly object _lock; private readonly object _lock;
@ -157,8 +156,6 @@ namespace TwitchChatTTS.Twitch.Socket
return; return;
} }
_lastReceivedMessageTimestamp = DateTime.UtcNow;
string content = message.Payload?.ToString() ?? string.Empty; string content = message.Payload?.ToString() ?? string.Empty;
if (message.Metadata.MessageType != "session_keepalive") if (message.Metadata.MessageType != "session_keepalive")
_logger.Debug("Twitch RX #" + message.Metadata.MessageType + ": " + content); _logger.Debug("Twitch RX #" + message.Metadata.MessageType + ": " + content);