1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3 ;; Play against an opponent over the network
7 (require 'chess-engine)
9 (require 'chess-algebraic)
11 (defvar chess-network-regexp-alist
13 (cons (concat chess-algebraic-regexp "$")
16 (funcall chess-engine-response-handler 'move
17 (chess-engine-convert-algebraic (match-string 0))))))
18 (cons "chess match\\(\\s-+\\(.+\\)\\)?$"
21 (funcall chess-engine-response-handler 'connect
23 (cons "accept match\\(\\s-+\\(.+\\)\\)?$"
26 (funcall chess-engine-response-handler 'accept-connect
28 (cons "fen\\s-+\\(.+\\)"
31 (funcall chess-engine-response-handler 'setup-pos
32 (chess-engine-convert-fen (match-string 1))))))
33 (cons "pgn\\s-+\\(.+\\)"
36 (funcall chess-engine-response-handler 'setup-game
37 (chess-engine-convert-pgn (match-string 1))))))
41 (funcall chess-engine-response-handler 'pass))))
45 (funcall chess-engine-response-handler 'quit))))
49 (funcall chess-engine-response-handler 'resign))))
53 (funcall chess-engine-response-handler 'draw))))
57 (funcall chess-engine-response-handler 'accept-draw))))
61 (funcall chess-engine-response-handler 'decline-draw))))
65 (funcall chess-engine-response-handler 'abort))))
69 (funcall chess-engine-response-handler 'accept-abort))))
70 (cons "decline abort$"
73 (funcall chess-engine-response-handler 'decline-abort))))
74 (cons "takeback\\s-+\\([0-9]+\\)$"
77 (funcall chess-engine-response-handler 'undo
78 (string-to-int (match-string 1))))))
79 (cons "accept takeback\\s-+\\([0-9]+\\)$"
82 (funcall chess-engine-response-handler 'accept-undo
83 (string-to-int (match-string 1))))))
84 (cons "decline takeback$"
87 (funcall chess-engine-response-handler 'decline-undo))))))
89 (defun chess-network-handler (event &rest args)
90 "Initialize the network chess engine."
92 ((eq event 'initialize)
93 (let ((which (read-char "Are you the c)lient or s)erver? "))
95 (message "Starting network client/server...")
96 (setq proc (if (eq which ?s)
97 (start-process "*chess-network*"
98 (current-buffer) "/usr/bin/nc"
99 "-l" "-p" (read-string "Port: "))
100 (open-network-stream "*chess-network*" (current-buffer)
101 (read-string "Host: ")
102 (read-string "Port: "))))
104 (message "Now waiting for your opponent to connect...")
105 (process-send-string proc (format "chess match %s\n" chess-full-name))
106 (message "You have connected; pass now or make your move."))
109 ((eq event 'shutdown)
110 (chess-engine-send nil "quit\n"))
112 ((eq event 'setup-pos)
113 (chess-engine-send nil (format "fen %s\n"
114 (chess-pos-to-string (car args)))))
116 ((eq event 'setup-game)
117 (chess-engine-send nil (format "pgn %s\n"
118 (chess-game-to-string (car args)))))
121 (chess-engine-send nil "pass\n"))
124 (chess-engine-send nil "playing\n"))
127 (chess-engine-send nil (format "chess match %s\n" chess-full-name)))
129 ((eq event 'accept-connect)
130 (chess-engine-send nil (format "accept match %s\n" chess-full-name)))
133 (chess-engine-send nil "decline\n"))
136 (chess-engine-send nil "resign\n"))
139 (chess-engine-send nil "draw\n"))
141 ((eq event 'accept-draw)
142 (chess-engine-send nil "accept draw\n"))
144 ((eq event 'decline-draw)
145 (chess-engine-send nil "decline draw\n"))
148 (chess-engine-send nil "abort\n"))
150 ((eq event 'accept-abort)
151 (chess-engine-send nil "accept abort\n"))
153 ((eq event 'decline-abort)
154 (chess-engine-send nil "decline abort\n"))
157 (chess-engine-send nil (format "takeback %d\n" (car args))))
159 ((eq event 'accept-undo)
160 (chess-engine-send nil (format "accept takeback %d\n" (car args))))
162 ((eq event 'decline-undo)
163 (chess-engine-send nil "decline takeback\n"))
166 (chess-engine-send nil (concat (chess-ply-to-algebraic (car args))
169 (provide 'chess-network)
171 ;;; chess-network.el ends here