Christophe Weblog Wiki Code Publications Music
slightly better `squeeze-update-state'
[squeeze-el.git] / squeeze.el
index 18586145f8a92d4f5fdc5246275c2a866ac90e57..977813b28fc24c118fc0dafd600d7c7901250723 100644 (file)
 
 (defvar squeeze-control-inhibit-display nil)
 
-(lexical-let ((buffer ""))
+(lexical-let ((buffer (get-buffer-create " *squeeze-update-state*")))
   (defun squeeze-update-state (string)
+    ;; FIXME: we could make this a lot more elegant by using the
+    ;; buffer abstraction more
     (if (cl-position ?\n string)
         (let (done-something)
-          (setq string (concat buffer string))
+          (with-current-buffer buffer
+            (insert string)
+            (setq string (buffer-string))
+            (erase-buffer))
           (dolist (line (split-string string "\n"))
             (when (squeeze-update-state-from-line line)
               (setq done-something t)))
           (when done-something
             (unless squeeze-control-inhibit-display
-              (squeeze-control-display-players)))
-          (setq buffer ""))
-      (setq buffer (concat buffer string)))
+              (squeeze-control-display-players))))
+      (with-current-buffer buffer
+        (insert string)))
     string))
 
 (defconst squeeze-player-line-regexp
   (save-match-data
     (let (result)
       (loop
-       (if (string-match "\\([a-z]+\\)%3A\\([^ \n]+\\)" string start)
+       (if (string-match "\\([a-z_]+\\)%3A\\([^ \n]+\\)" string start)
            (let ((mend (match-end 0)))
              (when (> mend end)
                (return))
     (when startpos
       (squeeze-string-plistify string startpos (length string)))))
 
+(defun squeeze-parse-count (string)
+  (save-match-data
+    (let ((countpos (string-match "count%3A\\([0-9]*\\)\\>" string)))
+      (if countpos
+          (string-to-number
+           (substring string (match-beginning 1) (match-end 1)))
+        (let ((kind
+               (progn (string-match "^\\([a-z]*\\) " string)
+                      (substring string (match-beginning 1) (match-end 1)))))
+          (message "no count found in %s line" kind)
+          nil)))))
+
 (defun squeeze-parse-players-line (string)
-  (let ((countpos (string-match " count%3A\\([0-9]\\) " string))
-        (startpos (match-end 0)))
-    (unless countpos
-      (message "no count found in players line"))
-    (let ((count (string-to-number (substring string (match-beginning 1) (match-end 1))))
-          result endpos)
-      (dotimes (i (1- count))
-        (setq endpos (progn (string-match " connected%3A[0-1] " string startpos)
-                            (match-end 0)))
-        (push (apply 'squeeze-make-player (squeeze-string-plistify string startpos endpos)) result)
-        (setq startpos endpos))
-      (push (apply 'squeeze-make-player (squeeze-string-plistify string startpos (length string))) result)
-      result)))
+  (let ((count (squeeze-parse-count string))
+        (startpos (string-match "playerindex" string))
+        result endpos)
+    (dotimes (i (1- count))
+      (setq endpos (progn (string-match " connected%3A[0-1] " string startpos)
+                          (match-end 0)))
+      (push (apply 'squeeze-make-player (squeeze-string-plistify string startpos endpos)) result)
+      (setq startpos endpos))
+    (push (apply 'squeeze-make-player (squeeze-string-plistify string startpos (length string))) result)
+    result))
+
 
 (defun squeeze-complete-command-at-point ()
   (save-excursion
             "serverstatus" "status" "displaystatus" "readdirectory"
 
             ;; Notifications
-            
+
             ;; Alarm commands and queries
             "alarm" "alarms"