summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--examples/shell-echo-bot.lisp3
-rw-r--r--granolin.lisp4
-rw-r--r--utility-apps.lisp33
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))))