80 lines
2.7 KiB
C#
80 lines
2.7 KiB
C#
using System.Reflection;
|
|
using Lagrange.Core;
|
|
using Lagrange.OneBot.Core.Entity.Action;
|
|
using Lagrange.OneBot.Core.Network;
|
|
using Lagrange.OneBot.Core.Notify;
|
|
using Lagrange.OneBot.Core.Operation.Message;
|
|
using Lagrange.OneBot.Message;
|
|
using LiteDB;
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
using Microsoft.Extensions.Logging;
|
|
using JsonSerializer = System.Text.Json.JsonSerializer;
|
|
|
|
namespace Lagrange.OneBot.Core.Operation;
|
|
|
|
public sealed class OperationService
|
|
{
|
|
private readonly BotContext _bot;
|
|
private readonly ILogger _logger;
|
|
private readonly Dictionary<string, Type> _operations;
|
|
private readonly ServiceProvider _service;
|
|
|
|
public OperationService(BotContext bot, ILogger<OperationService> logger, LiteDatabase context, MessageService message)
|
|
{
|
|
_bot = bot;
|
|
_logger = logger;
|
|
|
|
_operations = new Dictionary<string, Type>();
|
|
foreach (var type in Assembly.GetExecutingAssembly().GetTypes())
|
|
{
|
|
var attributes = type.GetCustomAttributes<OperationAttribute>();
|
|
foreach (var attribute in attributes) _operations[attribute.Api] = type;
|
|
}
|
|
|
|
var service = new ServiceCollection();
|
|
service.AddSingleton(bot);
|
|
service.AddSingleton(context);
|
|
service.AddSingleton(logger);
|
|
service.AddSingleton(message);
|
|
service.AddSingleton<MessageCommon>();
|
|
service.AddSingleton<TicketService>();
|
|
service.AddLogging();
|
|
|
|
foreach (var (_, type) in _operations) service.AddScoped(type);
|
|
_service = service.BuildServiceProvider();
|
|
}
|
|
|
|
public async Task<OneBotResult?> HandleOperation(MsgRecvEventArgs e)
|
|
{
|
|
try
|
|
{
|
|
if (JsonSerializer.Deserialize<OneBotAction>(e.Data) is { } action)
|
|
{
|
|
try
|
|
{
|
|
if (_operations.TryGetValue(action.Action, out var type))
|
|
{
|
|
var handler = (IOperation)_service.GetRequiredService(type);
|
|
var result = await handler.HandleOperation(_bot, action.Params);
|
|
result.Echo = action.Echo;
|
|
|
|
return result;
|
|
}
|
|
|
|
return new OneBotResult(null, 404, "failed") { Echo = action.Echo };
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
_logger.LogWarning(ex, "Unexpected error encountered while handling message.");
|
|
return new OneBotResult(null, 200, "failed") { Echo = action.Echo };
|
|
}
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
_logger.LogWarning(ex, "Json Serialization failed for such action");
|
|
}
|
|
|
|
return null;
|
|
}
|
|
} |