-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmessage.go
More file actions
137 lines (120 loc) · 2.4 KB
/
Copy pathmessage.go
File metadata and controls
137 lines (120 loc) · 2.4 KB
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
package main
import "encoding/json"
type MessageType int
const (
Move MessageType = iota
Resign
OfferDraw
AcceptDraw
DeclineDraw
GameEnd
Error
Initial
)
func (mt MessageType) String() string {
switch mt {
case Move:
return "move"
case Resign:
return "resign"
case OfferDraw:
return "offer_draw"
case AcceptDraw:
return "accept_draw"
case DeclineDraw:
return "decline_draw"
case GameEnd:
return "game_end"
case Error:
return "error"
case Initial:
return "initial"
default:
return "unknown"
}
}
func (mt MessageType) MarshalJSON() ([]byte, error) {
return json.Marshal(mt.String())
}
func (mt *MessageType) UnmarshalJSON(data []byte) error {
var s string
if err := json.Unmarshal(data, &s); err != nil {
return err
}
switch s {
case "move":
*mt = Move
case "resign":
*mt = Resign
case "offer_draw":
*mt = OfferDraw
case "accept_draw":
*mt = AcceptDraw
case "decline_draw":
*mt = DeclineDraw
case "error":
*mt = Error
default:
*mt = -1
}
return nil
}
// Message is a struct that represents a message sent by a client.
type Message struct {
Player Player `json:"player"`
Type MessageType `json:"type"`
Data string `json:"data"`
}
func NewMessage(player Player, messageType MessageType, data string) Message {
return Message{
Player: player,
Type: messageType,
Data: data,
}
}
type ServerMessage struct {
Type MessageType `json:"type"`
Data interface{} `json:"data"`
}
func NewServerMessage(t MessageType, data interface{}) *ServerMessage {
return &ServerMessage{
Type: t,
Data: data,
}
}
type ServerMoveMessage struct {
Fen string `json:"fen"`
LegalMoves []string `json:"moves"`
Move string `json:"move"`
}
type ServerInitialMessage struct {
Fen string `json:"fen"`
LegalMoves []string `json:"moves"`
Player Player `json:"player"`
}
func NewServerInitialMessage(fen string, moves []string, player Player) *ServerMessage {
return &ServerMessage{
Type: Initial,
Data: &ServerInitialMessage{
Fen: fen,
LegalMoves: moves,
Player: player,
},
}
}
func NewServerMoveMessage(move, fen string, moves []string) *ServerMessage {
return &ServerMessage{
Type: Move,
Data: &ServerMoveMessage{
Move: move,
Fen: fen,
LegalMoves: moves,
},
}
}
func NewServerError(err error) *ServerMessage {
return &ServerMessage{
Type: Error,
Data: err.Error(),
}
}