(defpackage :fwoar.hub.client (:use :cl :alexandria :fw.lu :fwoar.string-utils) (:export #:main #:queue-processor)) (in-package :fwoar.hub.client) (defparameter *obj-style* :hash-table) (defparameter *event-table* (make-array 100 :adjustable t :fill-pointer 0)) (defparameter *event-queue* (lparallel.queue:make-queue)) (defun parse-fa-body (ht) (prog1 ht (symbol-macrolet ((body (gethash "body" ht))) (setf body (yason:parse body :object-as *obj-style*))))) (defun parse (string) (destructuring-bind (path result) (coerce (split #\space string :count 1) 'list) (format t "~&(PATH ~a) (RESULT ~a)~%" path result) (list path (parse-fa-body (yason:parse result :object-as *obj-style*))))) (defun main (&optional (subscription "") (port "tcp://127.0.0.1:5557")) (format t "~&foobar~%") (pzmq:with-socket socket (:sub :subscribe subscription) (pzmq:connect socket port) (loop for i from 1 for raw-reply = (pzmq:recv-string socket :encoding :utf-8) for (path payload . r) = (progn (format t "~&~a~%" raw-reply) (parse raw-reply)) when r do (format t "~&extra stuff? PATH: ~a~%~4t~a~%~4t~a~2%" path payload r) do (lparallel.queue:push-queue payload *event-queue*)))) (defun queue-processor () (with-output-to-file (f "~/.feed-archive/events.json" :if-exists :append :if-does-not-exist :create) (loop for ev = (gethash "body" (lparallel.queue:pop-queue *event-queue*)) do (format t "~&New Event:~%~4tType: ~a~%~4tItem: ~a~2%" (gethash "event" ev) (gethash "item" ev)) (vector-push-extend ev *event-table*) (yason:encode ev f) (terpri f) (finish-output f) (sleep 0.01)))) #| (defparameter *app* (make-instance 'ningle:<app>)) (araneus:define-controller likes (params) (reverse *event-table*)) (araneus:define-spinneret-view likes (et) (:html (:head (:style "* {box-sizing: border-box}" ".like { background: black; color: white; }" "body { font-family: 'Lato', monospace; }" "a { border: thin solid white; display: block; padding: 0.5em 1em; color: inherit; letter-spacing: +0.01em; width: 100%; }" "a:hover { border: thin solid #444; color: #888; text-shadow: 0 0 0.01em white; }" "ul { list-style: none }" "li {}" "li + li { margin-top: 0.25em }" )) (:body (:ul (locally (declare (optimize (debug 3))) (loop for item across (remove-duplicates et :test 'equal :key (op (serapeum:string-join (pick '("event" "item") _)))) for is-like = (equal "like-item" (gethash "event" item)) do (:li :class (if is-like "like" "read") (:a :href (gethash "item" item) (gethash "title" item))))))))) (araneus:defroutes *app* (("/") (araneus:as-route 'likes))) (let ((handlers '())) (defun start () (push (clack:clackup *app* :port 6758) handlers)) (defun stop () (clack:stop (pop handlers)))) |#