blob: 9e06dad2b563d47fde09841179d3629c7fc538e2 (
plain) (
tree)
|
|
package steam
import (
"bytes"
. "github.com/Philipp15b/go-steam/protocol"
. "github.com/Philipp15b/go-steam/protocol/gamecoordinator"
. "github.com/Philipp15b/go-steam/protocol/protobuf"
. "github.com/Philipp15b/go-steam/protocol/steamlang"
"github.com/golang/protobuf/proto"
)
type GameCoordinator struct {
client *Client
handlers []GCPacketHandler
}
func newGC(client *Client) *GameCoordinator {
return &GameCoordinator{
client: client,
handlers: make([]GCPacketHandler, 0),
}
}
type GCPacketHandler interface {
HandleGCPacket(*GCPacket)
}
func (g *GameCoordinator) RegisterPacketHandler(handler GCPacketHandler) {
g.handlers = append(g.handlers, handler)
}
func (g *GameCoordinator) HandlePacket(packet *Packet) {
if packet.EMsg != EMsg_ClientFromGC {
return
}
msg := new(CMsgGCClient)
packet.ReadProtoMsg(msg)
p, err := NewGCPacket(msg)
if err != nil {
g.client.Errorf("Error reading GC message: %v", err)
return
}
for _, handler := range g.handlers {
handler.HandleGCPacket(p)
}
}
func (g *GameCoordinator) Write(msg IGCMsg) {
buf := new(bytes.Buffer)
msg.Serialize(buf)
msgType := msg.GetMsgType()
if msg.IsProto() {
msgType = msgType | 0x80000000 // mask with protoMask
}
g.client.Write(NewClientMsgProtobuf(EMsg_ClientToGC, &CMsgGCClient{
Msgtype: proto.Uint32(msgType),
Appid: proto.Uint32(msg.GetAppId()),
Payload: buf.Bytes(),
}))
}
// Sets you in the given games. Specify none to quit all games.
func (g *GameCoordinator) SetGamesPlayed(appIds ...uint64) {
games := make([]*CMsgClientGamesPlayed_GamePlayed, 0)
for _, appId := range appIds {
games = append(games, &CMsgClientGamesPlayed_GamePlayed{
GameId: proto.Uint64(appId),
})
}
g.client.Write(NewClientMsgProtobuf(EMsg_ClientGamesPlayed, &CMsgClientGamesPlayed{
GamesPlayed: games,
}))
}
|