|
@@ -35,33 +35,34 @@
|
|
|
(format stream "Tinkoff api error ~A: ~A" code message)))))
|
|
(format stream "Tinkoff api error ~A: ~A" code message)))))
|
|
|
|
|
|
|
|
(defun request (method &key params content retry)
|
|
(defun request (method &key params content retry)
|
|
|
- (let* ((params (loop for (k . v) in (append (default-params) params) when v
|
|
|
|
|
- collect (cons (princ-to-string k) (princ-to-string v))))
|
|
|
|
|
- (r (json-request (api-url method) :method (if content :POST :GET)
|
|
|
|
|
- :parameters params
|
|
|
|
|
- :content content)))
|
|
|
|
|
- (if (string= "OK" (agets r "resultCode"))
|
|
|
|
|
- (agets r "payload")
|
|
|
|
|
- (let ((code (agets r "resultCode"))
|
|
|
|
|
- (message (agets r "errorMessage")))
|
|
|
|
|
- (if (and (not retry)
|
|
|
|
|
- *credentials-provider*
|
|
|
|
|
- (string-equal code "INSUFFICIENT_PRIVILEGES"))
|
|
|
|
|
- (progn
|
|
|
|
|
- (funcall *credentials-provider*
|
|
|
|
|
- (lambda (login password)
|
|
|
|
|
- (api/login login password)))
|
|
|
|
|
- (request method :params params :content content :retry t))
|
|
|
|
|
- (error 'api-error :code code :message message))))))
|
|
|
|
|
-
|
|
|
|
|
-(defun api/login (username password)
|
|
|
|
|
- (let ((new-session (request "session")))
|
|
|
|
|
- (prog1
|
|
|
|
|
- (let* ((*session-id* new-session))
|
|
|
|
|
- (request "sign_up" :params `(("username" . ,username)
|
|
|
|
|
- ("password" . ,password)))
|
|
|
|
|
- (request "level_up"))
|
|
|
|
|
- (setf *session-id* new-session))))
|
|
|
|
|
|
|
+ (flet ((api/login (username password)
|
|
|
|
|
+ (let ((new-session (request "session")))
|
|
|
|
|
+ (prog1
|
|
|
|
|
+ (let* ((*session-id* new-session))
|
|
|
|
|
+ (request "sign_up" :params `(("username" . ,username)
|
|
|
|
|
+ ("password" . ,password)))
|
|
|
|
|
+ (request "level_up"))
|
|
|
|
|
+ (setf *session-id* new-session)))))
|
|
|
|
|
+ (let* ((params (loop for (k . v) in (append (default-params) params) when v
|
|
|
|
|
+ collect (cons (princ-to-string k) (princ-to-string v))))
|
|
|
|
|
+ (r (json-request (api-url method) :method (if content :POST :GET)
|
|
|
|
|
+ :parameters params
|
|
|
|
|
+ :content content)))
|
|
|
|
|
+ (if (string= "OK" (agets r "resultCode"))
|
|
|
|
|
+ (agets r "payload")
|
|
|
|
|
+ (let ((code (agets r "resultCode"))
|
|
|
|
|
+ (message (agets r "errorMessage")))
|
|
|
|
|
+ (if (and (not retry)
|
|
|
|
|
+ *credentials-provider*
|
|
|
|
|
+ (string-equal code "INSUFFICIENT_PRIVILEGES"))
|
|
|
|
|
+ (progn
|
|
|
|
|
+ (funcall *credentials-provider*
|
|
|
|
|
+ (lambda (login password)
|
|
|
|
|
+ (api/login login password)))
|
|
|
|
|
+ (request method :params params :content content :retry t))
|
|
|
|
|
+ (error 'api-error :code code :message message)))))))
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
|
|
|
(defun api/accounts ()
|
|
(defun api/accounts ()
|
|
|
(request "accounts_flat"))
|
|
(request "accounts_flat"))
|
|
@@ -195,6 +196,7 @@
|
|
|
|
|
|
|
|
(defun format-accounts (accounts)
|
|
(defun format-accounts (accounts)
|
|
|
(with-output-to-string (s)
|
|
(with-output-to-string (s)
|
|
|
|
|
+ (princ "```" s)
|
|
|
(loop for a in accounts
|
|
(loop for a in accounts
|
|
|
when (agets a "moneyAmount" "value")
|
|
when (agets a "moneyAmount" "value")
|
|
|
do (format s "; balance ~A ~A = ~A~A ~A~%"
|
|
do (format s "; balance ~A ~A = ~A~A ~A~%"
|
|
@@ -204,7 +206,8 @@
|
|
|
(if (equal "Credit" (agets a "accountType"))
|
|
(if (equal "Credit" (agets a "accountType"))
|
|
|
(agets a "debtAmount" "value")
|
|
(agets a "debtAmount" "value")
|
|
|
(agets a "moneyAmount" "value"))
|
|
(agets a "moneyAmount" "value"))
|
|
|
- (agets a "moneyAmount" "currency" "name")))))
|
|
|
|
|
|
|
+ (agets a "moneyAmount" "currency" "name")))
|
|
|
|
|
+ (princ "```" s)))
|
|
|
|
|
|
|
|
(defcron process-tinkoff (:minute '(member 0 5 10 15 20 25 30 35 40 45 50 55))
|
|
(defcron process-tinkoff (:minute '(member 0 5 10 15 20 25 30 35 40 45 50 55))
|
|
|
(dolist (chat-id (lists-get :tinkoff))
|
|
(dolist (chat-id (lists-get :tinkoff))
|