//
// ServiceCollectionExtensions.cs
//
// Copyright (c) František Boháček. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using NosSmooth.Core.Extensions;
using NosSmooth.Game.Apis;
using NosSmooth.Game.Events.Core;
using NosSmooth.Game.Events.Inventory;
using NosSmooth.Game.PacketHandlers.Act4;
using NosSmooth.Game.PacketHandlers.Characters;
using NosSmooth.Game.PacketHandlers.Entities;
using NosSmooth.Game.PacketHandlers.Inventory;
using NosSmooth.Game.PacketHandlers.Map;
using NosSmooth.Game.PacketHandlers.Relations;
using NosSmooth.Game.PacketHandlers.Skills;
using NosSmooth.Game.PacketHandlers.Specialists;
namespace NosSmooth.Game.Extensions;
///
/// Contains extension methods for .
///
public static class ServiceCollectionExtensions
{
///
/// Adds handling of nostale packets, registering singleton and dispatching of game events.
///
/// The service collection.
/// The collection.
public static IServiceCollection AddNostaleGame(this IServiceCollection serviceCollection)
{
serviceCollection
.AddNostaleCore()
.AddMemoryCache()
.TryAddScoped();
serviceCollection.TryAddSingleton();
serviceCollection
.AddPacketResponder()
.AddPacketResponder()
.AddPacketResponder()
.AddPacketResponder()
.AddPacketResponder()
.AddPacketResponder()
.AddPacketResponder()
.AddPacketResponder()
.AddPacketResponder()
.AddPacketResponder()
.AddPacketResponder()
.AddPacketResponder()
.AddPacketResponder()
.AddPacketResponder()
.AddPacketResponder()
.AddPacketResponder()
.AddPacketResponder()
.AddPacketResponder()
.AddPacketResponder()
.AddPacketResponder()
.AddPacketResponder()
.AddPacketResponder()
.AddPacketResponder();
serviceCollection
.AddTransient()
.AddTransient()
.AddTransient()
.AddTransient()
.AddTransient()
.AddTransient();
return serviceCollection;
}
///
/// Adds the given game event responder.
///
/// The service collection.
/// The responder to add.
/// The collection.
public static IServiceCollection AddGameResponder(this IServiceCollection serviceCollection)
where TGameResponder : IGameResponder
{
return serviceCollection.AddGameResponder(typeof(TGameResponder));
}
///
/// Adds the given game event responder.
///
/// The service collection.
/// The type of the event responder.
/// The collection.
public static IServiceCollection AddGameResponder(this IServiceCollection serviceCollection, Type gameResponder)
{
if (!gameResponder.GetInterfaces().Any(
i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IGameResponder<>)
))
{
throw new ArgumentException(
$"{nameof(gameResponder)} should implement IGameResponder.",
nameof(gameResponder));
}
var handlerTypeInterfaces = gameResponder.GetInterfaces();
var handlerInterfaces = handlerTypeInterfaces.Where
(
r => r.IsGenericType && r.GetGenericTypeDefinition() == typeof(IGameResponder<>)
);
foreach (var handlerInterface in handlerInterfaces)
{
serviceCollection.AddScoped(handlerInterface, gameResponder);
}
return serviceCollection;
}
}