{ stdenv, fetchurl, makeWrapper, makeDesktopItem , alsaLib, libpulseaudio, libX11, libXcursor, libXinerama, libXrandr, libXi, libGL , libSM, libICE, libXext, factorio-utils , releaseType , mods ? [] , username ? "", token ? "" # get/reset token at https://factorio.com/profile , experimental ? false # true means to always use the latest branch }: assert releaseType == "alpha" || releaseType == "headless" || releaseType == "demo"; let helpMsg = '' ===FETCH FAILED=== Please ensure you have set the username and token with config.nix, or /etc/nix/nixpkgs-config.nix if on NixOS. Your token can be seen at https://factorio.com/profile (after logging in). It is not as sensitive as your password, but should still be safeguarded. There is a link on that page to revoke/invalidate the token, if you believe it has been leaked or wish to take precautions. Example: { packageOverrides = pkgs: { factorio = pkgs.factorio.override { username = "FactorioPlayer1654"; token = "d5ad5a8971267c895c0da598688761"; }; }; } Alternatively, instead of providing the username+token, you may manually download the release through https://factorio.com/download , then add it to the store using e.g.: releaseType=alpha version=0.17.74 nix-prefetch-url file://$HOME/Downloads/factorio_\''${releaseType}_x64_\''${version}.tar.xz --name factorio_\''${releaseType}_x64-\''${version}.tar.xz Note the ultimate "_" is replaced with "-" in the --name arg! ''; desktopItem = makeDesktopItem { name = "factorio"; desktopName = "Factorio"; comment = "A game in which you build and maintain factories."; exec = "factorio"; icon = "factorio"; type = "Application"; categories = "Game"; }; branch = if experimental then "experimental" else "stable"; # NB `experimental` directs us to take the latest build, regardless of its branch; # hence the (stable, experimental) pairs may sometimes refer to the same distributable. binDists = { x86_64-linux = let bdist = bdistForArch { inUrl = "linux64"; inTar = "x64"; }; in { alpha = { stable = bdist { sha256 = "0zixscff0svpb0yg8nzczp2z4filqqxi1k0z0nrpzn2hhzhf1464"; version = "1.0.0"; withAuth = true; }; experimental = bdist { sha256 = "0cmia16d5dhy3f8mck926d7rrnavxmvb6a72ymjllxm37slsx60j"; version = "1.1.2"; withAuth = true; }; }; headless = { stable = bdist { sha256 = "0r0lplns8nxna2viv8qyx9mp4cckdvx6k20w2g2fwnj3jjmf3nc1"; version = "1.0.0"; }; experimental = bdist { sha256 = "0x3lwz11z8cczqr5i799m4yg8x3yk6h5qz48pfzw4l2ikrrwgahd"; version = "1.1.2"; }; }; demo = { stable = bdist { sha256 = "0h9cqbp143w47zcl4qg4skns4cngq0k40s5jwbk0wi5asjz8whqn"; version = "1.0.0"; }; }; }; i686-linux = let bdist = bdistForArch { inUrl = "linux32"; inTar = "i386"; }; in { alpha = { stable = bdist { sha256 = "0nnfkxxqnywx1z05xnndgh71gp4izmwdk026nnjih74m2k5j086l"; version = "0.14.23"; withAuth = true; nameMut = asGz; }; }; }; }; actual = binDists.${stdenv.hostPlatform.system}.${releaseType}.${branch} or (throw "Factorio ${releaseType}-${branch} binaries for ${stdenv.hostPlatform.system} are not available for download."); bdistForArch = arch: { version , sha256 , withAuth ? false , nameMut ? x: x }: let url = "https://factorio.com/get-download/${version}/${releaseType}/${arch.inUrl}"; name = nameMut "factorio_${releaseType}_${arch.inTar}-${version}.tar.xz"; in { inherit version arch; src = if withAuth then (stdenv.lib.overrideDerivation (fetchurl { inherit name url sha256; curlOpts = [ "--get" "--data-urlencode" "username@username" "--data-urlencode" "token@token" ]; }) (_: { # This preHook hides the credentials from /proc 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 ''; failureHook = '' cat <