summaryrefslogtreecommitdiff
path: root/chess-autosave.el
blob: f8f7369a4567bf8332a98ef73c23ae5ab3fca536 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; A special kind of display that merely autosaves the game
;;

(require 'chess-game)

(defgroup chess-autosave nil
  "A special display that autosaves after each move."
  :group 'chess-display)

(defcustom chess-autosave-file "~/.chess-save"
  "Filename in which to autosave chess games."
  :type '(choice file (const :tag "Do not auto-save" nil))
  :group 'chess-autosave)

(chess-message-catalog 'english
  '((chess-read-autosave   . "There is a chess autosave file, read it? ")
    (chess-delete-autosave . "Delete the autosave file? ")))

(defun chess-autosave-handler (game event &rest args)
  (cond
   ((eq event 'initialize)
    (if (file-readable-p chess-autosave-file)
	(if (y-or-n-p (chess-string 'chess-read-autosave))
	    (prog1
		(chess-game-copy-game
		 game (chess-autosave-read chess-autosave-file))
	      (delete-file chess-autosave-file))
	  (ignore
	   (if (y-or-n-p (chess-string 'chess-delete-autosave))
	       (delete-file chess-autosave-file)))))
    (kill-buffer (current-buffer))
    (set-buffer (find-file-noselect chess-autosave-file t))
    t)

   ((eq event 'post-move)
    (chess-autosave-write game chess-autosave-file))

   ((eq event 'destroy)
    (if (file-readable-p chess-autosave-file)
	(delete-file chess-autosave-file)))))

(defun chess-autosave-write (game file)
  "Write a chess GAME to FILE as raw Lisp."
  (let ((game-copy (copy-alist game)))
    (chess-game-set-hooks game-copy nil)
    (chess-game-set-data-alist game-copy nil)
    (with-current-buffer (find-file-noselect file t)
      (erase-buffer)
      (prin1 game-copy (current-buffer))
      (basic-save-buffer)
      (message nil))))

(defun chess-autosave-read (file)
  "Read a chess game as raw Lisp from FILE."
  (with-current-buffer (find-file-noselect file t)
    (goto-char (point-min))
    (read (current-buffer))))

(provide 'chess-autosave)

;;; chess-autosave.el ends here