-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathchess.coffee
executable file
·91 lines (85 loc) · 3.25 KB
/
chess.coffee
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# Description:
# Play a game of chess!
#
# Dependencies:
# "chess": "0.1.3"
#
# Configuration:
# None
#
# Commands:
# hubot chess me - Creates a new game between yourself and another person in the room
# hubot chess status - Gets the current state of the board
# hubot chess move <to> - Moves a piece to the coordinate position using standard chess notation
#
# Author:
# thallium205
#
Chess = require 'chess'
module.exports = (robot) ->
robot.respond /chess me$/i, (msg) ->
robot.brain.data.chess = Chess.create()
boardToFen robot.brain.data.chess.getStatus(), (status, fen) ->
msg.send 'http://webchess.freehostia.com/diag/chessdiag.php?fen=' + encodeURIComponent(fen) + '&size=large&coord=yes&cap=yes&stm=yes&fb=no&theme=classic&format=auto&color1=E3CEAA&color2=635147&color3=000000&.png'
robot.respond /chess status/i, (msg) ->
try
boardToFen robot.brain.data.chess.getStatus(), (status, fen) ->
if status
msg.send status
msg.send 'http://webchess.freehostia.com/diag/chessdiag.php?fen=' + encodeURIComponent(fen) + '&size=large&coord=yes&cap=yes&stm=yes&fb=no&theme=classic&format=auto&color1=E3CEAA&color2=635147&color3=000000&.png'
catch e
msg.send e
robot.respond /chess move (.*)/i, (msg) ->
try
robot.brain.data.chess.move msg.match[1]
boardToFen robot.brain.data.chess.getStatus(), (status, fen) ->
if status
msg.send status
msg.send 'http://webchess.freehostia.com/diag/chessdiag.php?fen=' + encodeURIComponent(fen) + '&size=large&coord=yes&cap=yes&stm=yes&fb=no&theme=classic&format=auto&color1=E3CEAA&color2=635147&color3=000000&.png'
catch e
msg.send e
boardToFen = (status, callback) ->
fen = [[],[],[],[],[],[],[],[]]
blank = 0
lastRank = 0
for square in status.board.squares
if lastRank isnt square.rank
if blank isnt 0
fen[lastRank - 1].push(blank)
blank = 0
if square.piece is null
blank = blank + 1
else
if square.piece.type is 'pawn'
if blank is 0
fen[square.rank - 1].push(if square.piece.side.name is 'white' then 'P' else 'p')
else
fen[square.rank - 1].push(blank)
fen[square.rank - 1].push(if square.piece.side.name is 'white' then 'P' else 'p')
blank = 0
else
if blank is 0
fen[square.rank - 1].push(if square.piece.side.name is 'white' then square.piece.notation.toUpperCase() else square.piece.notation.toLowerCase())
else
fen[square.rank - 1].push(blank)
fen[square.rank - 1].push(if square.piece.side.name is 'white' then square.piece.notation.toUpperCase() else square.piece.notation.toLowerCase())
blank = 0
lastRank = square.rank
for rank in fen
rank = rank.join()
fen = fen.reverse().join('/').replace(/,/g,'')
msg = ''
if status.isCheck
msg += 'Check! '
if status.isCheckmate
msg += 'Checkmate! '
if status.isRepetition
msg += 'Threefold Repetition! A draw can be called. '
if status.isStalemate
msg += 'Stalemate! '
if Object.keys(status.notatedMoves).length > 0
if status.notatedMoves[Object.keys(status.notatedMoves)[0]].src.piece.side.name is 'white'
fen += ' w';
else
fen += ' b';
callback msg, fen