feat!(rewrite): Update to v2 libraries

Updated nex libraries to their new v2 counterparts, and rewrite for the new API as appropriate.

Removed a lot of dead code, notably NEX ranking, subscriptions, and the database connection for rankings - these are unused for Minecraft.
This commit is contained in:
Ash Logan 2024-04-19 21:43:47 +10:00
parent 0501905ad4
commit f326cb00b3
30 changed files with 261 additions and 781 deletions

5
.gitignore vendored
View File

@ -23,8 +23,11 @@ go.work.sum
# custom
.vscode
.idea
.env
build
log
*.pem
*.key
*.key
*.pcap
*.pcapng

View File

@ -44,7 +44,6 @@ All configuration options are handled via environment variables
| Name | Description | Required |
|-----------------------------------------|------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------|
| `PN_MINECRAFT_POSTGRES_URI` | Fully qualified URI to your Postgres server (Example `postgres://username:password@localhost/minecraft?sslmode=disable`) | Yes |
| `PN_MINECRAFT_KERBEROS_PASSWORD` | Password used as part of the internal server data in Kerberos tickets | No (Default password `password` will be used) |
| `PN_MINECRAFT_AUTHENTICATION_SERVER_PORT` | Port for the authentication server | Yes |
| `PN_MINECRAFT_SECURE_SERVER_HOST` | Host name for the secure server (should point to the same address as the authentication server) | Yes |

View File

@ -1,25 +0,0 @@
package database
import (
"database/sql"
"os"
_ "github.com/lib/pq"
"github.com/PretendoNetwork/minecraft-wiiu/globals"
)
var Postgres *sql.DB
func ConnectPostgres() {
var err error
Postgres, err = sql.Open("postgres", os.Getenv("PN_MINECRAFT_POSTGRES_URI"))
if err != nil {
globals.Logger.Critical(err.Error())
}
globals.Logger.Success("Connected to Postgres!")
initPostgres()
}

View File

@ -1,63 +0,0 @@
package database
import (
"database/sql"
ranking_types "github.com/PretendoNetwork/nex-protocols-go/ranking/types"
"github.com/PretendoNetwork/minecraft-wiiu/globals"
"github.com/PretendoNetwork/minecraft-wiiu/types"
)
func GetRankingsByCategoryAndRankingOrderParam(category uint32, rankingOrderParam *ranking_types.RankingOrderParam) (error, []*ranking_types.RankingRankData) {
rankings := make([]*ranking_types.RankingRankData, 0, rankingOrderParam.Length)
rows, err := Postgres.Query(`
SELECT
owner_pid,
score,
groups,
param,
common_data
FROM rankings WHERE category=$1 ORDER BY score DESC LIMIT $2 OFFSET $3`,
category,
rankingOrderParam.Length,
rankingOrderParam.Offset,
)
if err != nil {
return err, rankings
}
row := 1
for rows.Next() {
rankingRankData := ranking_types.NewRankingRankData()
rankingRankData.UniqueID = 0
rankingRankData.Order = uint32(row)
rankingRankData.Category = category
// * A custom type is needed because
// * Postgres doesn't support scanning
// * uint8 slices by default
var groups types.PQUInt8Array
err := rows.Scan(
&rankingRankData.PrincipalID,
&rankingRankData.Score,
&groups,
&rankingRankData.Param,
&rankingRankData.CommonData,
)
if err != nil && err != sql.ErrNoRows {
globals.Logger.Critical(err.Error())
}
if err == nil {
rankingRankData.Groups = groups.Value
rankings = append(rankings, rankingRankData)
row += 1
}
}
return nil, rankings
}

View File

@ -1,12 +0,0 @@
package database
func GetTotalRankingsByCategory(category uint32) (error, uint32) {
var total uint32
err := Postgres.QueryRow(`SELECT COUNT(*) FROM rankings WHERE category=$1`, category).Scan(&total)
if err != nil {
return err, 0
}
return nil, total
}

View File

@ -1,26 +0,0 @@
package database
import "github.com/PretendoNetwork/minecraft-wiiu/globals"
func initPostgres() {
var err error
_, err = Postgres.Exec(`CREATE TABLE IF NOT EXISTS rankings (
id bigserial PRIMARY KEY,
owner_pid integer,
category integer,
score integer,
order_by integer,
update_mode integer,
groups integer[],
param bigint,
common_data bytea,
created_at bigint
)`)
if err != nil {
globals.Logger.Critical(err.Error())
return
}
globals.Logger.Success("Postgres tables created")
}

View File

@ -1,38 +0,0 @@
package database
import (
"time"
ranking_types "github.com/PretendoNetwork/nex-protocols-go/ranking/types"
"github.com/lib/pq"
)
func InsertRankingByPIDAndRankingScoreData(pid uint32, rankingScoreData *ranking_types.RankingScoreData) error {
now := time.Now().UnixNano()
_, err := Postgres.Exec(`
INSERT INTO rankings (
owner_pid,
category,
score,
order_by,
update_mode,
groups,
param,
common_data,
created_at
)
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)`,
pid,
rankingScoreData.Category,
rankingScoreData.Score,
rankingScoreData.OrderBy,
rankingScoreData.UpdateMode,
pq.Array(rankingScoreData.Groups),
rankingScoreData.Param,
make([]byte, 0),
now,
)
return err
}

63
globals/accounts.go Normal file
View File

@ -0,0 +1,63 @@
package globals
import (
"github.com/PretendoNetwork/nex-go/v2"
"github.com/PretendoNetwork/nex-go/v2/types"
"strconv"
)
var AuthenticationServerAccount *nex.Account
var SecureServerAccount *nex.Account
func InitAccounts() {
AuthenticationServerAccount = nex.NewAccount(types.NewPID(1), "Quazal Authentication", KerberosPassword)
SecureServerAccount = nex.NewAccount(types.NewPID(2), "Quazal Rendez-Vous", KerberosPassword)
}
func AccountDetailsByPID(pid *types.PID) (*nex.Account, *nex.Error) {
if pid.Equals(AuthenticationServerAccount.PID) {
return AuthenticationServerAccount, nil
}
if pid.Equals(SecureServerAccount.PID) {
return SecureServerAccount, nil
}
password, errorCode := PasswordFromPID(pid)
if errorCode != 0 {
return nil, nex.NewError(errorCode, "Failed to get password from PID")
}
account := nex.NewAccount(pid, strconv.Itoa(int(pid.LegacyValue())), password)
return account, nil
}
func AccountDetailsByUsername(username string) (*nex.Account, *nex.Error) {
if username == AuthenticationServerAccount.Username {
return AuthenticationServerAccount, nil
}
if username == SecureServerAccount.Username {
return SecureServerAccount, nil
}
pidInt, err := strconv.Atoi(username)
if err != nil {
Logger.Error(err.Error())
return nil, nex.NewError(nex.ResultCodes.RendezVous.InvalidUsername, "Invalid username")
}
pid := types.NewPID(uint64(pidInt))
password, errorCode := PasswordFromPID(pid)
if errorCode != 0 {
Logger.Errorf("Password err: %v", errorCode)
return nil, nex.NewError(errorCode, "Failed to get password from PID")
}
account := nex.NewAccount(pid, username, password)
return account, nil
}

View File

@ -2,7 +2,7 @@ package globals
import (
pb "github.com/PretendoNetwork/grpc-go/account"
"github.com/PretendoNetwork/nex-go"
"github.com/PretendoNetwork/nex-go/v2"
"github.com/PretendoNetwork/plogger-go"
"google.golang.org/grpc"
"google.golang.org/grpc/metadata"
@ -10,8 +10,13 @@ import (
var Logger *plogger.Logger
var KerberosPassword = "password" // * Default password
var AuthenticationServer *nex.Server
var SecureServer *nex.Server
var AuthenticationServer *nex.PRUDPServer
var AuthenticationEndpoint *nex.PRUDPEndPoint
var SecureServer *nex.PRUDPServer
var SecureEndpoint *nex.PRUDPEndPoint
var GRPCAccountClientConnection *grpc.ClientConn
var GRPCAccountClient pb.AccountClient
var GRPCAccountCommonMetadata metadata.MD

View File

@ -2,20 +2,20 @@ package globals
import (
"context"
"github.com/PretendoNetwork/nex-go/v2/types"
pb "github.com/PretendoNetwork/grpc-go/account"
"github.com/PretendoNetwork/nex-go"
"github.com/PretendoNetwork/nex-protocols-go/globals"
"github.com/PretendoNetwork/nex-go/v2"
"google.golang.org/grpc/metadata"
)
func PasswordFromPID(pid uint32) (string, uint32) {
func PasswordFromPID(pid *types.PID) (string, uint32) {
ctx := metadata.NewOutgoingContext(context.Background(), GRPCAccountCommonMetadata)
response, err := GRPCAccountClient.GetNEXPassword(ctx, &pb.GetNEXPasswordRequest{Pid: pid})
response, err := GRPCAccountClient.GetNEXPassword(ctx, &pb.GetNEXPasswordRequest{Pid: pid.LegacyValue()})
if err != nil {
globals.Logger.Error(err.Error())
return "", nex.Errors.RendezVous.InvalidUsername
Logger.Error(err.Error())
return "", nex.ResultCodes.RendezVous.InvalidUsername
}
return response.Password, 0

37
go.mod
View File

@ -1,33 +1,36 @@
module github.com/PretendoNetwork/minecraft-wiiu
go 1.19
go 1.21
replace github.com/PretendoNetwork/nex-protocols-common-go => ./nex-protocols-common-go
toolchain go1.21.9
require (
github.com/PretendoNetwork/grpc-go v1.0.2
github.com/PretendoNetwork/nex-go v1.0.41
github.com/PretendoNetwork/nex-protocols-common-go v1.0.28
github.com/PretendoNetwork/nex-protocols-go v1.0.55
github.com/PretendoNetwork/nex-go/v2 v2.0.2
github.com/PretendoNetwork/nex-protocols-common-go/v2 v2.0.5
github.com/PretendoNetwork/nex-protocols-go/v2 v2.0.3
github.com/PretendoNetwork/plogger-go v1.0.4
github.com/joho/godotenv v1.5.1
github.com/lib/pq v1.10.9
google.golang.org/grpc v1.59.0
google.golang.org/grpc v1.63.2
)
require (
github.com/fatih/color v1.15.0 // indirect
github.com/golang/protobuf v1.5.3 // indirect
github.com/dolthub/maphash v0.1.0 // indirect
github.com/fatih/color v1.17.0 // indirect
github.com/golang/protobuf v1.5.4 // indirect
github.com/jwalton/go-supportscolor v1.2.0 // indirect
github.com/klauspost/compress v1.17.8 // indirect
github.com/lxzan/gws v1.8.3 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/rasky/go-lzo v0.0.0-20200203143853-96a758eda86e // indirect
github.com/superwhiskers/crunch/v3 v3.5.7 // indirect
golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect
golang.org/x/mod v0.13.0 // indirect
golang.org/x/net v0.17.0 // indirect
golang.org/x/sys v0.13.0 // indirect
golang.org/x/term v0.13.0 // indirect
golang.org/x/text v0.13.0 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b // indirect
google.golang.org/protobuf v1.31.0 // indirect
golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect
golang.org/x/mod v0.17.0 // indirect
golang.org/x/net v0.25.0 // indirect
golang.org/x/sys v0.20.0 // indirect
golang.org/x/term v0.20.0 // indirect
golang.org/x/text v0.15.0 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20240415180920-8c6c420018be // indirect
google.golang.org/protobuf v1.33.0 // indirect
)

88
go.sum
View File

@ -1,62 +1,66 @@
github.com/PretendoNetwork/grpc-go v1.0.2 h1:9TvKmX7dCOANyoHEra1MMYqS1N/RGav66TRG4SHInvo=
github.com/PretendoNetwork/grpc-go v1.0.2/go.mod h1:XZjEsij9lL7HJBNkH6JPbBIkUSq/1rjflvjGdv+DAj0=
github.com/PretendoNetwork/nex-go v1.0.41 h1:TcBb1Bpe2KAB+AXaGX1K9NVQBRtZJIoy4yCvRde2xbI=
github.com/PretendoNetwork/nex-go v1.0.41/go.mod h1:QwHEa165DeVd0xIuthrgc3j6NWXT8lyPSG6t5kC/Shk=
github.com/PretendoNetwork/nex-protocols-go v1.0.54 h1:nDbGnNpe7F/cwBZBvFFFPS1afZQ4OLpVHfF8t5xug/Y=
github.com/PretendoNetwork/nex-protocols-go v1.0.54/go.mod h1:136762CMIcAsTZDrt4W7gDE4ppiBuc9zN2QFOHESjS8=
github.com/PretendoNetwork/nex-protocols-go v1.0.55 h1:8QMeCNO2eZO4m7CRT/nv2WWm+gDh/REKR5jKTYQaaCs=
github.com/PretendoNetwork/nex-protocols-go v1.0.55/go.mod h1:136762CMIcAsTZDrt4W7gDE4ppiBuc9zN2QFOHESjS8=
github.com/PretendoNetwork/nex-go/v2 v2.0.2 h1:mPp27Ero3Rr28nekuKg4f0tdp28NzmCJXgupt2paT18=
github.com/PretendoNetwork/nex-go/v2 v2.0.2/go.mod h1:O5v200Ro8bdrmqSAmzV0cqQsG7cdmwLHAet5X7Jxz20=
github.com/PretendoNetwork/nex-protocols-common-go/v2 v2.0.5 h1:17b7vA8wjWLW9JdJTHeOoX2g2e4S/EwA32m9AuPEA80=
github.com/PretendoNetwork/nex-protocols-common-go/v2 v2.0.5/go.mod h1:0wDEYxDYbUOjsKjsTUjU0/f3pL1MT54h+tGn4UyeB+A=
github.com/PretendoNetwork/nex-protocols-go/v2 v2.0.3 h1:80CG7f9w/34MN1vAZ1XP3ec4LJ4mqKlkests+HQzrvc=
github.com/PretendoNetwork/nex-protocols-go/v2 v2.0.3/go.mod h1:2UN8khoMDNaeJ4GcIG7ez7MqqmbLfLzbVS6hSa+kGnk=
github.com/PretendoNetwork/plogger-go v1.0.4 h1:PF7xHw9eDRHH+RsAP9tmAE7fG0N0p6H4iPwHKnsoXwc=
github.com/PretendoNetwork/plogger-go v1.0.4/go.mod h1:7kD6M4vPq1JL4LTuPg6kuB1OvUBOwQOtAvTaUwMbwvU=
github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs=
github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw=
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
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=
github.com/dolthub/maphash v0.1.0 h1:bsQ7JsF4FkkWyrP3oCnFJgrCUAFbFf3kOl4L/QxPDyQ=
github.com/dolthub/maphash v0.1.0/go.mod h1:gkg4Ch4CdCDu5h6PMriVLawB7koZ+5ijb9puGMV50a4=
github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4=
github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI=
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
github.com/jwalton/go-supportscolor v1.2.0 h1:g6Ha4u7Vm3LIsQ5wmeBpS4gazu0UP1DRDE8y6bre4H8=
github.com/jwalton/go-supportscolor v1.2.0/go.mod h1:hFVUAZV2cWg+WFFC4v8pT2X/S2qUUBYMioBD9AINXGs=
github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU=
github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
github.com/lxzan/gws v1.8.3 h1:umX2VLhXj7oVV4Sd2gCuqzrzpVWtqkKMy0tjHBBxXg0=
github.com/lxzan/gws v1.8.3/go.mod h1:FcGeRMB7HwGuTvMLR24ku0Zx0p6RXqeKASeMc4VYgi4=
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.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA=
github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/rasky/go-lzo v0.0.0-20200203143853-96a758eda86e h1:dCWirM5F3wMY+cmRda/B1BiPsFtmzXqV9b0hLWtVBMs=
github.com/rasky/go-lzo v0.0.0-20200203143853-96a758eda86e/go.mod h1:9leZcVcItj6m9/CfHY5Em/iBrCz7js8LcRQGTKEEv2M=
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/superwhiskers/crunch/v3 v3.5.7 h1:N9RLxaR65C36i26BUIpzPXGy2f6pQ7wisu2bawbKNqg=
github.com/superwhiskers/crunch/v3 v3.5.7/go.mod h1:4ub2EKgF1MAhTjoOCTU4b9uLMsAweHEa89aRrfAypXA=
golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI=
golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo=
golang.org/x/mod v0.13.0 h1:I/DsJXRlw/8l/0c24sM9yb0T4z9liZTduXvdAWYiysY=
golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM=
golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc=
golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA=
golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac=
golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE=
golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y=
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek=
golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=
golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k=
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/genproto/googleapis/rpc v0.0.0-20231012201019-e917dd12ba7a h1:a2MQQVoTo96JC9PMGtGBymLp7+/RzpFc2yX/9WfFg1c=
google.golang.org/genproto/googleapis/rpc v0.0.0-20231012201019-e917dd12ba7a/go.mod h1:4cYg8o5yUbm77w8ZX00LhMVNl/YVBFJRYWDc0uYWMs0=
google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b h1:ZlWIi1wSK56/8hn4QcBp/j9M7Gt3U/3hZw3mC7vDICo=
google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:swOH3j0KzcDDgGUWr+SNpyTen5YrXjS3eyPzFYKc6lc=
google.golang.org/grpc v1.58.3 h1:BjnpXut1btbtgN/6sp+brB2Kbm2LjNXnidYujAVbSoQ=
google.golang.org/grpc v1.58.3/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0=
google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=
google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=
google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw=
golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY=
golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk=
golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
google.golang.org/genproto/googleapis/rpc v0.0.0-20240415180920-8c6c420018be h1:LG9vZxsWGOmUKieR8wPAUR3u3MpnYFQZROPIMaXh7/A=
google.golang.org/genproto/googleapis/rpc v0.0.0-20240415180920-8c6c420018be/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY=
google.golang.org/grpc v1.63.2 h1:MUeiw1B2maTVZthpU5xvASfTh3LDbxHd6IJ6QQVU+xM=
google.golang.org/grpc v1.63.2/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA=
google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=
google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

11
init.go
View File

@ -7,7 +7,6 @@ import (
"strings"
pb "github.com/PretendoNetwork/grpc-go/account"
"github.com/PretendoNetwork/minecraft-wiiu/database"
"github.com/PretendoNetwork/minecraft-wiiu/globals"
"github.com/PretendoNetwork/plogger-go"
"github.com/joho/godotenv"
@ -26,7 +25,6 @@ func init() {
globals.Logger.Warning("Error loading .env file")
}
postgresURI := os.Getenv("PN_MINECRAFT_POSTGRES_URI")
kerberosPassword := os.Getenv("PN_MINECRAFT_KERBEROS_PASSWORD")
authenticationServerPort := os.Getenv("PN_MINECRAFT_AUTHENTICATION_SERVER_PORT")
secureServerHost := os.Getenv("PN_MINECRAFT_SECURE_SERVER_HOST")
@ -35,17 +33,14 @@ func init() {
accountGRPCPort := os.Getenv("PN_MINECRAFT_ACCOUNT_GRPC_PORT")
accountGRPCAPIKey := os.Getenv("PN_MINECRAFT_ACCOUNT_GRPC_API_KEY")
if strings.TrimSpace(postgresURI) == "" {
globals.Logger.Error("PN_MINECRAFT_POSTGRES_URI environment variable not set")
os.Exit(0)
}
if strings.TrimSpace(kerberosPassword) == "" {
globals.Logger.Warningf("PN_MINECRAFT_KERBEROS_PASSWORD environment variable not set. Using default password: %q", globals.KerberosPassword)
} else {
globals.KerberosPassword = kerberosPassword
}
globals.InitAccounts()
if strings.TrimSpace(authenticationServerPort) == "" {
globals.Logger.Error("PN_MINECRAFT_AUTHENTICATION_SERVER_PORT environment variable not set")
os.Exit(0)
@ -109,6 +104,4 @@ func init() {
globals.GRPCAccountCommonMetadata = metadata.Pairs(
"X-API-Key", accountGRPCAPIKey,
)
database.ConnectPostgres()
}

View File

@ -3,31 +3,41 @@ package nex
import (
"fmt"
"os"
"strconv"
nex "github.com/PretendoNetwork/nex-go"
"github.com/PretendoNetwork/minecraft-wiiu/globals"
"github.com/PretendoNetwork/nex-go/v2"
)
var serverBuildString string
func StartAuthenticationServer() {
globals.AuthenticationServer = nex.NewServer()
globals.AuthenticationServer.SetPRUDPVersion(1)
globals.AuthenticationServer.SetPRUDPProtocolMinorVersion(2)
globals.AuthenticationServer.SetDefaultNEXVersion(nex.NewNEXVersion(3,10,0))
globals.AuthenticationServer.SetKerberosPassword(globals.KerberosPassword)
globals.AuthenticationServer.SetAccessKey("f1b61c8e")
globals.AuthenticationServer = nex.NewPRUDPServer()
globals.AuthenticationServer.ByteStreamSettings.UseStructureHeader = true
globals.AuthenticationServer.On("Data", func(packet *nex.PacketV1) {
request := packet.RMCRequest()
globals.AuthenticationEndpoint = nex.NewPRUDPEndPoint(1)
globals.AuthenticationEndpoint.ServerAccount = globals.AuthenticationServerAccount
globals.AuthenticationEndpoint.AccountDetailsByPID = globals.AccountDetailsByPID
globals.AuthenticationEndpoint.AccountDetailsByUsername = globals.AccountDetailsByUsername
globals.AuthenticationServer.BindPRUDPEndPoint(globals.AuthenticationEndpoint)
globals.AuthenticationServer.LibraryVersions.SetDefault(nex.NewLibraryVersion(3, 10, 0))
globals.AuthenticationServer.AccessKey = "f1b61c8e"
globals.AuthenticationEndpoint.OnData(func(packet nex.PacketInterface) {
request := packet.RMCMessage()
fmt.Println("==Minecraft: Wii U Edition - Auth==")
fmt.Printf("Protocol ID: %#v\n", request.ProtocolID())
fmt.Printf("Method ID: %#v\n", request.MethodID())
fmt.Printf("Protocol ID: %#v\n", request.ProtocolID)
fmt.Printf("Method ID: %#v\n", request.MethodID)
fmt.Println("===============")
})
globals.AuthenticationEndpoint.OnError(func(err *nex.Error) {
globals.Logger.Errorf("Auth: %v", err)
})
registerCommonAuthenticationServerProtocols()
globals.AuthenticationServer.Listen(fmt.Sprintf(":%s", os.Getenv("PN_MINECRAFT_AUTHENTICATION_SERVER_PORT")))
port, _ := strconv.Atoi(os.Getenv("PN_MINECRAFT_AUTHENTICATION_SERVER_PORT"))
globals.AuthenticationServer.Listen(port)
}

View File

@ -1,38 +0,0 @@
package nex
import (
"encoding/hex"
"fmt"
nex "github.com/PretendoNetwork/nex-go"
matchmake_extension "github.com/PretendoNetwork/nex-protocols-go/matchmake-extension"
"github.com/PretendoNetwork/minecraft-wiiu/globals"
)
func GetPlayingSession(err error, client *nex.Client, callID uint32, listPID []uint32) uint32 {
rmcResponseStream := nex.NewStreamOut(globals.SecureServer)
rmcResponseStream.WriteUInt32LE(0)
rmcResponseBody := rmcResponseStream.Bytes()
fmt.Println(hex.EncodeToString(rmcResponseBody))
rmcResponse := nex.NewRMCResponse(matchmake_extension.ProtocolID, callID)
rmcResponse.SetSuccess(matchmake_extension.MethodGetPlayingSession, rmcResponseBody)
rmcResponseBytes := rmcResponse.Bytes()
responsePacket, _ := nex.NewPacketV1(client, nil)
responsePacket.SetVersion(1)
responsePacket.SetSource(0xA1)
responsePacket.SetDestination(0xAF)
responsePacket.SetType(nex.DataPacket)
responsePacket.SetPayload(rmcResponseBytes)
responsePacket.AddFlag(nex.FlagNeedsAck)
responsePacket.AddFlag(nex.FlagReliable)
globals.SecureServer.Send(responsePacket)
return 0
}

View File

@ -1,65 +0,0 @@
package nex_ranking
import (
"github.com/PretendoNetwork/nex-go"
ranking "github.com/PretendoNetwork/nex-protocols-go/ranking"
ranking_types "github.com/PretendoNetwork/nex-protocols-go/ranking/types"
"github.com/PretendoNetwork/minecraft-wiiu/database"
"github.com/PretendoNetwork/minecraft-wiiu/globals"
)
func GetRanking(err error, client *nex.Client, callID uint32, rankingMode uint8, category uint32, orderParam *ranking_types.RankingOrderParam, uniqueID uint64, principalID uint32) {
rmcResponse := nex.NewRMCResponse(ranking.ProtocolID, callID)
if err != nil {
globals.Logger.Error(err.Error())
rmcResponse.SetError(nex.Errors.Ranking.Unknown)
}
rankDataListErr, rankDataList := database.GetRankingsByCategoryAndRankingOrderParam(category, orderParam)
if rankDataListErr != nil {
globals.Logger.Error(rankDataListErr.Error())
rmcResponse.SetError(nex.Errors.Ranking.Unknown)
}
totalCountErr, totalCount := database.GetTotalRankingsByCategory(category)
if totalCountErr != nil {
globals.Logger.Error(totalCountErr.Error())
rmcResponse.SetError(nex.Errors.Ranking.Unknown)
}
if totalCount == 0 || len(rankDataList) == 0 {
rmcResponse.SetError(nex.Errors.Ranking.NotFound)
}
if rankDataListErr == nil && totalCountErr == nil && totalCount != 0 {
pResult := ranking_types.NewRankingResult()
pResult.RankDataList = rankDataList
pResult.TotalCount = totalCount
pResult.SinceTime = nex.NewDateTime(0x1f40420000) // * 2000-01-01T00:00:00.000Z, this is what the real server sends back
rmcResponseStream := nex.NewStreamOut(globals.SecureServer)
rmcResponseStream.WriteStructure(pResult)
rmcResponseBody := rmcResponseStream.Bytes()
rmcResponse.SetSuccess(ranking.MethodGetRanking, rmcResponseBody)
}
rmcResponseBytes := rmcResponse.Bytes()
responsePacket, _ := nex.NewPacketV1(client, nil)
responsePacket.SetVersion(1)
responsePacket.SetSource(0xA1)
responsePacket.SetDestination(0xAF)
responsePacket.SetType(nex.DataPacket)
responsePacket.SetPayload(rmcResponseBytes)
responsePacket.AddFlag(nex.FlagNeedsAck)
responsePacket.AddFlag(nex.FlagReliable)
globals.SecureServer.Send(responsePacket)
}

View File

@ -1,41 +0,0 @@
package nex_ranking
import (
"github.com/PretendoNetwork/nex-go"
ranking "github.com/PretendoNetwork/nex-protocols-go/ranking"
ranking_types "github.com/PretendoNetwork/nex-protocols-go/ranking/types"
"github.com/PretendoNetwork/minecraft-wiiu/database"
"github.com/PretendoNetwork/minecraft-wiiu/globals"
)
func UploadScore(err error, client *nex.Client, callID uint32, scoreData *ranking_types.RankingScoreData, uniqueID uint64) {
rmcResponse := nex.NewRMCResponse(ranking.ProtocolID, callID)
if err != nil {
globals.Logger.Error(err.Error())
rmcResponse.SetError(nex.Errors.Ranking.Unknown)
}
insertErr := database.InsertRankingByPIDAndRankingScoreData(client.PID(), scoreData)
if insertErr != nil {
globals.Logger.Error(insertErr.Error())
rmcResponse.SetError(nex.Errors.Ranking.Unknown)
} else {
rmcResponse.SetSuccess(ranking.MethodUploadScore, nil)
}
rmcResponseBytes := rmcResponse.Bytes()
responsePacket, _ := nex.NewPacketV1(client, nil)
responsePacket.SetVersion(1)
responsePacket.SetSource(0xA1)
responsePacket.SetDestination(0xAF)
responsePacket.SetType(nex.DataPacket)
responsePacket.SetPayload(rmcResponseBytes)
responsePacket.AddFlag(nex.FlagNeedsAck)
responsePacket.AddFlag(nex.FlagReliable)
globals.SecureServer.Send(responsePacket)
}

View File

@ -1,31 +1,33 @@
package nex
import (
"github.com/PretendoNetwork/minecraft-wiiu/globals"
"github.com/PretendoNetwork/nex-go/v2/constants"
"github.com/PretendoNetwork/nex-go/v2/types"
commonticketgranting "github.com/PretendoNetwork/nex-protocols-common-go/v2/ticket-granting"
ticketgranting "github.com/PretendoNetwork/nex-protocols-go/v2/ticket-granting"
"os"
"strconv"
nex "github.com/PretendoNetwork/nex-go"
ticket_granting "github.com/PretendoNetwork/nex-protocols-common-go/ticket-granting"
"github.com/PretendoNetwork/minecraft-wiiu/globals"
)
func registerCommonAuthenticationServerProtocols() {
ticketGrantingProtocol := ticket_granting.NewCommonTicketGrantingProtocol(globals.AuthenticationServer)
ticketGrantingProtocol := ticketgranting.NewProtocol()
globals.AuthenticationEndpoint.RegisterServiceProtocol(ticketGrantingProtocol)
commonTicketGrantingProtocol := commonticketgranting.NewCommonProtocol(ticketGrantingProtocol)
port, _ := strconv.Atoi(os.Getenv("PN_MINECRAFT_SECURE_SERVER_PORT"))
secureStationURL := nex.NewStationURL("")
secureStationURL.SetScheme("prudps")
secureStationURL := types.NewStationURL("")
secureStationURL.SetURLType(constants.StationURLPRUDPS)
secureStationURL.SetAddress(os.Getenv("PN_MINECRAFT_SECURE_SERVER_HOST"))
secureStationURL.SetPort(uint32(port))
secureStationURL.SetCID(1)
secureStationURL.SetPID(2)
secureStationURL.SetSID(1)
secureStationURL.SetStream(10)
secureStationURL.SetType(2)
secureStationURL.SetPortNumber(uint16(port))
secureStationURL.SetConnectionID(1)
secureStationURL.SetPrincipalID(types.NewPID(2))
secureStationURL.SetStreamID(1)
secureStationURL.SetStreamType(constants.StreamTypeRVSecure)
secureStationURL.SetType(uint8(constants.StationURLFlagPublic))
ticketGrantingProtocol.SetSecureStationURL(secureStationURL)
//ticketGrantingProtocol.SetBuildName("branch:origin/project/ctr-egd build:3_10_22_2008_0")
globals.AuthenticationServer.SetPasswordFromPIDFunction(globals.PasswordFromPID)
commonTicketGrantingProtocol.SecureStationURL = secureStationURL
commonTicketGrantingProtocol.BuildName = types.NewString("branch:origin/release/ngs/3.10.x.200x build:3_10_22_2006_0")
commonTicketGrantingProtocol.SecureServerAccount = globals.SecureServerAccount
}

View File

@ -1,45 +1,57 @@
package nex
import (
secureconnection "github.com/PretendoNetwork/nex-protocols-common-go/secure-connection"
matchmaking "github.com/PretendoNetwork/nex-protocols-common-go/matchmaking"
matchmakingext "github.com/PretendoNetwork/nex-protocols-common-go/matchmaking-ext"
matchmakeextension "github.com/PretendoNetwork/nex-protocols-common-go/matchmake-extension"
nattraversal "github.com/PretendoNetwork/nex-protocols-common-go/nat-traversal"
"github.com/PretendoNetwork/minecraft-wiiu/globals"
match_making_types "github.com/PretendoNetwork/nex-protocols-go/match-making/types"
"github.com/PretendoNetwork/nex-go/v2/types"
commonnattraversal "github.com/PretendoNetwork/nex-protocols-common-go/v2/nat-traversal"
commonsecure "github.com/PretendoNetwork/nex-protocols-common-go/v2/secure-connection"
nattraversal "github.com/PretendoNetwork/nex-protocols-go/v2/nat-traversal"
secure "github.com/PretendoNetwork/nex-protocols-go/v2/secure-connection"
"fmt"
commonmatchmaking "github.com/PretendoNetwork/nex-protocols-common-go/v2/match-making"
commonmatchmakingext "github.com/PretendoNetwork/nex-protocols-common-go/v2/match-making-ext"
commonmatchmakeextension "github.com/PretendoNetwork/nex-protocols-common-go/v2/matchmake-extension"
matchmaking "github.com/PretendoNetwork/nex-protocols-go/v2/match-making"
matchmakingext "github.com/PretendoNetwork/nex-protocols-go/v2/match-making-ext"
matchmakeextension "github.com/PretendoNetwork/nex-protocols-go/v2/matchmake-extension"
matchmakingtypes "github.com/PretendoNetwork/nex-protocols-go/v2/match-making/types"
)
func cleanupSearchMatchmakeSessionHandler(matchmakeSession *match_making_types.MatchmakeSession){
//matchmakeSession.Attributes[2] = 0
matchmakeSession.MatchmakeParam = match_making_types.NewMatchmakeParam()
matchmakeSession.ApplicationData = make([]byte, 0)
fmt.Println(matchmakeSession.String())
// Is this needed? -Ash
func cleanupSearchMatchmakeSessionHandler(matchmakeSession *matchmakingtypes.MatchmakeSession) {
//_ = matchmakeSession.Attributes.SetIndex(2, types.NewPrimitiveU32(0))
matchmakeSession.MatchmakeParam = matchmakingtypes.NewMatchmakeParam()
matchmakeSession.ApplicationBuffer = types.NewBuffer(make([]byte, 0))
globals.Logger.Info(matchmakeSession.String())
}
func cleanupMatchmakeSessionSearchCriteriaHandler(searchCriteria []*match_making_types.MatchmakeSessionSearchCriteria){
}
func gameSpecificMatchmakeSessionSearchCriteriaChecksHandler(requestSearchCriteria, sessionSearchCriteria *match_making_types.MatchmakeSessionSearchCriteria) bool{
return true;
}
func createReportDBRecordHandler(pid uint32, reportID uint32, reportData []byte) error {
func CreateReportDBRecord(_ *types.PID, _ *types.PrimitiveU32, _ *types.QBuffer) error {
return nil
}
func registerCommonSecureServerProtocols() {
commonSecureconnectionProtocol := secureconnection.NewCommonSecureConnectionProtocol(globals.SecureServer)
commonSecureconnectionProtocol.CreateReportDBRecord(createReportDBRecordHandler)
matchmaking.NewCommonMatchMakingProtocol(globals.SecureServer)
matchmakingext.NewCommonMatchMakingExtProtocol(globals.SecureServer)
commonMatchmakeExtensionProtocol := matchmakeextension.NewCommonMatchmakeExtensionProtocol(globals.SecureServer)
commonMatchmakeExtensionProtocol.CleanupSearchMatchmakeSession(cleanupSearchMatchmakeSessionHandler)
commonMatchmakeExtensionProtocol.CleanupMatchmakeSessionSearchCriteria(cleanupMatchmakeSessionSearchCriteriaHandler)
commonMatchmakeExtensionProtocol.GameSpecificMatchmakeSessionSearchCriteriaChecks(gameSpecificMatchmakeSessionSearchCriteriaChecksHandler)
commonMatchmakeExtensionProtocol.DefaultProtocol.GetPlayingSession(GetPlayingSession)
//commonMatchmakeExtensionProtocol.DefaultProtocol.AutoMatchmakeWithParam_Postpone(autoMatchmakeWithParam_Postpone)
nattraversal.NewCommonNATTraversalProtocol(globals.SecureServer)
secureProtocol := secure.NewProtocol()
globals.SecureEndpoint.RegisterServiceProtocol(secureProtocol)
commonSecureProtocol := commonsecure.NewCommonProtocol(secureProtocol)
commonSecureProtocol.CreateReportDBRecord = CreateReportDBRecord
natTraversalProtocol := nattraversal.NewProtocol()
globals.SecureEndpoint.RegisterServiceProtocol(natTraversalProtocol)
commonnattraversal.NewCommonProtocol(natTraversalProtocol)
matchMakingProtocol := matchmaking.NewProtocol()
globals.SecureEndpoint.RegisterServiceProtocol(matchMakingProtocol)
commonmatchmaking.NewCommonProtocol(matchMakingProtocol)
matchMakingExtProtocol := matchmakingext.NewProtocol()
globals.SecureEndpoint.RegisterServiceProtocol(matchMakingExtProtocol)
commonmatchmakingext.NewCommonProtocol(matchMakingExtProtocol)
matchmakeExtensionProtocol := matchmakeextension.NewProtocol()
globals.SecureEndpoint.RegisterServiceProtocol(matchmakeExtensionProtocol)
commonMatchmakeExtensionProtocol := commonmatchmakeextension.NewCommonProtocol(matchmakeExtensionProtocol)
commonMatchmakeExtensionProtocol.CleanupSearchMatchmakeSession = cleanupSearchMatchmakeSessionHandler
}

View File

@ -1,11 +0,0 @@
package nex
import (
utility "github.com/PretendoNetwork/nex-protocols-go/utility"
"github.com/PretendoNetwork/minecraft-wiiu/globals"
)
func registerSecureServerNEXProtocols() {
_ = utility.NewProtocol(globals.SecureServer)
}

View File

@ -3,32 +3,44 @@ package nex
import (
"fmt"
"os"
"strconv"
nex "github.com/PretendoNetwork/nex-go"
"github.com/PretendoNetwork/minecraft-wiiu/globals"
"github.com/PretendoNetwork/nex-go/v2"
)
func StartSecureServer() {
globals.SecureServer = nex.NewServer()
globals.SecureServer.SetPRUDPVersion(1)
globals.SecureServer.SetPRUDPProtocolMinorVersion(3)
globals.SecureServer.SetDefaultNEXVersion(nex.NewNEXVersion(3,10,0))
globals.SecureServer.SetKerberosPassword(globals.KerberosPassword)
globals.SecureServer.SetAccessKey("f1b61c8e")
globals.SecureServer = nex.NewPRUDPServer()
globals.SecureServer.ByteStreamSettings.UseStructureHeader = true
globals.SecureEndpoint = nex.NewPRUDPEndPoint(1)
globals.SecureEndpoint.IsSecureEndPoint = true
globals.SecureEndpoint.ServerAccount = globals.SecureServerAccount
globals.SecureEndpoint.AccountDetailsByPID = globals.AccountDetailsByPID
globals.SecureEndpoint.AccountDetailsByUsername = globals.AccountDetailsByUsername
globals.SecureServer.BindPRUDPEndPoint(globals.SecureEndpoint)
globals.SecureServer.LibraryVersions.SetDefault(nex.NewLibraryVersion(3, 10, 0))
globals.SecureServer.AccessKey = "f1b61c8e"
globals.Timeline = make(map[uint32][]uint8)
globals.SecureServer.On("Data", func(packet *nex.PacketV1) {
request := packet.RMCRequest()
globals.SecureEndpoint.OnData(func(packet nex.PacketInterface) {
request := packet.RMCMessage()
fmt.Println("==Minecraft: Wii U Edition - Secure==")
fmt.Printf("Protocol ID: %#v\n", request.ProtocolID())
fmt.Printf("Method ID: %#v\n", request.MethodID())
fmt.Printf("Protocol ID: %d\n", request.ProtocolID)
fmt.Printf("Method ID: %d\n", request.MethodID)
fmt.Println("===============")
})
registerCommonSecureServerProtocols()
registerSecureServerNEXProtocols()
globals.SecureEndpoint.OnError(func(err *nex.Error) {
globals.Logger.Errorf("Secure: %v", err)
})
globals.SecureServer.Listen(fmt.Sprintf(":%s", os.Getenv("PN_MINECRAFT_SECURE_SERVER_PORT")))
registerCommonSecureServerProtocols()
port, _ := strconv.Atoi(os.Getenv("PN_MINECRAFT_SECURE_SERVER_PORT"))
globals.SecureServer.Listen(port)
}

View File

@ -1,28 +0,0 @@
package nex_subscription
import (
nex "github.com/PretendoNetwork/nex-go"
"github.com/PretendoNetwork/minecraft-wiiu/globals"
"github.com/PretendoNetwork/nex-protocols-go/subscription"
)
func CreateMySubscriptionData(err error, client *nex.Client, callID uint32, unk uint64, content []byte) {
globals.Timeline[client.PID()] = content
rmcResponse := nex.NewRMCResponse(subscription.ProtocolID, callID)
rmcResponse.SetSuccess(subscription.MethodCreateMySubscriptionData, nil)
rmcResponseBytes := rmcResponse.Bytes()
responsePacket, _ := nex.NewPacketV1(client, nil)
responsePacket.SetVersion(1)
responsePacket.SetSource(0xA1)
responsePacket.SetDestination(0xAF)
responsePacket.SetType(nex.DataPacket)
responsePacket.SetPayload(rmcResponseBytes)
responsePacket.AddFlag(nex.FlagNeedsAck)
responsePacket.AddFlag(nex.FlagReliable)
globals.SecureServer.Send(responsePacket)
}

View File

@ -1,41 +0,0 @@
package nex_subscription
import (
"encoding/hex"
"fmt"
nex "github.com/PretendoNetwork/nex-go"
"github.com/PretendoNetwork/minecraft-wiiu/globals"
"github.com/PretendoNetwork/nex-protocols-go/subscription"
)
func GetActivePlayerSubscriptionData(err error, client *nex.Client, callID uint32) {
rmcResponseStream := nex.NewStreamOut(globals.SecureServer)
rmcResponseStream.WriteUInt32LE(uint32(len(globals.Timeline)))
for clientPID := range globals.Timeline {
for j := 0; j < len(globals.Timeline[clientPID]); j++ {
rmcResponseStream.WriteUInt8(globals.Timeline[clientPID][j])
}
}
rmcResponseBody := rmcResponseStream.Bytes()
fmt.Println(hex.EncodeToString(rmcResponseBody))
rmcResponse := nex.NewRMCResponse(subscription.ProtocolID, callID)
rmcResponse.SetSuccess(subscription.MethodGetActivePlayerSubscriptionData, rmcResponseBody)
rmcResponseBytes := rmcResponse.Bytes()
responsePacket, _ := nex.NewPacketV1(client, nil)
responsePacket.SetVersion(1)
responsePacket.SetSource(0xA1)
responsePacket.SetDestination(0xAF)
responsePacket.SetType(nex.DataPacket)
responsePacket.SetPayload(rmcResponseBytes)
responsePacket.AddFlag(nex.FlagNeedsAck)
responsePacket.AddFlag(nex.FlagReliable)
globals.SecureServer.Send(responsePacket)
}

View File

@ -1,33 +0,0 @@
package nex_subscription
import (
nex "github.com/PretendoNetwork/nex-go"
"github.com/PretendoNetwork/minecraft-wiiu/globals"
"github.com/PretendoNetwork/nex-protocols-go/subscription"
)
func GetFriendSubscriptionData(err error, client *nex.Client, callID uint32) {
rmcResponseStream := nex.NewStreamOut(globals.SecureServer)
rmcResponseStream.WriteUInt32LE(0)
rmcResponseBody := rmcResponseStream.Bytes()
rmcResponse := nex.NewRMCResponse(subscription.ProtocolID, callID)
rmcResponse.SetSuccess(subscription.MethodGetFriendSubscriptionData, rmcResponseBody)
rmcResponseBytes := rmcResponse.Bytes()
responsePacket, _ := nex.NewPacketV1(client, nil)
responsePacket.SetVersion(1)
responsePacket.SetSource(0xA1)
responsePacket.SetDestination(0xAF)
responsePacket.SetType(nex.DataPacket)
responsePacket.SetPayload(rmcResponseBytes)
responsePacket.AddFlag(nex.FlagNeedsAck)
responsePacket.AddFlag(nex.FlagReliable)
globals.SecureServer.Send(responsePacket)
}

View File

@ -1,27 +0,0 @@
package nex_subscription
import (
nex "github.com/PretendoNetwork/nex-go"
"github.com/PretendoNetwork/minecraft-wiiu/globals"
"github.com/PretendoNetwork/nex-protocols-go/subscription"
)
func GetPrivacyLevels(err error, client *nex.Client, callID uint32) {
rmcResponse := nex.NewRMCResponse(subscription.ProtocolID, callID)
rmcResponse.SetSuccess(subscription.MethodGetPrivacyLevels, nil)
rmcResponseBytes := rmcResponse.Bytes()
responsePacket, _ := nex.NewPacketV1(client, nil)
responsePacket.SetVersion(1)
responsePacket.SetSource(0xA1)
responsePacket.SetDestination(0xAF)
responsePacket.SetType(nex.DataPacket)
responsePacket.SetPayload(rmcResponseBytes)
responsePacket.AddFlag(nex.FlagNeedsAck)
responsePacket.AddFlag(nex.FlagReliable)
globals.SecureServer.Send(responsePacket)
}

View File

@ -1,44 +0,0 @@
package nex_subscription
import (
nex "github.com/PretendoNetwork/nex-go"
"encoding/hex"
"fmt"
"github.com/PretendoNetwork/minecraft-wiiu/globals"
"github.com/PretendoNetwork/nex-protocols-go/subscription"
)
func GetSubscriptionData(err error, client *nex.Client, callID uint32, pids []uint32) {
rmcResponseStream := nex.NewStreamOut(globals.SecureServer)
for _, pid := range pids {
fmt.Println(pid)
content := globals.Timeline[pid]
rmcResponseStream.WriteUInt32LE(1)
for i := 0; i < len(content); i++ {
rmcResponseStream.WriteUInt8(content[i])
}
}
rmcResponseBody := rmcResponseStream.Bytes()
_ = rmcResponseBody
fmt.Println(hex.EncodeToString(rmcResponseBody))
rmcResponse := nex.NewRMCResponse(subscription.ProtocolID, callID)
rmcResponse.SetSuccess(subscription.MethodGetSubscriptionData, rmcResponseBody)
rmcResponseBytes := rmcResponse.Bytes()
responsePacket, _ := nex.NewPacketV1(client, nil)
responsePacket.SetVersion(1)
responsePacket.SetSource(0xA1)
responsePacket.SetDestination(0xAF)
responsePacket.SetType(nex.DataPacket)
responsePacket.SetPayload(rmcResponseBytes)
responsePacket.AddFlag(nex.FlagNeedsAck)
responsePacket.AddFlag(nex.FlagReliable)
globals.SecureServer.Send(responsePacket)
}

View File

@ -1,33 +0,0 @@
package nex_subscription
import (
nex "github.com/PretendoNetwork/nex-go"
"github.com/PretendoNetwork/minecraft-wiiu/globals"
"github.com/PretendoNetwork/nex-protocols-go/subscription"
)
func GetTargetSubscriptionData(err error, client *nex.Client, callID uint32) {
rmcResponseStream := nex.NewStreamOut(globals.SecureServer)
rmcResponseStream.WriteUInt32LE(0)
rmcResponseBody := rmcResponseStream.Bytes()
rmcResponse := nex.NewRMCResponse(subscription.ProtocolID, callID)
rmcResponse.SetSuccess(subscription.MethodGetTargetSubscriptionData, rmcResponseBody)
rmcResponseBytes := rmcResponse.Bytes()
responsePacket, _ := nex.NewPacketV1(client, nil)
responsePacket.SetVersion(1)
responsePacket.SetSource(0xA1)
responsePacket.SetDestination(0xAF)
responsePacket.SetType(nex.DataPacket)
responsePacket.SetPayload(rmcResponseBytes)
responsePacket.AddFlag(nex.FlagNeedsAck)
responsePacket.AddFlag(nex.FlagReliable)
globals.SecureServer.Send(responsePacket)
}

View File

@ -1,33 +0,0 @@
package nex_subscription
import (
nex "github.com/PretendoNetwork/nex-go"
"github.com/PretendoNetwork/minecraft-wiiu/globals"
"github.com/PretendoNetwork/nex-protocols-go/subscription"
)
func ReplaceTargetAndGetSubscriptionData(err error, client *nex.Client, callID uint32) {
rmcResponseStream := nex.NewStreamOut(globals.SecureServer)
rmcResponseStream.WriteUInt32LE(0)
rmcResponseBody := rmcResponseStream.Bytes()
rmcResponse := nex.NewRMCResponse(subscription.ProtocolID, callID)
rmcResponse.SetSuccess(subscription.MethodReplaceTargetAndGetSubscriptionData, rmcResponseBody)
rmcResponseBytes := rmcResponse.Bytes()
responsePacket, _ := nex.NewPacketV1(client, nil)
responsePacket.SetVersion(1)
responsePacket.SetSource(0xA1)
responsePacket.SetDestination(0xAF)
responsePacket.SetType(nex.DataPacket)
responsePacket.SetPayload(rmcResponseBytes)
responsePacket.AddFlag(nex.FlagNeedsAck)
responsePacket.AddFlag(nex.FlagReliable)
globals.SecureServer.Send(responsePacket)
}

View File

@ -1,29 +0,0 @@
package nex_subscription
import (
nex "github.com/PretendoNetwork/nex-go"
"github.com/PretendoNetwork/minecraft-wiiu/globals"
"github.com/PretendoNetwork/nex-protocols-go/subscription"
)
func UpdateMySubscriptionData(err error, client *nex.Client, callID uint32, unk uint32, content []byte) {
globals.Timeline[client.PID()] = content
rmcResponse := nex.NewRMCResponse(subscription.ProtocolID, callID)
rmcResponse.SetSuccess(subscription.MethodUpdateMySubscriptionData, nil)
rmcResponseBytes := rmcResponse.Bytes()
responsePacket, _ := nex.NewPacketV1(client, nil)
responsePacket.SetVersion(1)
responsePacket.SetSource(0xA1)
responsePacket.SetDestination(0xAF)
responsePacket.SetType(nex.DataPacket)
responsePacket.SetPayload(rmcResponseBytes)
responsePacket.AddFlag(nex.FlagNeedsAck)
responsePacket.AddFlag(nex.FlagReliable)
globals.SecureServer.Send(responsePacket)
}

View File

@ -1,39 +0,0 @@
package types
import (
"fmt"
"strconv"
"strings"
)
type PQUInt8Array struct {
Value []uint8
}
func (array *PQUInt8Array) Scan(src interface{}) error {
switch src := src.(type) {
case []uint8:
// * Postgres stores uint8 slices as
// * a string in the format:
// * {1,2,3,4}
str := string(src)
str = strings.TrimSuffix(str, "}")
str = strings.TrimPrefix(str, "{")
strSlice := strings.Split(str, ",")
for i := 0; i < len(strSlice); i++ {
number, err := strconv.Atoi(strSlice[i])
if err != nil {
return err
}
array.Value = append(array.Value, uint8(number))
}
return nil
}
return fmt.Errorf("Type %T does not have a path to convert to UInt8Array", src)
}