updating dependencies, adding translation support

This commit is contained in:
olebeck 2023-01-23 13:40:12 +01:00
parent d0ecf1c261
commit 47f85f78b3
21 changed files with 452 additions and 221 deletions

View File

@ -11,6 +11,7 @@ import (
"strings"
"syscall"
"github.com/bedrock-tool/bedrocktool/locale"
"github.com/bedrock-tool/bedrocktool/utils"
_ "github.com/bedrock-tool/bedrocktool/subcommands"
@ -24,19 +25,16 @@ import (
func main() {
defer func() {
if err := recover(); err != nil {
logrus.Errorf("Fatal Error occurred.")
logrus.Errorf(locale.Loc("fatal_error", nil))
println("")
println("--COPY FROM HERE--")
logrus.Infof("Version: %s", utils.Version)
logrus.Infof("Cmdline: %s", os.Args)
logrus.Errorf("Error: %s", err)
fmt.Println("stacktrace from panic: \n" + string(debug.Stack()))
println("stacktrace from panic: \n" + string(debug.Stack()))
println("--END COPY HERE--")
println("")
println("if you want to report this error, please open an issue at")
println("https://github.com/bedrock-tool/bedrocktool/issues")
println("And attach the error info, describe what you did to get this error.")
println("Thanks!\n")
println(locale.Loc("report_issue", nil))
if utils.G_interactive {
input := bufio.NewScanner(os.Stdin)
input.Scan()
@ -47,7 +45,7 @@ func main() {
logrus.SetLevel(logrus.DebugLevel)
if utils.Version != "" {
logrus.Infof("bedrocktool version: %s", utils.Version)
logrus.Infof(locale.Loc("bedrocktool_version", locale.Strmap{"Version": utils.Version}))
}
newVersion, err := utils.Updater.UpdateAvailable()
@ -56,14 +54,14 @@ func main() {
}
if newVersion != "" && utils.Version != "" {
logrus.Infof("Update Available: %s", newVersion)
logrus.Infof(locale.Loc("update_available", locale.Strmap{"Version": newVersion}))
}
ctx, cancel := context.WithCancel(context.Background())
flag.BoolVar(&utils.G_debug, "debug", false, "debug mode")
flag.BoolVar(&utils.G_preload_packs, "preload", false, "preload resourcepacks for proxy")
enable_dns := flag.Bool("dns", false, "enable dns server for consoles")
flag.BoolVar(&utils.G_debug, "debug", false, locale.Loc("debug_mode", nil))
flag.BoolVar(&utils.G_preload_packs, "preload", false, locale.Loc("preload_packs", nil))
enable_dns := flag.Bool("dns", false, locale.Loc("enable_dns", nil))
subcommands.Register(subcommands.HelpCommand(), "")
subcommands.ImportantFlag("debug")
@ -77,13 +75,13 @@ func main() {
case <-ctx.Done():
return
default:
fmt.Println("Available commands:")
fmt.Println(locale.Loc("available_commands", nil))
for name, desc := range utils.ValidCMDs {
fmt.Printf("\t%s\t%s\n", name, desc)
}
fmt.Printf("Use '%s <command>' to run a command\n", os.Args[0])
fmt.Println(locale.Loc("use_to_run_command", nil))
cmd, cancelled := utils.User_input(ctx, "Input Command: ")
cmd, cancelled := utils.User_input(ctx, locale.Loc("input_command", nil))
if cancelled {
return
}
@ -112,7 +110,7 @@ func main() {
subcommands.Execute(ctx)
if utils.G_interactive {
logrus.Info("Press Enter to exit.")
logrus.Info(locale.Loc("enter_to_exit", nil))
input := bufio.NewScanner(os.Stdin)
input.Scan()
}
@ -126,7 +124,7 @@ func (*TransCMD) Name() string { return "trans" }
func (*TransCMD) Synopsis() string { return "" }
func (c *TransCMD) SetFlags(f *flag.FlagSet) {
f.BoolVar(&c.auth, "auth", false, "if it should login to xbox")
f.BoolVar(&c.auth, "auth", false, locale.Loc("should_login_xbox", nil))
}
func (c *TransCMD) Usage() string {

42
go.mod
View File

@ -3,52 +3,58 @@ module github.com/bedrock-tool/bedrocktool
go 1.19
//replace github.com/sandertv/gophertunnel => ./gophertunnel
replace github.com/sandertv/gophertunnel => github.com/olebeck/gophertunnel v1.26.1
replace github.com/sandertv/gophertunnel => github.com/olebeck/gophertunnel v1.26.2
//replace github.com/df-mc/dragonfly => ./dragonfly
replace github.com/df-mc/dragonfly => github.com/olebeck/dragonfly v0.8.10-1
replace github.com/df-mc/dragonfly => github.com/olebeck/dragonfly v0.9.1-1
require (
github.com/df-mc/dragonfly v0.8.5
github.com/cloudfoundry-attic/jibber_jabber v0.0.0-20151120183258-bcc4c8345a21
github.com/df-mc/dragonfly v0.9.1
github.com/df-mc/goleveldb v1.1.9
github.com/fatih/color v1.13.0
github.com/flytam/filenamify v1.1.1
github.com/flytam/filenamify v1.1.2
github.com/go-gl/mathgl v1.0.0
github.com/google/subcommands v1.2.0
github.com/google/uuid v1.3.0
github.com/jinzhu/copier v0.3.5
github.com/miekg/dns v1.1.50
github.com/nicksnyder/go-i18n/v2 v2.2.1
github.com/sanbornm/go-selfupdate v0.0.0-20210106163404-c9b625feac49
github.com/sandertv/gophertunnel v1.26.0
github.com/sirupsen/logrus v1.9.0
golang.design/x/lockfree v0.0.1
golang.org/x/exp v0.0.0-20220930202632-ec3f01382ef9
golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1
golang.org/x/exp v0.0.0-20230113213754-f9f960f08ad4
golang.org/x/image v0.3.0
golang.org/x/oauth2 v0.4.0
golang.org/x/text v0.6.0
gopkg.in/yaml.v3 v3.0.1
)
require (
github.com/brentp/intintmap v0.0.0-20190211203843-30dc0ade9af9 // indirect
github.com/changkun/lockfree v0.0.1 // indirect
github.com/cloudfoundry/jibber_jabber v0.0.0-20151120183258-bcc4c8345a21 // indirect
github.com/df-mc/atomic v1.10.0 // indirect
github.com/golang/protobuf v1.5.2 // indirect
github.com/golang/snappy v0.0.4 // indirect
github.com/google/uuid v1.3.0
github.com/jinzhu/copier v0.3.5
github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 // indirect
github.com/klauspost/compress v1.15.11 // indirect
github.com/klauspost/compress v1.15.14 // indirect
github.com/kr/binarydist v0.1.0 // indirect
github.com/kr/pretty v0.1.0 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.16 // indirect
github.com/mattn/go-isatty v0.0.17 // indirect
github.com/muhammadmuzzammil1998/jsonc v1.0.0 // indirect
github.com/sandertv/go-raknet v1.12.0 // indirect
github.com/sirupsen/logrus v1.9.0
go.uber.org/atomic v1.10.0 // indirect
golang.org/x/crypto v0.0.0-20220926161630-eccd6366d1be // indirect
golang.org/x/image v0.0.0-20220902085622-e7cb96979f69
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect
golang.org/x/net v0.0.0-20220930213112-107f3e3c3b0b // indirect
golang.org/x/sys v0.0.0-20220928140112-f11e5e49a4ec // indirect
golang.org/x/text v0.3.7 // indirect
golang.org/x/tools v0.1.12 // indirect
golang.org/x/crypto v0.5.0 // indirect
golang.org/x/mod v0.7.0 // indirect
golang.org/x/net v0.5.0 // indirect
golang.org/x/sys v0.4.0 // indirect
golang.org/x/tools v0.5.0 // indirect
google.golang.org/appengine v1.6.7 // indirect
google.golang.org/protobuf v1.28.1 // indirect
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect
gopkg.in/inconshreveable/go-update.v0 v0.0.0-20150814200126-d8b0b1d421aa // indirect
gopkg.in/square/go-jose.v2 v2.6.0 // indirect
)

95
go.sum
View File

@ -1,7 +1,13 @@
github.com/BurntSushi/toml v1.0.0 h1:dtDWrepsVPfW9H/4y7dDgFc2MBUSeJhlaDtK13CxFlU=
github.com/BurntSushi/toml v1.0.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
github.com/brentp/intintmap v0.0.0-20190211203843-30dc0ade9af9 h1:/G0ghZwrhou0Wq21qc1vXXMm/t/aKWkALWwITptKbE0=
github.com/brentp/intintmap v0.0.0-20190211203843-30dc0ade9af9/go.mod h1:TOk10ahXejq9wkEaym3KPRNeuR/h5Jx+s8QRWIa2oTM=
github.com/changkun/lockfree v0.0.1 h1:5WefVJLglY4IHRqOQmh6Ao6wkJYaJkarshKU8VUtId4=
github.com/changkun/lockfree v0.0.1/go.mod h1:3bKiaXn/iNzIPlSvSOMSVbRQUQtAp8qUAyBUtzU11s4=
github.com/cloudfoundry-attic/jibber_jabber v0.0.0-20151120183258-bcc4c8345a21 h1:Yg2hDs4b13Evkpj42FU2idX2cVXVFqQSheXYKM86Qsk=
github.com/cloudfoundry-attic/jibber_jabber v0.0.0-20151120183258-bcc4c8345a21/go.mod h1:MgJyK38wkzZbiZSKeIeFankxxSA8gayko/nr5x5bgBA=
github.com/cloudfoundry/jibber_jabber v0.0.0-20151120183258-bcc4c8345a21 h1:tuijfIjZyjZaHq9xDUh0tNitwXshJpbLkqMOJv4H3do=
github.com/cloudfoundry/jibber_jabber v0.0.0-20151120183258-bcc4c8345a21/go.mod h1:po7NpZ/QiTKzBKyrsEAxwnTamCoh8uDk/egRpQ7siIc=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@ -11,8 +17,8 @@ github.com/df-mc/goleveldb v1.1.9 h1:ihdosZyy5jkQKrxucTQmN90jq/2lUwQnJZjIYIC/9YU
github.com/df-mc/goleveldb v1.1.9/go.mod h1:+NHCup03Sci5q84APIA21z3iPZCuk6m6ABtg4nANCSk=
github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=
github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
github.com/flytam/filenamify v1.1.1 h1:508gP8QR6vtbv46S3oz2ob9l7JGFdDFfqqMeh/TwzTk=
github.com/flytam/filenamify v1.1.1/go.mod h1:Dzf9kVycwcsBlr2ATg6uxjqiFgKGH+5SKFuhdeP5zu8=
github.com/flytam/filenamify v1.1.2 h1:dGlfWU4zrhDlsmvob4IFcfgjG5vIjfo4UwLyec6Wx94=
github.com/flytam/filenamify v1.1.2/go.mod h1:Dzf9kVycwcsBlr2ATg6uxjqiFgKGH+5SKFuhdeP5zu8=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/go-gl/mathgl v1.0.0 h1:t9DznWJlXxxjeeKLIdovCOVJQk/GzDEL7h/h+Ro2B68=
github.com/go-gl/mathgl v1.0.0/go.mod h1:yhpkQzEiH9yPyxDUGzkmgScbaBVlhC06qodikEM0ZwQ=
@ -37,35 +43,33 @@ github.com/jinzhu/copier v0.3.5/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S
github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 h1:iQTw/8FWTuc7uiaSepXwyf3o52HaUYcV+Tu66S3F5GA=
github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8=
github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
github.com/klauspost/compress v1.15.11 h1:Lcadnb3RKGin4FYM/orgq0qde+nc15E5Cbqg4B9Sx9c=
github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM=
github.com/klauspost/compress v1.15.12 h1:YClS/PImqYbn+UILDnqxQCZ3RehC9N318SU3kElDUEM=
github.com/klauspost/compress v1.15.12/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM=
github.com/klauspost/compress v1.15.14 h1:i7WCKDToww0wA+9qrUZ1xOjp218vfFo3nTU6UHp+gOc=
github.com/klauspost/compress v1.15.14/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM=
github.com/kr/binarydist v0.1.0 h1:6kAoLA9FMMnNGSehX0s1PdjbEaACznAv/W219j2uvyo=
github.com/kr/binarydist v0.1.0/go.mod h1:DY7S//GCoz1BCd0B0EVrinCKAZN3pXe+MDaIZbXQVgM=
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ=
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng=
github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
github.com/miekg/dns v1.1.50 h1:DQUfb9uc6smULcREF09Uc+/Gd46YWqJd5DbpPE9xkcA=
github.com/miekg/dns v1.1.50/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME=
github.com/muhammadmuzzammil1998/jsonc v1.0.0 h1:8o5gBQn4ZA3NBA9DlTujCj2a4w0tqWrPVjDwhzkgTIs=
github.com/muhammadmuzzammil1998/jsonc v1.0.0/go.mod h1:saF2fIVw4banK0H4+/EuqfFLpRnoy5S+ECwTOCcRcSU=
github.com/olebeck/dragonfly v0.8.5-1 h1:+z1WO0W4jCc1jcPMGDz85AxLWz59haEakD0yAVEXeWQ=
github.com/olebeck/dragonfly v0.8.5-1/go.mod h1:CHQ21j4LjSwHgUeMk06tcxEW6U+SI7avLCUeSvp9AXo=
github.com/olebeck/dragonfly v0.8.10-1 h1:oMeCcyoKfb9xEDxxbKM6YyUPlK/R8wix/zzZ4UzkYYQ=
github.com/olebeck/dragonfly v0.8.10-1/go.mod h1:ZjzPME6I1nc73voUgr2s5lpkoTxnWuR54V6c1KbULX0=
github.com/olebeck/gophertunnel v1.24.11-1 h1:DKEqjK5nAcjlwejHAD/SHeolAM6y9EkyjJcMuoK7VVY=
github.com/olebeck/gophertunnel v1.24.11-1/go.mod h1:dYFetA6r62huhc1EgR9p8VFAFtKOuGgVE/iXf5CzZ4o=
github.com/olebeck/gophertunnel v1.24.13-1 h1:3Sj22hVFAGCnPMJAewoSeuC9N8ikzcWo0DvJNBnXvs0=
github.com/olebeck/gophertunnel v1.24.13-1/go.mod h1:dYFetA6r62huhc1EgR9p8VFAFtKOuGgVE/iXf5CzZ4o=
github.com/olebeck/gophertunnel v1.25.0-1 h1:9vh6MIUo7/3EJI5oULr5F9KutAoa9qnpgWa566fImaI=
github.com/olebeck/gophertunnel v1.25.0-1/go.mod h1:dYFetA6r62huhc1EgR9p8VFAFtKOuGgVE/iXf5CzZ4o=
github.com/olebeck/gophertunnel v1.26.1 h1:mkIthqpU5vSksh/mxUlhqFN/nsK9CcP9hAn1LjjqKnQ=
github.com/olebeck/gophertunnel v1.26.1/go.mod h1:dYFetA6r62huhc1EgR9p8VFAFtKOuGgVE/iXf5CzZ4o=
github.com/nicksnyder/go-i18n/v2 v2.2.1 h1:aOzRCdwsJuoExfZhoiXHy4bjruwCMdt5otbYojM/PaA=
github.com/nicksnyder/go-i18n/v2 v2.2.1/go.mod h1:fF2++lPHlo+/kPaj3nB0uxtPwzlPm+BlgwGX7MkeGj0=
github.com/olebeck/dragonfly v0.9.1-1 h1:b5CIocRvmxdesW6N6V87xTDH4fFLVthb1GRptbbqDuc=
github.com/olebeck/dragonfly v0.9.1-1/go.mod h1:ZjzPME6I1nc73voUgr2s5lpkoTxnWuR54V6c1KbULX0=
github.com/olebeck/gophertunnel v1.26.2 h1:AbiZcmeR5LenSJ5NX/2BPxLC3ddlvgWjrjouPmOB6BA=
github.com/olebeck/gophertunnel v1.26.2/go.mod h1:dYFetA6r62huhc1EgR9p8VFAFtKOuGgVE/iXf5CzZ4o=
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.7.0 h1:WSHQ+IS43OoUrWtD1/bbclrwK8TTH5hzp+umCiuxHgs=
github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
@ -91,21 +95,14 @@ golang.design/x/lockfree v0.0.1/go.mod h1:iaZUx6UgZaOdePjzI6wFd+seYMl1i0rsG8+xKv
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20220926161630-eccd6366d1be h1:fmw3UbQh+nxngCAHrDCCztao/kbYFnWjoqop8dHx05A=
golang.org/x/crypto v0.0.0-20220926161630-eccd6366d1be/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.3.0 h1:a06MkbcxBrEFc0w0QIZWXrH/9cCX6KJyWbBOIwAn+7A=
golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4=
golang.org/x/exp v0.0.0-20220930202632-ec3f01382ef9 h1:RjggHMcaTVp0LOVZcW0bo8alwHrOaCrGUDgfWUHhnN4=
golang.org/x/exp v0.0.0-20220930202632-ec3f01382ef9/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE=
golang.org/x/exp v0.0.0-20221126150942-6ab00d035af9 h1:yZNXmy+j/JpX19vZkVktWqAo7Gny4PBWYYK3zskGpx4=
golang.org/x/exp v0.0.0-20221126150942-6ab00d035af9/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc=
golang.org/x/crypto v0.5.0 h1:U/0M97KRkSFvyD/3FSmdP5W5swImpNgle/EHFhOsQPE=
golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU=
golang.org/x/exp v0.0.0-20230113213754-f9f960f08ad4 h1:CNkDRtCj8otM5CFz5jYvbr8ioXX8flVsLfDWEj0M5kk=
golang.org/x/exp v0.0.0-20230113213754-f9f960f08ad4/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc=
golang.org/x/image v0.0.0-20190321063152-3fc05d484e9f/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20220902085622-e7cb96979f69 h1:Lj6HJGCSn5AjxRAH2+r35Mir4icalbqku+CLUtjnvXY=
golang.org/x/image v0.0.0-20220902085622-e7cb96979f69/go.mod h1:doUCurBvlfPMKfmIpRIywoHmhN3VyhnoFDbvIEWF4hY=
golang.org/x/image v0.1.0 h1:r8Oj8ZA2Xy12/b5KZYj3tuv7NG/fBz3TwQVvpJ9l8Rk=
golang.org/x/image v0.1.0/go.mod h1:iyPr49SD/G/TBxYVB/9RRtGUT5eNbo2u4NamWeQcD5c=
golang.org/x/image v0.3.0 h1:HTDXbdK9bjfSWkPzDJIw89W8CAtfFGduujWs33NLLsg=
golang.org/x/image v0.3.0/go.mod h1:fXd9211C/0VTlYuAcOhW8dY/RtEJqODXOWBDpmYBf+A=
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/mod v0.7.0 h1:LapD9S96VoQRhi/GrNTqeBJFrUjs5UHCAtTlgwA5oZA=
golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
@ -117,18 +114,13 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.0.0-20220930213112-107f3e3c3b0b h1:uKO3Js8lXGjpjdc4J3rqs0/Ex5yDKUGfk43tTYWVLas=
golang.org/x/net v0.0.0-20220930213112-107f3e3c3b0b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
golang.org/x/net v0.2.0 h1:sZfSu1wtKLGlWI4ZZayP0ck9Y73K1ynO6gqzTdBVdPU=
golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY=
golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1 h1:lxqLZaMad/dJHMFZH0NiNpiEZI/nhgWhe4wgzpE+MuA=
golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg=
golang.org/x/oauth2 v0.2.0 h1:GtQkldQ9m7yvzCL1V+LrYow3Khe0eJH0w7RbX/VbaIU=
golang.org/x/oauth2 v0.2.0/go.mod h1:Cwn6afJ8jrQwYMxQDTpISoXmXW9I6qF6vDeuuoX3Ibs=
golang.org/x/net v0.5.0 h1:GyT4nK/YDHSqa1c4753ouYCDajOYKTja9Xb/OHtgvSw=
golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws=
golang.org/x/oauth2 v0.4.0 h1:NF0gk8LVPg1Ml7SSbGyySuoxdsXitj7TvgvuRxIMc/M=
golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 h1:uVc8UZUe6tr40fFVnUP5Oj+veunVezqYl9z7DYw9xzw=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@ -146,27 +138,24 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220928140112-f11e5e49a4ec h1:BkDtF2Ih9xZ7le9ndzTA7KJow28VbQW3odyk/8drmuI=
golang.org/x/sys v0.0.0-20220928140112-f11e5e49a4ec/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.2.0 h1:ljd4t30dBnAvMZaQCevtY0xLLD0A+bRZXbgLMLU1F/A=
golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.4.0 h1:Zr2JFtRQNX3BCZ8YtxRE9hNJYC8J6I1MVbMg6owUp18=
golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg=
golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.6.0 h1:3XmdazWV+ubf7QgHSTWeykHOci5oeekaGJBLkrkaw4k=
golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/tools v0.3.0 h1:SrNbZl6ECOS1qFzgTdQfWXZM9XBkiA6tkFrH9YSTPHM=
golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k=
golang.org/x/tools v0.5.0 h1:+bSpV5HIeWkuvgaMfI3UmKRThoTA5ODJTUd8T17NO+4=
golang.org/x/tools v0.5.0/go.mod h1:N+Kgy78s5I24c24dU8OfWNEotWjutIs8SnJvn5IDq+k=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@ -178,6 +167,8 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ
google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w=
google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
gopkg.in/inconshreveable/go-update.v0 v0.0.0-20150814200126-d8b0b1d421aa h1:drvf2JoUL1fz3ttkGNkw+rf3kZa2//7XkYGpSO4NHNA=
@ -188,5 +179,7 @@ gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkep
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

167
locale/en.yaml Normal file
View File

@ -0,0 +1,167 @@
bedrocktool_version:
other: "Bedrocktool Version {{.Version}}"
available_commands:
other: "Available Commands:"
use_to_run_command:
other: "Use 'bedrocktool <command>' to run a command"
input_command:
other: "Input Command: "
fatal_error:
other: "Fatal Error occurred."
report_issue:
other: |
if you want to report this error, please open an issue at
https://github.com/bedrock-tool/bedrocktool/issues
And attach the error info, describe what you did to get this error.
Thanks!
enter_to_exit:
other: "Press Enter to exit."
should_login_xbox:
other: "if it should login to xbox"
enable_dns:
other: "enable dns server for consoles"
preload_packs:
other: "preload resourcepacks for proxy"
debug_mode:
other: "debug mode"
starting_dns:
other: "Starting dns at {{.Ip}}:53"
failed_to_start_dns:
other: "Failed to start dns server: {{.Err}}"
suggest_bedrockconnect:
other: "you may have to use Bedrockconnect"
invalid_server:
other: "Invalid Server Address"
enter_server:
other: "Enter Server: "
disconnect:
other: "Disconnect {{.Pk}}"
preloading_packs:
other: "Preloading Resourcepacks"
failed_to_connect:
other: "failed to connect to {{.Address}}: {{.Err}}"
listening_on:
other: "Listening on {{.Address}}"
connecting:
other: "Connecting to {{.Address}}"
connected:
other: "Connected to server."
connection_cancelled:
other: "connection cancelled"
failed_start_game:
other: "failed to start game: {{.Err}}"
help_connect:
other: "Open Minecraft and connect to this computers local ip address to continue"
failed_to_spawn:
other: "Failed to Spawn"
not_supported_anymore:
other: "not supported anymore"
remote_address:
other: "remote server address"
ctrl_c_to_exit:
other: "Press ctrl+c to exit"
server_address_help:
other: |
accepted server address formats:
123.234.123.234
123.234.123.234:19132
realm:<Realmname>
realm:<Realmname>:<Id>
realm_list_line:
other: "Name: {{.Name}}\tid: {{.Id}}"
failed_to_open_output:
other: "Failed to open output"
adding_world:
other: "Adding {{.World}}"
not_found:
other: "{{.World}} Not Found"
need_to_specify_multiple_worlds:
other: "you need to specify more than 1 world to merge"
update_available:
other: "Update available: {{.Version}} use the update command to install it."
no_update:
other: "No Updates available."
updating:
other: "Updating to {{.Version}}"
updated:
other: "Updated!"
worldname_set:
other: "worldName is now {{.Name}}"
void_generator_true:
other: "Using Void Generator"
void_generator_false:
other: "Not using Void Generator"
subchunk_before_chunk:
other: "The server didnt send the chunk before the subchunk!"
zoom_level:
other: "Zoom: {{.Level}}"
not_saving_empty:
other: "Skipping save because the world didnt contain any chunks."
saving_world:
one: "Saving world {{.Name}} with {{.Count}} Chunk"
other: "Saving world {{.Name}} with {{.Count}} Chunks"
unknown_gamerule:
other: "unknown gamerule: {{.Name}}"
adding_pack:
other: "Adding Resourcepack {{.Name}}"
using_customblocks:
other: "Using Custom Blocks"
guessing_version:
other: "couldnt determine game version, assuming > 1.18"
use_setname:
other: "use /setname <worldname>\nto set the world name"
using_under_118:
other: "using legacy (< 1.18)"
setname_desc:
other: "set user defined name for this world"
void_desc:
other: "toggle if void generator should be used"
popup_chunk_count:
one: "{{.Count}} Chunk loaded\nName: {{.Name}}"
other: "{{.Count}} Chunks loaded\nName: {{.Name}}"
warn_window_closed_not_open:
other: "Closed window that wasnt open"
saved_block_inv:
other: "Saved Block Inventory"
save_packs_with_world:
other: "save resourcepacks to the worlds"
enable_void:
other: "save with void generator"
save_image:
other: "saves an png of the map at the end"
test_block_inv:
other: "enable experimental block inventory saving"
only_with_geometry:
other: "only save skins with geometry"
name_prefix:
other: "only save players starting with this"
failed_write:
other: "failed to write {{.Part}} {{.Path}}: {{.Err}}"
packet_filter:
other: "packets to not show"
list_realms_synopsis:
other: "prints all realms you have access to"
capture_synopsis:
other: "capture packets in a pcap file"
chat_log_synopsis:
other: "logs chat to a file"
debug_proxy_synopsis:
other: "verbose debug packets"
merge_synopsis:
other: "merge 2 or more worlds"
update_synopsis:
other: "self updates to latest version"
skins_proxy_synopsis:
other: "download skins from players on a server with proxy"
skins_synopsis:
other: "download skins from players on a server"
world_synopsis:
other: "download a world from a server"

71
locale/i18n.go Normal file
View File

@ -0,0 +1,71 @@
package locale
import (
"embed"
"fmt"
"github.com/cloudfoundry-attic/jibber_jabber"
"github.com/nicksnyder/go-i18n/v2/i18n"
"github.com/sirupsen/logrus"
"golang.org/x/text/language"
"gopkg.in/yaml.v3"
)
type Strmap map[string]interface{}
//go:embed *.yaml
var localesFS embed.FS
var lang *i18n.Localizer
func load_language(bundle *i18n.Bundle, tag language.Tag) error {
logrus.Infof("Using Language %s", tag.String())
_, err := bundle.LoadMessageFileFS(localesFS, fmt.Sprintf("%s.yaml", tag.String()))
return err
}
func init() {
var defaultTag language.Tag = language.English
var err error
// get default language
var languageName string
languageName, err = jibber_jabber.DetectLanguage()
if err == nil {
defaultTag, err = language.Parse(languageName)
if err != nil {
logrus.Warn("failed to parse language name")
}
}
bundle := i18n.NewBundle(defaultTag)
bundle.RegisterUnmarshalFunc("yaml", yaml.Unmarshal)
if defaultTag != language.English {
err = load_language(bundle, language.English)
if err != nil {
panic("failed to load english language")
}
}
err = load_language(bundle, defaultTag)
if err != nil {
logrus.Warnf("Couldnt load Language %s", languageName)
}
lang = i18n.NewLocalizer(bundle)
}
func Locm(id string, tmpl Strmap, count int) string {
return Loc(id, tmpl)
}
func Loc(id string, tmpl Strmap) string {
s, err := lang.Localize(&i18n.LocalizeConfig{
MessageID: id,
TemplateData: tmpl,
})
if err != nil {
return fmt.Sprintf("failed to translate! %s", id)
}
return s
}

View File

@ -11,6 +11,7 @@ import (
"sync"
"time"
"github.com/bedrock-tool/bedrocktool/locale"
"github.com/bedrock-tool/bedrocktool/utils"
"github.com/google/subcommands"
@ -43,14 +44,14 @@ type CaptureCMD struct {
}
func (*CaptureCMD) Name() string { return "capture" }
func (*CaptureCMD) Synopsis() string { return "capture packets in a pcap file" }
func (*CaptureCMD) Synopsis() string { return locale.Loc("capture_synopsis", nil) }
func (p *CaptureCMD) SetFlags(f *flag.FlagSet) {
f.StringVar(&p.server_address, "address", "", "remote server address")
}
func (c *CaptureCMD) Usage() string {
return c.Name() + ": " + c.Synopsis() + "\n" + utils.SERVER_ADDRESS_HELP
return c.Name() + ": " + c.Synopsis() + "\n" + locale.Loc("server_address_help", nil)
}
func (c *CaptureCMD) Execute(ctx context.Context, f *flag.FlagSet, _ ...interface{}) subcommands.ExitStatus {
@ -67,7 +68,7 @@ func (c *CaptureCMD) Execute(ctx context.Context, f *flag.FlagSet, _ ...interfac
}
defer fio.Close()
proxy := utils.NewProxy(logrus.StandardLogger())
proxy := utils.NewProxy()
proxy.PacketFunc = func(header packet.Header, payload []byte, src, dst net.Addr) {
from_client := src.String() == proxy.Client.LocalAddr().String()

View File

@ -7,6 +7,7 @@ import (
"os"
"time"
"github.com/bedrock-tool/bedrocktool/locale"
"github.com/bedrock-tool/bedrocktool/utils"
"github.com/google/subcommands"
@ -20,7 +21,7 @@ type ChatLogCMD struct {
}
func (*ChatLogCMD) Name() string { return "chat-log" }
func (*ChatLogCMD) Synopsis() string { return "logs chat to a file" }
func (*ChatLogCMD) Synopsis() string { return locale.Loc("chat_log_synopsis", nil) }
func (c *ChatLogCMD) SetFlags(f *flag.FlagSet) {
f.StringVar(&c.Address, "address", "", "remote server address")
@ -28,7 +29,7 @@ func (c *ChatLogCMD) SetFlags(f *flag.FlagSet) {
}
func (c *ChatLogCMD) Usage() string {
return c.Name() + ": " + c.Synopsis() + "\n" + utils.SERVER_ADDRESS_HELP
return c.Name() + ": " + c.Synopsis() + "\n" + locale.Loc("server_address_help", nil)
}
func (c *ChatLogCMD) Execute(ctx context.Context, flags *flag.FlagSet, _ ...interface{}) subcommands.ExitStatus {
@ -45,7 +46,7 @@ func (c *ChatLogCMD) Execute(ctx context.Context, flags *flag.FlagSet, _ ...inte
}
defer f.Close()
proxy := utils.NewProxy(logrus.StandardLogger())
proxy := utils.NewProxy()
proxy.PacketCB = func(pk packet.Packet, proxy *utils.ProxyContext, toServer bool) (packet.Packet, error) {
if text, ok := pk.(*packet.Text); ok {
logLine := text.Message

View File

@ -5,6 +5,7 @@ import (
"flag"
"strings"
"github.com/bedrock-tool/bedrocktool/locale"
"github.com/bedrock-tool/bedrocktool/utils"
"github.com/google/subcommands"
@ -17,15 +18,15 @@ type DebugProxyCMD struct {
}
func (*DebugProxyCMD) Name() string { return "debug-proxy" }
func (*DebugProxyCMD) Synopsis() string { return "verbose debug packets" }
func (*DebugProxyCMD) Synopsis() string { return locale.Loc("debug_proxy_synopsis", nil) }
func (c *DebugProxyCMD) SetFlags(f *flag.FlagSet) {
f.StringVar(&c.Address, "address", "", "remote server address")
f.StringVar(&c.filter, "filter", "", "packets to not show")
f.StringVar(&c.Address, "address", "", locale.Loc("remote_address", nil))
f.StringVar(&c.filter, "filter", "", locale.Loc("packet_filter", nil))
}
func (c *DebugProxyCMD) Usage() string {
return c.Name() + ": " + c.Synopsis() + "\n" + utils.SERVER_ADDRESS_HELP
return c.Name() + ": " + c.Synopsis() + "\n" + locale.Loc("server_address_help", nil)
}
func (c *DebugProxyCMD) Execute(ctx context.Context, f *flag.FlagSet, _ ...interface{}) subcommands.ExitStatus {
@ -52,7 +53,7 @@ func (c *DebugProxyCMD) Execute(ctx context.Context, f *flag.FlagSet, _ ...inter
}
}
proxy := utils.NewProxy(logrus.StandardLogger())
proxy := utils.NewProxy()
if err := proxy.Run(ctx, address); err != nil {
logrus.Error(err)
return 1

View File

@ -7,8 +7,10 @@ import (
"os"
"time"
"github.com/bedrock-tool/bedrocktool/locale"
"github.com/bedrock-tool/bedrocktool/utils"
"github.com/df-mc/dragonfly/server/entity"
"github.com/df-mc/dragonfly/server/world/mcdb"
"github.com/df-mc/goleveldb/leveldb/opt"
"github.com/google/subcommands"
@ -22,7 +24,7 @@ type MergeCMD struct {
}
func (*MergeCMD) Name() string { return "merge" }
func (*MergeCMD) Synopsis() string { return "merge 2 or more worlds" }
func (*MergeCMD) Synopsis() string { return locale.Loc("merge_synopsis", nil) }
func (c *MergeCMD) SetFlags(f *flag.FlagSet) {
f.BoolVar(&c.legacy, "legacy", false, "if the worlds are before 1.18")
@ -34,7 +36,7 @@ func (c *MergeCMD) Usage() string {
func (c *MergeCMD) Execute(ctx context.Context, f *flag.FlagSet, _ ...interface{}) subcommands.ExitStatus {
if f.NArg() == 0 {
logrus.Error("you need to specify 1 or more worlds")
logrus.Error(locale.Loc("need_to_specify_multiple_worlds", nil))
return 1
}
c.worlds = f.Args()
@ -42,16 +44,16 @@ func (c *MergeCMD) Execute(ctx context.Context, f *flag.FlagSet, _ ...interface{
prov_out, err := mcdb.New(logrus.StandardLogger(), out_name, opt.DefaultCompression)
if err != nil {
logrus.Errorf("failed to open output %s", err)
logrus.Errorf(locale.Loc("failed_to_open_output", locale.Strmap{"Err": err}))
return 1
}
for i, world_name := range c.worlds {
first := i == 0
logrus.Infof("Adding %s", world_name)
logrus.Infof(locale.Loc("adding_world", locale.Strmap{"World": world_name}))
s, err := os.Stat(world_name)
if errors.Is(err, os.ErrNotExist) {
logrus.Fatalf("%s not found", world_name)
logrus.Fatalf(locale.Loc("not_found", locale.Strmap{"Name": world_name}), world_name)
}
if !s.IsDir() { // if its a zip temporarily unpack it to read it
f, _ := os.Open(world_name)
@ -114,7 +116,7 @@ func (c *MergeCMD) merge_worlds(prov_out *mcdb.Provider, folder string, first bo
}
// entities
entities, err := prov_in.LoadEntities(i.P, i.D)
entities, err := prov_in.LoadEntities(i.P, i.D, entity.DefaultRegistry)
if err != nil {
return err
}

View File

@ -6,6 +6,7 @@ import (
"fmt"
"os"
"github.com/bedrock-tool/bedrocktool/locale"
"github.com/bedrock-tool/bedrocktool/utils"
"github.com/google/subcommands"
@ -20,16 +21,16 @@ type SkinProxyCMD struct {
}
func (*SkinProxyCMD) Name() string { return "skins-proxy" }
func (*SkinProxyCMD) Synopsis() string { return "download skins from players on a server with proxy" }
func (*SkinProxyCMD) Synopsis() string { return locale.Loc("skins_proxy_synopsis", nil) }
func (c *SkinProxyCMD) SetFlags(f *flag.FlagSet) {
f.StringVar(&c.server_address, "address", "", "remote server address")
f.StringVar(&c.filter, "filter", "", "player name filter prefix")
f.BoolVar(&c.only_with_geometry, "only-geom", false, "only save skins with geometry")
f.StringVar(&c.server_address, "address", "", locale.Loc("remote_address", nil))
f.StringVar(&c.filter, "filter", "", locale.Loc("name_prefix", nil))
f.BoolVar(&c.only_with_geometry, "only-geom", false, locale.Loc("only_with_geometry", nil))
}
func (c *SkinProxyCMD) Usage() string {
return c.Name() + ": " + c.Synopsis() + "\n" + utils.SERVER_ADDRESS_HELP
return c.Name() + ": " + c.Synopsis() + "\n" + locale.Loc("server_address_help", nil)
}
func (c *SkinProxyCMD) Execute(ctx context.Context, f *flag.FlagSet, _ ...interface{}) subcommands.ExitStatus {
@ -41,7 +42,7 @@ func (c *SkinProxyCMD) Execute(ctx context.Context, f *flag.FlagSet, _ ...interf
out_path := fmt.Sprintf("skins/%s", hostname)
os.MkdirAll(out_path, 0o755)
proxy := utils.NewProxy(logrus.StandardLogger())
proxy := utils.NewProxy()
proxy.PacketCB = func(pk packet.Packet, proxy *utils.ProxyContext, toServer bool) (packet.Packet, error) {
if !toServer {
process_packet_skins(proxy.Client, out_path, pk, c.filter, c.only_with_geometry)

View File

@ -4,6 +4,7 @@ import (
"bytes"
"context"
"encoding/json"
"errors"
"flag"
"fmt"
"image"
@ -13,6 +14,7 @@ import (
"path"
"strings"
"github.com/bedrock-tool/bedrocktool/locale"
"github.com/bedrock-tool/bedrocktool/utils"
"github.com/flytam/filenamify"
@ -43,7 +45,7 @@ type SkinMeta struct {
func (skin *Skin) WriteGeometry(output_path string) error {
f, err := os.Create(output_path)
if err != nil {
return fmt.Errorf("failed to write Geometry %s: %s", output_path, err)
return errors.New(locale.Loc("failed_write", locale.Strmap{"Part": "Geometry", "Path": output_path, "Err": err}))
}
defer f.Close()
io.Copy(f, bytes.NewReader(skin.SkinGeometry))
@ -54,14 +56,14 @@ func (skin *Skin) WriteGeometry(output_path string) error {
func (skin *Skin) WriteCape(output_path string) error {
f, err := os.Create(output_path)
if err != nil {
return fmt.Errorf("failed to write Cape %s: %s", output_path, err)
return errors.New(locale.Loc("failed_write", locale.Strmap{"Part": "Cape", "Path": output_path, "Err": err}))
}
defer f.Close()
cape_tex := image.NewRGBA(image.Rect(0, 0, int(skin.CapeImageWidth), int(skin.CapeImageHeight)))
cape_tex.Pix = skin.CapeData
if err := png.Encode(f, cape_tex); err != nil {
return fmt.Errorf("error writing skin: %s", err)
return fmt.Errorf(locale.Loc("failed_write", locale.Strmap{"Part": "Cape", "Err": err}))
}
return nil
}
@ -76,14 +78,14 @@ func (skin *Skin) WriteAnimations(output_path string) error {
func (skin *Skin) WriteTexture(output_path string) error {
f, err := os.Create(output_path)
if err != nil {
return fmt.Errorf("error writing Texture: %s", err)
return errors.New(locale.Loc("failed_write", locale.Strmap{"Part": "Meta", "Path": output_path, "Err": err}))
}
defer f.Close()
skin_tex := image.NewRGBA(image.Rect(0, 0, int(skin.SkinImageWidth), int(skin.SkinImageHeight)))
skin_tex.Pix = skin.SkinData
if err := png.Encode(f, skin_tex); err != nil {
return fmt.Errorf("error writing Texture: %s", err)
return errors.New(locale.Loc("failed_write", locale.Strmap{"Part": "Texture", "Path": output_path, "Err": err}))
}
return nil
}
@ -91,13 +93,13 @@ func (skin *Skin) WriteTexture(output_path string) error {
func (skin *Skin) WriteTint(output_path string) error {
f, err := os.Create(output_path)
if err != nil {
return fmt.Errorf("failed to write Tint %s: %s", output_path, err)
return errors.New(locale.Loc("failed_write", locale.Strmap{"Part": "Tint", "Path": output_path, "Err": err}))
}
defer f.Close()
err = json.NewEncoder(f).Encode(skin.PieceTintColours)
if err != nil {
return fmt.Errorf("failed to write Tint %s: %s", output_path, err)
return errors.New(locale.Loc("failed_write", locale.Strmap{"Part": "Tint", "Path": output_path, "Err": err}))
}
return nil
}
@ -105,7 +107,7 @@ func (skin *Skin) WriteTint(output_path string) error {
func (skin *Skin) WriteMeta(output_path string) error {
f, err := os.Create(output_path)
if err != nil {
return fmt.Errorf("failed to write Tint %s: %s", output_path, err)
return errors.New(locale.Loc("failed_write", locale.Strmap{"Part": "Meta", "Path": output_path, "Err": err}))
}
defer f.Close()
d, err := json.MarshalIndent(SkinMeta{
@ -169,10 +171,10 @@ func (skin *Skin) Write(output_path, name string) error {
// puts the skin at output_path if the filter matches it
// internally converts the struct so it can use the extra methods
func write_skin(output_path, name string, skin *protocol.Skin) {
logrus.Infof("Writing skin for %s\n", name)
logrus.Infof("Writing skin for %s", name)
_skin := &Skin{*skin}
if err := _skin.Write(output_path, name); err != nil {
fmt.Fprintf(os.Stderr, "Error writing skin: %s\n", err)
logrus.Errorf("Error writing skin: %s", err)
}
}
@ -256,27 +258,27 @@ type SkinCMD struct {
}
func (*SkinCMD) Name() string { return "skins" }
func (*SkinCMD) Synopsis() string { return "download all skins from players on a server" }
func (*SkinCMD) Synopsis() string { return locale.Loc("skins_synopsis", nil) }
func (c *SkinCMD) SetFlags(f *flag.FlagSet) {
f.StringVar(&c.server_address, "address", "", "remote server address")
f.StringVar(&c.filter, "filter", "", "player name filter prefix")
f.StringVar(&c.server_address, "address", "", locale.Loc("remote_address", nil))
f.StringVar(&c.filter, "filter", "", locale.Loc("name_prefix", nil))
}
func (c *SkinCMD) Usage() string {
return c.Name() + ": " + c.Synopsis() + "\n"
return c.Name() + ": " + c.Synopsis() + "\n" + locale.Loc("server_address_help", nil)
}
func (c *SkinCMD) Execute(ctx context.Context, f *flag.FlagSet, _ ...interface{}) subcommands.ExitStatus {
address, hostname, err := utils.ServerInput(ctx, c.server_address)
if err != nil {
fmt.Fprint(os.Stderr, err)
logrus.Error(err)
return 1
}
serverConn, err := utils.ConnectServer(ctx, address, nil, false, nil)
if err != nil {
fmt.Fprint(os.Stderr, err)
logrus.Error(err)
return 1
}
defer serverConn.Close()
@ -284,12 +286,12 @@ func (c *SkinCMD) Execute(ctx context.Context, f *flag.FlagSet, _ ...interface{}
out_path := fmt.Sprintf("skins/%s", hostname)
if err := serverConn.DoSpawnContext(ctx); err != nil {
fmt.Fprint(os.Stderr, err)
logrus.Error(err)
return 1
}
logrus.Info("Connected")
logrus.Info("Press ctrl+c to exit")
logrus.Info(locale.Loc("connected", nil))
logrus.Info(locale.Loc("ctrl_c_to_exit", nil))
os.MkdirAll(out_path, 0o755)

View File

@ -4,6 +4,7 @@ import (
"context"
"flag"
"github.com/bedrock-tool/bedrocktool/locale"
"github.com/bedrock-tool/bedrocktool/utils"
"github.com/sirupsen/logrus"
@ -13,7 +14,7 @@ import (
type UpdateCMD struct{}
func (*UpdateCMD) Name() string { return "update" }
func (*UpdateCMD) Synopsis() string { return "self updates to latest version" }
func (*UpdateCMD) Synopsis() string { return locale.Loc("update_synopsis", nil) }
func (c *UpdateCMD) SetFlags(f *flag.FlagSet) {}
@ -28,17 +29,17 @@ func (c *UpdateCMD) Execute(ctx context.Context, f *flag.FlagSet, _ ...interface
return 1
}
if newVersion == "" {
logrus.Info("No Updates available.")
logrus.Info(locale.Loc("no_update", nil))
return 0
}
logrus.Infof("Updating to %s", newVersion)
logrus.Infof(locale.Loc("updating", locale.Strmap{"Version": newVersion}))
if err := utils.Updater.Update(); err != nil {
logrus.Error(err)
return 1
}
logrus.Infof("Updated!")
logrus.Infof(locale.Loc("updated", nil))
return 0
}

View File

@ -14,6 +14,7 @@ import (
"strings"
"time"
"github.com/bedrock-tool/bedrocktool/locale"
"github.com/bedrock-tool/bedrocktool/utils"
"github.com/bedrock-tool/bedrocktool/utils/nbtconv"
@ -121,18 +122,18 @@ type WorldCMD struct {
}
func (*WorldCMD) Name() string { return "worlds" }
func (*WorldCMD) Synopsis() string { return "download a world from a server" }
func (*WorldCMD) Synopsis() string { return locale.Loc("world_synopsis", nil) }
func (p *WorldCMD) SetFlags(f *flag.FlagSet) {
f.StringVar(&p.Address, "address", "", "remote server address")
f.BoolVar(&p.packs, "packs", false, "save resourcepacks to the worlds")
f.BoolVar(&p.enableVoid, "void", true, "if false, saves with default flat generator")
f.BoolVar(&p.saveImage, "image", false, "saves an png of the map at the end")
f.BoolVar(&p.experimentInventory, "inv", false, "enable experimental block inventory saving")
f.StringVar(&p.Address, "address", "", locale.Loc("remote_address", nil))
f.BoolVar(&p.packs, "packs", false, locale.Loc("save_packs_with_world", nil))
f.BoolVar(&p.enableVoid, "void", true, locale.Loc("enable_void", nil))
f.BoolVar(&p.saveImage, "image", false, locale.Loc("save_image", nil))
f.BoolVar(&p.experimentInventory, "inv", false, locale.Loc("test_block_inv", nil))
}
func (c *WorldCMD) Usage() string {
return c.Name() + ": " + c.Synopsis() + "\n" + utils.SERVER_ADDRESS_HELP
return c.Name() + ": " + c.Synopsis() + "\n" + locale.Loc("server_address_help", nil)
}
func (c *WorldCMD) Execute(ctx context.Context, f *flag.FlagSet, _ ...interface{}) subcommands.ExitStatus {
@ -144,7 +145,7 @@ func (c *WorldCMD) Execute(ctx context.Context, f *flag.FlagSet, _ ...interface{
server_address, hostname, err := utils.ServerInput(ctx, c.Address)
if err != nil {
fmt.Fprintln(os.Stderr, err)
logrus.Error(err)
return 1
}
@ -156,7 +157,7 @@ func (c *WorldCMD) Execute(ctx context.Context, f *flag.FlagSet, _ ...interface{
w.experimentInventory = c.experimentInventory
w.ctx = ctx
proxy := utils.NewProxy(logrus.StandardLogger())
proxy := utils.NewProxy()
proxy.ConnectCB = w.OnConnect
proxy.PacketCB = func(pk packet.Packet, proxy *utils.ProxyContext, toServer bool) (packet.Packet, error) {
var forward bool
@ -173,7 +174,7 @@ func (c *WorldCMD) Execute(ctx context.Context, f *flag.FlagSet, _ ...interface{
err = proxy.Run(ctx, server_address)
if err != nil {
fmt.Fprintln(os.Stderr, err)
logrus.Error(err)
}
w.SaveAndReset()
return 0
@ -181,13 +182,19 @@ func (c *WorldCMD) Execute(ctx context.Context, f *flag.FlagSet, _ ...interface{
func (w *WorldState) setnameCommand(cmdline []string) bool {
w.WorldName = strings.Join(cmdline, " ")
w.proxy.SendMessage(fmt.Sprintf("worldName is now: %s", w.WorldName))
w.proxy.SendMessage(locale.Loc("worldname_set", locale.Strmap{"Name": w.WorldName}))
return true
}
func (w *WorldState) toggleVoid(cmdline []string) bool {
w.voidgen = !w.voidgen
w.proxy.SendMessage(fmt.Sprintf("using void generator: %t", w.voidgen))
var s string
if w.voidgen {
s = locale.Loc("void_generator_true", nil)
} else {
s = locale.Loc("void_generator_false", nil)
}
w.proxy.SendMessage(s)
return true
}
@ -244,7 +251,7 @@ func (w *WorldState) ProcessSubChunk(pk *packet.SubChunk) {
)
ch := w.chunks[pos]
if ch == nil {
logrus.Errorf("the server didnt send the chunk before the subchunk!")
logrus.Error(locale.Loc("subchunk_before_chunk", nil))
continue
}
blockNBT, err := ch.ApplySubChunkEntry(uint8(abs_y), &sub)
@ -268,7 +275,7 @@ func (w *WorldState) ProcessSubChunk(pk *packet.SubChunk) {
func (w *WorldState) ProcessAnimate(pk *packet.Animate) {
if pk.ActionType == packet.AnimateActionSwingArm {
w.ui.ChangeZoom()
w.proxy.SendPopup(fmt.Sprintf("Zoom: %d", w.ui.zoomLevel))
w.proxy.SendPopup(locale.Loc("zoom_level", locale.Strmap{"Level": w.ui.zoomLevel}))
}
}
@ -276,7 +283,7 @@ func (w *WorldState) ProcessChangeDimension(pk *packet.ChangeDimension) {
if len(w.chunks) > 0 {
w.SaveAndReset()
} else {
logrus.Info("Skipping save because the world didnt contain any chunks.")
logrus.Info(locale.Loc("not_saving_empty", nil))
w.Reset()
}
dim_id := pk.Dimension
@ -308,7 +315,7 @@ func (w *WorldState) Reset() {
// writes the world to a folder, resets all the chunks
func (w *WorldState) SaveAndReset() {
logrus.Infof("Saving world %s %d chunks", w.WorldName, len(w.chunks))
logrus.Infof(locale.Loc("saving_world", locale.Strmap{"Name": w.WorldName, "Count": len(w.chunks)}))
// open world
folder := path.Join("worlds", fmt.Sprintf("%s/%s", w.ServerName, w.WorldName))
@ -415,7 +422,7 @@ func (w *WorldState) SaveAndReset() {
ld.ShowBorderEffect = gr.Value.(bool)
// todo
default:
logrus.Warnf("unknown gamerule: %s\n", gr.Name)
logrus.Warnf(locale.Loc("unknown_gamerule", locale.Strmap{"Name": gr.Name}))
}
}
@ -432,7 +439,7 @@ func (w *WorldState) SaveAndReset() {
w.worldCounter += 1
for k, p := range w.packs {
logrus.Infof("Adding resource pack: %s\n", k)
logrus.Infof(locale.Loc("adding_pack", locale.Strmap{"Name": k}))
pack_folder := path.Join(folder, "resource_packs", k)
os.MkdirAll(pack_folder, 0o755)
data := make([]byte, p.Len())
@ -452,7 +459,7 @@ func (w *WorldState) SaveAndReset() {
if err := utils.ZipFolder(filename, folder); err != nil {
fmt.Println(err)
}
logrus.Infof("Saved: %s\n", filename)
logrus.Infof("Saved: %s", filename)
os.RemoveAll(folder)
w.Reset()
}
@ -462,7 +469,7 @@ func (w *WorldState) OnConnect(proxy *utils.ProxyContext) {
gd := w.proxy.Server.GameData()
if len(gd.CustomBlocks) > 0 {
logrus.Info("Using Custom Blocks")
logrus.Info(locale.Loc("using_customblocks", nil))
/*
for _, be := range gd.CustomBlocks {
b := block.ServerCustomBlock(be)
@ -486,18 +493,18 @@ func (w *WorldState) OnConnect(proxy *utils.ProxyContext) {
w.ispre118 = ver < 18
}
if err != nil || len(gv) <= 1 {
logrus.Info("couldnt determine game version, assuming > 1.18")
logrus.Info(locale.Loc("guessing_version", nil))
}
dim_id := gd.Dimension
if w.ispre118 {
logrus.Info("using legacy (< 1.18)")
logrus.Info(locale.Loc("using_under_118", nil))
dim_id += 10
}
w.Dim = dimension_ids[uint8(dim_id)]
}
w.proxy.SendMessage("use /setname <worldname>\nto set the world name")
w.proxy.SendMessage(locale.Loc("use_setname", nil))
w.ui.Start()
go func() { // send map item
@ -521,7 +528,7 @@ func (w *WorldState) OnConnect(proxy *utils.ProxyContext) {
Exec: w.setnameCommand,
Cmd: protocol.Command{
Name: "setname",
Description: "set user defined name for this world",
Description: locale.Loc("setname_desc", nil),
Overloads: []protocol.CommandOverload{
{
Parameters: []protocol.CommandParameter{
@ -540,7 +547,7 @@ func (w *WorldState) OnConnect(proxy *utils.ProxyContext) {
Exec: w.toggleVoid,
Cmd: protocol.Command{
Name: "void",
Description: "toggle if void generator should be used",
Description: locale.Loc("void_desc", nil),
},
})
}
@ -596,7 +603,8 @@ func (w *WorldState) ProcessPacketServer(pk packet.Packet) (packet.Packet, bool)
w.ProcessChangeDimension(pk)
case *packet.LevelChunk:
w.ProcessLevelChunk(pk)
w.proxy.SendPopup(fmt.Sprintf("%d chunks loaded\nname: %s", len(w.chunks), w.WorldName))
w.proxy.SendPopup(locale.Locm("popup_chunk_count", locale.Strmap{"Count": len(w.chunks), "Name": w.WorldName}, len(w.chunks)))
case *packet.SubChunk:
w.ProcessSubChunk(pk)
case *packet.ContainerOpen:
@ -614,7 +622,6 @@ func (w *WorldState) ProcessPacketServer(pk packet.Packet) (packet.Packet, bool)
case *packet.InventoryContent:
if w.experimentInventory {
// save content
fmt.Printf("WindowID: %d\n", pk.WindowID)
existing, ok := w.openItemContainers[byte(pk.WindowID)]
if !ok {
if pk.WindowID == 0x0 { // inventory
@ -637,7 +644,7 @@ func (w *WorldState) ProcessPacketServer(pk packet.Packet) (packet.Packet, bool)
// find container info
existing, ok := w.openItemContainers[byte(pk.WindowID)]
if !ok {
logrus.Warn("Closed window that wasnt open")
logrus.Warn(locale.Loc("warn_window_closed_not_open", nil))
break
}
@ -664,7 +671,7 @@ func (w *WorldState) ProcessPacketServer(pk packet.Packet) (packet.Packet, bool)
}
}
w.proxy.SendMessage("Saved Block Inventory")
w.proxy.SendMessage(locale.Loc("saved_block_inv", nil))
// remove it again
delete(w.openItemContainers, byte(pk.WindowID))

View File

@ -4,6 +4,7 @@ import (
"encoding/json"
"os"
"github.com/bedrock-tool/bedrocktool/locale"
"github.com/sandertv/gophertunnel/minecraft/auth"
"github.com/sandertv/gophertunnel/minecraft/realms"
"github.com/sirupsen/logrus"
@ -25,7 +26,7 @@ func GetTokenSource() oauth2.TokenSource {
panic(err)
}
if !token.Valid() {
logrus.Info("Refreshed token")
logrus.Info(locale.Loc("refreshed_token", nil))
write_token(new_token)
}

View File

@ -4,6 +4,7 @@ import (
"fmt"
"net"
"github.com/bedrock-tool/bedrocktool/locale"
"github.com/miekg/dns"
"github.com/sirupsen/logrus"
)
@ -88,12 +89,12 @@ func InitDNS() {
server := &dns.Server{Addr: ":53", Net: "udp"}
go func() {
logrus.Infof("Starting dns at %s:53\n", GetLocalIP())
logrus.Infof(locale.Loc("starting_dns", locale.Strmap{"Ip": GetLocalIP()}))
err := server.ListenAndServe()
defer server.Shutdown()
if err != nil {
logrus.Warnf("Failed to start dns server: %s\n ", err.Error())
logrus.Info("you may have to use bedrockconnect")
logrus.Warnf(locale.Loc("failed_to_start_dns", locale.Strmap{"Err": err.Error()}))
logrus.Info(locale.Loc("suggest_bedrockconnect", nil))
}
}()
}

View File

@ -9,6 +9,7 @@ import (
"regexp"
"strings"
"github.com/bedrock-tool/bedrocktool/locale"
"github.com/sirupsen/logrus"
)
@ -34,7 +35,7 @@ func User_input(ctx context.Context, q string) (string, bool) {
func server_url_to_name(server string) string {
host, _, err := net.SplitHostPort(server)
if err != nil {
logrus.Fatalf("Invalid server: %s", err)
logrus.Fatalf(locale.Loc("invalid_server", locale.Strmap{"Err": err.Error()}))
}
return host
}
@ -42,7 +43,7 @@ func server_url_to_name(server string) string {
func ServerInput(ctx context.Context, server string) (address, name string, err error) {
if server == "" { // no arg provided, interactive input
var cancelled bool
server, cancelled = User_input(ctx, "Enter Server: ")
server, cancelled = User_input(ctx, locale.Loc("enter_server", nil))
if cancelled {
return "", "", context.Canceled
}

View File

@ -5,6 +5,7 @@ import (
"net"
"reflect"
"github.com/bedrock-tool/bedrocktool/locale"
"github.com/fatih/color"
"github.com/sandertv/gophertunnel/minecraft/protocol"
"github.com/sandertv/gophertunnel/minecraft/protocol/packet"
@ -67,7 +68,7 @@ func PacketLogger(header packet.Header, payload []byte, src, dst net.Addr) {
switch pk := pk.(type) {
case *packet.Disconnect:
logrus.Infof("Disconnect: %s", pk.Message)
logrus.Infof(locale.Loc("disconnect", locale.Strmap{"Pk": pk}))
}
dir_S2C := color.GreenString("S") + "->" + color.CyanString("C")

View File

@ -8,6 +8,7 @@ import (
"strings"
"sync"
"github.com/bedrock-tool/bedrocktool/locale"
"github.com/sandertv/gophertunnel/minecraft"
"github.com/sandertv/gophertunnel/minecraft/protocol"
"github.com/sandertv/gophertunnel/minecraft/protocol/packet"
@ -39,8 +40,6 @@ type ProxyContext struct {
Listener *minecraft.Listener
commands map[string]IngameCommand
log *logrus.Logger
// called for every packet
PacketFunc PacketFunc
// called after game started
@ -143,12 +142,8 @@ func proxyLoop(ctx context.Context, proxy *ProxyContext, toServer bool, packetCB
}
}
func NewProxy(log *logrus.Logger) *ProxyContext {
if log == nil {
log = logrus.StandardLogger()
}
func NewProxy() *ProxyContext {
return &ProxyContext{
log: log,
commands: make(map[string]IngameCommand),
}
}
@ -157,25 +152,25 @@ var Client_addr net.Addr
func (p *ProxyContext) Run(ctx context.Context, server_address string) (err error) {
if strings.HasSuffix(server_address, ".pcap") {
return fmt.Errorf("not supported anymore")
return fmt.Errorf(locale.Loc("not_supported_anymore", nil))
}
if strings.HasSuffix(server_address, ".pcap2") {
return create_replay_connection(ctx, p.log, server_address, p.ConnectCB, p.PacketCB)
return create_replay_connection(ctx, server_address, p.ConnectCB, p.PacketCB)
}
GetTokenSource() // ask for login before listening
var packs []*resource.Pack
if G_preload_packs {
p.log.Info("Preloading resourcepacks")
logrus.Info(locale.Loc("preloading_packs", nil))
var serverConn *minecraft.Conn
serverConn, err = ConnectServer(ctx, server_address, nil, true, nil)
if err != nil {
err = fmt.Errorf("failed to connect to %s: %s", server_address, err)
err = fmt.Errorf(locale.Loc("failed_to_connect", locale.Strmap{"Address": server_address, "Err": err}))
return
}
serverConn.Close()
packs = serverConn.ResourcePacks()
p.log.Infof("%d packs loaded", len(packs))
logrus.Infof(locale.Locm("pack_count_loaded", locale.Strmap{"Count": len(packs)}, len(packs)))
}
_status := minecraft.NewStatusProvider("Server")
@ -191,25 +186,25 @@ func (p *ProxyContext) Run(ctx context.Context, server_address string) (err erro
}
defer p.Listener.Close()
p.log.Infof("Listening on %s", p.Listener.Addr())
p.log.Infof("Open Minecraft and connect to this computers local ip address to continue")
logrus.Infof(locale.Loc("listening_on", locale.Strmap{"Address": p.Listener.Addr()}))
logrus.Infof(locale.Loc("help_connect", nil))
var c net.Conn
c, err = p.Listener.Accept()
if err != nil {
p.log.Fatal(err)
logrus.Fatal(err)
}
p.Client = c.(*minecraft.Conn)
cd := p.Client.ClientData()
p.Server, err = ConnectServer(ctx, server_address, &cd, false, p.PacketFunc)
if err != nil {
err = fmt.Errorf("failed to connect to %s: %s", server_address, err)
err = fmt.Errorf(locale.Loc("failed_to_connect", locale.Strmap{"Address": server_address, "Err": err}))
return
}
// spawn and start the game
if err = spawn_conn(ctx, p.Client, p.Server); err != nil {
err = fmt.Errorf("failed to spawn: %s", err)
err = fmt.Errorf(locale.Loc("failed_to_spawn", locale.Strmap{"Err": err}))
return
}
@ -233,7 +228,7 @@ func (p *ProxyContext) Run(ctx context.Context, server_address string) (err erro
go func() {
defer wg.Done()
if err := proxyLoop(ctx, p, false, cbs); err != nil {
p.log.Error(err)
logrus.Error(err)
return
}
}()
@ -243,7 +238,7 @@ func (p *ProxyContext) Run(ctx context.Context, server_address string) (err erro
go func() {
defer wg.Done()
if err := proxyLoop(ctx, p, true, cbs); err != nil {
p.log.Error(err)
logrus.Error(err)
return
}
}()

View File

@ -6,6 +6,7 @@ import (
"fmt"
"strings"
"github.com/bedrock-tool/bedrocktool/locale"
"github.com/google/subcommands"
"github.com/sandertv/gophertunnel/minecraft/realms"
"github.com/sirupsen/logrus"
@ -35,7 +36,7 @@ func get_realm(ctx context.Context, api *realms.Client, realm_name, id string) (
type RealmListCMD struct{}
func (*RealmListCMD) Name() string { return "list-realms" }
func (*RealmListCMD) Synopsis() string { return "prints all realms you have access to" }
func (*RealmListCMD) Synopsis() string { return locale.Loc("list_realms_synopsis", nil) }
func (c *RealmListCMD) SetFlags(f *flag.FlagSet) {}
func (c *RealmListCMD) Usage() string {
@ -50,7 +51,7 @@ func (c *RealmListCMD) Execute(ctx context.Context, f *flag.FlagSet, _ ...interf
return 1
}
for _, realm := range realms {
fmt.Printf("Name: %s\tid: %d\n", realm.Name, realm.ID)
fmt.Println(locale.Loc("realm_list_line", locale.Strmap{"Name": realm.Name, "Id": realm.ID}))
}
return 0
}

View File

@ -12,8 +12,8 @@ import (
"github.com/sirupsen/logrus"
)
func create_replay_connection(ctx context.Context, log *logrus.Logger, filename string, onConnect ConnectCallback, packetCB PacketCallback) error {
log.Infof("Reading replay %s", filename)
func create_replay_connection(ctx context.Context, filename string, onConnect ConnectCallback, packetCB PacketCallback) error {
logrus.Infof("Reading replay %s", filename)
f, err := os.Open(filename)
if err != nil {
@ -28,7 +28,7 @@ func create_replay_connection(ctx context.Context, log *logrus.Logger, filename
size = stat.Size()
}
proxy := NewProxy(logrus.StandardLogger())
proxy := NewProxy()
proxy.Server = minecraft.NewConn()
game_started := false
@ -41,7 +41,7 @@ func create_replay_connection(ctx context.Context, log *logrus.Logger, filename
offset, _ := f.Seek(0, io.SeekCurrent)
if offset == size {
log.Info("Reached End")
logrus.Info("Reached End")
return nil
}
@ -54,11 +54,11 @@ func create_replay_connection(ctx context.Context, log *logrus.Logger, filename
payload := make([]byte, packet_length)
n, err := f.Read(payload)
if err != nil {
log.Error(err)
logrus.Error(err)
return nil
}
if n != int(packet_length) {
log.Errorf("Truncated %d", i)
logrus.Errorf("Truncated %d", i)
return nil
}
@ -74,7 +74,7 @@ func create_replay_connection(ctx context.Context, log *logrus.Logger, filename
}
pks, err := pk_data.Decode(proxy.Server)
if err != nil {
log.Error(err)
logrus.Error(err)
continue
}

View File

@ -1,18 +1,15 @@
package utils
import (
"bytes"
"compress/gzip"
"context"
"encoding/base64"
"encoding/json"
"fmt"
"io"
"errors"
"net"
"path"
"regexp"
"strings"
"github.com/bedrock-tool/bedrocktool/locale"
"github.com/google/uuid"
"github.com/sandertv/gophertunnel/minecraft"
"github.com/sirupsen/logrus"
@ -23,29 +20,12 @@ import (
"github.com/sandertv/gophertunnel/minecraft/protocol/packet"
)
const SERVER_ADDRESS_HELP = `accepted server address formats:
123.234.123.234
123.234.123.234:19132
realm:<Realmname>
realm:<Realmname>:<Id>
`
var (
G_debug bool
G_preload_packs bool
G_interactive bool
)
var A string
func init() {
b, _ := base64.RawStdEncoding.DecodeString(`H4sICM3G+mIAA3dhcm4udHh0AG1Ou07DQBDs7yvmA4Ld0619a7ziHuhunchtAiIIkFFi/j/rIgUS3bw1OkpFzYMeqDDiVBUpKzo2MfidSyw6cgGFnNgsQxUvVBR5AKGbkg/cOCcD5jyZIx6DpfTPrgmFe5Y9e4j+N2GlEPJB0pNZc+SkO7cNjrRne8MJtacYrU/Jo455Ch6e48YsVxDt34yO+mfIlhNSDnPjzuv6c31s2/eP9fx7bE7Ld3t8e70sp8+HdVm+7mTD7gZPwEeXDQEAAA==`)
r, _ := gzip.NewReader(bytes.NewBuffer(b))
d, _ := io.ReadAll(r)
A = string(d)
}
var name_regexp = regexp.MustCompile(`\||(?:§.?)`)
// cleans name so it can be used as a filename
@ -80,7 +60,7 @@ func ConnectServer(ctx context.Context, address string, ClientData *login.Client
cd = *ClientData
}
logrus.Infof("Connecting to %s\n", address)
logrus.Info(locale.Loc("connecting", locale.Strmap{"Address": address}))
serverConn, err = minecraft.Dialer{
TokenSource: GetTokenSource(),
ClientData: cd,
@ -93,7 +73,7 @@ func ConnectServer(ctx context.Context, address string, ClientData *login.Client
return nil, err
}
logrus.Debug("Connected.")
logrus.Debug(locale.Loc("connected", nil))
Client_addr = serverConn.LocalAddr()
return serverConn, nil
}
@ -112,10 +92,10 @@ func spawn_conn(ctx context.Context, clientConn *minecraft.Conn, serverConn *min
select {
case err := <-errs:
if err != nil {
return fmt.Errorf("failed to start game: %s", err)
return errors.New(locale.Loc("failed_start_game", locale.Strmap{"Err": err}))
}
case <-ctx.Done():
return fmt.Errorf("connection cancelled")
return errors.New(locale.Loc("connection_cancelled", nil))
}
}
return nil