git.fiddlerwoaroof.com
slack-api.lisp
ba627b0d
 (in-package :slacker)
 
 (defun slack-api-call (method &rest args)
   (bb:with-promise (resolve reject)
     (bt:make-thread
      (lambda ()
        (handler-case
            (let ((api-result (yason:parse
                               (babel:octets-to-string 
111b7353
                                (drakma:http-request (concat "https://slack.com/api/" method "?token="
                                                             *api-token*)
ba627b0d
                                                     :method :post
                                                     :content (quri:url-encode-params
                                                               (loop for (key value) on args by #'cddr
111b7353
                                                                     collect (cons
                                                                              (string-downcase key)
                                                                              value))))))))
              ;; todo error handling . . .
ba627b0d
              (resolve api-result)) 
111b7353
          (serious-condition (c)
ba627b0d
            (format t "~&Received condition ~s~%" c)
            (reject c)))))))
 
 (defmacro define-api-wrapper (name required-args &rest args)
   (flet ((name-case (string)
            (let ((parts (split-sequence #\- (string-downcase string))))
              (apply #'concatenate 'string
                     (car parts)
                     (mapcar #'string-capitalize (cdr parts))))))
     (let* ((api-method-name (name-case name)))
       `(progn (defun ,name (,@required-args &rest r &key ,@args)
                 (apply #'slack-api-call ,api-method-name
                        ,@(loop for req-arg in required-args
                                append (list (make-keyword req-arg) req-arg))
                        r))
               (eval-when (:compile-toplevel :load-toplevel :execute)
                 (let ((*package* (find-package 'slacker.api)))
                   (import ',name)
                   (export ',name)))))))
 
 (defmacro define-api-wrappers (&body body)
   `(progn ,@(loop for (name required-args . rest) in body
                   collect `(define-api-wrapper ,name ,required-args ,@rest))))
 
 (in-package :slacker.api)
 
 (slacker::define-api-wrappers
   (auth.test ())
111b7353
   (users.list () include_locale limit cursor)
ba627b0d
   (channels.list () exclude_archived)
111b7353
   (conversations.list () exclude_archived types)
   (conversations.join (channel)) 
ba627b0d
   (chat.delete (ts channel) as_user)
   (chat.me-message (channel text))
   (chat.post-message (channel text)
b6ef40ae
                      parse link_name attachments unfurl_links unfurl_media username as_user
                      icon_uri icon_emoji)
ba627b0d
   (chat.update (ts channel text) attachments parse link_names as_user))