// // 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; } }