Socket classes for Hermes
This commit is contained in:
9
Requests/IRequest.cs
Normal file
9
Requests/IRequest.cs
Normal file
@ -0,0 +1,9 @@
|
||||
namespace HermesSocketLibrary.Requests
|
||||
{
|
||||
public interface IRequest
|
||||
{
|
||||
string Name { get; }
|
||||
|
||||
Task<RequestResult> Grant(string sender, IDictionary<string, object> data);
|
||||
}
|
||||
}
|
13
Requests/Messages/EmoteInfo.cs
Normal file
13
Requests/Messages/EmoteInfo.cs
Normal 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; }
|
||||
}
|
||||
}
|
17
Requests/Messages/TTSWordFilter.cs
Normal file
17
Requests/Messages/TTSWordFilter.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
8
Requests/Messages/VoiceDetails.cs
Normal file
8
Requests/Messages/VoiceDetails.cs
Normal file
@ -0,0 +1,8 @@
|
||||
namespace HermesSocketLibrary.Requests.Messages
|
||||
{
|
||||
public class VoiceDetails
|
||||
{
|
||||
public string Id { get; set; }
|
||||
public string Name { get; set; }
|
||||
}
|
||||
}
|
62
Requests/RequestManager.cs
Normal file
62
Requests/RequestManager.cs
Normal 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
16
Requests/RequestResult.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user