Subject: [bug#30196] [PATCH 2/2] gnu: services: Add wesnothd service.

From: Arun Isaac <[email-masked]>
Date: Mon, 22 Jan 2018 17:41:04 +0530

* gnu/services/games.scm: New file.
* gnu/local.mk (GNU_SYSTEM_MODULES): Add it.
* doc/guix.texi (Game Services): Document the service.
---
 doc/guix.texi          | 35 +++++++++++++++++++++-
 gnu/local.mk           |  1 +
 gnu/services/games.scm | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 116 insertions(+), 1 deletion(-)
 create mode 100644 gnu/services/games.scm

diff --git a/doc/guix.texi b/doc/guix.texi
index 983e00ab3..d96de977c 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -43,7 +43,7 @@ Copyright @copyright{} 2017 Maxim Cournoyer@*
 Copyright @copyright{} 2017, 2018 Tobias Geerinckx-Rice@*
 Copyright @copyright{} 2017 George Clemmer@*
 Copyright @copyright{} 2017 Andy Wingo@*
-Copyright @copyright{} 2017 Arun Isaac@*
+Copyright @copyright{} 2017, 2018 Arun Isaac@*
 Copyright @copyright{} 2017 nee@*
 Copyright @copyright{} 2018 Rutger Helling
 
@@ -248,6 +248,7 @@ Services
 * Audio Services::              The MPD.
 * Virtualization Services::     Virtualization services.
 * Version Control Services::    Providing remote access to Git repositories.
+* Game Services::                Game servers.
 * Miscellaneous Services::      Other services.
 
 Defining Services
@@ -9469,6 +9470,7 @@ declaration.
 * Audio Services::              The MPD.
 * Virtualization Services::     Virtualization services.
 * Version Control Services::    Providing remote access to Git repositories.
+* Game Services::                Game servers.
 * Miscellaneous Services::      Other services.
 @end menu
 
@@ -18095,6 +18097,37 @@ HTTPS.  You will also need to add an @code{fcgiwrap} proxy to your
 system services.  @xref{Web Services}.
 @end deffn
 
+@node Game Services
+@subsubsection Game Services
+
+@subsubheading The Battle for Wesnoth Service
+@cindex wesnothd
+@uref{https://wesnoth.org, The Battle for Wesnoth} is a fantasy, turn
+based tactical strategy game, with several single player campaigns, and
+multiplayer games (both networked and local).
+
+@defvar {Scheme Variable} wesnothd-service-type
+Service type for the wesnothd service.  Its value must be a
+@code{wesnothd-configuration} object.  To run wesnothd in the default
+configuration, instantiate it as:
+
+@example
+(service wesnothd-service-type)
+@end example
+@end defvar
+
+@deftp {Data Type} wesnothd-configuration
+Data type representing the configuration of @command{wesnothd}.
+
+@table @asis
+@item @code{package} (default: @code{wesnoth-server})
+The wesnoth server package to use.
+
+@item @code{port} (default: @code{15000})
+The port to bind the server to.
+@end table
+@end deftp
+
 @node Miscellaneous Services
 @subsubsection Miscellaneous Services
 
diff --git a/gnu/local.mk b/gnu/local.mk
index 240554fe4..19b92b87b 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -457,6 +457,7 @@ GNU_SYSTEM_MODULES =				\
   %D%/services/desktop.scm			\
   %D%/services/dict.scm				\
   %D%/services/dns.scm				\
+  %D%/services/games.scm			\
   %D%/services/kerberos.scm			\
   %D%/services/lirc.scm				\
   %D%/services/virtualization.scm		\
diff --git a/gnu/services/games.scm b/gnu/services/games.scm
new file mode 100644
index 000000000..b14669623
--- /dev/null
+++ b/gnu/services/games.scm
@@ -0,0 +1,81 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2018 Arun Isaac <[email-masked]>
+;;;
+;;; This file is part of GNU Guix.
+;;;
+;;; GNU Guix is free software; you can redistribute it and/or modify it
+;;; under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 3 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; GNU Guix is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
+
+(define-module (gnu services games)
+  #:use-module (gnu services)
+  #:use-module (gnu services shepherd)
+  #:use-module (gnu packages admin)
+  #:use-module (gnu packages games)
+  #:use-module (gnu system shadow)
+  #:use-module (guix gexp)
+  #:use-module (guix modules)
+  #:use-module (guix records)
+  #:use-module (ice-9 match)
+  #:export (wesnothd-configuration
+            wesnoth-configuration?
+            wesnothd-service-type))
+
+;;;
+;;; The Battle for Wesnoth server
+;;;
+
+(define-record-type* <wesnothd-configuration>
+  wesnothd-configuration make-wesnothd-configuration wesnothd-configuration?
+  (package wesnothd-configuration-package
+           (default wesnoth-server))
+  (port wesnothd-configuration-port
+        (default 15000)))
+
+(define %wesnothd-accounts
+  (list (user-account
+         (name "wesnothd")
+         (group "wesnothd")
+         (system? #t)
+         (comment "Wesnoth daemon user")
+         (home-directory "/var/empty")
+         (shell (file-append shadow "/sbin/nologin")))
+        (user-group
+         (name "wesnothd")
+         (system? #t))))
+
+(define wesnothd-shepherd-service
+  (match-lambda
+    (($ <wesnothd-configuration> package port)
+     (with-imported-modules (source-module-closure
+                             '((gnu build shepherd)))
+       (shepherd-service
+        (documentation "The Battle for Wesnoth server")
+        (provision '(wesnoth-daemon))
+        (requirement '(networking))
+        (modules '((gnu build shepherd)))
+        (start #~(make-forkexec-constructor/container
+                  (list #$(file-append package "/bin/wesnothd")
+                        "-p" #$(number->string port))))
+        (stop #~(make-kill-destructor)))))))
+
+(define wesnothd-service-type
+  (service-type
+   (name 'wesnothd)
+   (description
+    "Run The Battle for Wesnoth server @command{wesnothd}.")
+   (extensions
+    (list (service-extension account-service-type
+                             (const %wesnothd-accounts))
+          (service-extension shepherd-root-service-type
+                             (compose list wesnothd-shepherd-service))))
+   (default-value (wesnothd-configuration))))
-- 
2.15.1