{ config, lib, pkgs, ... }: with lib; let # gdiw = let # version = "0.17.5"; # sha256 = "0kg1jz26gpmldajckb47vgk9v6z6w0sf1lykl2pvjh0nq4mfl252"; # in pkgs.stdenv.mkDerivation { # inherit version; # pname = "gdiw"; # src = pkgs.fetchurl { # inherit sha256; # url = # "https://github.com/DaCyclops/GDIW/archive/refs/tags/${version}.zip"; # }; # deps = [ ]; # phases = [ "installPhase" ]; # installPhase = '' # mkdir $out # cp $src $out/GDIW_${version}.zip # ''; # }; # bottleneck = let # version = "0.11.7"; # sha256 = "0mvk0wciqpggjc0vzhb7g0a0cxq0wdzvzwrbqvagr6y02j4h3y1n"; # in pkgs.stdenv.mkDerivation { # inherit version; # pname = "bottleneck"; # src = pkgs.fetchurl { # inherit sha256; # url = # "https://github.com/troelsbjerre/Bottleneck/archive/refs/tags/${version}.zip"; # }; # deps = [ ]; # phases = [ "installPhase" ]; # installPhase = '' # mkdir $out # cp $src $out/Bottleneck_${version}.zip # ''; # }; # even-distribution = let # version = "1.0.10"; # commit-hash = "2f65d82a4da606b82bc597fce2695e7c512ebbfe"; # sha256 = "05y1j8mq2nm163h014510bkv0w06hn97z5v2kay36ilj0rzdpi6j"; # in pkgs.stdenv.mkDerivation { # inherit version; # pname = "even-distribution"; # src = pkgs.fetchurl { # inherit sha256; # url = # "https://github.com/321freddy/even-distribution/archive/${commit-hash}.zip"; # }; # deps = [ ]; # phases = [ "installPhase" ]; # installPhase = '' # mkdir $out # cp $src $out/even-distribution_${version}.zip # ''; # }; # mkPlugin = { name, version, url, sha256, deps ? [ ] }: # let # fetchurl-auth = { name, url, sha256 }: # lib.overrideDerivation (pkgs.fetchurl { # inherit name url sha256; # curlOpts = [ # "--get" # "-L" # "-H" # "Accept:application/octet-stream" # "--data-urlencode" # "username@username" # "--data-urlencode" # "token@token" # ]; # }) (_: # let # username = "Exceeding9987"; # token = # lib.readFile config.fudo.secrets.files.blobs."factorio-token.txt"; # in { # preHook = if username != "" && token != "" then '' # echo -n "${username}" >username # echo -n "${token}" >token # '' else '' # # Deliberately failing since username/token was not provided, so we can't fetch. # # We can't use builtins.throw since we want the result to be used if the tar is in the store already. # exit 1 # ''; # }); # in pkgs.stdenv.mkDerivation { # inherit version deps; # pname = name; # src = fetchurl-auth { inherit name url sha256; }; # phases = [ "installPhase" ]; # installPhase = '' # mkdir $out # cp $src $out/${name}_${version}.zip # ''; # }; mods = let modFromFile = { file, deps, ... }: let basename = baseNameOf file; in pkgs.stdenv.mkDerivation { name = basename; src = file; phases = [ "installPhase" ]; installPhase = '' mkdir $out cp $src $out/${basename} ''; inherit deps; }; modzip = { filename, deps ? [ ], ... }: modFromFile { file = (../../../static/factorio + "/${filename}"); inherit deps; }; in rec { advanced-autonomous-industries = modzip { filename = "aai-industry_0.5.19.zip"; }; alien-biomes = modzip { filename = "alien-biomes_0.6.7.zip"; }; aircraft = modzip { filename = "Aircraft_1.8.4.zip"; }; armored-biters = modzip { filename = "ArmouredBiters_1.1.6.zip"; }; big-data-string = modzip { filename = "big-data-string_1.0.1.zip"; }; bobs-enemies = modzip { filename = "bobenemies_1.1.5.zip"; }; bottleneck = modzip { filename = "Bottleneck_0.11.7.zip"; }; bullet-trails = modzip { filename = "bullet-trails_0.6.2.zip"; }; even-distribution = modzip { filename = "even-distribution_1.0.10.zip"; }; flib = modzip { filename = "flib_0.11.2.zip"; }; flow-control = modzip { filename = "Flow Control_3.1.3.zip"; }; fluid-must-flow = modzip { filename = "FluidMustFlow_1.3.1.zip"; }; gdiw = modzip { filename = "GDIW_1.1.0.zip"; }; hovercrafts = modzip { filename = "Hovercrafts_1.2.2.zip"; }; industrial-revolution-2 = modzip { filename = "IndustrialRevolution_2.3.2.zip"; }; krastorio2 = modzip { filename = "Krastorio2_1.3.6.zip"; deps = [ krastorio2-assets flib ]; }; krastorio2-assets = modzip { filename = "Krastorio2Assets_1.2.0.zip"; }; larger-lamps = modzip { filename = "DeadlockLargerLamp_1.5.0.zip"; }; miniloader = modzip { filename = "miniloader_1.15.6.zip"; }; planet-imaging-satellite = modzip { filename = "planetImagingSatellite_1.0.3.zip"; }; rampant = modzip { filename = "Rampant_3.1.2.zip"; }; recipe-book = modzip { filename = "RecipeBook_3.4.5.zip"; }; space-exploration = modzip { filename = "space-exploration_0.6.89.zip"; }; stackers = modzip { filename = "deadlock-beltboxes-loaders_2.4.2.zip"; }; trees = modzip { filename = "Trees_4.5.1.zip"; deps = [ big-data-string ]; }; vehicle-snap = modzip { filename = "VehicleSnap_1.18.4.zip"; }; }; worldGenSeed = 5298; mapGenSettings = { autoplace_controls = { coal = { size = 4; richness = "high"; }; copper-ore = { size = 10; richness = "high"; }; crude-oil = { size = 10; richness = "high"; }; iron-ore = { size = 10; richness = "high"; }; stone = { size = 4; richness = "high"; }; uranium-ore = { size = 4; richness = "high"; }; }; seed = (toString worldGenSeed); }; in { config = { services.factorio = { enable = true; # 'factorio' points to an old game stateDirName = "krastorio2"; package = pkgs.factorio-headless-experimental.override { username = "fudoniten"; token = lib.removeSuffix "\n" (readFile config.fudo.secrets.files.blobs."factorio-token-fudoniten.txt"); }; public = false; port = 34197; lan = true; game-name = "Fudo Factorio"; description = "Fudo Factorio Server"; admins = [ "fudoniten" "Arkayuu" ]; openFirewall = true; autosave-interval = 30; loadLatestSave = true; mods = with mods; [ alien-biomes aircraft armored-biters bottleneck bullet-trails fluid-must-flow krastorio2 # industrial-revolution-2 larger-lamps stackers trees ]; }; systemd.services.factorio = let cfg = config.services.factorio; serverSettings = { name = cfg.game-name; description = cfg.description; visibility = { public = cfg.public; lan = cfg.lan; }; username = cfg.username; password = cfg.password; token = cfg.token; game_password = cfg.game-password; require_user_verification = cfg.requireUserVerification; max_upload_in_kilobytes_per_second = 0; minimum_latency_in_ticks = 0; ignore_player_limit_for_returning_players = false; allow_commands = "admins-only"; autosave_interval = cfg.autosave-interval; autosave_slots = 5; afk_autokick_interval = 0; auto_pause = true; only_admins_can_pause_the_game = false; autosave_only_on_server = true; non_blocking_saving = cfg.nonBlockingSaving; } // cfg.extraSettings; in { serviceConfig.ExecStart = mkForce (toString [ "${cfg.package}/bin/factorio" "--config=${cfg.configFile}" "--port=${toString cfg.port}" "--bind=${toString cfg.bind}" (optionalString (!cfg.loadLatestSave) "--start-server=/var/lib/${cfg.stateDirName}/saves/${cfg.saveName}.zip") "--server-settings=${ pkgs.writeText "factorio-server-settings.json" (builtins.toJSON (filterAttrsRecursive (n: v: v != null) serverSettings)) }" (optionalString cfg.loadLatestSave "--start-server-load-latest") (optionalString (cfg.mods != [ ]) "--mod-directory=${pkgs.factorio-utils.mkModDirDrv cfg.mods}") (optionalString (cfg.admins != [ ]) "--server-adminlist=${ pkgs.writeText "factorio-server-adminlist.json" (builtins.toJSON cfg.admins) }") "--map-gen-settings=${ pkgs.writeText "factorio-map-gen-settings.json" (builtins.toJSON mapGenSettings) }" ]); }; }; }