about summary refs log tree commit diff stats
path: root/src/pokedex
diff options
context:
space:
mode:
authorelioat <elioat@tilde.institute>2022-12-13 11:47:58 -0500
committerelioat <elioat@tilde.institute>2022-12-13 11:47:58 -0500
commit44bb45d2b4cea2186988020d692c9fd9b6eea78d (patch)
tree2f923ff78ea3553185163b7739b3355f3ab9fe66 /src/pokedex
parent1e75b821485dd166267b91fed2e50710aad5c5ad (diff)
downloaddecember-2022-44bb45d2b4cea2186988020d692c9fd9b6eea78d.tar.gz
cleaning up
Diffstat (limited to 'src/pokedex')
-rw-r--r--src/pokedex/pokedex.rkt59
-rw-r--r--src/pokedex/tmp.rkt63
2 files changed, 122 insertions, 0 deletions
diff --git a/src/pokedex/pokedex.rkt b/src/pokedex/pokedex.rkt
new file mode 100644
index 0000000..3aebea1
--- /dev/null
+++ b/src/pokedex/pokedex.rkt
@@ -0,0 +1,59 @@
+
+#lang racket
+
+;; let's try to make a pokedex in racket!
+
+;; first step will be to write a function to query the pokeAPI
+;; like so, https://pokeapi.co/api/v2/pokemon/ditto
+
+;; once there is a function in place that returns data I will
+;; have a choice to make -- do I want to always query the API,
+;; do I want to cache results, or do I want to create an offline
+;; repository of poke-data to search through and sometimes update?
+
+
+;; basic GET request
+(require net/url)
+(require json)
+
+; 🤔
+(require slideshow/pict racket/draw)
+
+;; API URL
+(define *POKE-API* "https://pokeapi.co/api/v2/")
+
+
+(define (get-pokemon id)
+    "queries the api, returns a butt ton of info"
+	(call/input-url (string->url (~a *POKE-API* "pokemon/" id)) ; ~a, like string-append but appends *either* strings or numbers to a string
+                get-pure-port
+                (compose string->jsexpr port->string))) ; QUESTION: could I use read-json here, instead?
+
+(define (dex-entry id)
+    "selects the info we need from the api, builds a hash table of the data that will build the entry"
+    (let ([poke-data (get-pokemon id)])
+        (define entry-data (make-hash))
+        (hash-set! entry-data "name" (hash-ref poke-data 'name))
+        (hash-set! entry-data "id" (hash-ref poke-data 'id))
+        (hash-set! entry-data "sprite" (hash-ref (hash-ref poke-data 'sprites) 'front_default))
+        (hash-set! entry-data "stats" (hash-ref poke-data 'stats))
+        (hash-set! entry-data "types" (hash-ref poke-data 'types))
+        entry-data))
+
+(define (inspector h)
+  "display the contents of a hash table for human eyeballs and let the hash table fall back out"
+  (hash-map h
+            (lambda (k v)
+              (if (list? v) (map ; consider making this if a cond and testing for lists/hash tables to recursively dive into nested data
+                             (lambda (x) (inspector x)) v)
+                  (display (~a "  key: " k "\nvalue: " v "\n=====\n")))))
+  h)
+
+(inspector (dex-entry 11))
+(inspector (dex-entry "bulbasaur"))
+
+(define img (hash-ref (dex-entry 11) "sprite"))
+
+(define display-image (bitmap (make-object bitmap% img)))
+
+(frame (scale display-image 0.3)) ; this doesn't actually seem to work with URLs/PNGs
diff --git a/src/pokedex/tmp.rkt b/src/pokedex/tmp.rkt
new file mode 100644
index 0000000..089e066
--- /dev/null
+++ b/src/pokedex/tmp.rkt
@@ -0,0 +1,63 @@
+#lang racket
+
+; (require sugar)
+
+(define test-data '#hash(("id" . 12)
+                         ("name" . "butterfree")
+                         ("sprite" . "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/12.png")
+                         ("stats"
+                          . (#hasheq((base_stat . 60)
+                                     (effort . 0)
+                                     (stat . #hasheq((name . "hp") (url . "https://pokeapi.co/api/v2/stat/1/"))))
+                             #hasheq((base_stat . 45)
+                                     (effort . 0)
+                                     (stat . #hasheq((name . "attack") (url . "https://pokeapi.co/api/v2/stat/2/"))))
+                             #hasheq((base_stat . 50)
+                                     (effort . 0)
+                                     (stat . #hasheq((name . "defense") (url . "https://pokeapi.co/api/v2/stat/3/"))))
+                             #hasheq((base_stat . 90)
+                                     (effort . 2)
+                                     (stat . #hasheq((name . "special-attack") (url . "https://pokeapi.co/api/v2/stat/4/"))))
+                             #hasheq((base_stat . 80)
+                                     (effort . 1)
+                                     (stat . #hasheq((name . "special-defense") (url . "https://pokeapi.co/api/v2/stat/5/"))))
+                             #hasheq((base_stat . 70)
+                                     (effort . 0)
+                                     (stat . #hasheq((name . "speed") (url . "https://pokeapi.co/api/v2/stat/6/"))))))
+                         ("types"
+                          . (#hasheq((slot . 1)
+                                     (type . #hasheq((name . "bug") (url . "https://pokeapi.co/api/v2/type/7/"))))
+                             #hasheq((slot . 2)
+                                     (type . #hasheq((name . "flying") (url . "https://pokeapi.co/api/v2/type/3/"))))))))
+
+
+; (define d (dict->list test-data)) ; or...you know...could convert from hash table to list?
+
+
+; (hash? (car (hash-ref test-data "stats"))) ; #t --- BOOM! this gets us a hash table! 
+; (display (car (hash-ref test-data "stats")))
+; (list? (hash-ref test-data "stats")) ;; #t
+
+;; "stats" and "types" AREN'T exactly nested hash tables! They're lists, with hash tables embedded in them! 
+;; SO! I need a way to test for if something is a LIST, and then if it is a LIST I think then I hash map through that!
+
+;; NEXT STEPS -> https://stackoverflow.com/questions/13504302/racket-scheme-filtering
+
+; (hash-ref test-data "stats") ; all stats
+; (hash-ref (car (hash-ref test-data "stats")) 'base_stat) ; value for a given stat
+; (hash-ref (hash-ref (car (hash-ref test-data "stats")) 'stat) 'name) ; name for a given stat
+
+;  [(list? v) (map (lambda (x) (inspector x)) v)]
+;  [(hash? (car (hash-ref k "stats")) (map (lambda (x) (inspector x)) v))] 
+
+(define (inspector h)
+  "display the contents of a hash table for human eyeballs and let the hash table fall back out"
+  (hash-map h
+            (lambda (k v)
+              (cond [(list? v) (cond
+                                 [(hash? (car (hash-ref k "stats")) (map (lambda (x) (inspector x) v)))] ; this is probably dumb, since it'll require at least another level of nesting...
+                                 [map (lambda (x) (inspector x)) v])]
+                    [(display (~a "  key: " k "\nvalue: " v "\n=====\n"))])))
+  h)
+
+(inspector test-data)