be6f8571 |
(cl:in-package :hhgbot-augmented-assistant)
;; Special Variables
|
60e29634 |
(defparameter *zxcv* *standard-output*)
|
be6f8571 |
(defvar *client*)
|
148e6242 |
(defvar *queue-pair* nil)
|
be6f8571 |
;; Macros
|
60e29634 |
(defun start-in-repl (&optional (start-bot t) (team-id :atomampd))
|
5ea361e0 |
(ubiquitous:restore :hhgbot-augmented-assistant)
(setf slacker::*api-token* (ubiquitous:value :api-token :atomampd))
(if start-bot
|
60e29634 |
(start-with-apitoken team-id)
|
5ea361e0 |
slacker::*api-token*))
|
60e29634 |
(defun start-with-apitoken (&optional (team-id :atomampd))
|
148e6242 |
(unless *queue-pair*
(setf *queue-pair* (make-instance 'slacker::queue-pair)))
|
be6f8571 |
(ubiquitous:restore :hhgbot-augmented-assistant)
|
60e29634 |
(let ((slacker::*api-token* (ubiquitous:value :api-token team-id)))
|
be6f8571 |
(unless slacker::*api-token*
(format *terminal-io* "~&API Token? ")
(finish-output *terminal-io*)
(setf slacker::*api-token* (read-line)))
|
148e6242 |
(values (slacker:coordinate-threads *queue-pair*)
|
5ea361e0 |
slacker::*api-token*)))
|
be6f8571 |
(defmacro if-let* ((&rest bindings) &body (then-form &optional else-form))
"Like if-let, but sets bindings sequentially. Doesn't short-circuit."
`(let* ,bindings
(if (and ,@(mapcar #'car bindings))
,then-form
,else-form)))
;; Utility functions
(define-command "myip" (event-pump ts channel)
(in-wq (event-pump)
(blackbird:alet ((ip (carrier:request "http://api.ipify.org/" :return-body t)))
|
5ea361e0 |
(format *zxcv* "~&IP: ~a~%TS: ~a~%CHANNEL: ~a~%CLIENT: ~A~%" (babel:octets-to-string ip) ts channel event-pump)
|
be6f8571 |
(edit-message ts channel
(concat "My ip is: "
(babel:octets-to-string ip))))))
(define-command "jira" (event-pump ts channel project &optional issue-number &rest rest)
|
5ea361e0 |
(let ((drakma:*drakma-default-external-format* :utf-8))
(apply #'edit-message ts channel
(fw.lu:ensure-list
(cond (rest
"I don't understand . . .")
(issue-number
(format nil "https://atomampd.atlassian.net/browse/~A-~A"
project issue-number))
(t
(format nil "https://atomampd.atlassian.net/browse/ATOMOS-~a"
project)))))))
(define-command "pr" (event-pump ts channel num)
(let ((num (parse-integer num)))
(edit-message ts channel (format nil "https://bitbucket.org/atomampd/atomos/pull-requests/~d?w=1" num))))
|
be6f8571 |
(define-command "js>" (event-pump ts channel &rest args)
(declare (ignorable ts))
(let ((*js-executor* (gethash :js-executor (modules event-pump))))
(blackbird:alet ((result (submit-js *js-executor*
(string-join args " "))))
(let ((result (cl-js:to-string result)))
(queue-message event-pump channel
(subseq result 0
(min 1000
(length result)))
:quote t)))))
(define-command "my-rsa-key" (event-pump ts channel &optional (cipher "rsa"))
(with-output-to-message (s event-pump channel :quote t)
(with-open-file (f (truename (concat "~/.ssh/id_" cipher ".pub")))
(let ((seq (make-string (file-length f))))
(read-sequence seq f)
(format s seq)))))
(define-command "paste" (event-pump ts channel)
|
5ea361e0 |
(with-simple-restart (abort "Stop command")
(ubiquitous:restore :atomampd-slack)
(format t "foo")
(let ((drakma:*drakma-default-external-format* :utf-8))
(edit-message ts channel
(format nil "```~%~a~%```"
(pop (ubiquitous:value :clip)))))))
(define-command "id" (event-pump ts channel &optional (for "channel"))
|
be6f8571 |
(edit-message ts channel
|
5ea361e0 |
(string-case for
("channel" channel)
(t (concat "don't know the id for " for)))))
(defmacro with ((var val) &body body)
`(let ((,var ,val))
,@body))
(ql:quickload '(:vecto :ironclad))
(defun hash-of-vector (vec)
(ironclad:byte-array-to-hex-string (ironclad:digest-sequence :sha256 vec)))
(defpackage #:vecto-example
(:use :cl :alexandria :serapeum :slacker :vecto)
(:shadowing-import-from :alexandria :rotate))
|
9cf1fdb1 |
(defparameter *zxcv* *standard-output*)
(define-command "lss" (event-pump ts channel)
(fw.lu:let-each (:be *)
#p"~/public_html/Screenshots/"
(uiop:directory-files *)
(sort * #'> :key #'file-write-date)
(car *)
(uiop/common-lisp:enough-namestring * #p"~/public_html/")
(concat "https://srv2.elangley.org/~edwlan/" *)
(slacker.api:chat.post-message channel * :as_user t :icon_emoji "camera_with_flash")))
|
5ea361e0 |
(in-package :vecto-example)
(defmacro with ((var val) &body body)
`(let ((,var ,val))
,@body))
(defun octets-to-36string (octets)
(string-join (map 'list (lambda (it)
(format nil "~2,1,0,'0@a"
(with (*print-base* 36)
(write-to-string it ))))
octets)))
(defmacro with-digested-output ((stream (data-sym digest-sym)) data-form &body body)
(with-gensyms (digest-stream data-stream)
`(let* ((,digest-stream (ironclad:make-digesting-stream :sha256))
(,data-stream (ironclad:make-octet-output-stream))
(,stream (make-broadcast-stream ,data-stream ,digest-stream)))
,data-form
(let ((,data-sym (ironclad:get-output-stream-octets ,data-stream))
(,digest-sym (ironclad:produce-digest ,digest-stream)))
,@body))))
(define-command "ring-word" (event-pump ts channel &optional (content #(#x3BB)))
(bt:make-thread
(lambda ()
(declare (optimize (debug 3)))
|
60e29634 |
(let ((*default-pathname-defaults* #p"/home/edwlan/github_repos/hhgbot/"))
|
5ea361e0 |
(with-canvas (:width 90 :height 90)
(let ((font (get-font "times.ttf"))
(step (/ pi 7)))
(set-font font 40)
(translate 45 45)
(format hhgbot-augmented-assistant::*zxcv* "~&content: ~s~%" content)
(draw-centered-string 0 -10 (map 'vector #'char-code content))
(set-rgb-stroke 1 0 0)
(centered-circle-path 0 0 35)
(stroke)
(set-rgba-stroke 0 0 1.0 0.5)
(set-line-width 4)
(dotimes (i 14)
(with-graphics-state
(vecto:rotate (* i step))
(move-to 30 0)
(line-to 40 0)
(stroke))))
(let* ((image-directory (ensure-directories-exist "/home/edwlan/public_html/slack_images/"))
(image-basename (concat channel "-" ts ".png"))
(image-filename (merge-pathnames image-basename image-directory))
(payload
(concat "token=" *api-token*
"&channel=" channel
"&text=..."
"&as_user=true"
"&attachments="
(quri:url-encode
(concat
"[{\"fallback\": \"foo\", \"ts\":" ts ",\"image_url\": \"https://srv2.elangley.org/~edwlan/slack_images/"
image-basename "\"}]")))))
(vecto:save-png image-filename)
(babel:octets-to-string
(drakma:http-request "https://slack.com/api/chat.postMessage"
:method :post
:content payload))))))
:name "Image Maker"))
|