Quellcode durchsuchen

Merge branch 'adventofcode' of termina1/chatikbot into master

Innocenty Enikeev vor 5 Jahren
Ursprung
Commit
53c00bceff
1 geänderte Dateien mit 58 neuen und 0 gelöschten Zeilen
  1. 58 0
      plugins/aoc.lisp

+ 58 - 0
plugins/aoc.lisp

@@ -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))))