1
0

vk.lisp 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. (in-package #:chatikbot)
  2. (defparameter +vk-api-url+ "https://api.vk.com/method/~A?v=5.40" "VK.com API endpoint")
  3. (defun %vk-api-call (method &optional args)
  4. (handler-case
  5. (bordeaux-threads:with-timeout (5)
  6. (let* ((params (loop for (k . v) in args
  7. when v
  8. collect (cons
  9. (princ-to-string k)
  10. (princ-to-string v))))
  11. (response (json-request (format nil +vk-api-url+ method)
  12. :method :post
  13. :parameters params)))
  14. (when (aget "error" response)
  15. (error (aget "error_msg" (aget "error" response))))
  16. (aget "response" response)))
  17. (bordeaux-threads:timeout (e)
  18. (declare (ignore e))
  19. (error "Timeout"))))
  20. (defun vk-wall-get (&key owner-id domain offset count filter extended fields)
  21. (%vk-api-call "wall.get"
  22. `(("owner_id" . ,owner-id)
  23. ("domain" . ,domain)
  24. ("offset" . ,offset)
  25. ("count" . ,count)
  26. ("filter" . ,filter)
  27. ("extended" . ,extended)
  28. ("fields" . ,fields))))
  29. (defun vk-get-user-name (id)
  30. (let ((r (first (%vk-api-call "users.get" `(("user_ids" . ,id))))))
  31. (format nil "~A ~A" (aget "first_name" r) (aget "last_name" r))))
  32. (defun vk-get-group-name (id)
  33. (aget "name" (first (%vk-api-call "groups.getById"
  34. `(("group_id" . ,(if (numberp id)
  35. (- id)
  36. id)))))))
  37. (defun vk-get-name (id)
  38. (if (and (numberp id) (> id 0))
  39. (vk-get-user-name id)
  40. (vk-get-group-name id)))