//
// 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.Apis.Safe;
using NosSmooth.Game.Apis.Unsafe;
using NosSmooth.Game.Contracts;
using NosSmooth.Game.Events.Core;
using NosSmooth.Game.Events.Inventory;
using NosSmooth.Game.Events.Ui;
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.Raids;
using NosSmooth.Game.PacketHandlers.Relations;
using NosSmooth.Game.PacketHandlers.Skills;
using NosSmooth.Game.PacketHandlers.Specialists;
using NosSmooth.Game.PacketHandlers.Ui;
using NosSmooth.Packets.Server.Raids;
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
.AddManagedNostaleCore()
.AddMemoryCache()
.TryAddScoped();
serviceCollection.TryAddSingleton();
serviceCollection
// act4
.AddPacketResponder()
// character
.AddPacketResponder()
.AddPacketResponder()
// skills
.AddPacketResponder()
.AddPacketResponder()
.AddPacketResponder()
.AddPacketResponder()
// friends
.AddPacketResponder()
// inventory
.AddPacketResponder()
// groups
.AddPacketResponder()
// mates
.AddPacketResponder()
.AddPacketResponder()
// map
.AddPacketResponder()
.AddPacketResponder()
.AddPacketResponder()
.AddPacketResponder()
.AddPacketResponder()
.AddPacketResponder()
.AddPacketResponder()
.AddPacketResponder()
.AddPacketResponder()
.AddPacketResponder()
// entities
.AddPacketResponder()
.AddPacketResponder()
.AddPacketResponder()
// hp, mp
.AddPacketResponder()
.AddPacketResponder()
.AddPacketResponder()
// equip
.AddPacketResponder()
.AddPacketResponder()
// raids
.AddPacketResponder()
.AddPacketResponder()
.AddPacketResponder()
.AddPacketResponder()
.AddPacketResponder()
.AddPacketResponder()
.AddPacketResponder()
// ui
.AddPacketResponder();
serviceCollection
.AddTransient()
.AddTransient()
.AddTransient()
.AddTransient()
.AddTransient()
.AddTransient()
.AddTransient()
.AddTransient()
.AddTransient();
serviceCollection
.AddScoped();
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 (serviceCollection.Any(x => x.ImplementationType == gameResponder))
{ // already added... assuming every packet responder was added even though that may not be the case.
return serviceCollection;
}
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;
}
}