(in-package :cl-user) (defpackage chatikbot.plugins.aoc (:use :cl :chatikbot.common :cl-cookie)) (in-package :chatikbot.plugins.aoc) (defparameter +api-uri+ "https://adventofcode.com/2020/leaderboard/private/view/24158.json") (defparameter +api-host+ "adventofcode.com") (defparameter +leader-board-link+ "https://adventofcode.com/2020/leaderboard/private/view/24158") (defmethod poller-request ((module (eql :aoc)) method &rest params) (let ((cookie-jar (make-cookie-jar))) (merge-cookies cookie-jar (list (parse-set-cookie-header (format nil "session=~a;" *poller-token*) +api-host+ "/"))) (handler-case (agets (json-request +api-uri+ :cookie-jar cookie-jar)) (dex:http-request-failed (e) e) ))) (defmethod poller-validate ((module (eql :aoc)) response) (not (typep response 'dex:http-request-failed))) (defmethod poller-get-token ((module (eql :aoc)) secret) (let* ((*poller-token* secret)) (poller-request :aoc "") (format nil "~a" secret) )) (defun leaderboard () (poller-call :aoc "")) (defun format-leaderboard (json) (let ((sorted (sort (loop for (uid . member) in (agets json "members") collect (list (agets member "name") (agets member "local_score"))) #'> :key #'second))) (format nil "🏆***Chad AoC Leaderboard***🏆~%~a~%~%~{~a. ~a: ~a~^~%~}" +leader-board-link+ (apply 'append (mapcar #'cons (alexandria:iota (length sorted) :start 1) sorted))))) (defun handle-leaderboard () (bot-send-message (handler-case (format-leaderboard (leaderboard)) (poller-error () "Надо обновить куки, старые истекли")) :parse-mode "markdown")) (defun handle-set-cookie (cookie) (handler-case (progn (poller-authenticate :aoc cookie) (bot-send-message "Кука рабочая, теперь можешь делать запросы.")) (poller-cant-authenticate () (bot-send-message "Чот не смог, пропробуй другие.")))) (def-message-cmd-handler handle-cmd-aoc (:aoc) (cond ((= 1 (length *args*)) (handle-set-cookie (car *args*))) (:otherwise (handle-leaderboard))))