diff options
| author | Mistivia <i@mistivia.com> | 2025-11-02 15:27:18 +0800 |
|---|---|---|
| committer | Mistivia <i@mistivia.com> | 2025-11-02 15:27:18 +0800 |
| commit | e9c24f4af7ed56760f6db7941827d09f6db9020b (patch) | |
| tree | 62128c43b883ce5e3148113350978755779bb5de /teleirc/matterbridge/vendor/github.com/Philipp15b/go-steam/protocol/packet.go | |
| parent | 58d5e7cfda4781d8a57ec52aefd02983835c301a (diff) | |
add matterbridge
Diffstat (limited to 'teleirc/matterbridge/vendor/github.com/Philipp15b/go-steam/protocol/packet.go')
| -rw-r--r-- | teleirc/matterbridge/vendor/github.com/Philipp15b/go-steam/protocol/packet.go | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/teleirc/matterbridge/vendor/github.com/Philipp15b/go-steam/protocol/packet.go b/teleirc/matterbridge/vendor/github.com/Philipp15b/go-steam/protocol/packet.go new file mode 100644 index 0000000..d6b2e42 --- /dev/null +++ b/teleirc/matterbridge/vendor/github.com/Philipp15b/go-steam/protocol/packet.go @@ -0,0 +1,116 @@ +package protocol + +import ( + "bytes" + "github.com/golang/protobuf/proto" + "encoding/binary" + "fmt" + . "github.com/Philipp15b/go-steam/protocol/steamlang" +) + +// TODO: Headers are always deserialized twice. + +// Represents an incoming, partially unread message. +type Packet struct { + EMsg EMsg + IsProto bool + TargetJobId JobId + SourceJobId JobId + Data []byte +} + +func NewPacket(data []byte) (*Packet, error) { + var rawEMsg uint32 + err := binary.Read(bytes.NewReader(data), binary.LittleEndian, &rawEMsg) + if err != nil { + return nil, err + } + eMsg := NewEMsg(rawEMsg) + buf := bytes.NewReader(data) + if eMsg == EMsg_ChannelEncryptRequest || eMsg == EMsg_ChannelEncryptResult { + header := NewMsgHdr() + header.Msg = eMsg + err = header.Deserialize(buf) + if err != nil { + return nil, err + } + return &Packet{ + EMsg: eMsg, + IsProto: false, + TargetJobId: JobId(header.TargetJobID), + SourceJobId: JobId(header.SourceJobID), + Data: data, + }, nil + } else if IsProto(rawEMsg) { + header := NewMsgHdrProtoBuf() + header.Msg = eMsg + err = header.Deserialize(buf) + if err != nil { + return nil, err + } + return &Packet{ + EMsg: eMsg, + IsProto: true, + TargetJobId: JobId(header.Proto.GetJobidTarget()), + SourceJobId: JobId(header.Proto.GetJobidSource()), + Data: data, + }, nil + } else { + header := NewExtendedClientMsgHdr() + header.Msg = eMsg + err = header.Deserialize(buf) + if err != nil { + return nil, err + } + return &Packet{ + EMsg: eMsg, + IsProto: false, + TargetJobId: JobId(header.TargetJobID), + SourceJobId: JobId(header.SourceJobID), + Data: data, + }, nil + } +} + +func (p *Packet) String() string { + return fmt.Sprintf("Packet{EMsg = %v, Proto = %v, Len = %v, TargetJobId = %v, SourceJobId = %v}", p.EMsg, p.IsProto, len(p.Data), p.TargetJobId, p.SourceJobId) +} + +func (p *Packet) ReadProtoMsg(body proto.Message) *ClientMsgProtobuf { + header := NewMsgHdrProtoBuf() + buf := bytes.NewBuffer(p.Data) + header.Deserialize(buf) + proto.Unmarshal(buf.Bytes(), body) + return &ClientMsgProtobuf{ // protobuf messages have no payload + Header: header, + Body: body, + } +} + +func (p *Packet) ReadClientMsg(body MessageBody) *ClientMsg { + header := NewExtendedClientMsgHdr() + buf := bytes.NewReader(p.Data) + header.Deserialize(buf) + body.Deserialize(buf) + payload := make([]byte, buf.Len()) + buf.Read(payload) + return &ClientMsg{ + Header: header, + Body: body, + Payload: payload, + } +} + +func (p *Packet) ReadMsg(body MessageBody) *Msg { + header := NewMsgHdr() + buf := bytes.NewReader(p.Data) + header.Deserialize(buf) + body.Deserialize(buf) + payload := make([]byte, buf.Len()) + buf.Read(payload) + return &Msg{ + Header: header, + Body: body, + Payload: payload, + } +} |
