diff --git a/drops.lisp b/drops.lisp index 39a1108..61b99ee 100644 --- a/drops.lisp +++ b/drops.lisp @@ -1,10 +1,10 @@ (in-package :lispostory) +(define-data-source drop) + (defparameter *chronostory-drops-sheet-url* "https://docs.google.com/spreadsheets/d/e/2PACX-1vRpKuZGJQIFFxSi6kzYx4ALI0MQborpLEkh3J1qIGSd0Bw7U4NYg5CK-3ESzyK580z4D8NO59SUeC3k/pub?gid=1888753114&single=true&output=csv") -(defparameter *chronostory-drops* nil) - -(defun refresh-drops () +(defmethod refresh ((ds drop-data-source)) (let* ((data (drakma:http-request *chronostory-drops-sheet-url*)) (csv (cl-csv:read-csv data)) (header (car csv)) @@ -14,19 +14,13 @@ (lambda (row) (pairhash keys (subseq row 0 num-fields-to-keep))) (cdr csv)))) - (setf *chronostory-drops* drops) + (setf (cache ds) drops) (write-string-into-file (shasht:write-json drops nil) - "drops.json" + (file-path ds) :if-exists :overwrite :if-does-not-exist :create))) -(defun reload-drops () - (let ((drops (shasht:read-json (uiop:read-file-string "drops.json")))) - (setf *chronostory-drops* drops) - drops)) - -(defun load-drops () - (if *chronostory-drops* - *chronostory-drops* - (reload-drops))) +(comment + (defvar drops (make-drop-data-source)) + (reload drops)) diff --git a/items.lisp b/items.lisp index 99f8014..cf821ba 100644 --- a/items.lisp +++ b/items.lisp @@ -1,5 +1,7 @@ (in-package :lispostory) +(define-data-source item) + (defparameter *maplestory-items-url* "https://maplestory.io/api/gms/83/item") (defun get-maplestory-items () @@ -7,21 +9,9 @@ (defparameter *chronostory-item-url-format* "https://chronostory.onrender.com/api/item-info?itemId=~a") -(defparameter *chronostory-items* (make-array 0)) - (defun chronostory-item-url (item-id) (format nil *chronostory-item-url-format* item-id)) -(defun reload-item-data () - (let ((item-data (shasht:read-json (uiop:read-file-string "items.json")))) - (setf *chronostory-items* item-data) - item-data)) - -(defun load-item-data () - (if (/= (length *chronostory-items*) 0) - *chronostory-items* - (reload-item-data))) - (defun get-chrono-item (maple-item) (if (gethash "isCash" maple-item) nil @@ -33,7 +23,7 @@ (uiop:println (concatenate 'string "Retrieved id " (write-to-string item-id)))) data))) -(defun refresh-item-data () +(defmethod refresh ((ds item-data-source)) (let* ((maple-items (get-maplestory-items)) (_ (uiop:println "Retrieved maplestory items. Getting chronostory items...")) (chrono-items @@ -45,10 +35,10 @@ collect chrono-item))) (declare (ignore _)) (uiop:println "Retrieved chronostory items. Writing out to json file...") - (setf *chronostory-items* chrono-items) + (setf (cache ds) chrono-items) (write-string-into-file (shasht:write-json chrono-items nil) - "items.json" + (file-path ds) :if-exists :overwrite :if-does-not-exist :create) (uiop:println "Done!"))) diff --git a/mobs.lisp b/mobs.lisp index 09b63c2..f2e9264 100644 --- a/mobs.lisp +++ b/mobs.lisp @@ -1,5 +1,7 @@ (in-package :lispostory) +(define-data-source mob) + (defparameter *maplestory-mobs-url* "https://maplestory.io/api/gms/83/mob") (defun get-maplestory-mobs () @@ -8,8 +10,6 @@ (defparameter *chronostory-mob-url-format* "https://chronostory.onrender.com/api/mob-info?mobId=~a") (defparameter *chronostory-mob-drop-url-format* "https://chronostory.onrender.com/api/mob-drops?mobId=~a") -(defparameter *chronostory-mobs* (make-array 0)) - (defun chronostory-mob-url (mob-id) (format nil *chronostory-mob-url-format* mob-id)) @@ -22,7 +22,7 @@ (uiop:println (concatenate 'string "Retrieved id " (write-to-string mob-id)))) data)) -(defun refresh-mob-data () +(defmethod refresh ((ds mob-data-source)) (let* ((maple-mobs (get-maplestory-mobs)) (_ (uiop:println "Retrieved maplestory mobs. Getting chronostory mobs...")) (chrono-mobs @@ -36,16 +36,10 @@ (chrono-mobs-str (shasht:write-json chrono-mobs nil))) (declare (ignore _)) (uiop:println "Retrieved chronostory mobs. Writing out to json file...") - (setf *chronostory-mobs* chrono-mobs) - (write-string-into-file chrono-mobs-str "mobs.json" :if-exists :overwrite :if-does-not-exist :create) + (setf (cache ds) chrono-mobs) + (write-string-into-file chrono-mobs-str (file-path ds) :if-exists :overwrite :if-does-not-exist :create) (uiop:println "Done!"))) -(defun reload-mob-data () - (let ((mob-data (shasht:read-json (uiop:read-file-string "mobs.json")))) - (setf *chronostory-mobs* mob-data) - mob-data)) - -(defun load-mob-data () - (if (/= (length *chronostory-mobs*) 0) - *chronostory-mobs* - (reload-mob-data))) +(comment + (defvar mobs (make-mob-data-source)) + (reload mobs)) diff --git a/spawns.lisp b/spawns.lisp index 1fd402d..152f4ec 100644 --- a/spawns.lisp +++ b/spawns.lisp @@ -1,5 +1,7 @@ (in-package :lispostory) +(define-data-source spawn) + (defparameter *chronostory-spawns-url-format* "https://docs.google.com/spreadsheets/d/e/2PACX-1vSIUj-72ADgwMqShxt4Dn7OP7dBN54l0wda1IPwlIVTZUN_ZtTlRx5DDidr43VXv2HYQ5RNqccLbbGS/pub?gid=~a&output=csv&single=true") (defparameter *chronostory-spawn-gids* @@ -16,8 +18,6 @@ :el-nath 1897049096 :ludibrium 1290087592)) -(defvar *chronostory-spawns* nil) - (defun chronostory-spawn-url (gid) (format nil *chronostory-spawns-url-format* gid)) @@ -87,7 +87,7 @@ separate csvs." (joined (string-join (concatenate 'list first-half second-half) #\Newline))) (csv-to-hash-tables (cl-csv:read-csv joined)))) -(defun refresh-spawn-data () +(defmethod refresh ((ds spawn-data-source)) (let ((spawn-data (pairhash (mapcar #'car *chronostory-spawn-gids*) (mapcar (lambda (pair) @@ -96,20 +96,10 @@ separate csvs." (uiop:println (concat "Requesting data for " (symbol-name (car pair)))) (parse-sheet data))) *chronostory-spawn-gids*)))) - (setf *chronostory-spawns* spawn-data) + (setf (cache ds) spawn-data) (write-string-into-file (shasht:write-json spawn-data nil) - "spawns.json" + (file-path ds) :if-exists :overwrite :if-does-not-exist :create) spawn-data)) - -(defun reload-spawn-data () - (let ((spawn-data (shasht:read-json (uiop:read-file-string "spawns.json" :if-does-not-exist nil)))) - (setf *chronostory-spawns* spawn-data) - spawn-data)) - -(defun load-spawn-data () - (if-not *chronostory-spawns* - (reload-spawn-data) - *chronostory-spawns*)) diff --git a/utils.lisp b/utils.lisp index 925bb7e..1b37d45 100644 --- a/utils.lisp +++ b/utils.lisp @@ -19,3 +19,32 @@ (defun string-to-hash-table-key (s) (string-replace " " s "")) + +(defclass data-source () + ((cache :initform nil :accessor cache) + (file-path :initarg :file-path :accessor file-path))) + +(defmacro define-data-source (singular-name) + (let* ((class-name (symbolicate singular-name '-data-source)) + (constructor-name (symbolicate 'make- singular-name '-data-source)) + (plural-name (concat (symbol-name singular-name) "s")) + (file-name (concat (string-downcase plural-name) ".json"))) + `(progn + (defclass ,class-name (data-source) ()) + + (defun ,constructor-name () + (make-instance ',class-name :file-path ,file-name))))) + +(defgeneric data (data-source)) +(defmethod data ((ds data-source)) + (or (cache ds) + (reload ds))) + +(defgeneric reload (data-source)) +(defmethod reload ((ds data-source)) + (if (uiop:file-exists-p (file-path ds)) + (let ((data (shasht:read-json (uiop:read-file-string (file-path ds))))) + (setf (cache ds) data) + data))) + +(defgeneric refresh (data-source))