1
0

aoc.lisp 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. (in-package :cl-user)
  2. (defpackage chatikbot.plugins.aoc
  3. (:use :cl :chatikbot.common :cl-cookie))
  4. (in-package :chatikbot.plugins.aoc)
  5. (defparameter +api-uri+ "https://adventofcode.com/2020/leaderboard/private/view/24158.json")
  6. (defparameter +api-host+ "adventofcode.com")
  7. (defparameter +leader-board-link+ "https://adventofcode.com/2020/leaderboard/private/view/24158")
  8. (defmethod poller-request ((module (eql :aoc)) method &rest params)
  9. (let ((cookie-jar (make-cookie-jar)))
  10. (merge-cookies cookie-jar
  11. (list (parse-set-cookie-header (format nil "session=~a;" *poller-token*) +api-host+ "/")))
  12. (handler-case
  13. (agets (json-request +api-uri+ :cookie-jar cookie-jar))
  14. (dex:http-request-failed (e) e)
  15. )))
  16. (defmethod poller-validate ((module (eql :aoc)) response)
  17. (not (typep response 'dex:http-request-failed)))
  18. (defmethod poller-get-token ((module (eql :aoc)) secret)
  19. (let* ((*poller-token* secret))
  20. (poller-request :aoc "")
  21. (format nil "~a" secret)
  22. ))
  23. (defun leaderboard ()
  24. (poller-call :aoc ""))
  25. (defun format-leaderboard (json)
  26. (let ((sorted (sort (loop for (uid . member) in (agets json "members")
  27. collect (list (agets member "name") (agets member "local_score")))
  28. #'> :key #'second)))
  29. (format nil "🏆***Chad AoC Leaderboard***🏆~%~a~%~%~{~a. ~a: ~a~^~%~}" +leader-board-link+
  30. (apply 'append (mapcar #'cons (alexandria:iota (length sorted) :start 1) sorted)))))
  31. (defun handle-leaderboard ()
  32. (bot-send-message
  33. (handler-case
  34. (format-leaderboard (leaderboard))
  35. (poller-error ()
  36. "Надо обновить куки, старые истекли"))
  37. :parse-mode "markdown"))
  38. (defun handle-set-cookie (cookie)
  39. (handler-case (progn
  40. (poller-authenticate :aoc cookie)
  41. (bot-send-message "Кука рабочая, теперь можешь делать запросы."))
  42. (poller-cant-authenticate ()
  43. (bot-send-message "Чот не смог, пропробуй другие."))))
  44. (def-message-cmd-handler handle-cmd-aoc (:aoc)
  45. (cond
  46. ((= 1 (length *args*))
  47. (handle-set-cookie (car *args*)))
  48. (:otherwise (handle-leaderboard))))