|
|
@@ -0,0 +1,58 @@
|
|
|
+
|
|
|
+(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))))
|