Socket classes for Hermes

This commit is contained in:
Tom
2024-06-24 22:31:45 +00:00
commit d8522584c4
26 changed files with 434 additions and 0 deletions

9
Requests/IRequest.cs Normal file
View File

@ -0,0 +1,9 @@
namespace HermesSocketLibrary.Requests
{
public interface IRequest
{
string Name { get; }
Task<RequestResult> Grant(string sender, IDictionary<string, object> data);
}
}

View File

@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace HermesSocketLibrary.Requests.Messages
{
public class EmoteInfo
{
public string Id { get; set; }
public string Name { get; set; }
}
}

View File

@ -0,0 +1,17 @@
namespace HermesSocketLibrary.Requests.Messages
{
public class TTSWordFilter
{
public string? Id { get; set; }
public string? Search { get; set; }
public string? Replace { get; set; }
public bool IsRegex { get; set; }
public TTSWordFilter()
{
IsRegex = true;
}
}
}

View File

@ -0,0 +1,8 @@
namespace HermesSocketLibrary.Requests.Messages
{
public class VoiceDetails
{
public string Id { get; set; }
public string Name { get; set; }
}
}

View File

@ -0,0 +1,62 @@
using System.Collections.Concurrent;
using System.Reflection;
using HermesSocketLibrary.Socket.Data;
using Microsoft.Extensions.DependencyInjection;
using Serilog;
namespace HermesSocketLibrary.Requests
{
public abstract class RequestManager
{
private readonly IDictionary<string, IRequest> _requests;
private readonly IServiceProvider _serviceProvider;
private readonly ILogger _logger;
public RequestManager(IServiceProvider serviceProvider, ILogger logger)
{
_serviceProvider = serviceProvider;
_logger = logger;
_requests = new ConcurrentDictionary<string, IRequest>();
LoadRequests();
}
protected abstract string AssemblyName { get; }
private void LoadRequests()
{
Type basetype = typeof(IRequest);
var types = Assembly.Load(AssemblyName).GetTypes().Where(t => t.IsClass && !t.IsAbstract && basetype.IsAssignableFrom(t));
foreach (var type in types)
{
_logger.Debug($"Loading IRequest for '{type.Name}'.");
var request = _serviceProvider.GetRequiredKeyedService<IRequest>(type.Name);
_requests.Add(request.Name, request);
}
}
public async Task<RequestResult> Grant(string sender, RequestMessage? message)
{
if (message == null || message.Type == null)
return new RequestResult(false, null);
if (!_requests.TryGetValue(message.Type, out IRequest? request) || request == null)
{
_logger.Warning($"Did not find request type '{message.Type}'.");
return new RequestResult(false, null);
}
try
{
return await request.Grant(sender, message.Data);
}
catch (Exception e)
{
_logger.Error(e, $"Failed to grant a request of type '{message.Type}'.");
}
return new RequestResult(false, null);
}
}
}

16
Requests/RequestResult.cs Normal file
View File

@ -0,0 +1,16 @@
namespace HermesSocketLibrary.Requests
{
public class RequestResult
{
public bool Success;
public object? Result;
public bool NotifyClientsOnAccount;
public RequestResult(bool success, object? result, bool notifyClientsOnAccount = true)
{
Success = success;
Result = result;
NotifyClientsOnAccount = notifyClientsOnAccount;
}
}
}