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/room/message.go

147 lines
4.4 KiB

package room
import (
"github.com/rs/xid"
"go.uber.org/zap/zapcore"
"hexmap-server/action"
"hexmap-server/state"
)
// Message marks messages going to clients from the room.
type Message interface {
zapcore.ObjectMarshaler
// RoomID marks the ID of the room this Message originated from, in case the Client has a shared IncomingChannel.
RoomID() xid.ID
}
// JoinResponse is the message sent by the room on a new client's IncomingChannel after it joins.
type JoinResponse struct {
id xid.ID
// currentState is a pointer to a copy of the room's current state.
// If the client refused the room state in its join message, this will be a nil pointer instead.
currentState *state.Synced
}
func (j JoinResponse) MarshalLogObject(encoder zapcore.ObjectEncoder) error {
encoder.AddString("type", "JoinResponse")
encoder.AddString("id", j.id.String())
return encoder.AddObject("currentState", j.currentState)
}
func (j JoinResponse) RoomID() xid.ID {
return j.id
}
// CurrentState returns the state of the room as of when the JoinRequest was processed.
func (j JoinResponse) CurrentState() *state.Synced {
return j.currentState
}
// RefreshResponse is the message sent by the room after a client requests it, or immediately on join.
type RefreshResponse struct {
id xid.ID
// currentState is a pointer to a copy of the room's current state.
currentState *state.Synced
}
func (r RefreshResponse) MarshalLogObject(encoder zapcore.ObjectEncoder) error {
encoder.AddString("type", "JoinResponse")
encoder.AddString("id", r.id.String())
return encoder.AddObject("currentState", r.currentState)
}
func (r RefreshResponse) RoomID() xid.ID {
return r.id
}
// CurrentState returns the state of the room as of when the RefreshRequest was processed.
func (r RefreshResponse) CurrentState() *state.Synced {
return r.currentState
}
// ApplyResponse returns the result of an action to _only_ the one that sent the ApplyRequest.
type ApplyResponse struct {
id xid.ID
// actionID is the ID of the action that completed or failed.
actionID int
// result is nil if the action was completed, or an error if it failed.
result error
}
func (a ApplyResponse) MarshalLogObject(encoder zapcore.ObjectEncoder) error {
encoder.AddString("type", "ApplyResponse")
encoder.AddString("id", a.id.String())
encoder.AddInt("actionId", a.actionID)
encoder.AddBool("success", a.result == nil)
if a.result != nil {
encoder.AddString("failure", a.result.Error())
}
return nil
}
func (a ApplyResponse) RoomID() xid.ID {
return a.id
}
// Success returns true if the action succeeded, false if it failed.
func (a ApplyResponse) Success() bool {
return a.result == nil
}
// Failure returns the error if the action failed, or nil if it succeeded.
func (a ApplyResponse) Failure() error {
return a.result
}
// ActionBroadcast is sent to all clients _other_ than the one that sent the ApplyRequest when an action succeeds.
type ActionBroadcast struct {
id xid.ID
// originalClientID is the client that sent the action in the first place.
originalClientID xid.ID
// originalActionID is the ID that the client that sent the action sent.
originalActionID int
// action is the action that succeeded.
action action.Syncable
}
func (a ActionBroadcast) MarshalLogObject(encoder zapcore.ObjectEncoder) error {
encoder.AddString("type", "ActionBroadcast")
encoder.AddString("id", a.id.String())
encoder.AddString("originalClientId", a.originalClientID.String())
encoder.AddInt("originalActionId", a.originalActionID)
return encoder.AddObject("action", a.action)
}
func (a ActionBroadcast) RoomID() xid.ID {
return a.id
}
// LeaveResponse is the message sent by the room when it has accepted that a client has left, and will send it no further messages.
type LeaveResponse struct {
id xid.ID
}
func (l LeaveResponse) MarshalLogObject(encoder zapcore.ObjectEncoder) error {
encoder.AddString("type", "LeaveResponse")
encoder.AddString("id", l.id.String())
return nil
}
func (l LeaveResponse) RoomID() xid.ID {
return l.id
}
// ShutdownRequest is the message sent by the room when something causes it to shut down. It will send the client no further messages except a possible LeaveResponse.
type ShutdownRequest struct {
id xid.ID
}
func (s ShutdownRequest) MarshalLogObject(encoder zapcore.ObjectEncoder) error {
encoder.AddString("type", "ShutdownRequest")
encoder.AddString("id", s.id.String())
return nil
}
func (s ShutdownRequest) RoomID() xid.ID {
return s.id
}