refactor to data-source

This commit is contained in:
2026-01-04 00:49:26 -05:00
parent e15628b20a
commit 712361da86
5 changed files with 55 additions and 58 deletions

View File

@@ -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))

View File

@@ -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!")))

View File

@@ -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))

View File

@@ -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*))

View File

@@ -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))