summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBoutade <thegoofist@protonmail.com>2019-10-06 09:48:31 -0500
committerBoutade <thegoofist@protonmail.com>2019-10-06 09:48:31 -0500
commitaaac878842c8124ac9f48b231726eaeb203037f5 (patch)
tree36af8a866582b388612ef6cf4ad2be0f136d8974
parent1fa9a1fc8cef784680bea4336f4ba4bed6185235 (diff)
hide event cache variables in lexical scope, update echo example
Resolves issue #3
-rw-r--r--examples/shell-echo-bot.lisp31
-rw-r--r--granolin.lisp148
2 files changed, 90 insertions, 89 deletions
diff --git a/examples/shell-echo-bot.lisp b/examples/shell-echo-bot.lisp
index f607295..27219f2 100644
--- a/examples/shell-echo-bot.lisp
+++ b/examples/shell-echo-bot.lisp
@@ -1,26 +1,21 @@
-(defclass shell-echo-bot (granolin:client
- granolin:message-log
- granolin:server-directory
- granolin::auto-joiner)
+(defpackage :shell-echo-bot
+ (:use #:cl #:granolin))
+
+(in-package :shell-echo-bot)
+
+(defclass shell-echo-bot (client
+ message-log
+ server-directory
+ auto-joiner)
())
-(defvar *bot*
- (make-instance 'shell-echo-bot
- :hardcopy (merge-pathnames ".shell-echo-bot.conf"
- (user-homedir-pathname))
- :homeserver "https://matrix.hrlo.world"
- :output *standard-output*))
-;; a script to login if necessary, and then start the bot
+(defun login-and-run (user pw homeserver)
+ (let ((bot (make-instance 'shell-echo-bot :homeserver homeserver)))
+ (login bot user pw)
+ (start bot)))
-(unless (granolin:logged-in-p *bot*)
- (princ "Log in to the server:")
- (terpri)
- (granolin:login *bot*
- (and (princ "username: ") (read-line))
- (and (princ "password: ") (read-line))))
-(granolin:start *bot*)
diff --git a/granolin.lisp b/granolin.lisp
index 0460ac2..2b1fd16 100644
--- a/granolin.lisp
+++ b/granolin.lisp
@@ -340,77 +340,83 @@
(process-invited-room-events client)
(process-account-data-events client))
-;; The following globals are private and are recycled per call to sync
-(defvar *timeline-event* (make-timeline-event :data nil))
-(defvar *text-message-event* (make-text-message-event :data nil))
-(defvar *image-message-event* (make-image-message-event :data nil))
-(defvar *audio-message-event* (make-audio-message-event :data nil))
-(defvar *file-message-event* (make-file-message-event :data nil))
-(defvar *video-message-event* (make-video-message-event :data nil))
-(defvar *emote-message-event* (make-emote-message-event :data nil))
-(defvar *notice-message-event* (make-notice-message-event :data nil))
-(defvar *location-message-event* (make-location-message-event :data nil))
-(defvar *state-event* (make-room-state-event :data nil))
-(defvar *account-data-event* (make-account-data-event :data nil))
-
-(defun categorize-and-set-timeline-event (ob)
- (cond
- ((text-message-event-p* ob)
- (setf (timeline-event-data *text-message-event*) ob)
- *text-message-event*)
- ((image-message-event-p* ob)
- (setf (timeline-event-data *image-message-event*) ob)
- *image-message-event*)
- ((audio-message-event-p* ob)
- (setf (timeline-event-data *audio-message-event*) ob)
- *audio-message-event*)
- ((file-message-event-p* ob)
- (setf (timeline-event-data *file-message-event*) ob)
- *file-message-event*)
- ((video-message-event-p* ob)
- (setf (timeline-event-data *video-message-event*) ob)
- *video-message-event*)
- ((emote-message-event-p* ob)
- (setf (timeline-event-data *emote-message-event*) ob)
- *emote-message-event*)
- ((notice-message-event-p* ob)
- (setf (timeline-event-data *notice-message-event*) ob)
- *notice-message-event*)
- ((location-message-event-p* ob)
- (setf (timeline-event-data *location-message-event*) ob)
- *location-message-event*)
- (t
- (setf (timeline-event-data *timeline-event*) ob)
- *timeline-event*)))
-
-(defun process-joined-events (client)
- (loop :for (room-id room . ignore) :on (joined-rooms *response-object*) :by #'cddr :do
- (let ((*room-id* (symbol-name room-id))) ;; room-id should be a string
-
- ;; handle the timeline events (aka room events)
- (dolist (ob (getob room :|timeline| :|events|))
- (handle-event client
- (categorize-and-set-timeline-event ob)))
-
- ;; handle state chnage events (aka state events)
- (dolist (ob (getob room :|state| :|events|))
- (setf (room-state-event-data *state-event*) ob)
- (handle-event client *state-event*)))))
-
-;; TODO add global cache variable for invite 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
- (let ((*room-id* (symbol-name room-id)))
-
- (dolist (ob (getob room :|invite_state| :|events|))
- (setf (invitation-event-data invite-event) ob)
- (handle-event client invite-event))))))
-
-(defun process-account-data-events (client)
- (dolist (ob (account-data-events *response-object*))
- (setf (account-data-event-data *account-data-event*) ob)
- (handle-event client *account-data-event*)))
+
+;;; Event Processing and Dispatch
+
+(let ;; define some private "cache" variables to reuse
+ (( %timeline-event% (make-timeline-event :data nil))
+ ( %text-message-event% (make-text-message-event :data nil))
+ ( %image-message-event% (make-image-message-event :data nil))
+ ( %audio-message-event% (make-audio-message-event :data nil))
+ ( %file-message-event% (make-file-message-event :data nil))
+ ( %video-message-event% (make-video-message-event :data nil))
+ ( %emote-message-event% (make-emote-message-event :data nil))
+ ( %notice-message-event% (make-notice-message-event :data nil))
+ ( %location-message-event% (make-location-message-event :data nil))
+ ( %state-event% (make-room-state-event :data nil))
+ ( %account-data-event% (make-account-data-event :data nil)))
+
+ (defun categorize-and-set-timeline-event (ob)
+ (cond
+ ((text-message-event-p* ob)
+ (setf (timeline-event-data %text-message-event%) ob)
+ %text-message-event%)
+ ((image-message-event-p* ob)
+ (setf (timeline-event-data %image-message-event%) ob)
+ %image-message-event%)
+ ((audio-message-event-p* ob)
+ (setf (timeline-event-data %audio-message-event%) ob)
+ %audio-message-event%)
+ ((file-message-event-p* ob)
+ (setf (timeline-event-data %file-message-event%) ob)
+ %file-message-event%)
+ ((video-message-event-p* ob)
+ (setf (timeline-event-data %video-message-event%) ob)
+ %video-message-event%)
+ ((emote-message-event-p* ob)
+ (setf (timeline-event-data %emote-message-event%) ob)
+ %emote-message-event%)
+ ((notice-message-event-p* ob)
+ (setf (timeline-event-data %notice-message-event%) ob)
+ %notice-message-event%)
+ ((location-message-event-p* ob)
+ (setf (timeline-event-data %location-message-event%) ob)
+ %location-message-event%)
+ (t
+ (setf (timeline-event-data %timeline-event%) ob)
+ %timeline-event%)))
+
+ (defun process-joined-events (client)
+ (loop :for (room-id room . ignore) :on (joined-rooms *response-object*) :by #'cddr :do
+ (let ((*room-id* (symbol-name room-id))) ;; room-id should be a string
+
+ ;; handle the timeline events (aka room events)
+ (dolist (ob (getob room :|timeline| :|events|))
+ (handle-event client
+ (categorize-and-set-timeline-event ob)))
+
+ ;; handle state chnage events (aka state events)
+ (dolist (ob (getob room :|state| :|events|))
+ (setf (room-state-event-data %state-event%) ob)
+ (handle-event client %state-event%)))))
+
+ ;; TODO add global cache variable for invite 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
+ (let ((*room-id* (symbol-name room-id)))
+
+ (dolist (ob (getob room :|invite_state| :|events|))
+ (setf (invitation-event-data invite-event) ob)
+ (handle-event client invite-event))))))
+
+ (defun process-account-data-events (client)
+ (dolist (ob (account-data-events *response-object*))
+ (setf (account-data-event-data %account-data-event%) ob)
+ (handle-event client %account-data-event%)))
+
+)
+
(defun send-text-message (client room-id message &rest args)
"Sends the MESSAGE (a string) to the room with id ROOM-ID. MESSAGE can also be