You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
hexmap/server/websocket/client.go

112 lines
3.3 KiB

package websocket
import (
"git.reya.zone/reya/hexmap/server/action"
"go.uber.org/zap/zapcore"
)
// ClientCommandType is an enum type for the client's protocol messages.
type ClientCommandType string
const (
ClientHelloType ClientCommandType = "HELLO"
ClientRefreshType ClientCommandType = "REFRESH"
ClientActType ClientCommandType = "ACT"
ClientGoodbyeType ClientCommandType = GoodbyeType
ClientMalformedCommandType ClientCommandType = "(malformed command)"
)
// ClientCommand s are those sent by the client.
type ClientCommand interface {
zapcore.ObjectMarshaler
// ClientType gives the type constant that will be sent on or read from the wire.
ClientType() ClientCommandType
}
// ClientHello is the command sent by the client when it first establishes the connection.
type ClientHello struct {
// Version is the protocol version the client is running.
Version int `json:"version"`
}
func (c ClientHello) ClientType() ClientCommandType {
return ClientHelloType
}
func (c ClientHello) MarshalLogObject(encoder zapcore.ObjectEncoder) error {
encoder.AddString("type", string(ClientHelloType))
encoder.AddInt("version", c.Version)
return nil
}
// ClientRefresh is the command sent by the client when it needs the full state re-sent.
type ClientRefresh struct {
}
func (c ClientRefresh) ClientType() ClientCommandType {
return ClientRefreshType
}
func (c ClientRefresh) MarshalLogObject(encoder zapcore.ObjectEncoder) error {
encoder.AddString("type", string(ClientRefreshType))
return nil
}
// IDed contains a pair of ID and Action, as sent by the client.
type IDed struct {
// ID contains the arbitrary ID that was sent by the client, for identifying the action in future messages.
ID int `json:"id"`
// Action contains the action that was actually being sent.
Action action.Action `json:"action"`
}
func (i IDed) MarshalLogObject(encoder zapcore.ObjectEncoder) error {
encoder.AddInt("id", i.ID)
return encoder.AddObject("action", i.Action)
}
type IDPairs []IDed
func (a IDPairs) MarshalLogArray(encoder zapcore.ArrayEncoder) error {
var finalErr error = nil
for _, v := range a {
err := encoder.AppendObject(v)
if err != nil && finalErr == nil {
finalErr = err
}
}
return finalErr
}
// ClientAct is a command sent in order to deliver one or more Action actions to the server.
type ClientAct struct {
// Actions contains the actions the client wants to apply, in the order they should be applied.
Actions IDPairs `json:"actions"`
}
func (c ClientAct) ClientType() ClientCommandType {
return ClientActType
}
func (c ClientAct) MarshalLogObject(encoder zapcore.ObjectEncoder) error {
encoder.AddString("type", string(ClientActType))
return encoder.AddArray("actions", c.Actions)
}
// ClientMalformed is synthesized by the reader when it has read a command that does not appear to match the
// protocol.
type ClientMalformed struct {
// Error is the error in parse that caused the reader to be unable to read the message.
Error error
}
func (c ClientMalformed) MarshalLogObject(encoder zapcore.ObjectEncoder) error {
encoder.AddString("type", string(ClientMalformedCommandType))
encoder.AddString("error", c.Error.Error())
return nil
}
func (c ClientMalformed) ClientType() ClientCommandType {
return ClientMalformedCommandType
}