git.fiddlerwoaroof.com
Raw Blame History
(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))))
|#