Przeglądaj źródła

VK walls handle reposts

Innocenty Enikeew 10 lat temu
rodzic
commit
ac31bfd9ed
2 zmienionych plików z 30 dodań i 9 usunięć
  1. 21 1
      chatikbot.lisp
  2. 9 8
      vk.lisp

+ 21 - 1
chatikbot.lisp

@@ -460,6 +460,26 @@
     (db-vk-ensure-domain domain last-id)
     domain))
 
+(defun %vk-find-best-photo (photo)
+  (let ((sizes (loop for (k . v) in photo
+                  when (equal "photo_" (subseq k 0 (min 6 (length k))))
+                  collect (cons (parse-integer (subseq k 6)) v))))
+    (cdr (assoc (apply #'max (mapcar #'car sizes)) sizes))))
+
+(defun %format-attachment (item)
+  (cond
+    ((equal "photo" (aget "type" item))
+     (%vk-find-best-photo (aget "photo" item)))))
+
+(defun %vk-post-text (post)
+  (alexandria:when-let (reposts (aget "copy_history" post))
+    (setf post (car (last reposts))))
+  (let ((text (aget "text" post))
+        (attachs (format nil "~{~A~^~%~}"
+                         (remove nil (mapcar #'%format-attachment
+                                             (aget "attachments" post))))))
+    (format nil "~{~A~^~%~}" (remove "" (list text attachs) :test #'equal))))
+
 (defun %format-wall-post (domain post)
   (format nil "[~A](https://vk.com/~A?w=wall~A_~A)~@[ @ _~A_~]~%~A~%"
           domain domain (aget "from_id" post) (aget "id" post)
@@ -468,7 +488,7 @@
              nil ts
              :format '((:year 2) "-" (:month 2) "-" (:day 2)
                        " " (:hour 2) ":" (:min 2))))
-          (aget "text" post)))
+          (%vk-post-text post)))
 
 (defun handle-cmd-wall (chat-id message-id args)
   (log:info "handle-cmd-wall" chat-id message-id args)

+ 9 - 8
vk.lisp

@@ -1,6 +1,6 @@
 (in-package #:chatikbot)
 
-(defparameter +vk-api-url+ "https://api.vk.com/method/~A?v=5.34" "VK.com API endpoint")
+(defparameter +vk-api-url+ "https://api.vk.com/method/~A?v=5.40" "VK.com API endpoint")
 
 (defun %vk-api-call (method &optional args)
   (handler-case
@@ -20,11 +20,12 @@
       (declare (ignore e))
       (error "Timeout"))))
 
-(defun vk-wall-get (&key owner-id domain offset count filter extended)
+(defun vk-wall-get (&key owner-id domain offset count filter extended fields)
   (%vk-api-call "wall.get"
-                (list (cons "owner_id" owner-id)
-                      (cons "domain" domain)
-                      (cons "offset" offset)
-                      (cons "count" count)
-                      (cons "filter" filter)
-                      (cons "extended" extended))))
+                `(("owner_id" . ,owner-id)
+                  ("domain" . ,domain)
+                  ("offset" . ,offset)
+                  ("count" . ,count)
+                  ("filter" . ,filter)
+                  ("extended" . ,extended)
+                  ("fields" . ,fields))))