From 94f31a5e1ff502fa12fb6a27c1f9b8b0854e3ad4 Mon Sep 17 00:00:00 2001 From: Boutade Date: Wed, 25 Sep 2019 15:04:53 -0500 Subject: added HARDCOPY slot to CLIENT. --- granolin.lisp | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) (limited to 'granolin.lisp') diff --git a/granolin.lisp b/granolin.lisp index ede3a2e..5c9e144 100644 --- a/granolin.lisp +++ b/granolin.lisp @@ -22,6 +22,11 @@ :initarg :homeserver :initform (error "HOMESERVER is required.") :type string) + (hardcopy + :accessor hardcopy + :initform nil + :type pathname + :documentation "A file path where client state is saved.") (running-p :accessor running-p :initform t) @@ -39,12 +44,19 @@ :accessor next-batch :initform nil :type string - :documentation "Used on sync requests as the value of the SINCE parameter"))) + :documentation "Used on sync requests as the value of the SINCE parameter")) + (:documentation "An instance of CLIENT holds the necessary state for + interacting with a Matrix server. If HARDCOPY is supplied, the + INITIALIZE-INSTANCE :after auxilliary method will attempt to populate the + following slots from a file: HOMESERVER, TIMEOUT, ACCESS-TOKEN, NEXT-BATCH.")) (defun save-client-state (client &key (fname "granolin.conf")) "Save a PLIST of client state to disk. Saves HOMESERVER, TIMEOUT, ACCESS-TOKEN, and NEXT-BATCH values to the file." + (when (hardcopy client) + (setf fname hardcopy)) + (with-open-file (out fname :direction :output) (print (list :homeserver (homeserver client) :timeout (timeout client) @@ -54,6 +66,10 @@ (defun load-client-state (client &optional (fname "granolin.conf")) "Load client state from a PLIST stored in a file." + + (when (hardcopy client) + (setf fname hardcopy)) + (let ((conf (with-open-file (in fname) (read in)))) (setf (homeserver client) (getf conf :homeserver)) (setf (timeout client) (getf conf :timeout)) @@ -66,7 +82,9 @@ "Ensure that the homeserver url is well formed, and makes an attempt to format it if it isnt") (defmethod initialize-instance :after ((client client) &key) - (validate-homserver-url client)) + (validate-homserver-url client) + (when (and (hardcopy client) (probe-file (hardcopy client))) + (load-client-state client))) (defgeneric handle-event (client room event) (:documentation "Implemented on handlers that need to respond to events.") @@ -75,7 +93,8 @@ (defgeneric clean-up (client) (:documentation "To be run before the client crashes or is killed.") (:method ((client client)) - (setf (running-p client) nil))) + (setf (running-p client) nil) + (save-client-state client))) ;;; Dynamic variables bound during response handling. Each such variable should ;;; be bound to a value during any message handler call. -- cgit v1.2.3