{lib, config, pkgs, ... }: with lib; let cfg = config.services.sdtdserver; gamePath = "/var/lib/sdtdserver"; gameOptions = { ServerPort="26900"; ServerVisibility="2"; ServerName="Serveur des loutres"; ServerPassword=""; ServerMaxPlayerCount="16"; ServerReservedSlots="0"; ServerReservedSlotsPermission="100"; ServerAdminSlots="0"; ServerAdminSlotsPermission="0"; ServerDescription="Un serveur idiot anti gilets jaunes"; ServerWebsiteURL=""; ServerDisabledNetworkProtocols=""; GameWorld="Navezgane"; WorldGenSeed="Lakeu"; WorldGenSize="4096"; GameName="Lakeu"; GameDifficulty="2"; GameMode="GameModeSurvival"; ZombiesRun="0"; ZombieMove="0"; ZombieMoveNight="3"; ZombieFeralMove="3"; ZombieBMMove="3"; BuildCreate="false"; DayNightLength="60"; DayLightLength="18"; PlayerKillingMode="3"; PersistentPlayerProfiles="false"; PlayerSafeZoneLevel="5"; PlayerSafeZoneHours="5"; ControlPanelEnabled="false"; ControlPanelPort="8080"; ControlPanelPassword="CHANGEME"; TelnetEnabled="false"; TelnetPort="8081"; TelnetPassword=""; TelnetFailedLoginLimit="10"; TelnetFailedLoginsBlocktime="10"; TerminalWindowEnabled="false"; AdminFileName="serveradmin.xml"; DropOnDeath="0"; DropOnQuit="0"; BloodMoonEnemyCount="8"; EnemySpawnMode="true"; EnemyDifficulty="0"; BlockDurabilityModifier="100"; LootAbundance="100"; LootRespawnDays="30"; LandClaimSize="41"; LandClaimDeadZone="30"; LandClaimExpiryTime="3"; LandClaimDecayMode="0"; LandClaimOnlineDurabilityModifier="4"; LandClaimOfflineDurabilityModifier="4"; PartySharedKillRange="100"; AirDropFrequency="72"; AirDropMarker="false"; MaxSpawnedZombies="60"; MaxSpawnedAnimals="50"; EACEnabled="true"; HideCommandExecutionLog="0"; MaxUncoveredMapChunksPerPlayer="131072"; BedrollDeadZoneSize="15"; ServerLoginConfirmationText="Prout"; }; gameConfig = builtins.toFile "serverconfig.xml" '' ${concatStrings ( mapAttrsToList (name: value: " \n" ) gameOptions)} ''; in { options.services.sdtdserver = { enable = mkEnableOption "Activation du serveur dédié 7 Days to Die"; }; config = mkIf cfg.enable { systemd.services.sdtdserver = { description = "Serveur dédié 7 Days to Die"; requires = ["network-online.target"]; wantedBy = ["multi-user.target"]; environment = { HOME = gamePath; }; serviceConfig = { DynamicUser = true; StateDirectory = "sdtdserver"; }; preStart = let libPath = with pkgs; lib.makeLibraryPath [ stdenv.cc.cc.lib ]; in '' ${pkgs.steamcmd}/bin/steamcmd +login anonymous +force_install_dir ${gamePath} +app_update 294420 validate +quit install -m666 ${gameConfig} ${gamePath}/serverconfig.xml ''; script = '' ${pkgs.steam-run}/bin/steam-run ${gamePath}/7DaysToDieServer.x86_64 -quit -batchmode -nographics -dedicated -configfile=serverconfig.xml ''; }; networking.firewall = { allowedTCPPorts = [ 26900 ]; allowedUDPPorts = [ 26900 26901 26902 ]; }; }; }