bedrocktool/utils/packet_logger.go

71 lines
1.6 KiB
Go

package utils
import (
"bytes"
"net"
"reflect"
"github.com/sandertv/gophertunnel/minecraft/protocol"
"github.com/sandertv/gophertunnel/minecraft/protocol/packet"
"github.com/sirupsen/logrus"
"golang.org/x/exp/slices"
)
var Pool = packet.NewPool()
var muted_packets = []string{
"*packet.UpdateBlock",
"*packet.MoveActorAbsolute",
"*packet.SetActorMotion",
"*packet.SetTime",
"*packet.RemoveActor",
"*packet.AddActor",
"*packet.UpdateAttributes",
"*packet.Interact",
"*packet.LevelEvent",
"*packet.SetActorData",
"*packet.MoveActorDelta",
"*packet.MovePlayer",
"*packet.BlockActorData",
"*packet.PlayerAuthInput",
"*packet.LevelChunk",
"*packet.LevelSoundEvent",
"*packet.ActorEvent",
"*packet.NetworkChunkPublisherUpdate",
"*packet.UpdateSubChunkBlocks",
"*packet.SubChunk",
"*packet.SubChunkRequest",
"*packet.Animate",
"*packet.NetworkStackLatency",
"*packet.InventoryTransaction",
}
func PacketLogger(header packet.Header, payload []byte, src, dst net.Addr) {
var pk packet.Packet
buf := bytes.NewBuffer(payload)
r := protocol.NewReader(buf, 0)
pkFunc, ok := Pool[header.PacketID]
if !ok {
pk = &packet.Unknown{PacketID: header.PacketID}
} else {
pk = pkFunc()
}
pk.Unmarshal(r)
dir := "S->C"
src_addr, _, _ := net.SplitHostPort(src.String())
if IPPrivate(net.ParseIP(src_addr)) {
dir = "C->S"
}
pk_name := reflect.TypeOf(pk).String()
if slices.Contains(muted_packets, pk_name) {
return
}
switch pk := pk.(type) {
case *packet.Disconnect:
logrus.Infof("Disconnect: %s", pk.Message)
}
logrus.Debugf("%s 0x%x, %s\n", dir, pk.ID(), pk_name)
}