summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore2
-rw-r--r--config.lisp.example3
-rw-r--r--src/dnd.lisp11
-rw-r--r--src/endpoints.lisp4
-rw-r--r--src/flash.lisp3
-rw-r--r--src/init.lisp31
-rw-r--r--src/utilities.lisp4
7 files changed, 45 insertions, 13 deletions
diff --git a/.gitignore b/.gitignore
index 10da9f7..6fa036f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,4 @@
*~
/bin/
+/config.lisp
+/dnd-store/
diff --git a/config.lisp.example b/config.lisp.example
new file mode 100644
index 0000000..c1be431
--- /dev/null
+++ b/config.lisp.example
@@ -0,0 +1,3 @@
+(:datastore-directory #P"/home/projects/dnd/dnd-store/"
+ :host "localhost"
+ :port 8888)
diff --git a/src/dnd.lisp b/src/dnd.lisp
index 952b8fe..70edd7d 100644
--- a/src/dnd.lisp
+++ b/src/dnd.lisp
@@ -2,16 +2,23 @@
(in-package #:dnd)
+(defvar *config* nil
+ "Instance of the config class globally available.")
+
(defvar *dnd-arena* nil
"The instance of the HTTP server")
-(defun start ()
- (init-db)
+(defun start (&optional config-path)
+ "Configures and initializes the datastore and web server, then starts the server."
+ (setf *config* (config-from-file (or config-path
+ (asdf:system-relative-pathname "dnd" "config.lisp"))))
+ (init-db *config*)
(setf *dnd-arena* (lzb:create-server))
(lzb:install-app *dnd-arena* (lzb:app 'dnd))
(lzb:start-server *dnd-arena*))
(defun boot ()
+ "Main entrypoint for an executable version of DND."
(swank:create-server :port 9876 :dont-close t)
(start)
(loop (sleep 1)))
diff --git a/src/endpoints.lisp b/src/endpoints.lisp
index 62d70ee..acc62c9 100644
--- a/src/endpoints.lisp
+++ b/src/endpoints.lisp
@@ -116,11 +116,11 @@ functions in url parameters in endpoint definitions."
(new-sesh player)))
(lzb:set-response-cookie
+session-cookie-name+ (session-id sesh)
- :path "/" :domain "localhost") ; TODO: generalize domain
+ :path "/" :domain (host *config*))
(redirect-to "/tavern"))
(progn
(flash :tavern-door (format nil "Hrmm... ~a you say? It ain't on the register." nick))
- (redirect-to "/tavern-door")))) )
+ (redirect-to "/tavern-door")))))
(defendpoint* :get "/join" () ()
(render (page-render-mode) :join))
diff --git a/src/flash.lisp b/src/flash.lisp
index b655fa0..f737d86 100644
--- a/src/flash.lisp
+++ b/src/flash.lisp
@@ -43,8 +43,7 @@ expires."
;; set the cookie, updating its expiration if necessary
(lzb:set-response-cookie
+flash-cookie-name+ key
- ;; TODO: generalize domain
- :path "/" :domain "localhost"
+ :path "/" :domain (host *config*)
:expires (+ +flash-value-lifetime+ now))))
diff --git a/src/init.lisp b/src/init.lisp
index 68b2a16..d7636a6 100644
--- a/src/init.lisp
+++ b/src/init.lisp
@@ -2,11 +2,28 @@
(in-package #:dnd)
-(defun init-db (&optional config)
+;;; CONFIGURATION
+
+(defvar *config* nil)
+
+(defclass/std config ()
+ ((datastore-directory :ir :std #P"/srv/dnd/store/")
+ (swank-port :std nil :doc "If set, swank is started on this port.")
+ (host :std "0.0.0.0")
+ (port :ir :std 8888)))
+
+(defun config-from-file (path)
+ "PATH should be a path to a file containing a PLIST suitable for
+ passing as the keyword arguments to (MAKE-INSTANCE 'CONFIG ...)"
+ (apply #'make-instance 'config (read-from-file path)))
+
+;;; DATASTORE
+
+(defun init-db (config)
+ "Initializes the data store with values from the CONFIG."
+ (ensure-directories-exist (datastore-directory config))
(unless (boundp 'db:*store*)
- (unless config
- nil ; TODO: handle the case where we have a config
- (make-instance
- 'db:mp-store
- :directory (merge-pathnames "dnd-store/" (user-homedir-pathname))
- :subsystems (list (make-instance 'db:store-object-subsystem))))))
+ (make-instance
+ 'db:mp-store
+ :directory (datastore-directory config)
+ :subsystems (list (make-instance 'db:store-object-subsystem)))))
diff --git a/src/utilities.lisp b/src/utilities.lisp
index 539ad28..3852399 100644
--- a/src/utilities.lisp
+++ b/src/utilities.lisp
@@ -70,3 +70,7 @@
(eval-when (:compile-toplevel :load-toplevel :execute)
(defun starts-with-vowel-p (string)
(find (elt string 0) "aeiou" :test #'char-equal)))
+
+(defun read-from-file (path)
+ (read-from-string
+ (alexandria:read-file-into-string path)))