1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3 ;; Play against an opponent over the network
6 (require 'chess-common)
8 (defvar chess-network-regexp-alist
10 (cons (concat chess-algebraic-regexp "$")
13 (funcall chess-engine-response-handler 'move
14 (chess-engine-convert-algebraic (match-string 0))))))
15 (cons "chess match\\(\\s-+\\(.+\\)\\)?$"
18 (funcall chess-engine-response-handler 'match
20 (cons "fen\\s-+\\(.+\\)"
23 (funcall chess-engine-response-handler 'setup-pos
24 (chess-engine-convert-fen (match-string 1))))))
25 (cons "pgn\\s-+\\(.+\\)"
28 (funcall chess-engine-response-handler 'setup-game
29 (chess-engine-convert-pgn
30 (chess-network-parse-multiline (match-string 1)))))))
34 (funcall chess-engine-response-handler 'pass))))
38 (funcall chess-engine-response-handler 'quit))))
42 (funcall chess-engine-response-handler 'resign))))
46 (funcall chess-engine-response-handler 'draw))))
50 (funcall chess-engine-response-handler 'abort))))
51 (cons "takeback\\s-+\\([0-9]+\\)$"
54 (funcall chess-engine-response-handler 'undo
55 (string-to-int (match-string 1))))))
56 (cons "accept\\(\\s-+\\(.+\\)\\)?$"
59 (funcall chess-engine-response-handler 'accept
64 (funcall chess-engine-response-handler 'decline))))
68 (funcall chess-engine-response-handler 'retract))))
72 (funcall chess-engine-response-handler 'illegal))))
76 (funcall chess-engine-response-handler 'call-flag))))
80 (funcall chess-engine-response-handler 'flag-fell))))
81 (cons "kibitz\\s-+\\(.+\\)$"
84 (funcall chess-engine-response-handler 'kibitz
85 (chess-network-parse-multiline (match-string 1))))))
86 (cons "chat\\s-+\\(.+\\)$"
89 (funcall chess-engine-response-handler 'chat
90 (chess-network-parse-multiline (match-string 1))))))))
92 (chess-message-catalog 'english
93 '((network-starting . "Starting network client/server...")
94 (network-waiting . "Now waiting for your opponent to connect...")
95 (network-connected ."You have connected; pass now or make your move.")))
97 (defun chess-network-flatten-multiline (str)
98 (while (string-match "\n" str)
99 (setq str (replace-match "\C-k" t t str)))
102 (defun chess-network-parse-multiline (str)
103 (while (string-match "\C-k" str)
104 (setq str (replace-match "\n" t t str)))
107 (defun chess-network-handler (game event &rest args)
108 "Initialize the network chess engine."
109 (unless chess-engine-handling-event
111 ((eq event 'initialize)
112 (let ((which (read-char "Are you the c)lient or s)erver? "))
114 (chess-message 'network-starting)
117 (if (fboundp 'open-network-stream-server)
118 (open-network-stream-server "*chess-network*"
120 (read-string "Port: "))
121 (start-process "*chess-network*"
122 (current-buffer) "/usr/bin/nc"
123 "-l" "-p" (read-string "Port: ")))
124 (open-network-stream "*chess-network*" (current-buffer)
125 (read-string "Host: ")
126 (read-string "Port: "))))
128 (chess-message 'network-waiting)
129 (chess-network-handler game 'match)
130 (chess-message 'network-connected))
133 ((eq event 'ready) ; don't set active yet
134 (chess-game-run-hooks game 'announce-autosave))
136 ((eq event 'setup-pos)
137 (chess-engine-send nil (format "fen %s\n"
138 (chess-pos-to-string (car args)))))
140 ((eq event 'setup-game)
141 (chess-engine-send nil (format "pgn %s\n"
142 (chess-network-flatten-multiline
143 (chess-game-to-string (car args))))))
146 (chess-engine-send nil "pass\n"))
149 (chess-engine-send nil "playing\n"))
152 (setq chess-engine-pending-offer 'match)
153 (chess-engine-send nil (format "chess match %s\n" chess-full-name)))
156 (if chess-engine-pending-offer
157 (chess-engine-command nil 'retract))
158 (setq chess-engine-pending-offer 'draw)
159 (chess-engine-send nil "draw\n"))
162 (if chess-engine-pending-offer
163 (chess-engine-command nil 'retract))
164 (setq chess-engine-pending-offer 'abort)
165 (chess-engine-send nil "abort\n"))
168 (if chess-engine-pending-offer
169 (chess-engine-command nil 'retract))
170 (setq chess-engine-pending-offer 'undo
171 chess-engine-pending-arg (car args))
172 (chess-engine-send nil (format "takeback %d\n" (car args))))
175 (chess-engine-send nil "accept\n"))
178 (chess-engine-send nil "decline\n"))
181 (chess-engine-send nil "retract\n"))
184 (chess-engine-send nil "illegal\n"))
186 ((eq event 'call-flag)
187 (chess-engine-send nil "flag\n"))
190 (chess-engine-send nil (format "kibitz %s\n"
191 (chess-network-flatten-multiline
195 (chess-engine-send nil (format "chat %s\n"
196 (chess-network-flatten-multiline
199 ((eq event 'set-index)
200 (chess-engine-send nil (format "index %d\n" (car args))))
202 ((eq event 'flag-fell)
203 (chess-engine-send nil "forfeit\n")
204 (chess-common-handler game 'flag-fell))
207 (apply 'chess-common-handler game event args)))))
209 (provide 'chess-network)
211 ;;; chess-network.el ends here