LANCommander/LANCommander.Server.Services/Extensions/IServiceCollectionExtensions.cs
Pat Hartl ecaecd21bb Send keepalive while game is running
Sends a keepalive/heartbeat signal across RPC while a game is running. Server-side this enables the ability to manage play session state with realtime information instead of hoping that the client will stop the play session. Keepalives are tracked in server cache allowing for future potential horizontally-scaled server instances.
2026-06-14 00:53:45 -05:00

116 lines
No EOL
4.9 KiB
C#

using LANCommander.SDK;
using LANCommander.SDK.Abstractions;
using LANCommander.SDK.Interceptors;
using LANCommander.SDK.Models;
using LANCommander.SDK.PowerShell;
using LANCommander.SDK.Services;
using LANCommander.Server.Services.Abstractions;
using LANCommander.Server.Services.Factories;
using LANCommander.Server.Services.Interceptors;
using LANCommander.Server.Services.MediaGrabbers;
using LANCommander.Server.Services.PowerShell;
using LANCommander.HQ.SDK;
using LANCommander.Server.Services.Providers;
using LANCommander.Server.Services.Providers.Metadata;
using LANCommander.Server.Services.ServerEngines;
using Microsoft.Extensions.DependencyInjection;
namespace LANCommander.Server.Services.Extensions;
public static class IServiceCollectionExtensions
{
public static IServiceCollection AddLANCommanderServer(this IServiceCollection services)
{
services.AddScoped<IGitHubService, GitHubService>();
services.AddScoped<IdentityContextFactory>();
services.AddScoped<AuthenticationService>();
services.AddScoped<ArchiveService>();
services.AddScoped<IArchiveClient, ArchiveService>();
services.AddScoped<StorageLocationService>();
services.AddScoped<ActionService>();
services.AddScoped<CategoryService>();
services.AddScoped<CollectionService>();
services.AddScoped<GameService>();
services.AddScoped<LibraryService>();
services.AddScoped<ScriptService>();
services.AddScoped<GenreService>();
services.AddScoped<PlatformService>();
services.AddScoped<KeyService>();
services.AddScoped<TagService>();
services.AddScoped<EngineService>();
services.AddScoped<CompanyService>();
services.AddScoped<MultiplayerModeService>();
services.AddScoped<ServerService>();
services.AddScoped<ServerHttpPathService>();
services.AddScoped<ServerConsoleService>();
services.AddScoped<GameSaveService>();
services.AddScoped<SavePathService>();
services.AddScoped<PlaySessionService>();
services.AddScoped<MediaService>();
services.AddScoped<RedistributableService>();
services.AddScoped<ConfigToOptionSchemaService>();
services.AddScoped<ToolService>();
services.AddScoped(sp =>
{
var settings = sp.GetRequiredService<SettingsProvider<Settings.Settings>>();
var hqSettings = settings.CurrentValue.Server.HQ;
return new HQClient(new HQClientOptions
{
BaseAddress = new Uri(hqSettings.BaseUrl),
Token = hqSettings.IsAuthenticated ? hqSettings.AccessToken : null,
});
});
services.AddScoped<HqMediaGrabber>();
services.AddScoped<SteamMediaGrabber>();
services.AddScoped<SteamGridDBMediaGrabber>();
services.AddScoped<YouTubeMediaGrabber>();
services.AddScoped<IMediaGrabberService, CompositeMediaGrabberService>();
services.AddScoped<MediaToolService>();
services.AddScoped<UpdateService>();
services.AddScoped<IssueService>();
services.AddScoped<PageService>();
services.AddScoped<UserService>();
services.AddScoped<RoleService>();
services.AddScoped<UserCustomFieldService>();
services.AddScoped<GameCustomFieldService>();
services.AddScoped<ChatService>();
services.AddScoped<ChatMessageService>();
services.AddScoped<ChatThreadService>();
services.AddScoped<ChatThreadReadStatusService>();
services.AddScoped<DepotService>();
services.AddScoped<RatingService>();
services.AddTransient<SetupService>();
// Register metadata providers
services.AddScoped<MetadataService>();
services.AddScoped<IMetadataProvider, HqMetadataProvider>();
services.AddScoped<IMetadataProvider, IgdbMetadataProvider>();
services.AddScoped<IMetadataProvider, PcGamingWikiMetadataProvider>();
// Register server engines
services.AddSingleton<IServerEngine, LocalServerEngine>();
services.AddSingleton<DockerServerEngine>();
services.AddSingleton<IServerEngine>(provider => provider.GetService<DockerServerEngine>());
services.AddSingleton<RemoteServerEngine>();
services.AddSingleton<IServerEngine>(provider => provider.GetService<RemoteServerEngine>());
services.AddSingleton<ServerManager>();
services.AddSingleton<PlaySessionKeepAliveTracker>();
services.AddHostedService<PlaySessionSweepService>();
services.AddSingleton<ScriptDebugger>();
services.AddSingleton<IScriptDebugger>(sp =>
sp.GetRequiredService<ScriptDebugger>());
services.AddSingleton<IPXRelayService>();
services.AddSingleton<IBeaconMessageInterceptor, BeaconMessageInterceptor>();
services.AddAutoMapper(cfg => { }, typeof(MappingProfile));
services.AddFusionCache();
return services;
}
}