1
0
Innocenty Enikeev 7 лет назад
Родитель
Сommit
dbe9ad08d4
1 измененных файлов с 45 добавлено и 1 удалено
  1. 45 1
      plugins/saver.lisp

+ 45 - 1
plugins/saver.lisp

@@ -197,6 +197,15 @@
 (defun db/saver/del-payment (chat-id name)
   (db-execute "delete from saver_payments where chat_id = ? and name = ?" chat-id name))
 
+(defun db/saver/set-payment-name (chat-id name new-name)
+  (db-execute "update saver_payments set name = ? where chat_id = ? and name = ?" new-name chat-id name))
+
+(defun db/saver/set-payment-amount (chat-id name new-amount)
+  (db-execute "update saver_payments set amount = ? where chat_id = ? and name = ?" new-amount chat-id name))
+
+(defun db/saver/set-payment-schedule (chat-id name new-schedule)
+  (db-execute "update saver_payments set schedule = ? where chat_id = ? and name = ?" new-schedule chat-id name))
+
 (defun db/saver/get-not-notified-payments (notified)
   (loop for row in (db-select "select name, amount, schedule, started, chat_id from saver_payments where notified is null or notified != ?" (%saver/format-time notified))
      collect (cons (nth 4 row) (%db/saver/make-payment row))))
@@ -299,6 +308,7 @@
         (bot-send-message chat-id (format nil "Нет поступлений, ничего не посчитать :( /saver add ...")))))
 
 (defparameter +saver/add-scanner+ (cl-ppcre:create-scanner "^(.+?) (-?\\d+(?:\\.\\d*)?) ((?:\\d+(?:,\\d+)*(?:-(?:\\d+)?)?|\\*)(?:\\/\\d+)?(?: (?:\\d+(?:,\\d+)*(?:-(?:\\d+)?)?|\\*)(?:\\/\\d+)?){0,2})(?: (\\d{4}-\\d{2}-\\d{2}))?$"))
+(defparameter +saver/schedule-scanner+ (cl-ppcre:create-scanner "^((?:\\d+(?:,\\d+)*(?:-(?:\\d+)?)?|\\*)(?:\\/\\d+)?(?: (?:\\d+(?:,\\d+)*(?:-(?:\\d+)?)?|\\*)(?:\\/\\d+)?){0,2})$"))
 
 (defun saver/add-payment (chat-id args)
   (multiple-value-bind (matched groups) (cl-ppcre:scan-to-strings +saver/add-scanner+ (spaced args))
@@ -337,6 +347,37 @@
                           :parse-mode "markdown"))
     (error (e) (bot-send-message chat-id (format nil "/saver del <idx> [~A]" e)))))
 
+(defun saver/set-payment-name (chat-id args)
+  (handler-case
+      (let* ((payments (db/saver/get-payments chat-id))
+             (payment (elt payments (1- (parse-integer (car args)))))
+             (new-name (spaced (rest args))))
+        (db/saver/set-payment-name chat-id (saver/payment-name payment) new-name)
+        (saver/send-info chat-id))
+    (error (e) (bot-send-message chat-id (format nil "/saver rename <idx> <new name> [~A]" e)))))
+
+(defun saver/set-payment-amount (chat-id args)
+  (handler-case
+      (let* ((payments (db/saver/get-payments chat-id))
+             (payment (elt payments (1- (parse-integer (car args)))))
+             (new-amount (round (* 100 (parse-float (second args))))))
+        (db/saver/set-payment-amount chat-id (saver/payment-name payment) new-amount)
+        (saver/send-info chat-id))
+    (error (e) (bot-send-message chat-id (format nil "/saver amount <idx> <new amount> [~A]" e)))))
+
+(defun saver/set-payment-schedule (chat-id args)
+  (handler-case
+      (let* ((payments (db/saver/get-payments chat-id))
+             (payment (elt payments (1- (parse-integer (car args)))))
+             (new-schedule (spaced (rest args))))
+        (unless (cl-ppcre:scan +saver/schedule-scanner+ new-schedule)
+          (error "format ex: 1-30/3 * *"))
+        (setf (saver/payment-schedule payment) new-schedule)
+        (saver/payment-next-time payment (get-universal-time)) ;; Perform additional schedule checks
+        (db/saver/set-payment-schedule chat-id (saver/payment-name payment) new-schedule)
+        (saver/send-info chat-id))
+    (error (e) (bot-send-message chat-id (format nil "/saver cron <idx> <new cron> [~A]" e)))))
+
 ;; Hooks
 (def-message-cmd-handler handler-cmd-save (:save :saver)
   (if (null args)
@@ -344,4 +385,7 @@
       (case (keyify (car args))
         (:add (saver/add-payment chat-id (rest args)))
         (:del (saver/del-payment chat-id (rest args)))
-        (t (bot-send-message chat-id "Надо /saver add ... или /saver del <idx>")))))
+        (:rename (saver/set-payment-name chat-id (rest args)))
+        (:amount (saver/set-payment-amount chat-id (rest args)))
+        (:cron (saver/set-payment-schedule chat-id (rest args)))
+        (t (bot-send-message chat-id "Надо /saver [add|del|rename|amount|cron] ...")))))