106 lines
2.7 KiB
Nix
106 lines
2.7 KiB
Nix
{ config, lib, pkgs, ... }:
|
|
with lib;
|
|
let
|
|
|
|
cfg = config.services.ghostOne;
|
|
ghostUser = "ghostone";
|
|
stateDir = "/var/lib/ghost-one";
|
|
|
|
in
|
|
{
|
|
|
|
###### interface
|
|
|
|
options = {
|
|
services.ghostOne = {
|
|
|
|
enable = mkOption {
|
|
default = false;
|
|
description = "Enable Ghost-One Warcraft3 game hosting server.";
|
|
};
|
|
|
|
language = mkOption {
|
|
default = "English";
|
|
type = types.addCheck types.str
|
|
(lang: elem lang [ "English" "Spanish" "Russian" "Serbian" "Turkish" ]);
|
|
description = "The language of bot messages: English, Spanish, Russian, Serbian or Turkish.";
|
|
};
|
|
|
|
war3path = mkOption {
|
|
default = "";
|
|
description = ''
|
|
The path to your local Warcraft III directory, which must contain war3.exe, storm.dll, and game.dll.
|
|
'';
|
|
};
|
|
|
|
mappath = mkOption {
|
|
default = "";
|
|
description = ''
|
|
The path to the directory where you keep your map files. GHost One doesn't require
|
|
map files but if it has access to them it can send them to players and automatically
|
|
calculate most map config values. GHost One will search [bot_mappath + map_localpath]
|
|
for the map file (map_localpath is set in each map's config file).
|
|
'';
|
|
};
|
|
|
|
config = mkOption {
|
|
default = "";
|
|
description = "Extra configuration options.";
|
|
};
|
|
|
|
};
|
|
};
|
|
|
|
###### implementation
|
|
|
|
config = mkIf cfg.enable {
|
|
|
|
users.extraUsers = singleton
|
|
{ name = ghostUser;
|
|
uid = config.ids.uids.ghostone;
|
|
description = "Ghost One game server user";
|
|
home = stateDir;
|
|
};
|
|
|
|
users.extraGroups = singleton
|
|
{ name = ghostUser;
|
|
gid = config.ids.gids.ghostone;
|
|
};
|
|
|
|
services.ghostOne.config = ''
|
|
# bot_log = /dev/stderr
|
|
bot_language = ${pkgs.ghostOne}/share/ghost-one/languages/${cfg.language}.cfg
|
|
bot_war3path = ${cfg.war3path}
|
|
|
|
bot_mapcfgpath = mapcfgs
|
|
bot_savegamepath = savegames
|
|
bot_mappath = ${cfg.mappath}
|
|
bot_replaypath = replays
|
|
'';
|
|
|
|
systemd.services."ghost-one" = {
|
|
wantedBy = [ "multi-user.target" ];
|
|
script = ''
|
|
mkdir -p ${stateDir}
|
|
cd ${stateDir}
|
|
chown ${ghostUser}:${ghostUser} .
|
|
|
|
mkdir -p mapcfgs
|
|
chown ${ghostUser}:${ghostUser} mapcfgs
|
|
|
|
mkdir -p replays
|
|
chown ${ghostUser}:${ghostUser} replays
|
|
|
|
mkdir -p savegames
|
|
chown ${ghostUser}:${ghostUser} savegames
|
|
|
|
ln -sf ${pkgs.writeText "ghost.cfg" cfg.config} ghost.cfg
|
|
ln -sf ${pkgs.ghostOne}/share/ghost-one/ip-to-country.csv
|
|
${pkgs.su}/bin/su -s ${pkgs.stdenv.shell} ${ghostUser} \
|
|
-c "LANG=C ${pkgs.ghostOne}/bin/ghost++"
|
|
'';
|
|
};
|
|
|
|
};
|
|
|
|
}
|