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

93 lines
2.6 KiB

package websocket
import (
"git.reya.zone/reya/hexmap/server/action"
"go.uber.org/zap/zapcore"
)
// ClientMessageType is an enum type for the client's protocol messages.
type ClientMessageType string
const (
ClientHelloType ClientMessageType = "HELLO"
ClientRefreshType ClientMessageType = "REFRESH"
ClientActType ClientMessageType = "ACT"
ClientGoodbyeType ClientMessageType = GoodbyeType
)
// ClientMessage s are those sent by the client.
type ClientMessage interface {
zapcore.ObjectMarshaler
// ClientType gives the type constant that will be sent on or read from the wire.
ClientType() ClientMessageType
}
// ClientHello is the action 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() ClientMessageType {
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 action sent by the client when it needs the full state re-sent.
type ClientRefresh struct {
}
func (c ClientRefresh) ClientType() ClientMessageType {
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.Syncable `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 an action sent in order to deliver one or more Syncable 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() ClientMessageType {
return ClientActType
}
func (c ClientAct) MarshalLogObject(encoder zapcore.ObjectEncoder) error {
encoder.AddString("type", string(ClientActType))
return encoder.AddArray("actions", c.Actions)
}