(require :eve-quine)
(require :tooter)

(defparameter *client*
(make-instance 'tooter:client
    :base "https://mastodon.sdf.org"
    :name "tooter-client eve-quine lamb"))

(format t
"Visit and authenticate from a in-browser mastodon app:~%~a~%"
(nth-value 1 (tooter:authorize (func-of *clamb*))))
(format t "Enter code from the browser:~%")
(tooter:authorize (func-of *clamb*) (read-line))

(print "We get one of @publius' posts:")
(print
(tooter:plain-format-html
 (tooter:content
  (tooter:find-status *client*
   "109894889851888658"))))

;;;; Using an eve-quine to persist that client with secret


;;; Everything is reusable

;;; Make an eve-quine that persists eve-quines to disk.
(defparameter *wriamb*
(form-eve ('lamb) :form-of
 ''(lambda (eve name outpath)
    (with-open-file (out outpath :Direction :output :if-exists :append
                     :if-does-not-exist :create)
     (let ((*print-pretty* t))
      (prin1 '(require :asdf) out) (terpri out)
      (prin1 '(require :eve-quine) out) (terpri out)
      (format out "(defparameter ~a ~s)~%" name
       (make-load-form eve) out) (terpri out))))))


;;; Make a dependency-loading eve-quine
;; just requires dep when loaded
(defparameter *depamb*
(form-eve ('lamb) :form-of
 ''(prog1 (values) (require "tooter"))))


;;; Make a client-containing eve-quine
(defparameter *clamb*
(form-eve ('lamb) :form-of
 (funcall (lambda (x) `',x)
  (make-load-form *client*))))

;;; persist them to disk to just be #'load ed later.

(loop for clos-quine in (list *wriamb* *depamb* *clamb*)
for name in '(*wriamb* *depamb* *clamb*)
do (funcall (Func-of *wriamb*) clos-quine name
    #p"load-me.lisp"))

;;; Later:
(print "reloading")
(load #p"load-me.lisp")
(print
(tooter:find-status (func-of *clamb*)
 "109894889851888658"))
(terpri)
(quit)