Add simple Common Lisp example client

Hacking isn't about why.  It's about why not!  So why not connect to
EDDN from your favorite Lisp implementation?  This works identically
to the JavaScript example.
This commit is contained in:
Matthew X. Economou 2020-01-11 12:27:10 -05:00
parent 754e74c7c3
commit 6f00524348
2 changed files with 73 additions and 0 deletions

1
examples/CL/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
*.fasl

View File

@ -0,0 +1,72 @@
;; This code has been tested on Ubuntu 18.04 and SBCL 1.4.5 with the
;; following packages installed: sbcl, cl-quicklisp, libzmq3-dev.
;; Install and configure Quicklisp, https://www.quicklisp.org/, prior
;; to running this. For more information, refer to the PZMQ
;; documentation at http://orivej.github.io/pzmq/doc/index.html.
(mapc #'ql:quickload '("pzmq" "zlib" "cl-json"))
(defpackage #:eddn-cl-example
(:use #:cl)
(:export
#:simple-client))
(in-package #:eddn-cl-example)
(defun simple-client ()
"Subscribe to EDDN and return one message."
(pzmq:with-socket s :sub ;create a 0MQ subscriber socket
(pzmq:connect s "tcp://eddn.edcd.io:9500") ;connect to EDDN
(pzmq:with-message msg ;allocate a 0MQ message
(pzmq:msg-recv msg s) ;receive EDDN compressed data
(json:decode-json-from-string ;parse the uncompressed JSON
(babel:octets-to-string ;convert uncompressed data to a string
(zlib:uncompress ;decompress the 0MQ message
(cffi:foreign-array-to-lisp ;convert 0MQ message from C to Lisp byte array
(pzmq:msg-data msg)
`(:array :uchar ,(pzmq:msg-size msg))
:element-type '(unsigned-byte 8))))))))
;; When run, it will output something like the following:
;;
;; CL-USER> (eddn-cl-example:simple-client)
;; ((:$SCHEMA-REF . "https://eddn.edcd.io/schemas/journal/1")
;; (:HEADER (:GATEWAY-TIMESTAMP . "2020-01-11T17:05:17.915018Z")
;; (:SOFTWARE-NAME . "E:D Market Connector [Windows]")
;; (:SOFTWARE-VERSION . "3.4.3.0")
;; (:UPLOADER-+ID+ . "8c07651144ad55f78ed79381e3274c718674abf1"))
;; (:MESSAGE (:*BODY . "Elata") (:*BODY-+ID+ . 0) (:*BODY-TYPE . "Star")
;; (:*FACTIONS
;; ((:*ALLEGIANCE . "Independent") (:*FACTION-STATE . "None")
;; (:*GOVERNMENT . "Corporate") (:*HAPPINESS . "$Faction_HappinessBand2;")
;; (:*INFLUENCE . 0.407) (:*NAME . "Elata Crimson Natural Industries"))
;; ((:*ALLEGIANCE . "PilotsFederation") (:*FACTION-STATE . "None")
;; (:*GOVERNMENT . "Democracy") (:*HAPPINESS . "") (:*INFLUENCE . 0.0)
;; (:*NAME . "Pilots' Federation Local Branch"))
;; ((:*ALLEGIANCE . "Federation") (:*FACTION-STATE . "None")
;; (:*GOVERNMENT . "Democracy") (:*HAPPINESS . "$Faction_HappinessBand2;")
;; (:*INFLUENCE . 0.208) (:*NAME . "Deuriara Progressive Party"))
;; ((:*ALLEGIANCE . "Independent") (:*FACTION-STATE . "None")
;; (:*GOVERNMENT . "PrisonColony") (:*HAPPINESS . "$Faction_HappinessBand2;")
;; (:*INFLUENCE . 0.088) (:*NAME . "Kondriates Prison Colony"))
;; ((:*ALLEGIANCE . "Independent") (:*FACTION-STATE . "None")
;; (:*GOVERNMENT . "Democracy") (:*HAPPINESS . "$Faction_HappinessBand2;")
;; (:*INFLUENCE . 0.123) (:*NAME . "Revolutionary Elata Progressive Party"))
;; ((:*ALLEGIANCE . "Independent") (:*FACTION-STATE . "None")
;; (:*GOVERNMENT . "Dictatorship") (:*HAPPINESS . "$Faction_HappinessBand2;")
;; (:*INFLUENCE . 0.068) (:*NAME . "Elata Regulatory State"))
;; ((:*ALLEGIANCE . "Independent") (:*FACTION-STATE . "None")
;; (:*GOVERNMENT . "Anarchy") (:*HAPPINESS . "$Faction_HappinessBand2;")
;; (:*INFLUENCE . 0.044) (:*NAME . "Elata Gold Camorra"))
;; ((:*ALLEGIANCE . "Independent") (:*FACTION-STATE . "None")
;; (:*GOVERNMENT . "Communism") (:*HAPPINESS . "$Faction_HappinessBand2;")
;; (:*INFLUENCE . 0.062) (:*NAME . "Elata Revolutionary Party")))
;; (:*POPULATION . 6846425) (:*STAR-POS -82.875 93.09375 -89.15625)
;; (:*STAR-SYSTEM . "Elata") (:*SYSTEM-ADDRESS . 3102837066083)
;; (:*SYSTEM-ALLEGIANCE . "Independent")
;; (:*SYSTEM-ECONOMY . "$economy_Terraforming;")
;; (:*SYSTEM-FACTION (:*NAME . "Elata Crimson Natural Industries"))
;; (:*SYSTEM-GOVERNMENT . "$government_Corporate;")
;; (:*SYSTEM-SECOND-ECONOMY . "$economy_Industrial;")
;; (:*SYSTEM-SECURITY . "$SYSTEM_SECURITY_medium;") (:EVENT . "FSDJump")
;; (:TIMESTAMP . "2020-01-11T17:05:17Z")))