Fixed a lot of compiler warnings. Fixed 7tv connection.

This commit is contained in:
Tom
2025-01-17 00:54:47 +00:00
parent b8d0e8cfd8
commit 5e33d594d2
78 changed files with 314 additions and 235 deletions

View File

@ -14,9 +14,8 @@ namespace TwitchChatTTS.Chat.Commands
public class CommandManager : ICommandManager
{
private readonly User _user;
private ICommandSelector _commandSelector;
private ICommandSelector? _commandSelector;
private readonly HermesSocketClient _hermes;
//private readonly TwitchWebsocketClient _twitch;
private readonly IGroupPermissionManager _permissionManager;
private readonly IUsagePolicy<long> _permissionPolicy;
private readonly ILogger _logger;
@ -26,7 +25,6 @@ namespace TwitchChatTTS.Chat.Commands
public CommandManager(
User user,
[FromKeyedServices("hermes")] SocketClient<WebSocketMessage> hermes,
//[FromKeyedServices("twitch")] SocketClient<TwitchWebsocketMessage> twitch,
IGroupPermissionManager permissionManager,
IUsagePolicy<long> limitManager,
ILogger logger
@ -34,7 +32,6 @@ namespace TwitchChatTTS.Chat.Commands
{
_user = user;
_hermes = (hermes as HermesSocketClient)!;
//_twitch = (twitch as TwitchWebsocketClient)!;
_permissionManager = permissionManager;
_permissionPolicy = limitManager;
_logger = logger;
@ -43,7 +40,7 @@ namespace TwitchChatTTS.Chat.Commands
public async Task<ChatCommandResult> Execute(string arg, ChannelChatMessage message, IEnumerable<string> groups)
{
if (string.IsNullOrWhiteSpace(arg))
if (string.IsNullOrWhiteSpace(arg) || _commandSelector == null)
return ChatCommandResult.Unknown;
arg = arg.Trim();

View File

@ -36,20 +36,20 @@ namespace TwitchChatTTS.Chat.Emotes
public class EmoteSet
{
public string Id { get; set; }
public string Name { get; set; }
public required string Id { get; set; }
public required string Name { get; set; }
public int Flags { get; set; }
public bool Immutable { get; set; }
public bool Privileged { get; set; }
public IList<Emote> Emotes { get; set; }
public required IList<Emote> Emotes { get; set; }
public int EmoteCount { get; set; }
public int Capacity { get; set; }
}
public class Emote
{
public string Id { get; set; }
public string Name { get; set; }
public required string Id { get; set; }
public required string Name { get; set; }
public int Flags { get; set; }
}
}

View File

@ -4,6 +4,7 @@ using CommonSocketLibrary.Abstract;
using CommonSocketLibrary.Common;
using HermesSocketLibrary.Socket.Data;
using Serilog;
using TwitchChatTTS.Bus;
namespace TwitchChatTTS.Hermes.Socket.Handlers
{
@ -11,13 +12,15 @@ namespace TwitchChatTTS.Hermes.Socket.Handlers
{
private readonly User _user;
private readonly NightbotApiClient _nightbot;
private readonly ServiceBusCentral _bus;
private readonly ILogger _logger;
public int OperationCode { get; } = 2;
public LoginAckHandler(User user, NightbotApiClient nightbot, ILogger logger)
public LoginAckHandler(User user, NightbotApiClient nightbot, ServiceBusCentral bus, ILogger logger)
{
_user = user;
_nightbot = nightbot;
_bus = bus;
_logger = logger;
}
@ -51,6 +54,8 @@ namespace TwitchChatTTS.Hermes.Socket.Handlers
_user.TwitchConnection = message.Connections.FirstOrDefault(c => c.Default && c.Type == "twitch");
_user.NightbotConnection = message.Connections.FirstOrDefault(c => c.Default && c.Type == "nightbot");
_bus.Send(this, "twitch id", _user.TwitchUserId);
var filters = message.WordFilters.Where(f => f.Search != null && f.Replace != null).ToList();
foreach (var filter in filters)
{

View File

@ -22,19 +22,19 @@ namespace TwitchChatTTS.Hermes.Socket.Requests
_logger = logger;
}
public void Acknowledge(string requestId, string json, IDictionary<string, object>? requestData)
public void Acknowledge(string requestId, string? json, IDictionary<string, object>? requestData)
{
var policy = JsonSerializer.Deserialize<Policy>(json, _options);
if (policy == null)
{
_logger.Warning($"Policy data failed: null");
_logger.Warning($"Policy JSON data is null.");
return;
}
var group = _groups.Get(policy.GroupId.ToString());
if (group == null)
{
_logger.Warning($"Policy data failed: group id not found [group id: {policy.GroupId}][policy id: {policy.Id}]");
_logger.Warning($"Policy data is failed: group id not found [group id: {policy.GroupId}][policy id: {policy.Id}]");
return;
}

View File

@ -19,8 +19,14 @@ namespace TwitchChatTTS.Hermes.Socket.Requests
_logger = logger;
}
public void Acknowledge(string requestId, string json, IDictionary<string, object>? requestData)
public void Acknowledge(string requestId, string? json, IDictionary<string, object>? requestData)
{
if (json == null)
{
_logger.Warning($"Redeemable action JSON data received is null.");
return;
}
var action = JsonSerializer.Deserialize<RedeemableAction>(json, _options);
if (action == null)
{

View File

@ -19,8 +19,14 @@ namespace TwitchChatTTS.Hermes.Socket.Requests
_logger = logger;
}
public void Acknowledge(string requestId, string json, IDictionary<string, object>? requestData)
public void Acknowledge(string requestId, string? json, IDictionary<string, object>? requestData)
{
if (json == null)
{
_logger.Warning($"Redemption JSON data received is null.");
return;
}
var redemption = JsonSerializer.Deserialize<Redemption>(json, _options);
if (redemption == null)
{

View File

@ -19,8 +19,14 @@ namespace TwitchChatTTS.Hermes.Socket.Requests
_logger = logger;
}
public void Acknowledge(string requestId, string json, IDictionary<string, object>? requestData)
public void Acknowledge(string requestId, string? json, IDictionary<string, object>? requestData)
{
if (json == null)
{
_logger.Warning($"TTS Filter JSON data received is null.");
return;
}
var filter = JsonSerializer.Deserialize<TTSWordFilter>(json, _options);
if (filter == null)
{
@ -40,7 +46,10 @@ namespace TwitchChatTTS.Hermes.Socket.Requests
re.Match(string.Empty);
filter.Regex = re;
}
catch (Exception) { }
catch (Exception)
{
_logger.Warning($"Failed to generate a Regular Expression using '{filter.Search}' [filter id: {filter.Id}]");
}
_logger.Debug($"Filter data [filter id: {filter.Id}][search: {filter.Search}][replace: {filter.Replace}]");
_user.RegexFilters.Add(filter);

View File

@ -14,7 +14,7 @@ namespace TwitchChatTTS.Hermes.Socket.Requests
_logger = logger;
}
public void Acknowledge(string requestId, string json, IDictionary<string, object>? requestData)
public void Acknowledge(string requestId, string? json, IDictionary<string, object>? requestData)
{
if (requestData == null)
{

View File

@ -14,7 +14,7 @@ namespace TwitchChatTTS.Hermes.Socket.Requests
_logger = logger;
}
public void Acknowledge(string requestId, string json, IDictionary<string, object>? requestData)
public void Acknowledge(string requestId, string? json, IDictionary<string, object>? requestData)
{
if (requestData == null)
{

View File

@ -18,7 +18,7 @@ namespace TwitchChatTTS.Hermes.Socket.Requests
_logger = logger;
}
public void Acknowledge(string requestId, string json, IDictionary<string, object>? requestData)
public void Acknowledge(string requestId, string? json, IDictionary<string, object>? requestData)
{
var data = json.Split('/');
if (data.Length != 2)

View File

@ -15,7 +15,7 @@ namespace TwitchChatTTS.Hermes.Socket.Requests
_logger = logger;
}
public void Acknowledge(string requestId, string json, IDictionary<string, object>? requestData)
public void Acknowledge(string requestId, string? json, IDictionary<string, object>? requestData)
{
if (requestData == null)
{

View File

@ -15,7 +15,7 @@ namespace TwitchChatTTS.Hermes.Socket.Requests
_logger = logger;
}
public void Acknowledge(string requestId, string json, IDictionary<string, object>? requestData)
public void Acknowledge(string requestId, string? json, IDictionary<string, object>? requestData)
{
if (requestData == null)
{

View File

@ -14,7 +14,7 @@ namespace TwitchChatTTS.Hermes.Socket.Requests
_logger = logger;
}
public void Acknowledge(string requestId, string json, IDictionary<string, object>? requestData)
public void Acknowledge(string requestId, string? json, IDictionary<string, object>? requestData)
{
if (requestData == null)
{

View File

@ -14,7 +14,7 @@ namespace TwitchChatTTS.Hermes.Socket.Requests
_logger = logger;
}
public void Acknowledge(string requestId, string json, IDictionary<string, object>? requestData)
public void Acknowledge(string requestId, string? json, IDictionary<string, object>? requestData)
{
if (requestData == null)
{

View File

@ -17,8 +17,14 @@ namespace TwitchChatTTS.Hermes.Socket.Requests
_logger = logger;
}
public void Acknowledge(string requestId, string json, IDictionary<string, object>? requestData)
public void Acknowledge(string requestId, string? json, IDictionary<string, object>? requestData)
{
if (json == null)
{
_logger.Warning("Chatters JSON is null.");
return;
}
var chatters = JsonSerializer.Deserialize<IEnumerable<long>>(json, _options);
if (chatters == null)
{

View File

@ -29,8 +29,14 @@ namespace TwitchChatTTS.Hermes.Socket.Requests
_logger = logger;
}
public void Acknowledge(string requestId, string json, IDictionary<string, object>? requestData)
public void Acknowledge(string requestId, string? json, IDictionary<string, object>? requestData)
{
if (json == null)
{
_logger.Error("Connections JSON is null.");
return;
}
var connections = JsonSerializer.Deserialize<IEnumerable<Connection>>(json, _options);
if (connections == null)
{

View File

@ -1,4 +1,3 @@
using System.Text.Json;
using Serilog;
namespace TwitchChatTTS.Hermes.Socket.Requests
@ -7,17 +6,15 @@ namespace TwitchChatTTS.Hermes.Socket.Requests
{
public string Name => "get_default_tts_voice";
private readonly User _user;
private readonly JsonSerializerOptions _options;
private readonly ILogger _logger;
public GetDefaultTTSVoiceAck(User user, JsonSerializerOptions options, ILogger logger)
public GetDefaultTTSVoiceAck(User user, ILogger logger)
{
_user = user;
_options = options;
_logger = logger;
}
public void Acknowledge(string requestId, string json, IDictionary<string, object>? requestData)
public void Acknowledge(string requestId, string? json, IDictionary<string, object>? requestData)
{
string? defaultVoice = json;
if (defaultVoice != null)

View File

@ -19,8 +19,14 @@ namespace TwitchChatTTS.Hermes.Socket.Requests
_logger = logger;
}
public void Acknowledge(string requestId, string json, IDictionary<string, object>? requestData)
public void Acknowledge(string requestId, string? json, IDictionary<string, object>? requestData)
{
if (json == null)
{
_logger.Warning("Emotes JSON is null.");
return;
}
var data = JsonSerializer.Deserialize<IEnumerable<EmoteInfo>>(json, _options);
if (data == null)
{

View File

@ -17,8 +17,14 @@ namespace TwitchChatTTS.Hermes.Socket.Requests
_logger = logger;
}
public void Acknowledge(string requestId, string json, IDictionary<string, object>? requestData)
public void Acknowledge(string requestId, string? json, IDictionary<string, object>? requestData)
{
if (json == null)
{
_logger.Warning("TTS Voices JSON is null.");
return;
}
var enabledTTSVoices = JsonSerializer.Deserialize<IEnumerable<string>>(json, _options);
if (enabledTTSVoices == null)
{

View File

@ -26,12 +26,18 @@ namespace TwitchChatTTS.Hermes.Socket.Requests
_logger = logger;
}
public void Acknowledge(string requestId, string json, IDictionary<string, object>? requestData)
public void Acknowledge(string requestId, string? json, IDictionary<string, object>? requestData)
{
if (json == null)
{
_logger.Error("Failed to load groups & permissions: JSON is null.");
return;
}
var groupInfo = JsonSerializer.Deserialize<GroupInfo>(json, _options);
if (groupInfo == null)
{
_logger.Error("Failed to load groups & permissions.");
_logger.Error("Failed to load groups & permissions: object is null.");
return;
}

View File

@ -26,12 +26,18 @@ namespace TwitchChatTTS.Hermes.Socket.Requests
_logger = logger;
}
public void Acknowledge(string requestId, string json, IDictionary<string, object>? requestData)
public void Acknowledge(string requestId, string? json, IDictionary<string, object>? requestData)
{
if (json == null)
{
_logger.Error($"No policies have been found: JSON is null.");
return;
}
var policies = JsonSerializer.Deserialize<IEnumerable<Policy>>(json, _options);
if (policies == null || !policies.Any())
{
_logger.Error($"No policies have been found.");
_logger.Error($"No policies have been found: object is null or empty.");
return;
}

View File

@ -23,7 +23,7 @@ namespace TwitchChatTTS.Hermes.Socket.Requests
_logger = logger;
}
public void Acknowledge(string requestId, string json, IDictionary<string, object>? requestData)
public void Acknowledge(string requestId, string? json, IDictionary<string, object>? requestData)
{
if (requestData == null)
{

View File

@ -23,7 +23,7 @@ namespace TwitchChatTTS.Hermes.Socket.Requests
_logger = logger;
}
public void Acknowledge(string requestId, string json, IDictionary<string, object>? requestData)
public void Acknowledge(string requestId, string? json, IDictionary<string, object>? requestData)
{
HermesRequestData? hermesRequestData = null;
if (!string.IsNullOrEmpty(requestId))

View File

@ -18,7 +18,7 @@ namespace TwitchChatTTS.Hermes.Socket.Requests
_logger = logger;
}
public void Acknowledge(string requestId, string json, IDictionary<string, object>? requestData)
public void Acknowledge(string requestId, string? json, IDictionary<string, object>? requestData)
{
var users = JsonSerializer.Deserialize<IDictionary<long, string>>(json, _options);
if (users == null)

View File

@ -19,7 +19,7 @@ namespace TwitchChatTTS.Hermes.Socket.Requests
_logger = logger;
}
public void Acknowledge(string requestId, string json, IDictionary<string, object>? requestData)
public void Acknowledge(string requestId, string? json, IDictionary<string, object>? requestData)
{
var voices = JsonSerializer.Deserialize<IEnumerable<TTSVoice>>(json, _options);
if (voices == null)

View File

@ -19,7 +19,7 @@ namespace TwitchChatTTS.Hermes.Socket.Requests
_logger = logger;
}
public void Acknowledge(string requestId, string json, IDictionary<string, object>? requestData)
public void Acknowledge(string requestId, string? json, IDictionary<string, object>? requestData)
{
var wordFilters = JsonSerializer.Deserialize<IEnumerable<TTSWordFilter>>(json, _options);
if (wordFilters == null)

View File

@ -3,6 +3,6 @@ namespace TwitchChatTTS.Hermes.Socket.Requests
public interface IRequestAck
{
string Name { get; }
void Acknowledge(string requestId, string json, IDictionary<string, object>? requestData);
void Acknowledge(string requestId, string? json, IDictionary<string, object>? requestData);
}
}

View File

@ -13,7 +13,7 @@ namespace TwitchChatTTS.Hermes.Socket.Requests
_logger = logger;
}
public void Fulfill(string type, string requestId, string data, IDictionary<string, object>? requestData)
public void Fulfill(string type, string requestId, string? data, IDictionary<string, object>? requestData)
{
if (!_acknowledgements.TryGetValue(type, out var ack))
{

View File

@ -14,7 +14,7 @@ namespace TwitchChatTTS.Hermes.Socket.Requests
_logger = logger;
}
public void Acknowledge(string requestId, string json, IDictionary<string, object>? requestData)
public void Acknowledge(string requestId, string? json, IDictionary<string, object>? requestData)
{
if (requestData == null)
{

View File

@ -22,7 +22,7 @@ namespace TwitchChatTTS.Hermes.Socket.Requests
_logger = logger;
}
public void Acknowledge(string requestId, string json, IDictionary<string, object>? requestData)
public void Acknowledge(string requestId, string? json, IDictionary<string, object>? requestData)
{
var policy = JsonSerializer.Deserialize<Policy>(json, _options);
if (policy == null)

View File

@ -19,7 +19,7 @@ namespace TwitchChatTTS.Hermes.Socket.Requests
_logger = logger;
}
public void Acknowledge(string requestId, string json, IDictionary<string, object>? requestData)
public void Acknowledge(string requestId, string? json, IDictionary<string, object>? requestData)
{
var action = JsonSerializer.Deserialize<RedeemableAction>(json, _options);
if (action == null)

View File

@ -19,8 +19,13 @@ namespace TwitchChatTTS.Hermes.Socket.Requests
_logger = logger;
}
public void Acknowledge(string requestId, string json, IDictionary<string, object>? requestData)
public void Acknowledge(string requestId, string? json, IDictionary<string, object>? requestData)
{
if (json == null) {
_logger.Warning($"Redemption JSON data received is null.");
return;
}
var redemption = JsonSerializer.Deserialize<Redemption>(json, _options);
if (redemption == null)
{

View File

@ -19,7 +19,7 @@ namespace TwitchChatTTS.Hermes.Socket.Requests
_logger = logger;
}
public void Acknowledge(string requestId, string json, IDictionary<string, object>? requestData)
public void Acknowledge(string requestId, string? json, IDictionary<string, object>? requestData)
{
var filter = JsonSerializer.Deserialize<TTSWordFilter>(json, _options);
if (filter == null)

View File

@ -14,7 +14,7 @@ namespace TwitchChatTTS.Hermes.Socket.Requests
_logger = logger;
}
public void Acknowledge(string requestId, string json, IDictionary<string, object>? requestData)
public void Acknowledge(string requestId, string? json, IDictionary<string, object>? requestData)
{
if (requestData == null)
{

View File

@ -14,7 +14,7 @@ namespace TwitchChatTTS.Hermes.Socket.Requests
_logger = logger;
}
public void Acknowledge(string requestId, string json, IDictionary<string, object>? requestData)
public void Acknowledge(string requestId, string? json, IDictionary<string, object>? requestData)
{
if (requestData == null)
{

View File

@ -14,7 +14,7 @@ namespace TwitchChatTTS.Hermes.Socket.Requests
_logger = logger;
}
public void Acknowledge(string requestId, string json, IDictionary<string, object>? requestData)
public void Acknowledge(string requestId, string? json, IDictionary<string, object>? requestData)
{
if (requestData == null)
{

View File

@ -4,7 +4,7 @@ namespace TwitchChatTTS.Hermes
{
public int MajorVersion { get; set; }
public int MinorVersion { get; set; }
public string Download { get; set; }
public string Changelog { get; set; }
public required string Download { get; set; }
public required string Changelog { get; set; }
}
}

View File

@ -2,8 +2,8 @@ namespace TwitchChatTTS.OBS.Socket.Data
{
public class EventMessage
{
public string EventType { get; set; }
public required string EventType { get; set; }
public int EventIntent { get; set; }
public Dictionary<string, object> EventData { get; set; }
public required Dictionary<string, object> EventData { get; set; }
}
}

View File

@ -2,13 +2,13 @@ namespace TwitchChatTTS.OBS.Socket.Data
{
public class HelloMessage
{
public string ObsWebSocketVersion { get; set; }
public required string ObsWebSocketVersion { get; set; }
public int RpcVersion { get; set; }
public AuthenticationMessage Authentication { get; set; }
public required AuthenticationMessage Authentication { get; set; }
}
public class AuthenticationMessage {
public string Challenge { get; set; }
public string Salt { get; set; }
public required string Challenge { get; set; }
public required string Salt { get; set; }
}
}

View File

@ -2,9 +2,9 @@ namespace TwitchChatTTS.OBS.Socket.Data
{
public class OBSSceneItem
{
public string SourceUuid { get; set; }
public string SourceName { get; set; }
public string SourceType { get; set; }
public required string SourceUuid { get; set; }
public required string SourceName { get; set; }
public required string SourceType { get; set; }
public int SceneItemId { get; set; }
}
}

View File

@ -1,5 +1,3 @@
using Newtonsoft.Json;
namespace TwitchChatTTS.OBS.Socket.Data
{
public class RequestBatchMessage

View File

@ -2,7 +2,7 @@ namespace TwitchChatTTS.OBS.Socket.Data
{
public class RequestBatchResponseMessage
{
public string RequestId { get; set; }
public IEnumerable<object> Results { get; set; }
public required string RequestId { get; set; }
public required IEnumerable<object> Results { get; set; }
}
}

View File

@ -3,7 +3,7 @@ namespace TwitchChatTTS.OBS.Socket.Data
public class RequestMessage
{
public string RequestType { get; set; }
public string RequestId { get; set; }
public string? RequestId { get; set; }
public Dictionary<string, object> RequestData { get; set; }
public RequestMessage(string type, string id, Dictionary<string, object> data)

View File

@ -1,12 +1,10 @@
using Newtonsoft.Json;
namespace TwitchChatTTS.OBS.Socket.Data
{
public class RequestResponseMessage
{
public string RequestType { get; set; }
public string RequestId { get; set; }
public object RequestStatus { get; set; }
public Dictionary<string, object> ResponseData { get; set; }
public required string RequestType { get; set; }
public required string RequestId { get; set; }
public required object RequestStatus { get; set; }
public required Dictionary<string, object> ResponseData { get; set; }
}
}

View File

@ -5,7 +5,7 @@ namespace TwitchChatTTS.OBS.Socket.Data
public int Alignment { get; set; }
public int BoundsAlignment { get; set; }
public double BoundsHeight { get; set; }
public string BoundsType { get; set; }
public required string BoundsType { get; set; }
public double BoundsWidth { get; set; }
public int CropBottom { get; set; }
public int CropLeft { get; set; }

View File

@ -23,10 +23,17 @@ public class SevenApiClient
});
}
public async Task<EmoteSet?> FetchChannelEmoteSet(string twitchId)
public async Task<EmoteSet?> FetchChannelEmoteSet(long twitchId)
{
if (twitchId <= 0)
{
_logger.Warning("No valid Twitch Id was given for 7tv emotes.");
return null;
}
try
{
_logger.Debug($"Fetching 7tv information using Twitch Id [twitch id: {twitchId}]");
var details = await _web.GetJson<UserDetails>($"{API_URL}/users/twitch/" + twitchId);
return details?.EmoteSet;
}

View File

@ -2,10 +2,10 @@ namespace TwitchChatTTS.Seven.Socket.Data
{
public class ChangeMapMessage
{
public object Id { get; set; }
public required object Id { get; set; }
public byte Kind { get; set; }
public bool? Contextual { get; set; }
public object Actor { get; set; }
public required object Actor { get; set; }
public IEnumerable<ChangeField>? Added { get; set; }
public IEnumerable<ChangeField>? Updated { get; set; }
public IEnumerable<ChangeField>? Removed { get; set; }
@ -14,17 +14,17 @@ namespace TwitchChatTTS.Seven.Socket.Data
}
public class ChangeField {
public string Key { get; set; }
public required string Key { get; set; }
public int? Index { get; set; }
public bool Nested { get; set; }
public object OldValue { get; set; }
public object Value { get; set; }
public required object OldValue { get; set; }
public required object Value { get; set; }
}
public class EmoteField {
public string Id { get; set; }
public string Name { get; set; }
public string ActorId { get; set; }
public required string Id { get; set; }
public required string Name { get; set; }
public required string ActorId { get; set; }
public int Flags { get; set; }
}
}

View File

@ -2,7 +2,7 @@ namespace TwitchChatTTS.Seven.Socket.Data
{
public class DispatchMessage
{
public object EventType { get; set; }
public ChangeMapMessage Body { get; set; }
public required object EventType { get; set; }
public required ChangeMapMessage Body { get; set; }
}
}

View File

@ -3,6 +3,6 @@ namespace TwitchChatTTS.Seven.Socket.Data
public class EndOfStreamMessage
{
public int Code { get; set; }
public string Message { get; set; }
public required string Message { get; set; }
}
}

View File

@ -2,7 +2,7 @@ namespace TwitchChatTTS.Seven.Socket.Data
{
public class ErrorMessage
{
public Exception Exception { get; set; }
public string Message { get; set; }
public Exception? Exception { get; set; }
public string? Message { get; set; }
}
}

View File

@ -2,6 +2,6 @@ namespace TwitchChatTTS.Seven.Socket.Data
{
public class ReconnectMessage
{
public string Reason { get; set; }
public required string Reason { get; set; }
}
}

View File

@ -2,6 +2,6 @@ namespace TwitchChatTTS.Seven.Socket.Data
{
public class ResumeMessage
{
public string SessionId { get; set; }
public required string SessionId { get; set; }
}
}

View File

@ -3,7 +3,7 @@ namespace TwitchChatTTS.Seven.Socket.Data
public class SevenHelloMessage
{
public uint HeartbeatInterval { get; set; }
public string SessionId { get; set; }
public required string SessionId { get; set; }
public int SubscriptionLimit { get; set; }
}
}

View File

@ -2,7 +2,7 @@ namespace TwitchChatTTS.Seven.Socket.Data
{
public class SubscribeMessage
{
public string? Type { get; set; }
public required string Type { get; set; }
public IDictionary<string, string>? Condition { get; set; }
}
}

View File

@ -2,7 +2,7 @@ namespace TwitchChatTTS.Seven.Socket.Data
{
public class UnsubscribeMessage
{
public string Type { get; set; }
public required string Type { get; set; }
public IDictionary<string, string>? Condition { get; set; }
}
}

View File

@ -15,7 +15,7 @@ namespace TwitchChatTTS.Seven.Socket.Handlers
return;
var code = message.Code - 4000;
await sender.DisconnectAsync(new SocketDisconnectionEventArgs(WebSocketCloseStatus.Empty.ToString(), code.ToString()));
await sender.DisconnectAsync(new SocketDisconnectionEventArgs(message.Message, code.ToString()));
}
}
}

View File

@ -17,13 +17,13 @@ namespace TwitchChatTTS.Seven.Socket.Handlers
public Task Execute<Data>(SocketClient<WebSocketMessage> sender, Data data)
{
if (data is not ErrorMessage message || message == null)
if (data is not ErrorMessage message || message == null || message.Exception == null && message.Message == null)
return Task.CompletedTask;
if (message.Exception != null)
_logger.Error(message.Exception, message.Message);
_logger.Error(message.Exception, message.Message ?? string.Empty);
else
_logger.Error(message.Message);
_logger.Error(message.Message!);
return Task.CompletedTask;
}
}

View File

@ -4,18 +4,18 @@ namespace TwitchChatTTS.Seven
{
public class UserDetails
{
public string Id { get; set; }
public string Platform { get; set; }
public string Username { get; set; }
public required string Id { get; set; }
public required string Platform { get; set; }
public required string DisplayName { get; set; }
public int EmoteCapacity { get; set; }
public string EmoteSetId { get; set; }
public EmoteSet EmoteSet { get; set; }
public SevenUser User { get; set; }
public required string EmoteSetId { get; set; }
public required EmoteSet EmoteSet { get; set; }
public required SevenUser User { get; set; }
}
public class SevenUser
{
public string Id { get; set; }
public string Username { get; set; }
public required string Id { get; set; }
public required string Username { get; set; }
}
}

29
TTS.cs
View File

@ -15,6 +15,8 @@ using TwitchChatTTS.Chat.Commands;
using System.Text;
using TwitchChatTTS.Chat.Speech;
using TwitchChatTTS.Veadotube;
using TwitchChatTTS.Bus;
using System.Reactive.Linq;
namespace TwitchChatTTS
{
@ -36,6 +38,7 @@ namespace TwitchChatTTS
private readonly IEmoteDatabase _emotes;
private readonly TTSPlayer _player;
private readonly AudioPlaybackEngine _playback;
private readonly ServiceBusCentral _bus;
private readonly Configuration _configuration;
private readonly ILogger _logger;
@ -53,6 +56,7 @@ namespace TwitchChatTTS
IEmoteDatabase emotes,
TTSPlayer player,
AudioPlaybackEngine playback,
ServiceBusCentral bus,
Configuration configuration,
ILogger logger
)
@ -68,9 +72,10 @@ namespace TwitchChatTTS
_commandFactory = commandFactory;
_commandManager = commandManager;
_emotes = emotes;
_configuration = configuration;
_player = player;
_playback = playback;
_bus = bus;
_configuration = configuration;
_logger = logger;
}
@ -108,6 +113,22 @@ namespace TwitchChatTTS
_logger.Warning("Failed to check for version updates.");
}
// 7tv
var twitchTopic = _bus.GetTopic("twitch id");
twitchTopic.FirstAsync().Subscribe(async (data) =>
{
var twitchId = data.Value?.ToString();
if (twitchId == null)
return;
var emoteSet = await _sevenApiClient.FetchChannelEmoteSet(_user.TwitchUserId);
if (emoteSet != null)
_user.SevenEmoteSetId = emoteSet.Id;
await InitializeEmotes(_sevenApiClient, emoteSet);
await InitializeSevenTv();
});
await InitializeHermesWebsocket();
_playback.AddOnMixerInputEnded((object? s, SampleProviderEventArgs e) =>
@ -139,14 +160,8 @@ namespace TwitchChatTTS
return;
}
var emoteSet = await _sevenApiClient.FetchChannelEmoteSet(_user.TwitchUserId.ToString());
if (emoteSet != null)
_user.SevenEmoteSetId = emoteSet.Id;
_commandManager.Update(_commandFactory);
await InitializeEmotes(_sevenApiClient, emoteSet);
await InitializeSevenTv();
await InitializeObs();
}

View File

@ -5,11 +5,11 @@ namespace TwitchChatTTS.Twitch.Socket.Messages
public int DurationSeconds { get; set; }
public DateTime StartedAt { get; set; }
public bool IsAutomatic { get; set; }
public string BroadcasterUserId { get; set; }
public string BroadcasterUserLogin { get; set; }
public string BroadcasterUserName { get; set; }
public string RequesterUserId { get; set; }
public string RequesterUserLogin { get; set; }
public string RequesterUserName { get; set; }
public required string BroadcasterUserId { get; set; }
public required string BroadcasterUserLogin { get; set; }
public required string BroadcasterUserName { get; set; }
public required string RequesterUserId { get; set; }
public required string RequesterUserLogin { get; set; }
public required string RequesterUserName { get; set; }
}
}

View File

@ -2,16 +2,16 @@ namespace TwitchChatTTS.Twitch.Socket.Messages
{
public class ChannelBanMessage
{
public string UserId { get; set; }
public string UserLogin { get; set; }
public string UserName { get; set; }
public string BroadcasterUserId { get; set; }
public string BroadcasterUserLogin { get; set; }
public string BroadcasterUserName { get; set; }
public string ModeratorUserId { get; set; }
public string ModeratorUserLogin { get; set; }
public string ModeratorUserName { get; set; }
public string Reason { get; set; }
public required string UserId { get; set; }
public required string UserLogin { get; set; }
public required string UserName { get; set; }
public required string BroadcasterUserId { get; set; }
public required string BroadcasterUserLogin { get; set; }
public required string BroadcasterUserName { get; set; }
public required string ModeratorUserId { get; set; }
public required string ModeratorUserLogin { get; set; }
public required string ModeratorUserName { get; set; }
public required string Reason { get; set; }
public DateTime BannedAt { get; set; }
public DateTime? EndsAt { get; set; }
public bool IsPermanent { get; set; }

View File

@ -2,8 +2,8 @@ namespace TwitchChatTTS.Twitch.Socket.Messages
{
public class ChannelChatClearMessage
{
public string BroadcasterUserId { get; set; }
public string BroadcasterUserLogin { get; set; }
public string BroadcasterUserName { get; set; }
public required string BroadcasterUserId { get; set; }
public required string BroadcasterUserLogin { get; set; }
public required string BroadcasterUserName { get; set; }
}
}

View File

@ -2,8 +2,8 @@ namespace TwitchChatTTS.Twitch.Socket.Messages
{
public class ChannelChatClearUserMessage : ChannelChatClearMessage
{
public string TargetUserId { get; set; }
public string TargetUserLogin { get; set; }
public string TargetUserName { get; set; }
public required string TargetUserId { get; set; }
public required string TargetUserLogin { get; set; }
public required string TargetUserName { get; set; }
}
}

View File

@ -2,6 +2,6 @@ namespace TwitchChatTTS.Twitch.Socket.Messages
{
public class ChannelChatDeleteMessage : ChannelChatClearUserMessage
{
public string MessageId { get; set; }
public required string MessageId { get; set; }
}
}

View File

@ -2,16 +2,16 @@ namespace TwitchChatTTS.Twitch.Socket.Messages
{
public class ChannelChatMessage
{
public string BroadcasterUserId { get; set; }
public string BroadcasterUserLogin { get; set; }
public string BroadcasterUserName { get; set; }
public string ChatterUserId { get; set; }
public string ChatterUserLogin { get; set; }
public string ChatterUserName { get; set; }
public string MessageId { get; set; }
public TwitchChatMessageInfo Message { get; set; }
public string MessageType { get; set; }
public TwitchBadge[] Badges { get; set; }
public required string BroadcasterUserId { get; set; }
public required string BroadcasterUserLogin { get; set; }
public required string BroadcasterUserName { get; set; }
public required string ChatterUserId { get; set; }
public required string ChatterUserLogin { get; set; }
public required string ChatterUserName { get; set; }
public required string MessageId { get; set; }
public required TwitchChatMessageInfo Message { get; set; }
public required string MessageType { get; set; }
public required TwitchBadge[] Badges { get; set; }
public TwitchReplyInfo? Reply { get; set; }
public string? ChannelPointsCustomRewardId { get; set; }
public string? ChannelPointsAnimationId { get; set; }
@ -19,14 +19,14 @@ namespace TwitchChatTTS.Twitch.Socket.Messages
public class TwitchChatMessageInfo
{
public string Text { get; set; }
public TwitchChatFragment[] Fragments { get; set; }
public required string Text { get; set; }
public required TwitchChatFragment[] Fragments { get; set; }
}
public class TwitchChatFragment
{
public string Type { get; set; }
public string Text { get; set; }
public required string Type { get; set; }
public required string Text { get; set; }
public TwitchCheerInfo? Cheermote { get; set; }
public TwitchEmoteInfo? Emote { get; set; }
public TwitchMentionInfo? Mention { get; set; }
@ -34,42 +34,42 @@ namespace TwitchChatTTS.Twitch.Socket.Messages
public class TwitchCheerInfo
{
public string Prefix { get; set; }
public required string Prefix { get; set; }
public int Bits { get; set; }
public int Tier { get; set; }
}
public class TwitchEmoteInfo
{
public string Id { get; set; }
public string EmoteSetId { get; set; }
public string OwnerId { get; set; }
public string[] Format { get; set; }
public required string Id { get; set; }
public required string EmoteSetId { get; set; }
public required string OwnerId { get; set; }
public required string[] Format { get; set; }
}
public class TwitchMentionInfo
{
public string UserId { get; set; }
public string UserName { get; set; }
public string UserLogin { get; set; }
public required string UserId { get; set; }
public required string UserName { get; set; }
public required string UserLogin { get; set; }
}
public class TwitchBadge
{
public string SetId { get; set; }
public string Id { get; set; }
public string Info { get; set; }
public required string SetId { get; set; }
public required string Id { get; set; }
public required string Info { get; set; }
}
public class TwitchReplyInfo
{
public string ParentMessageId { get; set; }
public string ParentMessageBody { get; set; }
public string ParentUserId { get; set; }
public string ParentUserName { get; set; }
public string ParentUserLogin { get; set; }
public string ThreadMessageId { get; set; }
public string ThreadUserName { get; set; }
public string ThreadUserLogin { get; set; }
public required string ParentMessageId { get; set; }
public required string ParentMessageBody { get; set; }
public required string ParentUserId { get; set; }
public required string ParentUserName { get; set; }
public required string ParentUserLogin { get; set; }
public required string ThreadMessageId { get; set; }
public required string ThreadUserName { get; set; }
public required string ThreadUserLogin { get; set; }
}
}

View File

@ -2,23 +2,23 @@ namespace TwitchChatTTS.Twitch.Socket.Messages
{
public class ChannelCustomRedemptionMessage
{
public string BroadcasterUserId { get; set; }
public string BroadcasterUserLogin { get; set; }
public string BroadcasterUserName { get; set; }
public string Id { get; set; }
public string UserId { get; set; }
public string UserLogin { get; set; }
public string UserName { get; set; }
public string Status { get; set; }
public required string BroadcasterUserId { get; set; }
public required string BroadcasterUserLogin { get; set; }
public required string BroadcasterUserName { get; set; }
public required string Id { get; set; }
public required string UserId { get; set; }
public required string UserLogin { get; set; }
public required string UserName { get; set; }
public required string Status { get; set; }
public DateTime RedeemedAt { get; set; }
public RedemptionReward Reward { get; set; }
public required RedemptionReward Reward { get; set; }
}
public class RedemptionReward
{
public string Id { get; set; }
public string Title { get; set; }
public string Prompt { get; set; }
public required string Id { get; set; }
public required string Title { get; set; }
public required string Prompt { get; set; }
public int Cost { get; set; }
}
}

View File

@ -2,12 +2,12 @@ namespace TwitchChatTTS.Twitch.Socket.Messages
{
public class ChannelFollowMessage
{
public string BroadcasterUserId { get; set; }
public string BroadcasterUserLogin { get; set; }
public string BroadcasterUserName { get; set; }
public string UserId { get; set; }
public string UserLogin { get; set; }
public string UserName { get; set; }
public required string BroadcasterUserId { get; set; }
public required string BroadcasterUserLogin { get; set; }
public required string BroadcasterUserName { get; set; }
public required string UserId { get; set; }
public required string UserLogin { get; set; }
public required string UserName { get; set; }
public DateTime FollowedAt { get; set; }
}
}

View File

@ -2,12 +2,12 @@ namespace TwitchChatTTS.Twitch.Socket.Messages
{
public class ChannelRaidMessage
{
public string FromBroadcasterUserId { get; set; }
public string FromBroadcasterUserLogin { get; set; }
public string FromBroadcasterUserName { get; set; }
public string ToBroadcasterUserId { get; set; }
public string ToBroadcasterUserLogin { get; set; }
public string ToBroadcasterUserName { get; set; }
public required string FromBroadcasterUserId { get; set; }
public required string FromBroadcasterUserLogin { get; set; }
public required string FromBroadcasterUserName { get; set; }
public required string ToBroadcasterUserId { get; set; }
public required string ToBroadcasterUserLogin { get; set; }
public required string ToBroadcasterUserName { get; set; }
public int Viewers { get; set; }
}
}

View File

@ -2,7 +2,7 @@ namespace TwitchChatTTS.Twitch.Socket.Messages
{
public class ChannelResubscriptionMessage : ChannelSubscriptionData
{
public TwitchChatMessageInfo Message { get; set; }
public required TwitchChatMessageInfo Message { get; set; }
public int CumulativeMonths { get; set; }
public int StreakMonths { get; set; }
public int DurationMonths { get; set; }

View File

@ -5,10 +5,10 @@ namespace TwitchChatTTS.Twitch.Socket.Messages
public string? UserId { get; set; }
public string? UserLogin { get; set; }
public string? UserName { get; set; }
public string BroadcasterUserId { get; set; }
public string BroadcasterUserLogin { get; set; }
public string BroadcasterUserName { get; set; }
public string Tier { get; set; }
public required string BroadcasterUserId { get; set; }
public required string BroadcasterUserLogin { get; set; }
public required string BroadcasterUserName { get; set; }
public required string Tier { get; set; }
}
public class ChannelSubscriptionMessage : ChannelSubscriptionData

View File

@ -2,8 +2,8 @@ namespace TwitchChatTTS.Twitch.Socket.Messages
{
public class ChatterMessage
{
public string UserId { get; set; }
public string UserLogin { get; set; }
public string UserName { get; set; }
public required string UserId { get; set; }
public required string UserLogin { get; set; }
public required string UserName { get; set; }
}
}

View File

@ -2,14 +2,14 @@ namespace TwitchChatTTS.Twitch.Socket.Messages
{
public class NotificationMessage
{
public NotificationInfo Subscription { get; set; }
public object Event { get; set; }
public required NotificationInfo Subscription { get; set; }
public required object Event { get; set; }
}
public class NotificationInfo : EventSubscriptionMessage
{
public string Id { get; set; }
public string Status { get; set; }
public required string Id { get; set; }
public required string Status { get; set; }
public DateTime CreatedAt { get; set; }
public object? Event { get; set; }
}

View File

@ -2,11 +2,11 @@ namespace TwitchChatTTS.Twitch.Socket.Messages
{
public class SessionWelcomeMessage
{
public TwitchSocketSession Session { get; set; }
public required TwitchSocketSession Session { get; set; }
public class TwitchSocketSession {
public string Id { get; set; }
public string Status { get; set; }
public required string Id { get; set; }
public required string Status { get; set; }
public DateTime ConnectedAt { get; set; }
public int? KeepaliveTimeoutSeconds { get; set; }
public string? ReconnectUrl { get; set; }

View File

@ -2,13 +2,13 @@ namespace TwitchChatTTS.Twitch.Socket.Messages
{
public class TwitchWebsocketMessage
{
public TwitchMessageMetadata Metadata { get; set; }
public required TwitchMessageMetadata Metadata { get; set; }
public object? Payload { get; set; }
}
public class TwitchMessageMetadata {
public string MessageId { get; set; }
public string MessageType { get; set; }
public required string MessageId { get; set; }
public required string MessageType { get; set; }
public DateTime MessageTimestamp { get; set; }
}

View File

@ -20,13 +20,13 @@ namespace TwitchChatTTS.Twitch.Socket
private bool _disconnected;
private readonly object _lock;
public event EventHandler<EventArgs> OnIdentified;
public event EventHandler<EventArgs>? OnIdentified;
public string UID { get; }
public string URL;
public bool Connected { get; private set; }
public bool Identified { get; private set; }
public string SessionId { get; private set; }
public string? SessionId { get; private set; }
public bool ReceivedReconnecting { get; set; }
public bool TwitchReconnected { get; set; }

16
User.cs
View File

@ -9,27 +9,27 @@ namespace TwitchChatTTS
public class User
{
// Hermes user id
public string HermesUserId { get; set; }
public string HermesUsername { get; set; }
public required string HermesUserId { get; set; }
public required string HermesUsername { get; set; }
public long TwitchUserId { get; set; }
public string TwitchUsername { get; set; }
public string SevenEmoteSetId { get; set; }
public required string TwitchUsername { get; set; }
public required string SevenEmoteSetId { get; set; }
public long? OwnerId { get; set; }
public Connection? TwitchConnection { get; set; }
public Connection? NightbotConnection { get; set; }
public string DefaultTTSVoice { get; set; }
public required string DefaultTTSVoice { get; set; }
// voice id -> voice name
public IDictionary<string, string> VoicesAvailable { get => _voicesAvailable; set { _voicesAvailable = value; VoiceNameRegex = GenerateEnabledVoicesRegex(); } }
// chatter/twitch id -> voice id
public IDictionary<long, string> VoicesSelected { get; set; }
public required IDictionary<long, string> VoicesSelected { get; set; }
// voice names
public HashSet<string> VoicesEnabled { get => _voicesEnabled; set { _voicesEnabled = value; VoiceNameRegex = GenerateEnabledVoicesRegex(); } }
public IDictionary<string, RaidInfo> Raids { get; set; } = new Dictionary<string, RaidInfo>();
public HashSet<long> Chatters { get; set; }
public IList<TTSWordFilter> RegexFilters { get; set; }
public required HashSet<long> Chatters { get; set; }
public required IList<TTSWordFilter> RegexFilters { get; set; }
[JsonIgnore]
public Regex? VoiceNameRegex { get; set; }

View File

@ -7,8 +7,8 @@ namespace TwitchChatTTS.Veadotube
[JsonPropertyName("time")]
public long Time { get; set; }
[JsonPropertyName("name")]
public string Name { get; set; }
public required string Name { get; set; }
[JsonPropertyName("server")]
public string Server { get; set; }
public required string Server { get; set; }
}
}

View File

@ -4,35 +4,35 @@ namespace TwitchChatTTS.Veadotube
{
public class VeadoPayloadMessage
{
public string Event { get; set; }
public string Type { get; set; }
public string Id { get; set; }
public string Name { get; set; }
public object Payload { get; set; }
public required string Event { get; set; }
public required string Type { get; set; }
public required string Id { get; set; }
public string? Name { get; set; }
public required object Payload { get; set; }
}
public class VeadoEventMessage
{
[JsonPropertyName("event")]
public string Event { get; set; }
public required string Event { get; set; }
}
public class VeadoNodeState {
public string Id { get; set; }
public string Name { get; set; }
public required string Id { get; set; }
public required string Name { get; set; }
}
public class VeadoNodeStateListMessage : VeadoEventMessage {
public IEnumerable<VeadoNodeState> States { get; set; }
public required IEnumerable<VeadoNodeState> States { get; set; }
}
public class VeadoNodeStateMessage : VeadoEventMessage {
public string State { get; set; }
public required string State { get; set; }
}
public class VeadoNodeThumbMessage {
public int Width { get; set; }
public int Height { get; set; }
public string Png { get; set; }
public required string Png { get; set; }
}
}