diff --git a/drops.lisp b/drops.lisp new file mode 100644 index 0000000..3bce015 --- /dev/null +++ b/drops.lisp @@ -0,0 +1,32 @@ +(in-package :lispostory) + +(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 () + (let* ((data (drakma:http-request *chronostory-drops-sheet-url*)) + (csv (cl-csv:read-csv data)) + (header (car csv)) + (num-fields-to-keep (position "" header :test #'equal)) + (keys (mapcar #'string-to-hash-table-key (subseq header 0 num-fields-to-keep))) + (drops (map 'vector + (lambda (row) + (serapeum:pairhash keys (subseq row 0 num-fields-to-keep))) + (cdr csv)))) + (setf *chronostory-drops* drops) + (alexandria-2:write-string-into-file + (shasht:write-json drops nil) + "drops.json" + :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))) diff --git a/lispostory.asd b/lispostory.asd index e71b859..f822eec 100644 --- a/lispostory.asd +++ b/lispostory.asd @@ -9,4 +9,5 @@ (:file "main" :depends-on ("utils")) (:file "mobs" :depends-on ("utils")) (:file "items" :depends-on ("utils")) - (:file "spawns" :depends-on ("utils")))) + (:file "spawns" :depends-on ("utils")) + (:file "drops" :depends-on ("utils")))) diff --git a/main.lisp b/main.lisp index 5f014e5..531f876 100644 --- a/main.lisp +++ b/main.lisp @@ -3,6 +3,5 @@ (defparameter *chronostory-map-url-format* "https://chronostory.onrender.com/api/map-info?mapId=~a") (defparameter *chronostory-gacha-search-format* "https://chronostory.onrender.com/api/gacha-search?itemId=~a") (defparameter *chronostory-gacha-url-format "https://chronostory.onrender.com/api/gacha-items?gachaId=~a") -(defparameter *chronostory-drops-sheet-url* "https://docs.google.com/spreadsheets/d/e/2PACX-1vRpKuZGJQIFFxSi6kzYx4ALI0MQborpLEkh3J1qIGSd0Bw7U4NYg5CK-3ESzyK580z4D8NO59SUeC3k/pub?gid=1888753114&single=true&output=csv") ; (sb-ext:save-lisp-and-die "my-prog" :toplevel #'show-mobs :executable t) diff --git a/spawns.lisp b/spawns.lisp index 29b8061..874370f 100644 --- a/spawns.lisp +++ b/spawns.lisp @@ -56,9 +56,7 @@ separate csvs." (parse-error () nil))) (defun csv-to-hash-tables (csv) - (let* ((keys (mapcar (lambda (k) - (let ((k2 (string-upcase (serapeum:string-replace " " k "")))) - (intern k2 :keyword))) + (let* ((keys (mapcar #'string-to-hash-table-key (car csv))) (result (make-array 0 :adjustable t :fill-pointer 0))) (loop for row in csv diff --git a/utils.lisp b/utils.lisp index d883833..32affe4 100644 --- a/utils.lisp +++ b/utils.lisp @@ -16,3 +16,7 @@ (defun map-vector (func vec) (map 'vector func vec)) + +(defun string-to-hash-table-key (s) + (let ((k2 (string-upcase (serapeum:string-replace " " s "")))) + (intern k2 :keyword)))