64 lines
1.2 KiB
Go
64 lines
1.2 KiB
Go
package lobby
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
)
|
|
|
|
type Event interface {
|
|
LobbyEvent()
|
|
}
|
|
|
|
type PlayerJoin struct {
|
|
ID int
|
|
}
|
|
|
|
func (PlayerJoin) LobbyEvent() {}
|
|
|
|
type PlayerLeave struct {
|
|
ID int
|
|
}
|
|
|
|
func (PlayerLeave) LobbyEvent() {}
|
|
|
|
func ParseEvent(b []byte) (Event, error) {
|
|
var wrapper struct {
|
|
Type string `json:"type"`
|
|
Package string `json:"package"`
|
|
Payload json.RawMessage `json:"payload"`
|
|
}
|
|
if err := json.Unmarshal(b, &wrapper); err != nil {
|
|
return nil, err
|
|
} else if wrapper.Package != "lobby" {
|
|
return nil, nil
|
|
}
|
|
|
|
var e Event
|
|
var err error
|
|
switch wrapper.Type {
|
|
case "lobby.PlayerJoin":
|
|
v := PlayerJoin{}
|
|
err = json.Unmarshal(wrapper.Payload, &v)
|
|
e = v
|
|
case "lobby.PlayerLeave":
|
|
v := PlayerLeave{}
|
|
err = json.Unmarshal(wrapper.Payload, &v)
|
|
e = v
|
|
default:
|
|
return nil, fmt.Errorf("failed to parse event %q", wrapper.Type)
|
|
}
|
|
return e, err
|
|
}
|
|
|
|
func MarshalEvent(e Event) ([]byte, error) {
|
|
var marshalme struct {
|
|
Payload Event `json:"payload"`
|
|
Type string `json:"type"`
|
|
Package string `json:"package"`
|
|
}
|
|
marshalme.Payload = e
|
|
marshalme.Type = fmt.Sprintf("%T", e)
|
|
marshalme.Package = "lobby"
|
|
return json.Marshal(marshalme)
|
|
}
|