git.fiddlerwoaroof.com
webfinger-viewer.lisp
0b2bdc21
 (defpackage :activitypub-tools.webfinger-viewer
   (:use :cl )
   (:export
    #:main))
 (in-package :activitypub-tools.webfinger-viewer)
 
 (defclass handler (ningle:<app> araneus:mixin)
   ())
 
 (defmethod araneus:controller ((name (eql 'root)) params &key)
b176bb2d
   nil)
0b2bdc21
 (defmethod araneus:view ((name (eql 'root)) (params null))
   `(200
     (:content-type "text/html" ,(format nil "/v/~a" params))
     (,(spinneret:with-html-string
         (:form :method :post
                :action "/"
                (:input :name "handle"
                        :placeholder "foo@example.com")
                (:button :type "submit" ">"))))))
 
 (defmethod araneus:controller ((name (eql 'redirect)) params &key)
37f49ee6
   (serapeum:assocdr "handle" params
0b2bdc21
                     :test 'equal))
 (defmethod araneus:view ((name (eql 'redirect)) (params null))
   `(404 (:content-type "text/html") ("Not Found")))
 (defmethod araneus:view ((name (eql 'redirect)) (params string))
   `(302
     (:content-type "text/plain"
      :location ,(format nil "/v/~a" params))
     ("Redirecting")))
 
 (defmethod araneus:controller ((name (eql 'handle)) params &key)
   (activitypub-tools.domain:webfinger-data (serapeum:assocdr :handle params)))
 
 (defmethod araneus:view ((name (eql 'handle)) (model hash-table))
   `(200
     (:content-type "text/html")
     (,(spinneret:with-html-string
         (:head
          (:style "body { padding: 1em; font-family: sans-serif; }"))
         (:h1 "Webfinger Information Viewer")
         (:section
          (:h* "subject")
          (gethash "subject" model))
         (:section
          (:h* "aka")
          (:ul
           (loop for alias in (gethash "aliases" model)
                 do (:li alias))))
         (:section
          (:h* "links")
          (:ul
           (loop for link in (gethash "links" model)
                 do (:li (loop for key being the hash-keys of link using (hash-value value)
                               do (if (equal key "href")
                                      (:a :class key :href value ("~a: ~a" key value))
                                      (:div :class key ("~a: ~a" key value))))))))
 
 
         (:details (:summary "Raw data")
                   (:pre (prin1-to-string model)))))))
 
 (defmethod araneus:routes progn ((app handler))
   (araneus:defroutes app
     (("/v/:handle") (araneus:as-route 'handle))
     (("/" :method :post) (araneus:as-route 'redirect))
     (("/" :method :get) (araneus:as-route 'root))))
 
 (defun main ()
   (uiop:setup-command-line-arguments)
b05e52d3
   (activitypub-tools.pprint-setup:setup-pprint)
0b2bdc21
   (let* ((port (if (= (length (uiop:command-line-arguments)) 1)
                    (parse-integer (elt (uiop:command-line-arguments) 0))
                    9092))
          (handler (make-instance 'handler)))
     (clack:clackup handler
                    :address "0.0.0.0"
                    :port port
                    :debug nil
                    :use-thread nil)))