tumblr.lisp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. (in-package :chatikbot)
  2. (defvar *tumblr-roll* nil "List of tumblr to select from")
  3. (defparameter *read-timeout* 5 "API request timeout")
  4. (defparameter *boobs-roll*
  5. '("http://bbt12.tumblr.com"
  6. "http://boobsarethegreatest.tumblr.com"
  7. "http://perfectbreasts.tumblr.com")
  8. "Tumblr roll with boobs")
  9. (defparameter *ass-roll*
  10. '("http://divine-asses.tumblr.com"
  11. "http://greatestassonearth.tumblr.com")
  12. "Tumblr roll with asses")
  13. (defparameter *tumblr-rules*
  14. `((((?* ?a) (?or сиськи сисяндры титьки буфера boobs tits) (?is ?n numberp))
  15. (#'tumblr-random-photo ,*boobs-roll* ?n))
  16. (((?* ?a) (?or сиськи сисяндры титьки буфера boobs tits) (?* ?b))
  17. (#'tumblr-random-photo ,*boobs-roll*))
  18. (((?* ?a) (?or жопа жопы ягодицы зад зады ass asses) (?is ?n numberp))
  19. (#'tumblr-random-photo ,*ass-roll* ?n))
  20. (((?* ?a) (?or жопа жопы ягодицы зад зады ass asses) (?* ?b))
  21. (#'tumblr-random-photo ,*ass-roll*))
  22. (((?* ?a) (?or тёлка телка телку тёлку баба бабу сука суку сучка сучку babe bitch) (?* ?b))
  23. (#'tumblr-random-photo ,*ass-roll*) (#'tumblr-random-photo ,*boobs-roll*))))
  24. (defun lo-string (val)
  25. (string-downcase (princ-to-string val)))
  26. (defun tumblr-read (domain &rest args)
  27. (handler-case
  28. (let ((params (loop for (k v) on args by #'cddr
  29. when v collect (cons (lo-string k) (lo-string v)))))
  30. (yason:parse
  31. (subseq (flexi-streams:octets-to-string
  32. (bordeaux-threads:with-timeout (*read-timeout*)
  33. (drakma:http-request
  34. (format nil "~A/api/read/json" domain)
  35. :parameters params
  36. :force-binary t))
  37. :external-format :utf-8) 22)
  38. :object-as :alist))
  39. (bordeaux-threads:timeout (e) (error e))))
  40. (defun tumblr-random-post (&key (roll *tumblr-roll*) type (num 1))
  41. (when roll
  42. (let* ((domain (random-elt roll))
  43. (total (aget "posts-total" (tumblr-read domain :num 1 :type type)))
  44. (start (random total))
  45. (res (tumblr-read domain :num num :type type :start start)))
  46. (log:info "Post" start "from" domain)
  47. (loop for post in (aget "posts" res)
  48. collect (aget "photo-url-1280" post)))))
  49. (defun tumblr-random-photo (&optional (roll *tumblr-roll*) (num 1))
  50. (tumblr-random-post :roll roll :type :photo :num num))
  51. (def-message-handler handle-tumblr (message)
  52. (alexandria:when-let ((resp (eliza (preprocess-input text) *tumblr-rules*)))
  53. (log:info resp)
  54. (send-response chat-id resp)))