(in-package :chatikbot) (defvar *tumblr-roll* nil "List of tumblr to select from") (defparameter *read-timeout* 5 "API request timeout") (defun lo-string (val) (string-downcase (princ-to-string val))) (defun tumblr-read (domain &rest args) (handler-case (let ((params (loop for (k v) on args by #'cddr when v collect (cons (lo-string k) (lo-string v))))) (yason:parse (subseq (flexi-streams:octets-to-string (bordeaux-threads:with-timeout (*read-timeout*) (drakma:http-request (format nil "~A/api/read/json" domain) :parameters params :force-binary t)) :external-format :utf-8) 22) :object-as :alist)) (bordeaux-threads:timeout (e) (error e)))) (defun tumblr-random-post (&key (roll *tumblr-roll*) type) (when roll (let* ((domain (random-elt roll)) (total (aget "posts-total" (tumblr-read domain :num 1 :type type))) (res (tumblr-read domain :num 1 :type type :start (random total)))) (aget "photo-url-1280" (first (aget "posts" res)))))) (defun tumblr-random-photo (&optional (roll *tumblr-roll*)) (tumblr-random-post :roll roll :type :photo))