forked from lug/matterbridge
		
	
		
			
				
	
	
		
			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,
 | 
						|
	}))
 | 
						|
}
 |