|
|
@@ -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] ...")))))
|