fix wrong skins being saved, save skins immediately

This commit is contained in:
olebeck 2023-03-04 03:25:13 +01:00
parent 5485182135
commit 17572e8e94
3 changed files with 22 additions and 27 deletions

View File

@ -33,7 +33,7 @@ type skinEntry struct {
Type string `json:"type"`
}
func NewSkinPack(name string) *SkinPack {
func NewSkinPack(name, fpath string) *SkinPack {
return &SkinPack{
skins: make(map[uuid.UUID]_skinWithIndex),
Name: name,
@ -100,7 +100,9 @@ func (s *SkinPack) Save(fpath, serverName string) error {
if err != nil {
return err
}
if err := json.NewEncoder(f).Encode(geometryJson); err != nil {
e := json.NewEncoder(f)
e.SetIndent("", "\t")
if err := e.Encode(geometryJson); err != nil {
return err
}
}
@ -110,7 +112,9 @@ func (s *SkinPack) Save(fpath, serverName string) error {
if err != nil {
return err
}
if err := json.NewEncoder(f).Encode(skinsJson); err != nil {
e := json.NewEncoder(f)
e.SetIndent("", "\t")
if err := e.Encode(skinsJson); err != nil {
return err
}
}

View File

@ -49,7 +49,10 @@ func (c *SkinProxyCMD) Execute(ctx context.Context, f *flag.FlagSet, _ ...interf
return 1
}
s := NewSkinsSession(proxy, hostname)
outPathBase := fmt.Sprintf("skins/%s", hostname)
os.MkdirAll(outPathBase, 0o755)
s := NewSkinsSession(proxy, hostname, outPathBase)
s.OnlyIfHasGeometry = c.only_with_geometry
s.PlayerNameFilter = c.filter
@ -64,9 +67,6 @@ func (c *SkinProxyCMD) Execute(ctx context.Context, f *flag.FlagSet, _ ...interf
logrus.Error(err)
}
outPathBase := fmt.Sprintf("skins/%s", hostname)
os.MkdirAll(outPathBase, 0o755)
s.Save(outPathBase)
return 0
}

View File

@ -36,15 +36,17 @@ type skinsSession struct {
OnlyIfHasGeometry bool
ServerName string
Proxy *utils.ProxyContext
fpath string
playerSkinPacks map[uuid.UUID]*SkinPack
playerNames map[uuid.UUID]string
}
func NewSkinsSession(proxy *utils.ProxyContext, serverName string) *skinsSession {
func NewSkinsSession(proxy *utils.ProxyContext, serverName, fpath string) *skinsSession {
return &skinsSession{
ServerName: serverName,
Proxy: proxy,
fpath: fpath,
playerSkinPacks: make(map[uuid.UUID]*SkinPack),
playerNames: make(map[uuid.UUID]string),
@ -57,7 +59,7 @@ func (s *skinsSession) AddPlayerSkin(playerID uuid.UUID, playerName string, skin
creating := fmt.Sprintf("Creating Skinpack for %s", playerName)
s.Proxy.SendPopup(creating)
logrus.Info(creating)
p = NewSkinPack(playerName)
p = NewSkinPack(playerName, s.fpath)
s.playerSkinPacks[playerID] = p
}
if p.AddSkin(skin) {
@ -67,6 +69,9 @@ func (s *skinsSession) AddPlayerSkin(playerID uuid.UUID, playerName string, skin
logrus.Info(added)
}
}
if err := p.Save(path.Join(s.fpath, playerName), s.ServerName); err != nil {
logrus.Error(err)
}
}
func (s *skinsSession) AddSkin(playerName string, playerID uuid.UUID, playerSkin *protocol.Skin) {
@ -90,8 +95,6 @@ func (s *skinsSession) AddSkin(playerName string, playerID uuid.UUID, playerSkin
func (s *skinsSession) ProcessPacket(pk packet.Packet) {
switch pk := pk.(type) {
case *packet.PlayerSkin:
s.AddSkin("", pk.UUID, &pk.Skin)
case *packet.PlayerList:
if pk.ActionType == 1 { // remove
return
@ -106,17 +109,6 @@ func (s *skinsSession) ProcessPacket(pk packet.Packet) {
}
}
func (s *skinsSession) Save(fpath string) error {
logrus.Infof("Saving %d players", len(s.playerSkinPacks))
for id, sp := range s.playerSkinPacks {
err := sp.Save(path.Join(fpath, s.playerNames[id]), s.ServerName)
if err != nil {
logrus.Warn(err)
}
}
return nil
}
type SkinCMD struct {
serverAddress string
filter string
@ -153,7 +145,10 @@ func (c *SkinCMD) Execute(ctx context.Context, f *flag.FlagSet, _ ...interface{}
return true
}
s := NewSkinsSession(proxy, hostname)
outPathBase := fmt.Sprintf("skins/%s", hostname)
os.MkdirAll(outPathBase, 0o755)
s := NewSkinsSession(proxy, hostname, outPathBase)
proxy.PacketCB = func(pk packet.Packet, _ *utils.ProxyContext, toServer bool, _ time.Time) (packet.Packet, error) {
if !toServer {
@ -165,10 +160,6 @@ func (c *SkinCMD) Execute(ctx context.Context, f *flag.FlagSet, _ ...interface{}
err = proxy.Run(ctx, address)
if err != nil {
logrus.Error(err)
} else {
outPathBase := fmt.Sprintf("skins/%s", hostname)
os.MkdirAll(outPathBase, 0o755)
s.Save(outPathBase)
}
return 0
}