Changed command dictionary to a command tree. Fixed various requests. OBS reconnection added if identified previously.
This commit is contained in:
@ -40,39 +40,15 @@ namespace TwitchChatTTS.Hermes.Socket.Handlers
|
||||
client.LoggedIn = true;
|
||||
_logger.Information($"Logged in as {_user.TwitchUsername} {(message.WebLogin ? "via web" : "via TTS app")}.");
|
||||
|
||||
await client.Send(3, new RequestMessage()
|
||||
{
|
||||
Type = "get_tts_voices",
|
||||
Data = null
|
||||
});
|
||||
|
||||
await client.Send(3, new RequestMessage()
|
||||
{
|
||||
Type = "get_tts_users",
|
||||
Data = new Dictionary<string, object>() { { "user", _user.HermesUserId } }
|
||||
});
|
||||
|
||||
await client.Send(3, new RequestMessage()
|
||||
{
|
||||
Type = "get_default_tts_voice",
|
||||
Data = null
|
||||
});
|
||||
|
||||
await client.Send(3, new RequestMessage()
|
||||
{
|
||||
Type = "get_chatter_ids",
|
||||
Data = null
|
||||
});
|
||||
|
||||
await client.Send(3, new RequestMessage()
|
||||
{
|
||||
Type = "get_emotes",
|
||||
Data = null
|
||||
});
|
||||
|
||||
await client.GetRedemptions();
|
||||
|
||||
await Task.Delay(TimeSpan.FromSeconds(3));
|
||||
await client.FetchTTSVoices();
|
||||
await client.FetchEnabledTTSVoices();
|
||||
await client.FetchTTSWordFilters();
|
||||
await client.FetchTTSChatterVoices();
|
||||
await client.FetchDefaultTTSVoice();
|
||||
await client.FetchChatterIdentifiers();
|
||||
await client.FetchEmotes();
|
||||
await client.FetchRedemptions();
|
||||
await client.FetchPermissions();
|
||||
|
||||
_logger.Information("TTS is now ready.");
|
||||
client.Ready = true;
|
||||
|
@ -8,6 +8,8 @@ using HermesSocketLibrary.Socket.Data;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Serilog;
|
||||
using TwitchChatTTS.Chat.Emotes;
|
||||
using TwitchChatTTS.Chat.Groups;
|
||||
using TwitchChatTTS.Chat.Groups.Permissions;
|
||||
using TwitchChatTTS.Twitch.Redemptions;
|
||||
|
||||
namespace TwitchChatTTS.Hermes.Socket.Handlers
|
||||
@ -28,7 +30,6 @@ namespace TwitchChatTTS.Hermes.Socket.Handlers
|
||||
|
||||
public RequestAckHandler(
|
||||
User user,
|
||||
//RedemptionManager redemptionManager,
|
||||
ICallbackManager<HermesRequestData> callbackManager,
|
||||
IServiceProvider serviceProvider,
|
||||
JsonSerializerOptions options,
|
||||
@ -36,7 +37,6 @@ namespace TwitchChatTTS.Hermes.Socket.Handlers
|
||||
)
|
||||
{
|
||||
_user = user;
|
||||
//_redemptionManager = redemptionManager;
|
||||
_callbackManager = callbackManager;
|
||||
_serviceProvider = serviceProvider;
|
||||
_options = options;
|
||||
@ -66,7 +66,6 @@ namespace TwitchChatTTS.Hermes.Socket.Handlers
|
||||
_logger.Debug($"Received a Hermes request message [type: {message.Request.Type}][data: {string.Join(',', message.Request.Data?.Select(entry => entry.Key + '=' + entry.Value) ?? Array.Empty<string>())}]");
|
||||
if (message.Request.Type == "get_tts_voices")
|
||||
{
|
||||
_logger.Verbose("Updating all available voices for TTS.");
|
||||
var voices = JsonSerializer.Deserialize<IEnumerable<VoiceDetails>>(message.Data.ToString(), _options);
|
||||
if (voices == null)
|
||||
return;
|
||||
@ -79,7 +78,6 @@ namespace TwitchChatTTS.Hermes.Socket.Handlers
|
||||
}
|
||||
else if (message.Request.Type == "create_tts_user")
|
||||
{
|
||||
_logger.Verbose("Adding new tts voice for user.");
|
||||
if (!long.TryParse(message.Request.Data["chatter"].ToString(), out long chatterId))
|
||||
{
|
||||
_logger.Warning($"Failed to parse chatter id [chatter id: {message.Request.Data["chatter"]}]");
|
||||
@ -93,7 +91,6 @@ namespace TwitchChatTTS.Hermes.Socket.Handlers
|
||||
}
|
||||
else if (message.Request.Type == "update_tts_user")
|
||||
{
|
||||
_logger.Verbose("Updating user's voice");
|
||||
if (!long.TryParse(message.Request.Data["chatter"].ToString(), out long chatterId))
|
||||
{
|
||||
_logger.Warning($"Failed to parse chatter id [chatter id: {message.Request.Data["chatter"]}]");
|
||||
@ -107,7 +104,6 @@ namespace TwitchChatTTS.Hermes.Socket.Handlers
|
||||
}
|
||||
else if (message.Request.Type == "create_tts_voice")
|
||||
{
|
||||
_logger.Verbose("Creating new tts voice.");
|
||||
string? voice = message.Request.Data["voice"].ToString();
|
||||
string? voiceId = message.Data.ToString();
|
||||
if (voice == null || voiceId == null)
|
||||
@ -123,7 +119,6 @@ namespace TwitchChatTTS.Hermes.Socket.Handlers
|
||||
}
|
||||
else if (message.Request.Type == "delete_tts_voice")
|
||||
{
|
||||
_logger.Verbose("Deleting tts voice.");
|
||||
var voice = message.Request.Data["voice"].ToString();
|
||||
if (!_user.VoicesAvailable.TryGetValue(voice, out string? voiceName) || voiceName == null)
|
||||
return;
|
||||
@ -138,7 +133,6 @@ namespace TwitchChatTTS.Hermes.Socket.Handlers
|
||||
}
|
||||
else if (message.Request.Type == "update_tts_voice")
|
||||
{
|
||||
_logger.Verbose("Updating TTS voice.");
|
||||
string voiceId = message.Request.Data["idd"].ToString();
|
||||
string voice = message.Request.Data["voice"].ToString();
|
||||
|
||||
@ -150,7 +144,6 @@ namespace TwitchChatTTS.Hermes.Socket.Handlers
|
||||
}
|
||||
else if (message.Request.Type == "get_tts_users")
|
||||
{
|
||||
_logger.Verbose("Updating all chatters' selected voice.");
|
||||
var users = JsonSerializer.Deserialize<IDictionary<long, string>>(message.Data.ToString(), _options);
|
||||
if (users == null)
|
||||
return;
|
||||
@ -163,7 +156,6 @@ namespace TwitchChatTTS.Hermes.Socket.Handlers
|
||||
}
|
||||
else if (message.Request.Type == "get_chatter_ids")
|
||||
{
|
||||
_logger.Verbose("Fetching all chatters' id.");
|
||||
var chatters = JsonSerializer.Deserialize<IEnumerable<long>>(message.Data.ToString(), _options);
|
||||
if (chatters == null)
|
||||
return;
|
||||
@ -174,7 +166,6 @@ namespace TwitchChatTTS.Hermes.Socket.Handlers
|
||||
}
|
||||
else if (message.Request.Type == "get_emotes")
|
||||
{
|
||||
_logger.Verbose("Updating emotes.");
|
||||
var emotes = JsonSerializer.Deserialize<IEnumerable<EmoteInfo>>(message.Data.ToString(), _options);
|
||||
if (emotes == null)
|
||||
return;
|
||||
@ -196,9 +187,78 @@ namespace TwitchChatTTS.Hermes.Socket.Handlers
|
||||
if (duplicateNames > 0)
|
||||
_logger.Warning($"Found {duplicateNames} emotes with duplicate names.");
|
||||
}
|
||||
else if (message.Request.Type == "get_enabled_tts_voices")
|
||||
{
|
||||
var enabledTTSVoices = JsonSerializer.Deserialize<IEnumerable<string>>(message.Data.ToString(), _options);
|
||||
if (enabledTTSVoices == null)
|
||||
{
|
||||
_logger.Error("Failed to load enabled tts voices.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (_user.VoicesEnabled == null)
|
||||
_user.VoicesEnabled = enabledTTSVoices.ToHashSet();
|
||||
else
|
||||
_user.VoicesEnabled.Clear();
|
||||
foreach (var voice in enabledTTSVoices)
|
||||
_user.VoicesEnabled.Add(voice);
|
||||
_logger.Information($"TTS voices [count: {_user.VoicesEnabled.Count}] have been enabled.");
|
||||
}
|
||||
else if (message.Request.Type == "get_permissions")
|
||||
{
|
||||
var groupInfo = JsonSerializer.Deserialize<GroupInfo>(message.Data.ToString(), _options);
|
||||
if (groupInfo == null)
|
||||
{
|
||||
_logger.Error("Failed to load groups & permissions.");
|
||||
return;
|
||||
}
|
||||
|
||||
var chatterGroupManager = _serviceProvider.GetRequiredService<IChatterGroupManager>();
|
||||
var permissionManager = _serviceProvider.GetRequiredService<IGroupPermissionManager>();
|
||||
|
||||
permissionManager.Clear();
|
||||
chatterGroupManager.Clear();
|
||||
|
||||
var groupsById = groupInfo.Groups.ToDictionary(g => g.Id, g => g);
|
||||
foreach (var group in groupInfo.Groups)
|
||||
chatterGroupManager.Add(group);
|
||||
|
||||
foreach (var permission in groupInfo.GroupPermissions)
|
||||
{
|
||||
_logger.Debug($"Adding group permission [permission id: {permission.Id}][group id: {permission.GroupId}][path: {permission.Path}][allow: {permission.Allow?.ToString() ?? "null"}]");
|
||||
if (!groupsById.TryGetValue(permission.GroupId, out var group))
|
||||
{
|
||||
_logger.Warning($"Failed to find group by id [permission id: {permission.Id}][group id: {permission.GroupId}][path: {permission.Path}]");
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
var path = $"{group.Name}.{permission.Path}";
|
||||
permissionManager.Set(path, permission.Allow);
|
||||
_logger.Debug($"Added group permission [id: {permission.Id}][group id: {permission.GroupId}][path: {permission.Path}]");
|
||||
}
|
||||
|
||||
_logger.Information($"Groups [count: {groupInfo.Groups.Count()}] & Permissions [count: {groupInfo.GroupPermissions.Count()}] have been loaded.");
|
||||
|
||||
foreach (var chatter in groupInfo.GroupChatters)
|
||||
if (groupsById.TryGetValue(chatter.GroupId, out var group))
|
||||
chatterGroupManager.Add(chatter.ChatterId, group.Name);
|
||||
_logger.Information($"Users in each group [count: {groupInfo.GroupChatters.Count()}] have been loaded.");
|
||||
}
|
||||
else if (message.Request.Type == "get_tts_word_filters")
|
||||
{
|
||||
var wordFilters = JsonSerializer.Deserialize<IEnumerable<TTSWordFilter>>(message.Data.ToString(), _options);
|
||||
if (wordFilters == null)
|
||||
{
|
||||
_logger.Error("Failed to load word filters.");
|
||||
return;
|
||||
}
|
||||
|
||||
_user.RegexFilters = wordFilters.ToList();
|
||||
_logger.Information($"TTS word filters [count: {_user.RegexFilters.Count}] have been refreshed.");
|
||||
}
|
||||
else if (message.Request.Type == "update_tts_voice_state")
|
||||
{
|
||||
_logger.Verbose("Updating TTS voice states.");
|
||||
string voiceId = message.Request.Data["voice"].ToString();
|
||||
bool state = message.Request.Data["state"].ToString().ToLower() == "true";
|
||||
|
||||
@ -216,7 +276,6 @@ namespace TwitchChatTTS.Hermes.Socket.Handlers
|
||||
}
|
||||
else if (message.Request.Type == "get_redemptions")
|
||||
{
|
||||
_logger.Verbose("Fetching all the redemptions.");
|
||||
IEnumerable<Redemption>? redemptions = JsonSerializer.Deserialize<IEnumerable<Redemption>>(message.Data!.ToString()!, _options);
|
||||
if (redemptions != null)
|
||||
{
|
||||
@ -229,7 +288,6 @@ namespace TwitchChatTTS.Hermes.Socket.Handlers
|
||||
}
|
||||
else if (message.Request.Type == "get_redeemable_actions")
|
||||
{
|
||||
_logger.Verbose("Fetching all the redeemable actions.");
|
||||
IEnumerable<RedeemableAction>? actions = JsonSerializer.Deserialize<IEnumerable<RedeemableAction>>(message.Data!.ToString()!, _options);
|
||||
if (actions == null)
|
||||
{
|
||||
|
@ -36,14 +36,14 @@ namespace TwitchChatTTS.Hermes.Socket
|
||||
User user,
|
||||
Configuration configuration,
|
||||
ICallbackManager<HermesRequestData> callbackManager,
|
||||
[FromKeyedServices("hermes")] HandlerManager<WebSocketClient, IWebSocketHandler> handlerManager,
|
||||
[FromKeyedServices("hermes")] HandlerTypeManager<WebSocketClient, IWebSocketHandler> typeManager,
|
||||
[FromKeyedServices("hermes")] IEnumerable<IWebSocketHandler> handlers,
|
||||
[FromKeyedServices("hermes")] MessageTypeManager<IWebSocketHandler> typeManager,
|
||||
ILogger logger
|
||||
) : base(logger, handlerManager, typeManager, new JsonSerializerOptions()
|
||||
) : base(handlers, typeManager, new JsonSerializerOptions()
|
||||
{
|
||||
PropertyNameCaseInsensitive = false,
|
||||
PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseLower
|
||||
})
|
||||
}, logger)
|
||||
{
|
||||
_user = user;
|
||||
_configuration = configuration;
|
||||
@ -74,7 +74,7 @@ namespace TwitchChatTTS.Hermes.Socket
|
||||
if (!Connected)
|
||||
return;
|
||||
|
||||
await DisconnectAsync();
|
||||
await DisconnectAsync(new SocketDisconnectionEventArgs("Normal disconnection", "Disconnection was executed"));
|
||||
}
|
||||
|
||||
public async Task CreateTTSVoice(string voiceName)
|
||||
@ -104,11 +104,67 @@ namespace TwitchChatTTS.Hermes.Socket
|
||||
});
|
||||
}
|
||||
|
||||
public async Task GetRedemptions()
|
||||
public async Task FetchChatterIdentifiers() {
|
||||
await Send(3, new RequestMessage()
|
||||
{
|
||||
Type = "get_chatter_ids",
|
||||
Data = null
|
||||
});
|
||||
}
|
||||
|
||||
public async Task FetchDefaultTTSVoice() {
|
||||
await Send(3, new RequestMessage()
|
||||
{
|
||||
Type = "get_default_tts_voice",
|
||||
Data = null
|
||||
});
|
||||
}
|
||||
|
||||
public async Task FetchEmotes() {
|
||||
await Send(3, new RequestMessage()
|
||||
{
|
||||
Type = "get_emotes",
|
||||
Data = null
|
||||
});
|
||||
}
|
||||
|
||||
public async Task FetchEnabledTTSVoices() {
|
||||
await Send(3, new RequestMessage()
|
||||
{
|
||||
Type = "get_enabled_tts_voices",
|
||||
Data = null
|
||||
});
|
||||
}
|
||||
|
||||
public async Task FetchTTSVoices() {
|
||||
await Send(3, new RequestMessage()
|
||||
{
|
||||
Type = "get_tts_voices",
|
||||
Data = null
|
||||
});
|
||||
}
|
||||
|
||||
public async Task FetchTTSChatterVoices() {
|
||||
await Send(3, new RequestMessage()
|
||||
{
|
||||
Type = "get_tts_users",
|
||||
Data = null
|
||||
});
|
||||
}
|
||||
|
||||
public async Task FetchTTSWordFilters() {
|
||||
await Send(3, new RequestMessage()
|
||||
{
|
||||
Type = "get_tts_word_filters",
|
||||
Data = null
|
||||
});
|
||||
}
|
||||
|
||||
public async Task FetchRedemptions()
|
||||
{
|
||||
var requestId = _callbackManager.GenerateKeyForCallback(new HermesRequestData()
|
||||
{
|
||||
Callback = async (d) => await GetRedeemableActions(d["redemptions"] as IEnumerable<Redemption>),
|
||||
Callback = async (d) => await FetchRedeemableActions(d["redemptions"] as IEnumerable<Redemption>),
|
||||
Data = new Dictionary<string, object>()
|
||||
});
|
||||
|
||||
@ -120,7 +176,7 @@ namespace TwitchChatTTS.Hermes.Socket
|
||||
});
|
||||
}
|
||||
|
||||
public async Task GetRedeemableActions(IEnumerable<Redemption> redemptions)
|
||||
private async Task FetchRedeemableActions(IEnumerable<Redemption> redemptions)
|
||||
{
|
||||
var requestId = _callbackManager.GenerateKeyForCallback(new HermesRequestData()
|
||||
{
|
||||
@ -135,6 +191,15 @@ namespace TwitchChatTTS.Hermes.Socket
|
||||
});
|
||||
}
|
||||
|
||||
public async Task FetchPermissions()
|
||||
{
|
||||
await Send(3, new RequestMessage()
|
||||
{
|
||||
Type = "get_permissions",
|
||||
Data = null
|
||||
});
|
||||
}
|
||||
|
||||
public void Initialize()
|
||||
{
|
||||
_logger.Information("Initializing Hermes websocket client.");
|
||||
|
@ -1,41 +0,0 @@
|
||||
using CommonSocketLibrary.Common;
|
||||
using CommonSocketLibrary.Socket.Manager;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Serilog;
|
||||
|
||||
namespace TwitchChatTTS.Hermes.Socket.Managers
|
||||
{
|
||||
public class HermesHandlerManager : WebSocketHandlerManager
|
||||
{
|
||||
public HermesHandlerManager(ILogger logger, IServiceProvider provider) : base(logger)
|
||||
{
|
||||
try
|
||||
{
|
||||
var basetype = typeof(IWebSocketHandler);
|
||||
var assembly = GetType().Assembly;
|
||||
var types = assembly.GetTypes().Where(t => t.IsClass && basetype.IsAssignableFrom(t) && t.AssemblyQualifiedName?.Contains(".Hermes.") == true);
|
||||
|
||||
foreach (var type in types)
|
||||
{
|
||||
var key = "hermes-" + type.Name.Replace("Handlers", "Hand#lers")
|
||||
.Replace("Handler", "")
|
||||
.Replace("Hand#lers", "Handlers")
|
||||
.ToLower();
|
||||
var handler = provider.GetKeyedService<IWebSocketHandler>(key);
|
||||
if (handler == null)
|
||||
{
|
||||
logger.Error("Failed to find hermes websocket handler: " + type.AssemblyQualifiedName);
|
||||
continue;
|
||||
}
|
||||
|
||||
_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.");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -7,12 +7,12 @@ using Serilog;
|
||||
|
||||
namespace TwitchChatTTS.Hermes.Socket.Managers
|
||||
{
|
||||
public class HermesHandlerTypeManager : WebSocketHandlerTypeManager
|
||||
public class HermesMessageTypeManager : WebSocketMessageTypeManager
|
||||
{
|
||||
public HermesHandlerTypeManager(
|
||||
ILogger factory,
|
||||
[FromKeyedServices("hermes")] HandlerManager<WebSocketClient, IWebSocketHandler> handlers
|
||||
) : base(factory, handlers)
|
||||
public HermesMessageTypeManager(
|
||||
[FromKeyedServices("hermes")] IEnumerable<IWebSocketHandler> handlers,
|
||||
ILogger logger
|
||||
) : base(handlers, logger)
|
||||
{
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user