222 lines
4.4 KiB
Go
222 lines
4.4 KiB
Go
package protocol
|
|
|
|
import (
|
|
"github.com/golang/protobuf/proto"
|
|
. "github.com/Philipp15b/go-steam/protocol/steamlang"
|
|
. "github.com/Philipp15b/go-steam/steamid"
|
|
"io"
|
|
)
|
|
|
|
// Interface for all messages, typically outgoing. They can also be created by
|
|
// using the Read* methods in a PacketMsg.
|
|
type IMsg interface {
|
|
Serializer
|
|
IsProto() bool
|
|
GetMsgType() EMsg
|
|
GetTargetJobId() JobId
|
|
SetTargetJobId(JobId)
|
|
GetSourceJobId() JobId
|
|
SetSourceJobId(JobId)
|
|
}
|
|
|
|
// Interface for client messages, i.e. messages that are sent after logging in.
|
|
// ClientMsgProtobuf and ClientMsg implement this.
|
|
type IClientMsg interface {
|
|
IMsg
|
|
GetSessionId() int32
|
|
SetSessionId(int32)
|
|
GetSteamId() SteamId
|
|
SetSteamId(SteamId)
|
|
}
|
|
|
|
// Represents a protobuf backed client message with session data.
|
|
type ClientMsgProtobuf struct {
|
|
Header *MsgHdrProtoBuf
|
|
Body proto.Message
|
|
}
|
|
|
|
func NewClientMsgProtobuf(eMsg EMsg, body proto.Message) *ClientMsgProtobuf {
|
|
hdr := NewMsgHdrProtoBuf()
|
|
hdr.Msg = eMsg
|
|
return &ClientMsgProtobuf{
|
|
Header: hdr,
|
|
Body: body,
|
|
}
|
|
}
|
|
|
|
func (c *ClientMsgProtobuf) IsProto() bool {
|
|
return true
|
|
}
|
|
|
|
func (c *ClientMsgProtobuf) GetMsgType() EMsg {
|
|
return NewEMsg(uint32(c.Header.Msg))
|
|
}
|
|
|
|
func (c *ClientMsgProtobuf) GetSessionId() int32 {
|
|
return c.Header.Proto.GetClientSessionid()
|
|
}
|
|
|
|
func (c *ClientMsgProtobuf) SetSessionId(session int32) {
|
|
c.Header.Proto.ClientSessionid = &session
|
|
}
|
|
|
|
func (c *ClientMsgProtobuf) GetSteamId() SteamId {
|
|
return SteamId(c.Header.Proto.GetSteamid())
|
|
}
|
|
|
|
func (c *ClientMsgProtobuf) SetSteamId(s SteamId) {
|
|
c.Header.Proto.Steamid = proto.Uint64(uint64(s))
|
|
}
|
|
|
|
func (c *ClientMsgProtobuf) GetTargetJobId() JobId {
|
|
return JobId(c.Header.Proto.GetJobidTarget())
|
|
}
|
|
|
|
func (c *ClientMsgProtobuf) SetTargetJobId(job JobId) {
|
|
c.Header.Proto.JobidTarget = proto.Uint64(uint64(job))
|
|
}
|
|
|
|
func (c *ClientMsgProtobuf) GetSourceJobId() JobId {
|
|
return JobId(c.Header.Proto.GetJobidSource())
|
|
}
|
|
|
|
func (c *ClientMsgProtobuf) SetSourceJobId(job JobId) {
|
|
c.Header.Proto.JobidSource = proto.Uint64(uint64(job))
|
|
}
|
|
|
|
func (c *ClientMsgProtobuf) Serialize(w io.Writer) error {
|
|
err := c.Header.Serialize(w)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
body, err := proto.Marshal(c.Body)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
_, err = w.Write(body)
|
|
return err
|
|
}
|
|
|
|
// Represents a struct backed client message.
|
|
type ClientMsg struct {
|
|
Header *ExtendedClientMsgHdr
|
|
Body MessageBody
|
|
Payload []byte
|
|
}
|
|
|
|
func NewClientMsg(body MessageBody, payload []byte) *ClientMsg {
|
|
hdr := NewExtendedClientMsgHdr()
|
|
hdr.Msg = body.GetEMsg()
|
|
return &ClientMsg{
|
|
Header: hdr,
|
|
Body: body,
|
|
Payload: payload,
|
|
}
|
|
}
|
|
|
|
func (c *ClientMsg) IsProto() bool {
|
|
return true
|
|
}
|
|
|
|
func (c *ClientMsg) GetMsgType() EMsg {
|
|
return c.Header.Msg
|
|
}
|
|
|
|
func (c *ClientMsg) GetSessionId() int32 {
|
|
return c.Header.SessionID
|
|
}
|
|
|
|
func (c *ClientMsg) SetSessionId(session int32) {
|
|
c.Header.SessionID = session
|
|
}
|
|
|
|
func (c *ClientMsg) GetSteamId() SteamId {
|
|
return c.Header.SteamID
|
|
}
|
|
|
|
func (c *ClientMsg) SetSteamId(s SteamId) {
|
|
c.Header.SteamID = s
|
|
}
|
|
|
|
func (c *ClientMsg) GetTargetJobId() JobId {
|
|
return JobId(c.Header.TargetJobID)
|
|
}
|
|
|
|
func (c *ClientMsg) SetTargetJobId(job JobId) {
|
|
c.Header.TargetJobID = uint64(job)
|
|
}
|
|
|
|
func (c *ClientMsg) GetSourceJobId() JobId {
|
|
return JobId(c.Header.SourceJobID)
|
|
}
|
|
|
|
func (c *ClientMsg) SetSourceJobId(job JobId) {
|
|
c.Header.SourceJobID = uint64(job)
|
|
}
|
|
|
|
func (c *ClientMsg) Serialize(w io.Writer) error {
|
|
err := c.Header.Serialize(w)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
err = c.Body.Serialize(w)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
_, err = w.Write(c.Payload)
|
|
return err
|
|
}
|
|
|
|
type Msg struct {
|
|
Header *MsgHdr
|
|
Body MessageBody
|
|
Payload []byte
|
|
}
|
|
|
|
func NewMsg(body MessageBody, payload []byte) *Msg {
|
|
hdr := NewMsgHdr()
|
|
hdr.Msg = body.GetEMsg()
|
|
return &Msg{
|
|
Header: hdr,
|
|
Body: body,
|
|
Payload: payload,
|
|
}
|
|
}
|
|
|
|
func (m *Msg) GetMsgType() EMsg {
|
|
return m.Header.Msg
|
|
}
|
|
|
|
func (m *Msg) IsProto() bool {
|
|
return false
|
|
}
|
|
|
|
func (m *Msg) GetTargetJobId() JobId {
|
|
return JobId(m.Header.TargetJobID)
|
|
}
|
|
|
|
func (m *Msg) SetTargetJobId(job JobId) {
|
|
m.Header.TargetJobID = uint64(job)
|
|
}
|
|
|
|
func (m *Msg) GetSourceJobId() JobId {
|
|
return JobId(m.Header.SourceJobID)
|
|
}
|
|
|
|
func (m *Msg) SetSourceJobId(job JobId) {
|
|
m.Header.SourceJobID = uint64(job)
|
|
}
|
|
|
|
func (m *Msg) Serialize(w io.Writer) error {
|
|
err := m.Header.Serialize(w)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
err = m.Body.Serialize(w)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
_, err = w.Write(m.Payload)
|
|
return err
|
|
}
|