Bladeren bron

Merge branch 'aoc-cron' of termina1/chatikbot into master

Innocenty Enikeev 5 jaren geleden
bovenliggende
commit
44c142e834
1 gewijzigde bestanden met toevoegingen van 25 en 0 verwijderingen
  1. 25 0
      plugins/aoc.lisp

+ 25 - 0
plugins/aoc.lisp

@@ -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 15 30 45))
+  (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))))