summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--granolin.lisp71
1 files changed, 37 insertions, 34 deletions
diff --git a/granolin.lisp b/granolin.lisp
index f22e921..ea00d95 100644
--- a/granolin.lisp
+++ b/granolin.lisp
@@ -109,24 +109,27 @@
(joined-rooms :|rooms| :|join|)
(invited-rooms :|rooms| :|invite|))
-(def-json-wrap room-event
+(def-json-wrap timeline-event
(content :|content|)
(event-type :|type|)
(event-id :|event_id|)
- (sender :|sender|))
+ (sender :|sender|)
+ (msg-type :|content| :|msgtype|)
+ (msg-body :|content| :|body|))
-(defmacro do-timeline-events ((room-var evt-var resp) &body body)
- "RESP is a SYNC-RESPONSE instance, probably passed in as *RESPONSE-OBJECT*.
+(def-json-wrap room-state-event
+ (content :|content|)
+ (event-type :|type|)
+ (event-id :|event_id|)
+ (state-key :|state_key|)
+ (prev-content :|prev_content|))
- ROOM-VAR becomes bound to the id of each room as it is processed, and EVT-VAR
- to a ROOM-EVENT instance in that room."
+(def-json-wrap invitation-event
+ (content :|content|)
+ (state-key :|state_key|)
+ (event-type :|type|)
+ (sender :|sender|))
- (let ((tmp-var (gensym)))
- `(let ((,evt-var (make-room-event :data nil)))
- (loop :for (,room-var room . ignore) :on (joined-rooms ,resp) :by #'cddr :do
- (dolist (,tmp-var (getob room :|timeline| :|events|))
- (setf (room-event-data ,evt-var) ,tmp-var)
- ,@body)))))
;;; URI constants for interacting with the Matrix API
@@ -207,8 +210,6 @@
;;; API Calls
-;(defgeneric login (client user password))
-
(defun login (client user password)
"Logs CLIENT into its HOMESERVER withthe provided USER and PASSWORD.
@@ -241,12 +242,9 @@
https://matrix.org/docs/spec/client_server/r0.5.0#get-matrix-client-r0-sync
"
(let (params)
- (when (next-batch client)
- (push (cons "since" (next-batch client))
- params))
-
-
(push (cons "full_state" full-state) params)
+ (when (next-batch client)
+ (push (cons "since" (next-batch client)) params))
(fetch (client +sync-path+ :params params :resp-formatter make-sync-response)
(handle-sync-response client)
@@ -260,20 +258,25 @@
(if (not (state client))
(setf (state client) (copy-tree (sync-response-data *response-object*)))
(progn
- (process-joined-room-timeline-events client)
- (process-joined-room-state-events client)
+ (process-joined-events client)
(process-invited-room-events client))))
-(defun process-joined-room-timeline-events (client)
- (do-timeline-events (room-id event *response-object*)
- (handle-timeline-event client room-id event)))
-
-(defun process-joined-room-state-events (client))
- ;; TODO
- ;; (do-room-state-events (room-id event *response-object*)
- ;; (handle-room-state-event client room-id event)))
-
-(defun process-invited-room-events (client))
- ;; TODO
- ;; (do-room-invited-events (room-id event)
- ;; (handle-invitation-event client room-id event )))
+(defun process-joined-events (client)
+ (let ((message-event (make-timeline-event :data nil))
+ (state-event (make-room-state-event :data nil)))
+ (loop :for (room-id room . ignore) :on (joined-rooms *response-object*) :by #'cddr :do
+ ;; handle the timeline events (aka room events)
+ (dolist (ob (getob room :|timeline| :|events|))
+ (setf (timeline-event-data message-event) ob)
+ (handle-timeline-event client room-id message-event))
+ ;; handle state chnage events (aka state events)
+ (dolist (ob (getob room :|state| :|events|))
+ (setf (room-state-event-data state-event) ob)
+ (handle-room-state-event client room-id state-event)))))
+
+(defun process-invited-room-events (client)
+ (let ((invite-event (make-invitation-event :data nil)))
+ (loop :for (room-id room . ignore) :on (invited-rooms *response-object*) :by #'cddr :do
+ (dolist (ob (getob room :|invite_state| :|events|))
+ (setf (invitation-event-data invite-event) ob)
+ (handle-invitation-event client room-id invite-event)))))