80 lines
1.8 KiB
Go
80 lines
1.8 KiB
Go
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,
|
|
}))
|
|
}
|