-
Notifications
You must be signed in to change notification settings - Fork 19
/
serialization.go
82 lines (73 loc) · 2.22 KB
/
serialization.go
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
// Author: Niels A.D.
// Project: gowarcraft3 (https://github.com/nielsAD/gowarcraft3)
// License: Mozilla Public License, v2.0
package capi
import (
"encoding/json"
"io"
"strings"
)
// SerializePacket serializes p and writes it to w.
func SerializePacket(w io.Writer, p *Packet) error {
return json.NewEncoder(w).Encode(p)
}
// DeserializePacket reads exactly one packet from r and returns it in the proper (deserialized) packet type.
func DeserializePacket(r io.Reader) (*Packet, error) {
type rawPacket struct {
Command string `json:"command"`
RequestID int64 `json:"request_id"`
Status *Status `json:"status,omitempty"`
Payload json.RawMessage `json:"payload"`
}
var raw rawPacket
if err := json.NewDecoder(r).Decode(&raw); err != nil {
return nil, err
}
var p = &Packet{
Command: raw.Command,
RequestID: raw.RequestID,
Status: raw.Status,
}
if strings.HasSuffix(raw.Command, CmdResponseSuffix) {
p.Payload = &Response{}
} else {
switch raw.Command {
case CmdAuthenticate + CmdRequestSuffix:
p.Payload = &Authenticate{}
case CmdConnect + CmdRequestSuffix:
p.Payload = &Connect{}
case CmdDisconnect + CmdRequestSuffix:
p.Payload = &Disconnect{}
case CmdSendMessage + CmdRequestSuffix:
p.Payload = &SendMessage{}
case CmdSendEmote + CmdRequestSuffix:
p.Payload = &SendEmote{}
case CmdSendWhisper + CmdRequestSuffix:
p.Payload = &SendWhisper{}
case CmdKickUser + CmdRequestSuffix:
p.Payload = &KickUser{}
case CmdBanUser + CmdRequestSuffix:
p.Payload = &BanUser{}
case CmdUnbanUser + CmdRequestSuffix:
p.Payload = &UnbanUser{}
case CmdSetModerator + CmdRequestSuffix:
p.Payload = &SetModerator{}
case CmdConnectEvent + CmdRequestSuffix:
p.Payload = &ConnectEvent{}
case CmdDisconnectEvent + CmdRequestSuffix:
p.Payload = &DisconnectEvent{}
case CmdMessageEvent + CmdRequestSuffix:
p.Payload = &MessageEvent{}
case CmdUserUpdateEvent + CmdRequestSuffix:
p.Payload = &UserUpdateEvent{}
case CmdUserLeaveEvent + CmdRequestSuffix:
p.Payload = &UserLeaveEvent{}
default:
p.Payload = &map[string]interface{}{}
}
}
if err := json.Unmarshal(raw.Payload, p.Payload); err != nil {
return nil, err
}
return p, nil
}