|
|
@@ -24,6 +24,10 @@
|
|
|
|
|
|
(defun leaderboard ()
|
|
|
(poller-call :aoc ""))
|
|
|
+(defun completion-state ()
|
|
|
+ (loop for (uid . member) in (agets (leaderboard) "members")
|
|
|
+ append (loop for (num . completion) in (agets member "completion_day_level")
|
|
|
+ collect (list (parse-integer uid) (agets member "name") (parse-integer num) (length completion)))))
|
|
|
|
|
|
(defun get-advent-days-active ()
|
|
|
(max 0 (min 25 (- 25 (ceiling (/ (- +advent-time+ (get-universal-time)) 86400))))))
|
|
|
@@ -50,6 +54,19 @@
|
|
|
"Надо обновить куки, старые истекли"))
|
|
|
:parse-mode "markdown"))
|
|
|
|
|
|
+(defun format-completion-state-change (diff)
|
|
|
+ (format nil "Обновился лидерборд 🏆***AoC*** 🏆~%~a~%~{~a!~^~%~}" +leader-board-link+ (loop for (uid name daynum completed) in diff
|
|
|
+ collect (format nil "***~a*** ебнул ~a задачку ~a дня" name completed daynum))))
|
|
|
+
|
|
|
+(defcron process-aoc (:minute '(member 0 5 10 15 20 22 23 24 25 26 27 30 34 35 36 37 38 39 40 45 50 55))
|
|
|
+ (poller-poll-lists :aoc
|
|
|
+ #'completion-state
|
|
|
+ #'(lambda (diff)
|
|
|
+ (log:info (list "Completion state diff:" diff))
|
|
|
+ (bot-send-message (format-completion-state-change diff)
|
|
|
+ :parse-mode "markdown"))
|
|
|
+ :key #'first))
|
|
|
+
|
|
|
(defun handle-set-cookie (cookie)
|
|
|
(handler-case (progn
|
|
|
(poller-authenticate :aoc cookie)
|
|
|
@@ -57,8 +74,16 @@
|
|
|
(poller-cant-authenticate ()
|
|
|
(bot-send-message "Чот не смог, пропробуй другие."))))
|
|
|
|
|
|
+(defun handle-set-cron (enable)
|
|
|
+ (lists-set-entry :aoc *chat-id* enable)
|
|
|
+ (bot-send-message (if enable
|
|
|
+ "Включил рассылку обновлений лидерборда. '/aoc updates off' чтобы выключить, /aoc - показать лидерборд."
|
|
|
+ "Отключил рассылку обновлений лидерборда. '/aoc updates on' - включить, /aoc - показать лидерборд.")))
|
|
|
+
|
|
|
(def-message-cmd-handler handle-cmd-aoc (:aoc)
|
|
|
(cond
|
|
|
((= 1 (length *args*))
|
|
|
(handle-set-cookie (car *args*)))
|
|
|
+ ((= 2 (length *args*))
|
|
|
+ (handle-set-cron (equal "on" (second *args*))))
|
|
|
(:otherwise (handle-leaderboard))))
|