(in-package :lispostory) (defparameter *maplestory-mobs-url* "https://maplestory.io/api/gms/83/mob") (defun get-maplestory-mobs () (http-get-json *maplestory-mobs-url*)) (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)) (defun get-chrono-mob (maple-mob) (let* ((mob-id (gethash "id" maple-mob)) (url (chronostory-mob-url mob-id)) (data (http-get-json url))) (sleep 0.3) (when data (uiop:println (concatenate 'string "Retrieved id " (write-to-string mob-id)))) data)) (defun refresh-mob-data () (let* ((maple-mobs (get-maplestory-mobs)) (_ (uiop:println "Retrieved maplestory mobs. Getting chronostory mobs...")) (chrono-mobs (loop for maple-mob across maple-mobs for chrono-mob = (get-chrono-mob maple-mob) when (let ((mob (and chrono-mob (gethash "mob" chrono-mob)))) (and mob (numberp (gethash "released" mob)) (= (gethash "released" mob) 1))) collect chrono-mob)) (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) (alexandria-2:write-string-into-file chrono-mobs-str "mobs.json" :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)))