diff options
-rw-r--r-- | examples/shell-echo-bot.lisp | 3 | ||||
-rw-r--r-- | granolin.lisp | 4 | ||||
-rw-r--r-- | utility-apps.lisp | 33 |
3 files changed, 39 insertions, 1 deletions
diff --git a/examples/shell-echo-bot.lisp b/examples/shell-echo-bot.lisp index 2e4167c..f607295 100644 --- a/examples/shell-echo-bot.lisp +++ b/examples/shell-echo-bot.lisp @@ -1,7 +1,8 @@ (defclass shell-echo-bot (granolin:client granolin:message-log - granolin:server-directory) + granolin:server-directory + granolin::auto-joiner) ()) (defvar *bot* diff --git a/granolin.lisp b/granolin.lisp index ab04c51..40963f5 100644 --- a/granolin.lisp +++ b/granolin.lisp @@ -174,11 +174,15 @@ (event-type :|type|) (sender :|sender|)) +(def-json-wrap basic-json) + + ;;; URI constants for interacting with the Matrix API (defparameter +login-path+ "/_matrix/client/r0/login") (defparameter +sync-path+ "/_matrix/client/r0/sync") + ;;; Utility functions and macros for making HTTP requests to the MATRIX API (defun add-auth-header (client headers) diff --git a/utility-apps.lisp b/utility-apps.lisp index 3280289..f6b4416 100644 --- a/utility-apps.lisp +++ b/utility-apps.lisp @@ -18,6 +18,7 @@ :do (format stream "~a: ~a~%" k v))) (defmethod handle-event :after ((log message-log) room (event timeline-event)) + (print "Joined Room Message/Timeline Event" (output log)) (let ((fields `(("room" . ,room) ("sender" . ,(sender event)) ("event type" . ,(event-type event)) @@ -29,6 +30,18 @@ (defmethod handle-event :after ((log message-log) room (event room-state-event)) + (print "Joined Room State Event" (output log)) + (let ((fields `(("room" . ,room) + ("sender" . ,(sender event)) + ("event type" . ,(event-type event)) + ("state key" . ,(state-key event)) + ("content" . ,(event-content event))))) + (print-assoc fields (output log)) + (terpri (output log)))) + + +(defmethod handle-event :after ((log message-log) room (event invitation-event)) + (print "Invitation Event" (output log)) (let ((fields `(("room" . ,room) ("sender" . ,(sender event)) ("event type" . ,(event-type event)) @@ -102,3 +115,23 @@ (and like (search name (room-name room) :test #'string-equal))) :collect (if full room (room-id room))))) + +;;; Basic Joiner Bot + +(defclass auto-joiner () ()) + +(defmethod handle-event :after ((client auto-joiner) room-id (event invitation-event)) + (when (equal "invite" + (getf (event-content event) :|join_rule|)) + (join-room client room-id))) + +(defparameter +join-room-path+ "/_matrix/client/r0/rooms/~a/join") + + + +(defun join-room (client room-id) + (let ((body (list :|roomId| room-id)) + (url (format nil +join-room-path+ room-id))) + (send (client url body :method :post :wrap make-basic-json) + (format *standard-output* "JOINED ROOM ~a" room-id) + (format *error-output* "JOIN ROOM FAILED ~a" room-id)))) |