;; 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")))