(in-package #:chatikbot) (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 (bordeaux-threads:with-timeout (5) (let* ((params (loop for (k . v) in args when v collect (cons (princ-to-string k) (princ-to-string v)))) (response (json-request (format nil +vk-api-url+ method) :method :post :parameters params))) (when (aget "error" response) (error (aget "error_msg" (aget "error" response)))) (aget "response" response))) (bordeaux-threads:timeout (e) (declare (ignore e)) (error "Timeout")))) (defun vk-wall-get (&key owner-id domain offset count filter extended fields) (%vk-api-call "wall.get" `(("owner_id" . ,owner-id) ("domain" . ,domain) ("offset" . ,offset) ("count" . ,count) ("filter" . ,filter) ("extended" . ,extended) ("fields" . ,fields)))) (defun vk-get-user-name (id) (let ((r (first (%vk-api-call "users.get" `(("user_ids" . ,id)))))) (format nil "~A ~A" (aget "first_name" r) (aget "last_name" r)))) (defun vk-get-group-name (id) (aget "name" (first (%vk-api-call "groups.getById" `(("group_id" . ,(if (numberp id) (- id) id))))))) (defun vk-get-name (id) (if (and (numberp id) (> id 0)) (vk-get-user-name id) (vk-get-group-name id)))