1
0
Innocenty Enikeew 9 роки тому
батько
коміт
575f5644e2
2 змінених файлів з 63 додано та 57 видалено
  1. 11 0
      chatikbot.lisp
  2. 52 57
      utils.lisp

+ 11 - 0
chatikbot.lisp

@@ -43,6 +43,17 @@
      unless (equal "update_id" key)
      do (run-hooks (string-to-event (format nil "update-~A" key)) value)))
 
+(def-message-admin-cmd-handler handle-admin-settings (:settings)
+  (send-response chat-id
+                 (format nil "~{~{~A~@[ (~A)~]: ~A~}~^~%~}"
+                         (loop for symbol in *settings*
+                            collect (list symbol (documentation symbol 'variable) (symbol-value symbol))))))
+
+(def-message-admin-cmd-handler handle-admin-setsetting (:setsetting)
+  (let ((var (read-from-string (car args)))
+        (val (read-from-string (format nil "~{~A~^ ~}" (rest args)))))
+    (send-response chat-id (format nil "OK, ~A" (set-setting var val)))))
+
 (defcron process-watchdog ()
   (close
    (open (merge-pathnames ".watchdog"

+ 52 - 57
utils.lisp

@@ -23,57 +23,6 @@
 (defun string-to-event (key)
   (intern (string-upcase (substitute #\- #\_ key)) :keyword))
 
-(defmacro def-message-handler (name (message) &body body)
-  `(progn
-     (defun ,name (,message)
-       (let ((message-id (aget "message_id" ,message))
-             (from-id (aget "id" (aget "from" ,message)))
-             (chat-id (aget "id" (aget "chat" ,message)))
-             (text (aget "text" ,message)))
-         (declare (ignorable message-id from-id chat-id text))
-         (handler-case (progn ,@body)
-           (error (e)
-             (log:error "~A" e)
-             (bot-send-message chat-id
-                               (format nil "Ошибочка вышла~@[: ~A~]"
-                                       (when (member chat-id *admins*) e)))))))
-     (add-hook :update-message ',name)))
-
-(defmacro def-message-cmd-handler (name (&rest commands) &body body)
-  `(def-message-handler ,name (message)
-     (when (and text (equal #\/ (char text 0)))
-       (multiple-value-bind (cmd args) (parse-cmd text)
-         (when (member cmd (list ,@commands))
-           (log:info cmd message-id chat-id from-id args)
-           ,@body
-           t)))))
-
-(defmacro def-message-admin-cmd-handler (name (&rest commands) &body body)
-  `(def-message-handler ,name (message)
-     (when (and (member chat-id *admins*)
-                text (equal #\/ (char text 0)))
-       (multiple-value-bind (cmd args) (parse-cmd text)
-         (when (member cmd (list ,@commands))
-           (log:info cmd message-id chat-id from-id args)
-           ,@body
-           t)))))
-
-;; Schedule
-(defmacro defcron (name (&rest schedule) &body body)
-  (let ((schedule (or schedule '(:minute '* :hour '*))))
-    `(progn
-       (defun ,name ()
-         (handler-case (progn ,@body)
-           (error (e) (log:error e))))
-       (add-hook :starting #'(lambda ()
-                               (clon:schedule-function
-                                ',name (clon:make-scheduler
-                                        (clon:make-typed-cron-schedule
-                                         ,@schedule)
-                                        :allow-now-p t)
-                                :name ',name :thread t)
-                               (values))))))
-
 ;; Settings
 (defvar *settings* nil "List of plugin's settings symbols")
 (defmacro defsetting (var &optional val doc)
@@ -95,12 +44,6 @@
         (setf (symbol-value symbol) value))
     (error (e) (log:error e))))
 
-(def-message-admin-cmd-handler handle-admin-settings (:settings)
-  (send-response chat-id
-                 (format nil "~{~{~A~@[ (~A)~]: ~A~}~^~%~}"
-                         (loop for symbol in *settings*
-                            collect (list symbol (documentation symbol 'variable) (symbol-value symbol))))))
-
 (defvar *backoff-start* 1 "Initial back-off")
 (defvar *backoff-max* 64 "Maximum back-off delay")
 
@@ -319,6 +262,58 @@ is replaced with replacement."
                     '("http://www.yitspb.ru/yit_spb/catalog/apartments/novoorlovskiy-korpus-1-1-1"
                       "http://www.yitspb.ru/yit_spb/catalog/apartments/novoorlovskiy-korpus-1-1-2")))))
 
+(defmacro def-message-handler (name (message) &body body)
+  `(progn
+     (defun ,name (,message)
+       (let ((message-id (aget "message_id" ,message))
+             (from-id (aget "id" (aget "from" ,message)))
+             (chat-id (aget "id" (aget "chat" ,message)))
+             (text (aget "text" ,message)))
+         (declare (ignorable message-id from-id chat-id text))
+         (handler-case (progn ,@body)
+           (error (e)
+             (log:error "~A" e)
+             (bot-send-message chat-id
+                               (format nil "Ошибочка вышла~@[: ~A~]"
+                                       (when (member chat-id *admins*) e)))))))
+     (add-hook :update-message ',name)))
+
+(defmacro def-message-cmd-handler (name (&rest commands) &body body)
+  `(def-message-handler ,name (message)
+     (when (and text (equal #\/ (char text 0)))
+       (multiple-value-bind (cmd args) (parse-cmd text)
+         (when (member cmd (list ,@commands))
+           (log:info cmd message-id chat-id from-id args)
+           ,@body
+           t)))))
+
+(defmacro def-message-admin-cmd-handler (name (&rest commands) &body body)
+  `(def-message-handler ,name (message)
+     (when (and (member chat-id *admins*)
+                text (equal #\/ (char text 0)))
+       (multiple-value-bind (cmd args) (parse-cmd text)
+         (when (member cmd (list ,@commands))
+           (log:info cmd message-id chat-id from-id args)
+           ,@body
+           t)))))
+
+;; Schedule
+(defmacro defcron (name (&rest schedule) &body body)
+  (let ((schedule (or schedule '(:minute '* :hour '*))))
+    `(progn
+       (defun ,name ()
+         (handler-case (progn ,@body)
+           (error (e) (log:error e))))
+       (add-hook :starting #'(lambda ()
+                               (clon:schedule-function
+                                ',name (clon:make-scheduler
+                                        (clon:make-typed-cron-schedule
+                                         ,@schedule)
+                                        :allow-now-p t)
+                                :name ',name :thread t)
+                               (values))))))
+
+
 ;; Fix bug in local-time (following symlinks in /usr/share/zoneinfo/
 ;; leads to bad cutoff)
 (in-package #:local-time)