Skip to content

Commit

Permalink
Add players list
Browse files Browse the repository at this point in the history
  • Loading branch information
egor-erm committed Oct 25, 2024
1 parent 21635b9 commit 1adfd02
Show file tree
Hide file tree
Showing 5 changed files with 105 additions and 9 deletions.
6 changes: 6 additions & 0 deletions players.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"2535421762930933": {
"Identity": "ad63c8db-84bb-3542-b40b-37308563317b",
"SelfSignedID": "903f688f-6710-30da-b641-6ed0c2a4bd59"
}
}
4 changes: 3 additions & 1 deletion proxy/player/human/human.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (

"github.com/go-gl/mathgl/mgl32"
"github.com/sandertv/gophertunnel/minecraft"
"github.com/sandertv/gophertunnel/minecraft/protocol/login"
"github.com/sandertv/gophertunnel/minecraft/protocol/packet"

"github.com/sandertv/gophertunnel/minecraft/protocol"
Expand Down Expand Up @@ -53,7 +54,8 @@ type Human interface {
}

type HumanManager interface {
AddPlayer(*minecraft.Conn, *minecraft.Conn) Human
AddPlayer(*minecraft.Conn, *minecraft.Conn, login.ClientData) Human
ProcessingPlayerData(*login.ClientData, *login.IdentityData)
DeletePlayer(Human)
DeleteAll()
GetPlayer(string) Human
Expand Down
92 changes: 88 additions & 4 deletions proxy/player/manager/player_manager.go
Original file line number Diff line number Diff line change
@@ -1,30 +1,114 @@
package manager

import (
"encoding/json"
"math"
"os"
"strings"
"sync"

"github.com/HyPE-Network/vanilla-proxy/log"
"github.com/HyPE-Network/vanilla-proxy/proxy/player"
"github.com/HyPE-Network/vanilla-proxy/proxy/player/human"
"github.com/HyPE-Network/vanilla-proxy/proxy/session"

"github.com/sandertv/gophertunnel/minecraft"
"github.com/sandertv/gophertunnel/minecraft/protocol/login"
)

type PlayerManager struct {
Players map[string]human.Human
mu sync.Mutex
Players map[string]human.Human
PlayersIdentityData map[string]IdentityData
}

type IdentityData struct {
Identity, SelfSignedID string
}

func NewPlayerManager() *PlayerManager {
playersIdentityData := make(map[string]IdentityData)
if _, err := os.Stat("players.json"); os.IsNotExist(err) {
f, err := os.Create("players.json")
if err != nil {
log.Logger.Fatalf("error creating players file: %v", err)
}
data, err := json.Marshal(playersIdentityData)
if err != nil {
log.Logger.Fatalf("error encoding default players: %v", err)
}
if _, err := f.Write(data); err != nil {
log.Logger.Fatalf("error writing encoded default players: %v", err)
}
f.Close()
} else {
players, err := os.OpenFile("players.json", os.O_RDWR|os.O_CREATE, 0644)
if err != nil {
log.Logger.Fatalf("error start open players file: %v", err)
} else {
info, err := players.Stat()
if err != nil {
log.Logger.Errorf("error stating playerlist file: %v", err)
} else {
data := make([]byte, info.Size())
_, err = players.Read(data)
if err != nil {
log.Logger.Fatalf("error reading players file: %v", err)
} else {
err = json.Unmarshal(data, &playersIdentityData)
if err != nil {
log.Logger.Fatalf("error unmarshal players file: %v", err)
}
}
}
}
}

return &PlayerManager{
Players: make(map[string]human.Human),
Players: make(map[string]human.Human),
PlayersIdentityData: playersIdentityData,
}
}

func (pm *PlayerManager) ProcessingPlayerData(cd *login.ClientData, idata *login.IdentityData) {
if idata.XUID == "" {
return
}

if pld, ok := pm.PlayersIdentityData[idata.XUID]; ok {
cd.SelfSignedID = pld.SelfSignedID
idata.Identity = pld.Identity
} else {
pld := IdentityData{
SelfSignedID: cd.SelfSignedID,
Identity: idata.Identity,
}

pm.PlayersIdentityData[idata.XUID] = pld

pm.mu.Lock()
defer pm.mu.Unlock()

players, err := os.OpenFile("players.json", os.O_RDWR|os.O_CREATE, 0644)
if err != nil {
log.Logger.Fatalf("error open players file: %v", err)
} else {
js, err := json.MarshalIndent(pm.PlayersIdentityData, "", " ")
if err != nil {
log.Logger.Fatalf("error open players file: %v", err)
} else {
_, err := players.Write(js)
if err != nil {
log.Logger.Fatalf("error write players file: %v", err)
}
}
}
}
}

func (pm *PlayerManager) AddPlayer(conn *minecraft.Conn, serverConn *minecraft.Conn) human.Human {
func (pm *PlayerManager) AddPlayer(conn *minecraft.Conn, serverConn *minecraft.Conn, cd login.ClientData) human.Human {
ab := session.NewBridge(conn, serverConn)
newSession := session.NewSession(conn.IdentityData(), conn.ClientData(), ab)
newSession := session.NewSession(conn.IdentityData(), cd, ab)
var pl human.Human = player.NewPlayer(conn.IdentityData().DisplayName, newSession, conn.GameData())

pm.Players[conn.IdentityData().DisplayName] = pl
Expand Down
10 changes: 7 additions & 3 deletions proxy/proxy.go
Original file line number Diff line number Diff line change
Expand Up @@ -136,10 +136,14 @@ func (arg *Proxy) handleConn(conn *minecraft.Conn) {
return
}

cd := conn.ClientData()
idata := conn.IdentityData()
arg.PlayerManager.ProcessingPlayerData(&cd, &idata)

serverConn, err := minecraft.Dialer{
KeepXBLIdentityData: true,
ClientData: conn.ClientData(),
IdentityData: conn.IdentityData(),
ClientData: cd,
IdentityData: idata,
}.Dial("raknet", arg.Config.Connection.RemoteAddress)

if err != nil {
Expand Down Expand Up @@ -182,7 +186,7 @@ func (arg *Proxy) handleConn(conn *minecraft.Conn) {
}
}

pl := arg.PlayerManager.AddPlayer(conn, serverConn)
pl := arg.PlayerManager.AddPlayer(conn, serverConn, cd)
log.Logger.Infoln(pl.GetName(), "joined the server")

go func() { // client-proxy
Expand Down
2 changes: 1 addition & 1 deletion utils/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ func ReadConfig() Config {
if _, err := f.Write(data); err != nil {
log.Fatalf("error writing encoded default config: %v", err)
}
_ = f.Close()
f.Close()
}

data, err := os.ReadFile("config.toml")
Expand Down

0 comments on commit 1adfd02

Please sign in to comment.