125 lines
3.9 KiB
Nix
125 lines
3.9 KiB
Nix
{
|
|
inputs = {
|
|
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
|
flake-utils.url = "github:numtide/flake-utils";
|
|
fenix = {
|
|
url = "github:nix-community/fenix";
|
|
inputs.nixpkgs.follows = "nixpkgs";
|
|
};
|
|
crane = {
|
|
url = "github:ipetkov/crane";
|
|
};
|
|
};
|
|
outputs = {
|
|
self,
|
|
nixpkgs,
|
|
flake-utils,
|
|
fenix,
|
|
crane,
|
|
}:
|
|
flake-utils.lib.eachDefaultSystem
|
|
(
|
|
system: let
|
|
overlays = [fenix.overlays.default];
|
|
pkgs = import nixpkgs {
|
|
inherit system overlays;
|
|
};
|
|
craneLib = crane.mkLib pkgs;
|
|
commonArgs = {
|
|
src = craneLib.cleanCargoSource ./.;
|
|
strictDeps = true;
|
|
|
|
nativeBuildInputs = with pkgs; [pkg-config cmake];
|
|
buildInputs = with pkgs;
|
|
[
|
|
openssl
|
|
zlib-ng
|
|
]
|
|
++ lib.optionals stdenv.isDarwin [
|
|
libiconv
|
|
];
|
|
};
|
|
in
|
|
with pkgs; {
|
|
devShells.default = mkShell {
|
|
buildInputs = [
|
|
pkgs.fenix.stable.completeToolchain
|
|
pkg-config
|
|
openssl
|
|
];
|
|
};
|
|
packages.default = craneLib.buildPackage (commonArgs
|
|
// {
|
|
cargoArtifacts = craneLib.buildDepsOnly commonArgs;
|
|
});
|
|
formatter = alejandra;
|
|
}
|
|
)
|
|
// flake-utils.lib.eachDefaultSystemPassThrough (system: {
|
|
nixosModules.default = {
|
|
config,
|
|
lib,
|
|
pkgs,
|
|
...
|
|
}: {
|
|
options.services.smo-server = {
|
|
enable = lib.mkEnableOption "a game server for Super Mario Odyssey Online";
|
|
user = lib.mkOption {
|
|
type = lib.types.string;
|
|
description = "The user to start the server with";
|
|
};
|
|
enableFaker = lib.mkOption {
|
|
type = lib.types.bool;
|
|
default = false;
|
|
example = true;
|
|
description = "Whether to enable the test bot for solo development.";
|
|
};
|
|
tcpPort = lib.mkOption {
|
|
type = lib.types.port;
|
|
default = 1027;
|
|
description = "The TCP port to host the server on";
|
|
};
|
|
udpPort = lib.mkOption {
|
|
type = lib.types.port;
|
|
default = 1027;
|
|
description = "The UDP port to host the server on";
|
|
};
|
|
proximity = lib.mkOption {
|
|
type = lib.types.nullOr lib.types.attrs;
|
|
default = null;
|
|
} // {
|
|
port = lib.mkOption {
|
|
type = lib.types.port;
|
|
example = 4433;
|
|
description = "The UDP port to host the proximity chat server on";
|
|
};
|
|
certPath = lib.mkOption {
|
|
type = lib.types.path;
|
|
example = "cert.pem";
|
|
description = "The certificate used for encrypting the WebTransport stream";
|
|
};
|
|
keyPath = lib.mkOption {
|
|
type = lib.types.path;
|
|
example = "cert.pem";
|
|
description = "The private key used for encrypting the WebTransport stream";
|
|
};
|
|
};
|
|
};
|
|
config = lib.mkIf config.services.smo-server.enable {
|
|
systemd.services.smo-server = with config.services.smo-server; {
|
|
wantedBy = ["multi-user.target"];
|
|
after = ["network.target"];
|
|
description = "Start smo-server";
|
|
serviceConfig = {
|
|
WorkingDirectory = "${self.packages.${system}.default}";
|
|
Type = "simple";
|
|
ExecStart = let
|
|
proxRes = if proximity == null then "-p ${proximity.port} --prox-cert ${proximity.certPath} --prox-key ${proximity.keyPath}" else "";
|
|
in ''${self.packages.${system}.default}/bin/smo-server -t ${toString tcpPort} -u ${toString udpPort} ${lib.strings.optionalString enableFaker "--enable-faker"}'';
|
|
};
|
|
};
|
|
};
|
|
};
|
|
});
|
|
}
|