1
0

aoc.lisp 2.7 KB

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