summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--dungeons-and-deadlines.lisp3
-rw-r--r--model.lisp81
-rw-r--r--package.lisp12
-rw-r--r--utilities.lisp25
4 files changed, 121 insertions, 0 deletions
diff --git a/dungeons-and-deadlines.lisp b/dungeons-and-deadlines.lisp
new file mode 100644
index 0000000..881eb20
--- /dev/null
+++ b/dungeons-and-deadlines.lisp
@@ -0,0 +1,3 @@
+;;;; dungeons-and-deadlines.lisp
+
+(in-package #:dungeons-and-deadlines)
diff --git a/model.lisp b/model.lisp
new file mode 100644
index 0000000..318aa26
--- /dev/null
+++ b/model.lisp
@@ -0,0 +1,81 @@
+;;;; model.lisp -- bknr.datastore class definitions for dnd
+
+ty
+
+(in-package :dungeons-and-deadlines)
+
+(deftype title ()
+ `(member :noob))
+
+(deftype character-class ()
+ `(member :hero))
+
+(defclass has-uid (db:store-object)
+ ((nuid :reader uid :initform (nuid)))
+ (:metaclass db:persistent-class))
+
+(defclass can-equip (db:store-object)
+ ((equipment-slots
+ :initform (make-hash-table))
+ (equipment-slot-names
+ :initform (list :holding)
+ :initarg :slot-names
+ :type (list keyword)))
+ (:metaclass db:persistent-class))
+
+;; TODO: define an equip protocol
+
+;; a user
+(defclass hero (can-equip has-uid)
+ ((name
+ :accessor hero-name
+ :initarg :name
+ :initform (error "Heroes must be named")
+ :type string
+ :index-type idx:string-unique-index
+ :index-reader hero-known-as)
+ (experience
+ :accessor experience
+ :initform 0
+ :type integer)
+ (chronicle
+ :accessor hero-chronicle
+ :initform (list)
+ :type (cons string))
+ (pwhash
+ :accessor pwhash
+ :type string
+ :initarg :pwhash
+ :documentation "A hash of the password, hashed with the value of the pwsalt slot.")
+ (pwsalt
+ :reader pwsalt
+ :initform (nuid)
+ :type string
+ :documentation "Salt for this hero's password hash."))
+ (:metaclass db:persistent-class))
+
+;; aka an issue
+;; (defclass monster (can-equip has-uid)
+;; ((name)
+;; (description)
+;; (difficulty)
+;; (tags)
+;; (status)
+;; (priority)
+;; )
+;; (:metaclass db:persistent-class))
+
+;; (defun experience-value (monster)
+;; ;; Int
+;; ;; (tag + campaign) - lookup table , priortiy,
+;; )
+
+;; ;; aka .... uhh.... dumbass github flair
+;; (defclass loot (db:store-object)
+;; ()
+;; (:metaclass db:persistent-class))
+
+;; ;; aka a project
+;; (defclass campagin (db:store-object)
+;; ()
+;; (:metaclass db:persistent-class))
diff --git a/package.lisp b/package.lisp
new file mode 100644
index 0000000..c18b3eb
--- /dev/null
+++ b/package.lisp
@@ -0,0 +1,12 @@
+;;;; package.lisp
+
+(defpackage #:dungeons-and-deadlines
+ (:use #:cl)
+ (:local-nicknames (#:db #:bknr.datastore)
+ (#:idx #:bknr.indices)
+ (#:lzb #:lazybones)
+ (#:re #:cl-ppcre))
+ (:import-from #:lazybones
+ #:defendpoint*))
+
+
diff --git a/utilities.lisp b/utilities.lisp
new file mode 100644
index 0000000..dd4455c
--- /dev/null
+++ b/utilities.lisp
@@ -0,0 +1,25 @@
+;;;; utilities -- nuff said
+
+(in-package :dungeons-and-deadlines)
+
+
+(let ((host (uiop:hostname))
+ (count 0))
+ (defun nuid ()
+ "Generates a Nearly Universal ID"
+ (format nil "~36r"
+ (sxhash
+ (list
+ (incf count)
+ host
+ (get-universal-time))))))
+
+(defun hash-string (plaintext salt)
+ "Hash plaintext using SALT"
+ (flexi-streams:octets-to-string
+ (ironclad:digest-sequence
+ :sha3
+ (flexi-streams:string-to-octets (concatenate 'string salt plaintext)
+ :external-format :utf-8))
+ :external-format :latin1))
+