#| Legacy Code Scheduled For Deletion YGOProDeck v1 JSON Importer |# (in-package #:cl-user) (defpackage #:cl-deck-builder2.models.ygoprodeck.json (:use :cl :cl-deck-builder2.db :cl-deck-builder2.models.ygoprodeck) (:local-nicknames (#:v #:org.shirakumo.verbose)) (:export :json-import-cardinfo)) (in-package #:cl-deck-builder2.models.ygoprodeck.json) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defvar *json* nil "The currently loaded \"cardinfo.php\" data pulled from YGOProDeck API. You may have to munge it into \"cardinfo.json\" with jq: $ jq . < cardinfo.php > cardinfo.json ") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; GET-NEW-CARDINFO got renamed to YGOPRODECK2:FETCH-CARDINFO. ;; Actually, basically everything got moved into YGOPRODECK2. This is ;; legacy code. (defun json-import-cardinfo (path &optional (force nil)) (load-cardinfo path force) (let ((lst ())) ;; CARD is an ALIST (dolist (card *json*) (let (;; Banlist_Info: Unused ;; (banlist-info (assoc-utils:aget card :banlist--info)) ;; Card Images: Variant Artwork ;; Skip the first one with REST (card-images (rest (assoc-utils:aget card :card--images))) ;; make a copy: we munge it (card-prices (copy-alist (assoc-utils:aget card :card--prices))) ;; make a copy: we munge it (card-sets (copy-alist (assoc-utils:aget card :card--sets))) ;; Link Markers: Unused ;; (linkmarkers (assoc-utils:aget card :linkmarkers)) ;; make a copy: we munge it (card-misc-info (copy-alist (assoc-utils:aget card :misc--info))) ;; '((:banlist--info) ;; (:card--images) ;; (:card--prices) ;; (:card--sets) ;; (:linkmarkers) ;; (:misc--info)) (passcode (assoc-utils:aget card :id)) (base-fields (assoc-utils:alist-plist (json-cardinfo-base-fields card)))) ;; First import all the base data (push (apply #'make-instance 'ygo-info base-fields) lst) ;; Card images, variant artwork, I'm not sure how to handle ;; it. Here's a dirty hack! If there are any variant images ;; with passcodes, just create a duplicate entry with the same ;; data from the parent. I'm sure a separate table is a better ;; way to handle this information, but I don't know how to do ;; that right now! (dolist (card-image card-images) (let ((id (assoc-utils:aget card-image :id))) (setf (getf base-fields :passcode) id) (push (apply #'make-instance 'ygo-info base-fields) lst))) ;; TODO Ban List Info ;; Append :passcode to all banlist-info for this card ;; (dolist (banlist banlist-info) ;; (setf banlist (acons :passcode passcode banlist)) ;; (apply #'mito:create-dao 'banlist-info ;; (assoc-utils:alist-plist banlist))) ;; Append :passcode to all card-prices for this card (dolist (card-price card-prices) (setf card-price (acons :passcode passcode card-price) ;; Data Transformation (car (assoc :cardmarket--price card-price)) :cardmarket (car (assoc :tcgplayer--price card-price)) :tcgplayer (car (assoc :ebay--price card-price)) :ebay (car (assoc :amazon--price card-price)) :amazon (car (assoc :coolstuffinc--price card-price)) :coolstuffinc) (push (apply #'make-instance 'ygo-price (assoc-utils:alist-plist card-price)) lst)) ;; Append :passcode to all card-sets for this card (dolist (card-set card-sets) (setf card-set (acons :passcode passcode card-set) ;; Data Transformation (car (assoc :set--name card-set)) :name (car (assoc :set--code card-set)) :code (car (assoc :set--rarity card-set)) :rarity (car (assoc :set--rarity--code card-set)) :rarity-code (car (assoc :set--price card-set)) :price) (push (apply #'make-instance 'ygo-set (assoc-utils:alist-plist card-set)) lst)) ;; misc_info + misc_info.formats ;; (dolist (misc-info card-misc-info) ;; (setf card-set (acons :passcode passcode card-set) ;; ;; Data Transformation ;; (car (assoc :set--name card-set)) :name ;; (car (assoc :set--code card-set)) :code ;; (car (assoc :set--rarity card-set)) :rarity ;; (car (assoc :set--rarity--code card-set)) :rarity-code ;; (car (assoc :set--price card-set)) :price) ;; (push (apply #'make-instance 'ygo-set (assoc-utils:alist-plist card-set)) ;; lst)) )) (do-grouped-insert lst))) ;; TODO linkmarkers ;; Append :passcode to all linkmarkers for this card ;; (dolist (linkmarker linkmarkers) ;; (setf linkmarker (acons :passcode passcode linkmarker)) ;; Data Transformation ;; (apply #'mito:create-dao 'linkmarker ;; (assoc-utils:alist-plist linkmarker)))