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