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,
 | |
| 	}))
 | |
| }
 | 
