Merge pull request #6 from shoginyan/master
Some checks are pending
Build and Publish Docker Image / build-publish (push) Waiting to run

merged auth and secure, updated nex libraries.
This commit is contained in:
William Oldham 2025-02-22 12:54:29 +00:00 committed by GitHub
commit 7f8fad8990
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
42 changed files with 893 additions and 892 deletions

5
.gitignore vendored
View File

@ -27,4 +27,7 @@ go.work.sum
build
log
*.pem
*.key
*.key
# macOS nonsense
.DS_Store

View File

@ -4,7 +4,7 @@ ARG app_dir="/home/go/app"
# * Building the application
FROM golang:1.22-alpine3.20 AS build
FROM golang:1.23-alpine3.20 AS build
ARG app_dir
WORKDIR ${app_dir}
@ -15,8 +15,9 @@ RUN --mount=type=cache,target=/go/pkg/mod/ \
go mod download -x
COPY . .
ARG BUILD_STRING=pretendo.WUC.docker
RUN --mount=type=cache,target=/go/pkg/mod/ \
CGO_ENABLED=0 go build -v -o ${app_dir}/build/server
CGO_ENABLED=0 go build -ldflags "-X 'main.serverBuildString=${BUILD_STRING}'" -v -o ${app_dir}/build/server
# * Running the final application

60
Makefile Normal file
View File

@ -0,0 +1,60 @@
# TODO - Assumes a UNIX-like OS
RED := $(shell tput setaf 1)
BLUE := $(shell tput setaf 4)
CYAN := $(shell tput setaf 14)
ORANGE := $(shell tput setaf 202)
YELLOW := $(shell tput setaf 214)
RESET := $(shell tput sgr0)
ifeq ($(shell which go),)
# TODO - Read contents from .git folder instead?
$(error "$(RED)go command not found. Install go to continue $(BLUE)https://go.dev/doc/install$(RESET)")
endif
ifneq ($(wildcard .git),)
# * .git folder exists, build server build string from repo info
ifeq ($(shell which git),)
# TODO - Read contents from .git folder instead?
$(error "$(RED)git command not found. Install git to continue $(ORANGE)https://git-scm.com/downloads$(RESET)")
endif
$(info "$(CYAN)Building server build string from repository info$(RESET)")
# * Build server build string from repo info
BRANCH := $(shell git rev-parse --abbrev-ref HEAD)
REMOTE_ORIGIN := $(shell git config --get remote.origin.url)
# * Handle multiple origin URL formats
HTTPS_PREFIX_CHECK := $(shell echo $(REMOTE_ORIGIN) | head -c 8)
HTTP_PREFIX_CHECK := $(shell echo $(REMOTE_ORIGIN) | head -c 7)
GIT@_PREFIX_CHECK := $(shell echo $(REMOTE_ORIGIN) | head -c 4)
ifeq ($(HTTPS_PREFIX_CHECK), https://)
REMOTE_PATH := $(shell echo $(REMOTE_ORIGIN) | cut -d/ -f4-)
else ifeq ($(HTTP_PREFIX_CHECK), http://)
REMOTE_PATH := $(shell echo $(REMOTE_ORIGIN) | cut -d/ -f4-)
else ifeq ($(GIT@_PREFIX_CHECK), git@)
REMOTE_PATH := $(shell echo $(REMOTE_ORIGIN) | cut -d: -f2-)
else
REMOTE_PATH := $(shell echo $(REMOTE_ORIGIN) | cut -d/ -f2-)
endif
HASH := $(shell git rev-parse --short HEAD)
SERVER_BUILD := $(BRANCH):$(REMOTE_PATH)@$(HASH)
else
# * .git folder not present, assume downloaded from zip file and just use folder name
$(info "$(CYAN)git repository not found. Building server build string from folder name$(RESET)")
SERVER_BUILD := $(notdir $(CURDIR))
endif
# * Final build string
DATE_TIME := $(shell date --iso=seconds)
BUILD_STRING := $(SERVER_BUILD), $(DATE_TIME)
all:
ifeq ($(wildcard .env),)
$(warning "$(YELLOW).env file not found, environment variables may not be populated correctly$(RESET)")
endif
go get -u
go mod tidy
go build -ldflags "-X 'main.serverBuildString=$(BUILD_STRING)'" -o ./build/$(notdir $(CURDIR))

57
README.md Normal file
View File

@ -0,0 +1,57 @@
# Wii U Chat replacement server
Includes both the authentication and secure servers
## Compiling
### Setup
Install [Go](https://go.dev/doc/install) and [git](https://git-scm.com/downloads), then clone and enter the repository
```bash
$ git clone https://github.com/PretendoNetwork/wiiu-chat
$ cd wiiu-chat
```
### Compiling using `go`
To compile using Go, `go get` the required modules and then `go build` to your desired location. You may also want to tidy the go modules, though this is optional
```bash
$ go get -u
$ go mod tidy
$ go build -o build/wiiu-chat
```
The server is now built to `build/wiiu-chat`
When compiling with only Go, the authentication servers build string is not automatically set. This should not cause any issues with gameplay, but it means that the server build will not be visible in any packet dumps or logs a title may produce
To compile the servers with the authentication server build string, add `-ldflags "-X 'main.serverBuildString=BUILD_STRING_HERE'"` to the build command, or use `make` to compile the server
### Compiling using `make`
Compiling using `make` will read the local `.git` directory to create a dynamic authentication server build string, based on your repositories remote origin and current commit
Install `make` either through your systems package manager or the [official download](https://www.gnu.org/software/make/). We provide a `default` rule which compiles [using `go`](#compiling-using-go)
To build using `go`
```bash
$ make
```
The server is now built to `build/wiiu-chat`
## Configuration
All configuration options are handled via environment variables
`.env` files are supported
| Name | Description | Required |
| ---- | ----------- | -------- |
| `PN_WUC_POSTGRES_URI` | Fully qualified URI to your Postgres server (Example `postgres://username:password@localhost/wiiuchat?sslmode=disable`) | Yes |
| `PN_WUC_AUTHENTICATION_SERVER_PORT` | Port for the authentication server | Yes |
| `PN_WUC_SECURE_SERVER_HOST` | Host name for the secure server (should point to the same address as the authentication server) | Yes |
| `PN_WUC_SECURE_SERVER_PORT` | Port for the secure server | Yes |
| `PN_WUC_ACCOUNT_GRPC_HOST` | Host name for your account server gRPC service | Yes |
| `PN_WUC_ACCOUNT_GRPC_PORT` | Port for your account server gRPC service | Yes |
| `PN_WUC_ACCOUNT_GRPC_API_KEY` | API key for your account server gRPC service | No (Assumed to be an open gRPC API) |
| `PN_WUC_FRIENDS_GRPC_HOST` | Host name for your friends server gRPC service | Yes |
| `PN_WUC_FRIENDS_GRPC_PORT` | Port for your friends server gRPC service | Yes |
| `PN_WUC_FRIENDS_GRPC_API_KEY` | API key for your friends server gRPC service | No (Assumed to be an open gRPC API) |

View File

@ -1,23 +0,0 @@
package database
import (
"context"
"go.mongodb.org/mongo-driver/bson"
)
func AddNewUser(pid uint32) {
username := GetUsernameFromPID(pid)
filter := bson.D{
{"pid", pid},
{"missed_calls", bson.A{""}},
{"username", username},
{"status", "unallowed"},
}
_, err := usersCollection.InsertOne(context.TODO(), filter)
if err != nil {
panic(err)
}
}

View File

@ -1,5 +0,0 @@
package database
func ConnectAll() {
connectMongo()
}

View File

@ -1,41 +0,0 @@
package database
import (
"context"
"os"
"time"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)
var mongoClient *mongo.Client
var mongoContext context.Context
var accountDatabase *mongo.Database
var doorsDatabase *mongo.Database
var pnidCollection *mongo.Collection
var nexAccountsCollection *mongo.Collection
var regionsCollection *mongo.Collection
var usersCollection *mongo.Collection
var sessionsCollection *mongo.Collection
var callsCollection *mongo.Collection
var tourneysCollection *mongo.Collection
func connectMongo() {
mongoClient, _ = mongo.NewClient(options.Client().ApplyURI(os.Getenv("PN_WIIU_CHAT_MONGO_URI")))
mongoContext, _ = context.WithTimeout(context.Background(), 10*time.Second)
_ = mongoClient.Connect(mongoContext)
accountDatabase = mongoClient.Database("pretendo")
pnidCollection = accountDatabase.Collection("pnids")
nexAccountsCollection = accountDatabase.Collection("nexaccounts")
doorsDatabase = mongoClient.Database("doors")
usersCollection = doorsDatabase.Collection("users")
sessionsCollection = doorsDatabase.Collection("sessions")
callsCollection = doorsDatabase.Collection("calls")
sessionsCollection.DeleteMany(context.TODO(), bson.D{})
callsCollection.DeleteMany(context.TODO(), bson.D{})
}

View File

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

View File

@ -1,27 +0,0 @@
package database
import (
"context"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)
func DoesUserExist(pid uint32) bool {
var result bson.M
filter := bson.D{
{"pid", pid},
}
err := usersCollection.FindOne(context.TODO(), filter, options.FindOne()).Decode(&result)
if err != nil {
if err == mongo.ErrNoDocuments {
return false
} else {
panic(err)
}
} else {
return true
}
}

View File

@ -1,18 +1,14 @@
package database
import (
"context"
"go.mongodb.org/mongo-driver/bson"
"github.com/PretendoNetwork/nex-go/v2/types"
"github.com/PretendoNetwork/wiiu-chat/globals"
)
func EndCall(caller uint32) {
filter := bson.D{
{"caller_pid", caller},
}
_, err := callsCollection.DeleteOne(context.TODO(), filter)
func EndCall(caller types.PID) {
_, err := Postgres.Exec(`DELETE FROM ongoingcalls WHERE caller_pid = $1;`, caller)
if err != nil {
panic(err)
globals.Logger.Critical(err.Error())
return
}
}

View File

@ -1,26 +1,14 @@
package database
import (
"context"
"go.mongodb.org/mongo-driver/bson"
"github.com/PretendoNetwork/nex-go/v2/types"
"github.com/PretendoNetwork/wiiu-chat/globals"
)
func EndCallRinging(caller uint32) {
filter := bson.D{
{"caller_pid", caller},
}
update := bson.D{
{
"$set", bson.D{
{"ringing", false},
},
},
}
_, err := callsCollection.UpdateOne(context.TODO(), filter, update)
func EndCallRinging(caller types.PID) {
_, err := Postgres.Exec(`UPDATE ongoingcalls SET (ringing = $1) WHERE caller_pid = $2;`, false, caller)
if err != nil {
panic(err)
globals.Logger.Critical(err.Error())
return
}
}

View File

@ -1,27 +1,16 @@
package database
import (
"context"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"github.com/PretendoNetwork/nex-go/v2/types"
"github.com/PretendoNetwork/wiiu-chat/globals"
)
func GetCallInfoByCaller(caller uint32) (uint32, uint32, bool) { // caller pid, target pid, ringing
var result bson.M
filter := bson.D{
{"caller_pid", caller},
}
err := callsCollection.FindOne(context.TODO(), filter, options.FindOne()).Decode(&result)
func GetCallInfoByCaller(caller types.PID) (caller_pid types.PID, target_pid types.PID, ringing types.Bool) {
row := Postgres.QueryRow(`SELECT (caller_pid, target_pid, ringing) FROM ongoingcalls WHERE caller_pid = $1;`, caller)
err := row.Scan(&caller_pid, &target_pid, &ringing)
if err != nil {
if err == mongo.ErrNoDocuments {
return 0, 0, false
} else {
panic(err)
}
} else {
return uint32(result["caller_pid"].(int64)), uint32(result["target_pid"].(int64)), result["ringing"].(bool)
globals.Logger.Critical(err.Error())
return 0, 0, false
}
return caller_pid, target_pid, ringing
}

View File

@ -1,27 +1,16 @@
package database
import (
"context"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"github.com/PretendoNetwork/nex-go/v2/types"
"github.com/PretendoNetwork/wiiu-chat/globals"
)
func GetCallInfoByTarget(target uint32) (uint32, uint32, bool) { // caller pid, target pid, ringing
var result bson.M
filter := bson.D{
{"target_pid", target},
}
err := callsCollection.FindOne(context.TODO(), filter, options.FindOne()).Decode(&result)
func GetCallInfoByTarget(target types.PID) (caller_pid types.PID, target_pid types.PID, ringing types.Bool) {
row := Postgres.QueryRow(`SELECT (caller_pid, target_pid, ringing) FROM ongoingcalls WHERE target_pid = $1;`, target)
err := row.Scan(&caller_pid, &target_pid, &ringing)
if err != nil {
if err == mongo.ErrNoDocuments {
return 0, 0, false
} else {
panic(err)
}
} else {
return uint32(result["caller_pid"].(int64)), uint32(result["target_pid"].(int64)), result["ringing"].(bool)
globals.Logger.Warning(err.Error())
return 0, 0, false
}
return caller_pid, target_pid, ringing
}

View File

@ -1,31 +0,0 @@
package database
import (
"context"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)
func GetUsernameFromPID(pid uint32) string {
var result bson.M
filter := bson.D{
{
Key: "pid",
Value: pid,
},
}
err := pnidCollection.FindOne(context.TODO(), filter, options.FindOne()).Decode(&result)
if err != nil {
if err == mongo.ErrNoDocuments {
return ""
}
panic(err)
}
return result["username"].(string)
}

26
database/init_postgres.go Normal file
View File

@ -0,0 +1,26 @@
package database
import "github.com/PretendoNetwork/wiiu-chat/globals"
func InitPostgres() {
var err error
_, err = Postgres.Exec(`CREATE TABLE IF NOT EXISTS ongoingcalls (
caller_pid integer UNIQUE PRIMARY KEY,
target_pid integer,
ringing bool
)`)
if err != nil {
globals.Logger.Critical(err.Error())
return
}
// Empty out call list if there happens to be old data lingering
_, err = Postgres.Exec(`DELETE FROM ongoingcalls;`)
if err != nil {
globals.Logger.Critical(err.Error())
return
}
globals.Logger.Success("Postgres tables created")
}

View File

@ -1,32 +0,0 @@
package database
import (
"context"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)
func IsUserAllowed(pid uint32) bool {
var result bson.M
filter := bson.D{
{"pid", pid},
}
err := usersCollection.FindOne(context.TODO(), filter, options.FindOne()).Decode(&result)
if err != nil {
if err == mongo.ErrNoDocuments {
return false
} else {
panic(err)
}
} else {
data := result["status"].(string)
if data == "allowed" {
return true
} else {
return false
}
}
}

View File

@ -1,20 +1,14 @@
package database
import (
"context"
"go.mongodb.org/mongo-driver/bson"
"github.com/PretendoNetwork/nex-go/v2/types"
"github.com/PretendoNetwork/wiiu-chat/globals"
)
func NewCall(caller uint32, target uint32) {
document := bson.D{
{"caller_pid", caller},
{"target_pid", target},
{"ringing", true},
}
_, err := callsCollection.InsertOne(context.TODO(), document)
func NewCall(caller types.PID, target types.PID) {
_, err := Postgres.Exec(`INSERT INTO ongoingcalls (caller_pid, target_pid, ringing) VALUES ($1, $2, $3);`, caller, target, true)
if err != nil {
panic(err)
globals.Logger.Critical(err.Error())
return
}
}

56
globals/accounts.go Normal file
View File

@ -0,0 +1,56 @@
package globals
import (
"strconv"
"github.com/PretendoNetwork/nex-go/v2"
"github.com/PretendoNetwork/nex-go/v2/types"
)
var AuthenticationServerAccount *nex.Account
var SecureServerAccount *nex.Account
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)), 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 {
return nil, nex.NewError(nex.ResultCodes.RendezVous.InvalidUsername, "Invalid username")
}
pid := types.NewPID(uint64(pidInt))
password, errorCode := PasswordFromPID(pid)
if errorCode != 0 {
return nil, nex.NewError(errorCode, "Failed to get password from PID")
}
account := nex.NewAccount(pid, username, password)
return account, nil
}

View File

@ -1,15 +1,23 @@
package globals
import (
pb "github.com/PretendoNetwork/grpc-go/friends"
"github.com/PretendoNetwork/nex-go"
pb_accounts "github.com/PretendoNetwork/grpc-go/account"
pb_friends "github.com/PretendoNetwork/grpc-go/friends"
"github.com/PretendoNetwork/nex-go/v2"
"github.com/PretendoNetwork/plogger-go"
"google.golang.org/grpc"
"google.golang.org/grpc/metadata"
)
var Logger = plogger.NewLogger()
var NEXServer *nex.Server
var Logger *plogger.Logger
var KerberosPassword = "password" // * Default password
var AuthenticationServer *nex.PRUDPServer
var AuthenticationEndpoint *nex.PRUDPEndPoint
var SecureServer *nex.PRUDPServer
var SecureEndpoint *nex.PRUDPEndPoint
var GRPCAccountClientConnection *grpc.ClientConn
var GRPCAccountClient pb_accounts.AccountClient
var GRPCAccountCommonMetadata metadata.MD
var GRPCFriendsClientConnection *grpc.ClientConn
var GRPCFriendsClient pb.FriendsClient
var GRPCFriendsClient pb_friends.FriendsClient
var GRPCFriendsCommonMetadata metadata.MD

View File

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

59
go.mod
View File

@ -1,39 +1,38 @@
module github.com/PretendoNetwork/wiiu-chat-secure
module github.com/PretendoNetwork/wiiu-chat
go 1.18
go 1.23.0
toolchain go1.23.4
require (
github.com/PretendoNetwork/grpc-go v1.0.1
github.com/PretendoNetwork/nex-go v1.0.28
github.com/PretendoNetwork/nex-protocols-common-go v1.0.22
github.com/PretendoNetwork/nex-protocols-go v1.0.38
github.com/PretendoNetwork/plogger-go v1.0.3
github.com/PretendoNetwork/grpc-go v1.0.2
github.com/PretendoNetwork/nex-go/v2 v2.1.2
github.com/PretendoNetwork/nex-protocols-common-go/v2 v2.2.2
github.com/PretendoNetwork/nex-protocols-go/v2 v2.2.1
github.com/PretendoNetwork/plogger-go v1.1.0
github.com/joho/godotenv v1.5.1
go.mongodb.org/mongo-driver v1.11.4
google.golang.org/grpc v1.48.0
github.com/lib/pq v1.10.9
google.golang.org/grpc v1.58.3
)
require (
github.com/fatih/color v1.15.0 // indirect
github.com/golang/protobuf v1.5.2 // indirect
github.com/golang/snappy v0.0.4 // indirect
github.com/jwalton/go-supportscolor v1.1.0 // indirect
github.com/klauspost/compress v1.16.4 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.19 // indirect
github.com/montanaflynn/stats v0.7.0 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/PretendoNetwork/pq-extended v1.0.0 // indirect
github.com/dolthub/maphash v0.1.0 // indirect
github.com/fatih/color v1.18.0 // indirect
github.com/golang/protobuf v1.5.3 // indirect
github.com/jwalton/go-supportscolor v1.2.0 // indirect
github.com/klauspost/compress v1.18.0 // indirect
github.com/lxzan/gws v1.8.8 // indirect
github.com/mattn/go-colorable v0.1.14 // 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
github.com/xdg-go/pbkdf2 v1.0.0 // indirect
github.com/xdg-go/scram v1.1.2 // indirect
github.com/xdg-go/stringprep v1.0.4 // indirect
github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a // indirect
golang.org/x/crypto v0.8.0 // indirect
golang.org/x/net v0.9.0 // indirect
golang.org/x/sync v0.1.0 // indirect
golang.org/x/sys v0.9.0 // indirect
golang.org/x/term v0.9.0 // indirect
golang.org/x/text v0.9.0 // indirect
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 // indirect
google.golang.org/protobuf v1.28.1 // indirect
golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa // indirect
golang.org/x/mod v0.23.0 // indirect
golang.org/x/net v0.33.0 // indirect
golang.org/x/sys v0.30.0 // indirect
golang.org/x/term v0.29.0 // indirect
golang.org/x/text v0.21.0 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20231012201019-e917dd12ba7a // indirect
google.golang.org/protobuf v1.31.0 // indirect
)

285
go.sum
View File

@ -1,240 +1,83 @@
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/PretendoNetwork/grpc-go v1.0.1 h1:3O0n4vnRX9rAZfrrjZydDjEOyWb4TbJcvwMrtY3Yz9g=
github.com/PretendoNetwork/grpc-go v1.0.1/go.mod h1:XZjEsij9lL7HJBNkH6JPbBIkUSq/1rjflvjGdv+DAj0=
github.com/PretendoNetwork/nex-go v1.0.26 h1:lJqDS5F8s836xcQzCEI5hNvUesmTsh2NGDC4tZvG250=
github.com/PretendoNetwork/nex-go v1.0.26/go.mod h1:qzc5s4iNrt1ubS9Axb38b2jPuEsiETN2mDijn+MthmI=
github.com/PretendoNetwork/nex-go v1.0.28 h1:g3892srP1T7LaeY5JklMtLZ03gTxE8wpXqpPQpXpN74=
github.com/PretendoNetwork/nex-go v1.0.28/go.mod h1:tWfWhrC/DCJuS08jTk0ceOv2R1VtElvKSVv13To6miE=
github.com/PretendoNetwork/nex-protocols-common-go v1.0.17 h1:w0n+RJAHANgX/iVnL5qRiyPJeDHcwr8w6DzDeFqxkqk=
github.com/PretendoNetwork/nex-protocols-common-go v1.0.17/go.mod h1:5Y3jRIbvDxasj0CIvd024za+t9LMbD0OZkBwyKICijg=
github.com/PretendoNetwork/nex-protocols-common-go v1.0.22 h1:oIKx3AsBApaKWl1f91q/Vt59YKJOjoUhzxs/F0UA1Vw=
github.com/PretendoNetwork/nex-protocols-common-go v1.0.22/go.mod h1:UwVHUdB1WFlzVn4yq8WLai0J+9OQXw4cg5qNjnJQ3RU=
github.com/PretendoNetwork/nex-protocols-go v1.0.29 h1:sye/cpRHpDuoV1I+vpeTBIEXaKsJ5biK/+zo3O92dlY=
github.com/PretendoNetwork/nex-protocols-go v1.0.29/go.mod h1:Pw1u2rsZGXuv45iM9y/7nZ5TBr1L5hctv9ylNXlW1ws=
github.com/PretendoNetwork/nex-protocols-go v1.0.38 h1:DCzzlIx8NJlTLcfisqeVg4vXTKvIVe0kF1cXzDBz6p8=
github.com/PretendoNetwork/nex-protocols-go v1.0.38/go.mod h1:jZSnoM2G4oc7tKXeUf2OkJ6VyfJc4nb7gR++2oNEh5A=
github.com/PretendoNetwork/plogger-go v1.0.2 h1:vWKEnEmJJzYwqLxLyiSsAvCrZV6qnnu/a0GQOjIfzY0=
github.com/PretendoNetwork/plogger-go v1.0.2/go.mod h1:7kD6M4vPq1JL4LTuPg6kuB1OvUBOwQOtAvTaUwMbwvU=
github.com/PretendoNetwork/plogger-go v1.0.3 h1:KEnrUfPaCn0LFweg8OrhtiDhlN3pclWpNhlmAtmgfB0=
github.com/PretendoNetwork/plogger-go v1.0.3/go.mod h1:7kD6M4vPq1JL4LTuPg6kuB1OvUBOwQOtAvTaUwMbwvU=
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI=
github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
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/v2 v2.1.1 h1:OI2W14lIw2V2kItV2c/57UGLrT6PV5CuhyU07VAAki4=
github.com/PretendoNetwork/nex-go/v2 v2.1.1/go.mod h1:3LyJzsv3AataJW8D0binp15Q8ZH22MWTYly1VNtXi64=
github.com/PretendoNetwork/nex-go/v2 v2.1.2 h1:OJFAS6U6VNzZ4YzteKqUEZ5aJMwWIHODeRrLwNbN7nw=
github.com/PretendoNetwork/nex-go/v2 v2.1.2/go.mod h1:3LyJzsv3AataJW8D0binp15Q8ZH22MWTYly1VNtXi64=
github.com/PretendoNetwork/nex-protocols-common-go/v2 v2.2.2 h1:rBJNZDJ92pa9fU3Og0sanyizJTWnELPoGR0Tjz8zlws=
github.com/PretendoNetwork/nex-protocols-common-go/v2 v2.2.2/go.mod h1:iuNMuBK/zww+44d6ajfLsOusXx/6Llj3zSkmhJwMuuM=
github.com/PretendoNetwork/nex-protocols-go/v2 v2.2.0 h1:abbCXgYN9icR9hmGV9GkuiOvg92+WBeVTnvtiAU06QU=
github.com/PretendoNetwork/nex-protocols-go/v2 v2.2.0/go.mod h1:+soBHmwX6ixGxj6cphLuCvfJqxcZPuowc/5e7Qi9Bz0=
github.com/PretendoNetwork/nex-protocols-go/v2 v2.2.1 h1:/dsuP0W7bZNvrXoXH0ZRdxpxonfbWmmson51WCQdpEQ=
github.com/PretendoNetwork/nex-protocols-go/v2 v2.2.1/go.mod h1:+soBHmwX6ixGxj6cphLuCvfJqxcZPuowc/5e7Qi9Bz0=
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/PretendoNetwork/plogger-go v1.1.0 h1:x2XgyeeM8zDFGy+NcIZd3SYC2fNrVWpBBbkqTejOfiM=
github.com/PretendoNetwork/plogger-go v1.1.0/go.mod h1:wpltahp91IXr9nOvWgwep8zGtUKDeCVwm+/Wa484lQ4=
github.com/PretendoNetwork/pq-extended v1.0.0 h1:GHZ0hLvCvmYKQPTV9I9XtTx8J1iB5Z9CEnfW2tUpsYg=
github.com/PretendoNetwork/pq-extended v1.0.0/go.mod h1:bq6Ai+3lG4/M0iamUBt2Uzi5vL/nYy1a1Ar2ow9NDF0=
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/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE=
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs=
github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
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.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM=
github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU=
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
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.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ=
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
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.1.0 h1:HsXFJdMPjRUAx8cIW6g30hVSFYaxh9yRQwEWgkAR7lQ=
github.com/jwalton/go-supportscolor v1.1.0/go.mod h1:hFVUAZV2cWg+WFFC4v8pT2X/S2qUUBYMioBD9AINXGs=
github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
github.com/klauspost/compress v1.16.4 h1:91KN02FnsOYhuunwU4ssRe8lc2JosWmizWa91B5v1PU=
github.com/klauspost/compress v1.16.4/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
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.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/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
github.com/montanaflynn/stats v0.7.0 h1:r3y12KyNxj/Sb/iOE46ws+3mS1+MZca1wlHQFPsY/JU=
github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
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/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc=
github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0=
github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo=
github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ=
github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/lxzan/gws v1.8.8 h1:st193ZG8qN8sSw8/g/UituFhs7etmKzS7jUqhijg5wM=
github.com/lxzan/gws v1.8.8/go.mod h1:FcGeRMB7HwGuTvMLR24ku0Zx0p6RXqeKASeMc4VYgi4=
github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE=
github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8=
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/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
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=
github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4=
github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c=
github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g=
github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY=
github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4=
github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8=
github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8=
github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM=
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a h1:fZHgsYlfvtyqToslyjUt3VOPF4J7aK/3MPcK7xp3PDk=
github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a/go.mod h1:ul22v+Nro/R083muKhosV54bj5niojjWZvU8xrevuH4=
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
go.mongodb.org/mongo-driver v1.11.4 h1:4ayjakA013OdpGyL2K3ZqylTac/rMjrJOMZ1EHizXas=
go.mongodb.org/mongo-driver v1.11.4/go.mod h1:PTSz5yu21bkT/wXpkS7WR5f0ddqw5quethTUn9WM+2g=
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.8.0 h1:pd9TJtTueMTVQXzk8E2XESSMQDj/U7OUu0PqJqPXQjQ=
golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM=
golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/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/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/exp v0.0.0-20250210185358-939b2ce775ac h1:l5+whBCLH3iH2ZNHYLbAe58bo7yrN4mVcnkHDYz5vvs=
golang.org/x/exp v0.0.0-20250210185358-939b2ce775ac/go.mod h1:hH+7mtFmImwwcMvScyxUhjuVHR3HGaDPMn9rMSUUbxo=
golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa h1:t2QcU6V556bFjYgu4L6C+6VrCPyJZ+eyRsABUPs1mz4=
golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa/go.mod h1:BHOTPb3L19zxehTsLoJXVaTktb06DFgmdW6Wb9s8jqk=
golang.org/x/mod v0.23.0 h1:Zb7khfcRGKk+kqfxFaP5tZqCnDZMjC5VtUBs87Hr6QM=
golang.org/x/mod v0.23.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I=
golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/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.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s=
golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
golang.org/x/sys v0.30.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.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols=
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
golang.org/x/term v0.9.0 h1:GRRCnKYhdQrD8kfRAdQ6Zcw1P0OcELxGLKJvtjVMZ28=
golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
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/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE=
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/term v0.29.0 h1:L6pJp37ocefwRRtYPKSWOWzOtWSxVajvz2ldH/xi3iU=
golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s=
golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 h1:+kGHl1aib/qcwaRi1CbqBZ1rk19r85MNUf8HaBghugY=
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
google.golang.org/grpc v1.48.0 h1:rQOsyJ/8+ufEDJd/Gdsz7HG220Mh9HAhFHRGnIjda0w=
google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
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/grpc v1.58.3 h1:BjnpXut1btbtgN/6sp+brB2Kbm2LjNXnidYujAVbSoQ=
google.golang.org/grpc v1.58.3/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0=
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.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
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/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=
google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=

View File

@ -2,18 +2,17 @@ package grpc
import (
"context"
"encoding/binary"
pb "github.com/PretendoNetwork/grpc-go/friends"
nex "github.com/PretendoNetwork/nex-go"
friends_wiiu_types "github.com/PretendoNetwork/nex-protocols-go/friends-wiiu/types"
nintendo_notifications "github.com/PretendoNetwork/nex-protocols-go/nintendo-notifications"
nintendo_notifications_types "github.com/PretendoNetwork/nex-protocols-go/nintendo-notifications/types"
"github.com/PretendoNetwork/wiiu-chat-secure/globals"
nex "github.com/PretendoNetwork/nex-go/v2"
"github.com/PretendoNetwork/nex-go/v2/types"
friends_wiiu_types "github.com/PretendoNetwork/nex-protocols-go/v2/friends-wiiu/types"
nintendo_notifications_types "github.com/PretendoNetwork/nex-protocols-go/v2/nintendo-notifications/types"
"github.com/PretendoNetwork/wiiu-chat/globals"
"google.golang.org/grpc/metadata"
)
func SendFriendsNotification(caller uint32, target uint32, ringing bool) {
func SendFriendsNotification(caller types.PID, target types.PID, ringing types.Bool) {
ctx := metadata.NewOutgoingContext(context.Background(), globals.GRPCFriendsCommonMetadata)
presence := friends_wiiu_types.NewNintendoPresenceV2()
@ -22,31 +21,30 @@ func SendFriendsNotification(caller uint32, target uint32, ringing bool) {
presence.GameKey = friends_wiiu_types.NewGameKey()
presence.GameServerID = 0x1005A000
presence.PID = 1 // This is not a PID, but the amount of times the PID is repeated in bytes in the application data.
presence.GatheringID = caller
presence.GatheringID = types.NewUInt32(uint32(caller))
if ringing {
presence.Unknown2 = 0x65
presence.Unknown2 = types.NewUInt32(0x65)
}
targetBytes := make([]byte, 4)
binary.BigEndian.PutUint32(targetBytes, target)
targetBytes := nex.NewByteStreamOut(globals.SecureServer.LibraryVersions, globals.SecureServer.ByteStreamSettings)
target.WriteTo(targetBytes)
presence.ApplicationData = targetBytes
presence.ApplicationData = targetBytes.Bytes()
presence.GameKey.TitleID = 0x000500101005A100
presence.GameKey.TitleVersion = 55
eventObject := nintendo_notifications_types.NewNintendoNotificationEvent()
eventObject.Type = nintendo_notifications.NotificationTypes.FriendStartedTitle
eventObject.SenderPID = caller
eventObject.DataHolder = nex.NewDataHolder()
eventObject.DataHolder.SetTypeName("NintendoPresenceV2")
eventObject.DataHolder.SetObjectData(presence)
eventObject.DataHolder = types.NewDataHolder()
eventObject.DataHolder.Object = presence
stream := nex.NewStreamOut(globals.NEXServer)
eventObjectBytes := eventObject.Bytes(stream)
stream := nex.NewByteStreamOut(globals.SecureServer.LibraryVersions, globals.SecureServer.ByteStreamSettings)
eventObject.WriteTo(stream)
eventObjectBytes := stream.Bytes()
_, err := globals.GRPCFriendsClient.SendUserNotificationWiiU(ctx, &pb.SendUserNotificationWiiURequest{Pid: target, NotificationData: eventObjectBytes})
_, err := globals.GRPCFriendsClient.SendUserNotificationWiiU(ctx, &pb.SendUserNotificationWiiURequest{Pid: uint32(target), NotificationData: eventObjectBytes})
if err != nil {
globals.Logger.Criticalf("Greeting Friends gRPC failed! : %v", err)
}

133
init.go
View File

@ -1,65 +1,160 @@
package main
import (
"crypto/rand"
"fmt"
"os"
"strconv"
"strings"
pb "github.com/PretendoNetwork/grpc-go/friends"
pb_account "github.com/PretendoNetwork/grpc-go/account"
pb_friends "github.com/PretendoNetwork/grpc-go/friends"
"github.com/PretendoNetwork/nex-go/v2"
"github.com/PretendoNetwork/nex-go/v2/types"
"github.com/PretendoNetwork/plogger-go"
"github.com/PretendoNetwork/wiiu-chat-secure/database"
"github.com/PretendoNetwork/wiiu-chat-secure/globals"
"github.com/PretendoNetwork/wiiu-chat/database"
"github.com/PretendoNetwork/wiiu-chat/globals"
"github.com/joho/godotenv"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
"google.golang.org/grpc/metadata"
)
var logger = plogger.NewLogger()
func init() {
err := godotenv.Load()
globals.Logger = plogger.NewLogger()
var err error
//err = godotenv.Load("../super-smash-bros-3ds.env")
err = godotenv.Load(".env")
if err != nil {
logger.Warning("Error loading .env file")
globals.Logger.Warning("Error loading .env file")
}
friendsGRPCHost := os.Getenv("PN_WIIU_CHAT_FRIENDS_GRPC_HOST")
friendsGRPCPort := os.Getenv("PN_WIIU_CHAT_FRIENDS_GRPC_PORT")
friendsGRPCAPIKey := os.Getenv("PN_WIIU_CHAT_FRIENDS_GRPC_API_KEY")
authenticationServerPort := os.Getenv("PN_WUC_AUTHENTICATION_SERVER_PORT")
secureServerHost := os.Getenv("PN_WUC_SECURE_SERVER_HOST")
secureServerPort := os.Getenv("PN_WUC_SECURE_SERVER_PORT")
accountGRPCHost := os.Getenv("PN_WUC_ACCOUNT_GRPC_HOST")
accountGRPCPort := os.Getenv("PN_WUC_ACCOUNT_GRPC_PORT")
accountGRPCAPIKey := os.Getenv("PN_WUC_ACCOUNT_GRPC_API_KEY")
friendsGRPCHost := os.Getenv("PN_WUC_FRIENDS_GRPC_HOST")
friendsGRPCPort := os.Getenv("PN_WUC_FRIENDS_GRPC_PORT")
friendsGRPCAPIKey := os.Getenv("PN_WUC_FRIENDS_GRPC_API_KEY")
postgresURI := os.Getenv("PN_WUC_POSTGRES_URI")
if strings.TrimSpace(postgresURI) == "" {
globals.Logger.Error("PN_WUC_POSTGRES_URI environment variable not set")
os.Exit(0)
}
kerberosPassword := make([]byte, 0x10)
_, err = rand.Read(kerberosPassword)
if err != nil {
globals.Logger.Error("Error generating Kerberos password")
os.Exit(0)
}
globals.KerberosPassword = string(kerberosPassword)
globals.AuthenticationServerAccount = nex.NewAccount(types.NewPID(1), "Quazal Authentication", globals.KerberosPassword)
globals.SecureServerAccount = nex.NewAccount(types.NewPID(2), "Quazal Rendez-Vous", globals.KerberosPassword)
if strings.TrimSpace(authenticationServerPort) == "" {
globals.Logger.Error("PN_WUC_AUTHENTICATION_SERVER_PORT environment variable not set")
os.Exit(0)
}
if port, err := strconv.Atoi(authenticationServerPort); err != nil {
globals.Logger.Errorf("PN_WUC_AUTHENTICATION_SERVER_PORT is not a valid port. Expected 0-65535, got %s", authenticationServerPort)
os.Exit(0)
} else if port < 0 || port > 65535 {
globals.Logger.Errorf("PN_WUC_AUTHENTICATION_SERVER_PORT is not a valid port. Expected 0-65535, got %s", authenticationServerPort)
os.Exit(0)
}
if strings.TrimSpace(secureServerHost) == "" {
globals.Logger.Error("PN_WUC_SECURE_SERVER_HOST environment variable not set")
os.Exit(0)
}
if strings.TrimSpace(secureServerPort) == "" {
globals.Logger.Error("PN_WUC_SECURE_SERVER_PORT environment variable not set")
os.Exit(0)
}
if port, err := strconv.Atoi(secureServerPort); err != nil {
globals.Logger.Errorf("PN_WUC_SECURE_SERVER_PORT is not a valid port. Expected 0-65535, got %s", secureServerPort)
os.Exit(0)
} else if port < 0 || port > 65535 {
globals.Logger.Errorf("PN_WUC_SECURE_SERVER_PORT is not a valid port. Expected 0-65535, got %s", secureServerPort)
os.Exit(0)
}
if strings.TrimSpace(accountGRPCHost) == "" {
globals.Logger.Error("PN_WUC_ACCOUNT_GRPC_HOST environment variable not set")
os.Exit(0)
}
if strings.TrimSpace(accountGRPCPort) == "" {
globals.Logger.Error("PN_WUC_ACCOUNT_GRPC_PORT environment variable not set")
os.Exit(0)
}
if port, err := strconv.Atoi(accountGRPCPort); err != nil {
globals.Logger.Errorf("PN_WUC_ACCOUNT_GRPC_PORT is not a valid port. Expected 0-65535, got %s", accountGRPCPort)
os.Exit(0)
} else if port < 0 || port > 65535 {
globals.Logger.Errorf("PN_WUC_ACCOUNT_GRPC_PORT is not a valid port. Expected 0-65535, got %s", accountGRPCPort)
os.Exit(0)
}
if strings.TrimSpace(accountGRPCAPIKey) == "" {
globals.Logger.Warning("Insecure gRPC server detected. PN_WUC_ACCOUNT_GRPC_API_KEY environment variable not set")
}
if strings.TrimSpace(friendsGRPCHost) == "" {
globals.Logger.Error("PN_WIIU_CHAT_FRIENDS_GRPC_HOST environment variable not set")
globals.Logger.Error("PN_WUC_FRIENDS_GRPC_HOST environment variable not set")
os.Exit(0)
}
if strings.TrimSpace(friendsGRPCPort) == "" {
globals.Logger.Error("PN_WIIU_CHAT_FRIENDS_GRPC_PORT environment variable not set")
globals.Logger.Error("PN_WUC_FRIENDS_GRPC_PORT environment variable not set")
os.Exit(0)
}
if port, err := strconv.Atoi(friendsGRPCPort); err != nil {
globals.Logger.Errorf("PN_WIIU_CHAT_FRIENDS_GRPC_PORT is not a valid port. Expected 0-65535, got %s", friendsGRPCPort)
globals.Logger.Errorf("PN_WUC_FRIENDS_GRPC_PORT is not a valid port. Expected 0-65535, got %s", friendsGRPCPort)
os.Exit(0)
} else if port < 0 || port > 65535 {
globals.Logger.Errorf("PN_WIIU_CHAT_FRIENDS_GRPC_PORT is not a valid port. Expected 0-65535, got %s", friendsGRPCPort)
globals.Logger.Errorf("PN_WUC_FRIENDS_GRPC_PORT is not a valid port. Expected 0-65535, got %s", friendsGRPCPort)
os.Exit(0)
}
if strings.TrimSpace(friendsGRPCAPIKey) == "" {
globals.Logger.Warning("Insecure gRPC server detected. PN_WIIU_CHAT_FRIENDS_GRPC_API_KEY environment variable not set")
globals.Logger.Warning("Insecure gRPC server detected. PN_WUC_FRIENDS_GRPC_API_KEY environment variable not set")
}
globals.GRPCFriendsClientConnection, err = grpc.Dial(fmt.Sprintf("%s:%s", friendsGRPCHost, friendsGRPCPort), grpc.WithTransportCredentials(insecure.NewCredentials()))
globals.GRPCAccountClientConnection, err = grpc.Dial(fmt.Sprintf("%s:%s", accountGRPCHost, accountGRPCPort), grpc.WithTransportCredentials(insecure.NewCredentials()))
if err != nil {
globals.Logger.Criticalf("Failed to connect to friends gRPC server: %v", err)
globals.Logger.Criticalf("Failed to connect to account gRPC server: %v", err)
os.Exit(0)
}
globals.GRPCFriendsClient = pb.NewFriendsClient(globals.GRPCFriendsClientConnection)
globals.GRPCAccountClient = pb_account.NewAccountClient(globals.GRPCAccountClientConnection)
globals.GRPCAccountCommonMetadata = metadata.Pairs(
"X-API-Key", accountGRPCAPIKey,
)
globals.GRPCFriendsClientConnection, err = grpc.Dial(fmt.Sprintf("%s:%s", friendsGRPCHost, friendsGRPCPort), grpc.WithTransportCredentials(insecure.NewCredentials()))
if err != nil {
globals.Logger.Criticalf("Failed to connect to account gRPC server: %v", err)
os.Exit(0)
}
globals.GRPCFriendsClient = pb_friends.NewFriendsClient(globals.GRPCFriendsClientConnection)
globals.GRPCFriendsCommonMetadata = metadata.Pairs(
"X-API-Key", friendsGRPCAPIKey,
)
database.ConnectAll()
database.ConnectPostgres()
}

View File

@ -3,16 +3,17 @@ package main
import (
"sync"
"github.com/PretendoNetwork/wiiu-chat-secure/nex"
"github.com/PretendoNetwork/wiiu-chat/nex"
)
var wg sync.WaitGroup
func main() {
wg.Add(1)
wg.Add(2)
// TODO - Add gRPC server
go nex.StartNEXServer()
go nex.StartAuthenticationServer()
go nex.StartSecureServer()
wg.Wait()
}

44
nex/authentication.go Normal file
View File

@ -0,0 +1,44 @@
package nex
import (
"fmt"
"os"
"strconv"
nex "github.com/PretendoNetwork/nex-go/v2"
"github.com/PretendoNetwork/wiiu-chat/globals"
)
var serverBuildString string
func StartAuthenticationServer() {
serverBuildString = "branch:ngs_2_30 build:2_22_11148_30_2"
globals.AuthenticationServer = nex.NewPRUDPServer()
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.ByteStreamSettings.UseStructureHeader = false
// Technically this title is 3.4.2; however, it uses older-style structures and is therefore defined here as 3.3.2
globals.AuthenticationServer.LibraryVersions.SetDefault(nex.NewLibraryVersion(3, 3, 2))
globals.AuthenticationServer.AccessKey = "e7a47214"
globals.AuthenticationEndpoint.OnData(func(packet nex.PacketInterface) {
request := packet.RMCMessage()
fmt.Println("=== WUC - Auth ===")
fmt.Printf("Protocol ID: %d\n", request.ProtocolID)
fmt.Printf("Method ID: %d\n", request.MethodID)
fmt.Println("==================")
})
registerCommonAuthenticationServerProtocols()
port, _ := strconv.Atoi(os.Getenv("PN_WUC_AUTHENTICATION_SERVER_PORT"))
globals.AuthenticationServer.Listen(port)
}

View File

@ -1,38 +1,26 @@
package nex_match_making_ext
import (
"strconv"
"fmt"
"github.com/PretendoNetwork/nex-go"
match_making_ext "github.com/PretendoNetwork/nex-protocols-go/match-making-ext"
"github.com/PretendoNetwork/wiiu-chat-secure/globals"
"github.com/PretendoNetwork/nex-go/v2"
"github.com/PretendoNetwork/nex-go/v2/types"
match_making_ext "github.com/PretendoNetwork/nex-protocols-go/v2/match-making-ext"
"github.com/PretendoNetwork/wiiu-chat/globals"
)
func EndParticipation(err error, client *nex.Client, callID uint32, idGathering uint32, strMessage string) {
globals.Logger.Info("ENDING PARTICIPATION: GID: " + strconv.FormatUint(uint64(idGathering), 10) + ", MESSAGE: " + strMessage)
func EndParticipation(err error, packet nex.PacketInterface, callID uint32, idGathering types.UInt32, strMessage types.String) (*nex.RMCMessage, *nex.Error) {
globals.Logger.Info(fmt.Sprintf("ENDING PARTICIPATION: GID: %d, MESSAGE: %s", idGathering, strMessage))
rmcResponseStream := nex.NewStreamOut(globals.NEXServer)
rmcResponseStream := nex.NewByteStreamOut(globals.SecureServer.LibraryVersions, globals.SecureServer.ByteStreamSettings)
// TODO - Check if this is always true or not, and if not when to set to false
rmcResponseStream.WriteBool(true)
rmcResponseBody := rmcResponseStream.Bytes()
rmcResponse := nex.NewRMCSuccess(globals.SecureEndpoint, rmcResponseStream.Bytes())
rmcResponse.ProtocolID = match_making_ext.ProtocolID
rmcResponse.CallID = callID
rmcResponse.MethodID = match_making_ext.MethodEndParticipation
rmcResponse := nex.NewRMCResponse(match_making_ext.ProtocolID, callID)
rmcResponse.SetSuccess(match_making_ext.MethodEndParticipation, 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.NEXServer.Send(responsePacket)
return rmcResponse, nil
}

View File

@ -1,16 +1,18 @@
package nex_match_making
import (
nex "github.com/PretendoNetwork/nex-go"
match_making "github.com/PretendoNetwork/nex-protocols-go/match-making"
match_making_types "github.com/PretendoNetwork/nex-protocols-go/match-making/types"
"github.com/PretendoNetwork/wiiu-chat-secure/globals"
"github.com/PretendoNetwork/nex-go/v2/types"
nex "github.com/PretendoNetwork/nex-go/v2"
match_making "github.com/PretendoNetwork/nex-protocols-go/v2/match-making"
match_making_types "github.com/PretendoNetwork/nex-protocols-go/v2/match-making/types"
"github.com/PretendoNetwork/wiiu-chat/globals"
)
func FindBySingleID(err error, client *nex.Client, callID uint32, id uint32) {
caller := id // Gathering ID and caller are the same here
func FindBySingleID(err error, packet nex.PacketInterface, callID uint32, id types.UInt32) (*nex.RMCMessage, *nex.Error) {
caller := types.NewPID(uint64(id)) // Gathering ID and caller are the same here
result := true
result := types.NewBool(true)
gathering := match_making_types.NewGathering()
gathering.ID = id
@ -20,29 +22,26 @@ func FindBySingleID(err error, client *nex.Client, callID uint32, id uint32) {
gathering.MaximumParticipants = 2
gathering.Description = "Doors Invite Request"
dataHolder := nex.NewDataHolder()
dataHolder.SetTypeName("Gathering")
dataHolder.SetObjectData(gathering)
// Gathering does not support being within an AnyDataHolder for some reason,
// so we have to create the AnyDataHolder info manually
dataHolder := nex.NewByteStreamOut(globals.SecureServer.LibraryVersions, globals.SecureServer.ByteStreamSettings)
gathering.WriteTo(dataHolder)
dataHolderBytes := dataHolder.Bytes()
rmcResponseStream := nex.NewStreamOut(globals.NEXServer)
rmcResponseStream.WriteBool(result)
rmcResponseStream.WriteDataHolder(dataHolder)
name := types.NewString("Gathering")
holderLen := types.NewUInt32(uint32(len(dataHolderBytes)) + 4)
holderBuf := types.NewBuffer(dataHolderBytes)
rmcResponse := nex.NewRMCResponse(match_making.ProtocolID, callID)
rmcResponse.SetSuccess(match_making.MethodFindBySingleID, rmcResponseStream.Bytes())
rmcResponseStream := nex.NewByteStreamOut(globals.SecureServer.LibraryVersions, globals.SecureServer.ByteStreamSettings)
result.WriteTo(rmcResponseStream)
name.WriteTo(rmcResponseStream)
holderLen.WriteTo(rmcResponseStream)
holderBuf.WriteTo(rmcResponseStream)
rmcResponseBytes := rmcResponse.Bytes()
rmcResponse := nex.NewRMCSuccess(globals.SecureEndpoint, rmcResponseStream.Bytes())
rmcResponse.ProtocolID = match_making.ProtocolID
rmcResponse.CallID = callID
rmcResponse.MethodID = match_making.MethodFindBySingleID
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.NEXServer.Send(responsePacket)
return rmcResponse, nil
}

View File

@ -1,40 +1,24 @@
package nex_match_making
import (
nex "github.com/PretendoNetwork/nex-go"
match_making "github.com/PretendoNetwork/nex-protocols-go/match-making"
"github.com/PretendoNetwork/wiiu-chat-secure/database"
"github.com/PretendoNetwork/wiiu-chat-secure/globals"
nex "github.com/PretendoNetwork/nex-go/v2"
"github.com/PretendoNetwork/nex-go/v2/types"
match_making "github.com/PretendoNetwork/nex-protocols-go/v2/match-making"
"github.com/PretendoNetwork/wiiu-chat/globals"
)
func GetSessionUrls(err error, client *nex.Client, callID uint32, gid uint32) {
var stationUrlStrings []string
func GetSessionUrls(err error, packet nex.PacketInterface, callID uint32, gid types.UInt32) (*nex.RMCMessage, *nex.Error) {
caller := types.NewPID(uint64(gid)) // Gathering ID and caller are the same here
hostpid, _, _ := database.GetCallInfoByCaller(gid)
stationUrlStrings := globals.SecureEndpoint.FindConnectionByPID(uint64(caller)).StationURLs
stationUrlStrings = globals.NEXServer.FindClientFromPID(hostpid).StationURLs()
rmcResponseStream := nex.NewByteStreamOut(globals.SecureServer.LibraryVersions, globals.SecureServer.ByteStreamSettings)
stationUrlStrings.WriteTo(rmcResponseStream)
rmcResponseStream := nex.NewStreamOut(globals.NEXServer)
rmcResponseStream.WriteListString(stationUrlStrings)
rmcResponse := nex.NewRMCSuccess(globals.SecureEndpoint, rmcResponseStream.Bytes())
rmcResponse.ProtocolID = match_making.ProtocolID
rmcResponse.CallID = callID
rmcResponse.MethodID = match_making.MethodGetSessionURLs
rmcResponseBody := rmcResponseStream.Bytes()
// Build response packet
rmcResponse := nex.NewRMCResponse(match_making.ProtocolID, callID)
rmcResponse.SetSuccess(match_making.MethodGetSessionURLs, 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.NEXServer.Send(responsePacket)
return rmcResponse, nil
}

View File

@ -1,30 +1,27 @@
package nex_match_making
import (
nex "github.com/PretendoNetwork/nex-go"
match_making "github.com/PretendoNetwork/nex-protocols-go/match-making"
"github.com/PretendoNetwork/wiiu-chat-secure/database"
"github.com/PretendoNetwork/wiiu-chat-secure/globals"
nex "github.com/PretendoNetwork/nex-go/v2"
"github.com/PretendoNetwork/nex-go/v2/types"
match_making "github.com/PretendoNetwork/nex-protocols-go/v2/match-making"
"github.com/PretendoNetwork/wiiu-chat/database"
"github.com/PretendoNetwork/wiiu-chat/globals"
)
func UnregisterGathering(err error, client *nex.Client, callID uint32, idGathering uint32) {
database.EndCall(idGathering)
func UnregisterGathering(err error, packet nex.PacketInterface, callID uint32, idGathering types.UInt32) (*nex.RMCMessage, *nex.Error) {
caller := types.NewPID(uint64(idGathering)) // Gathering ID and caller are the same here
rmcResponse := nex.NewRMCResponse(match_making.MethodUnregisterGathering, callID)
rmcResponse.SetSuccess(match_making.ProtocolID, []byte{0x01})
database.EndCall(caller)
rmcResponseBytes := rmcResponse.Bytes()
success := types.NewBool(true)
responsePacket, _ := nex.NewPacketV1(client, nil)
rmcResponseStream := nex.NewByteStreamOut(globals.SecureServer.LibraryVersions, globals.SecureServer.ByteStreamSettings)
success.WriteTo(rmcResponseStream)
responsePacket.SetVersion(1)
responsePacket.SetSource(0xA1)
responsePacket.SetDestination(0xAF)
responsePacket.SetType(nex.DataPacket)
responsePacket.SetPayload(rmcResponseBytes)
rmcResponse := nex.NewRMCSuccess(globals.SecureEndpoint, rmcResponseStream.Bytes())
rmcResponse.ProtocolID = match_making.ProtocolID
rmcResponse.CallID = callID
rmcResponse.MethodID = match_making.MethodUnregisterGathering
responsePacket.AddFlag(nex.FlagNeedsAck)
responsePacket.AddFlag(nex.FlagReliable)
globals.NEXServer.Send(responsePacket)
return rmcResponse, nil
}

View File

@ -3,39 +3,27 @@ package nex_matchmake_extension
import (
//"math/rand"
nex "github.com/PretendoNetwork/nex-go"
"github.com/PretendoNetwork/wiiu-chat-secure/globals"
nex "github.com/PretendoNetwork/nex-go/v2"
"github.com/PretendoNetwork/nex-go/v2/types"
"github.com/PretendoNetwork/wiiu-chat/globals"
matchmake_extension "github.com/PretendoNetwork/nex-protocols-go/matchmake-extension"
match_making_types "github.com/PretendoNetwork/nex-protocols-go/v2/match-making/types"
matchmake_extension "github.com/PretendoNetwork/nex-protocols-go/v2/matchmake-extension"
)
func CreateMatchmakeSession(err error, client *nex.Client, callID uint32, anyGathering *nex.DataHolder, message string, participationCount uint16) {
var gid uint32 = client.PID() // TODO: Random this
func CreateMatchmakeSession(err error, packet nex.PacketInterface, callID uint32, anyGathering match_making_types.GatheringHolder, message types.String, participationCount types.UInt16) (*nex.RMCMessage, *nex.Error) {
var gid types.UInt32 = types.NewUInt32(uint32(packet.Sender().PID())) // TODO: Randomize this
sessionKey := make([]byte, 32)
//rand.Read(sessionKey)
sessionKeyBuffer := types.NewBuffer(sessionKey)
rmcResponseStream := nex.NewStreamOut(globals.NEXServer)
rmcResponseStream := nex.NewByteStreamOut(globals.SecureServer.LibraryVersions, globals.SecureServer.ByteStreamSettings)
gid.WriteTo(rmcResponseStream)
sessionKeyBuffer.WriteTo(rmcResponseStream)
rmcResponseStream.WriteUInt32LE(gid)
rmcResponseStream.WriteBuffer(sessionKey)
rmcResponse := nex.NewRMCSuccess(globals.SecureEndpoint, rmcResponseStream.Bytes())
rmcResponse.ProtocolID = matchmake_extension.ProtocolID
rmcResponse.CallID = callID
rmcResponse.MethodID = matchmake_extension.MethodCreateMatchmakeSession
rmcResponseBody := rmcResponseStream.Bytes()
rmcResponse := nex.NewRMCResponse(matchmake_extension.ProtocolID, callID)
rmcResponse.SetSuccess(matchmake_extension.MethodCreateMatchmakeSession, 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.NEXServer.Send(responsePacket)
return rmcResponse, nil
}

View File

@ -1,56 +1,44 @@
package nex_matchmake_extension
import (
nex "github.com/PretendoNetwork/nex-go"
"github.com/PretendoNetwork/wiiu-chat-secure/database"
"github.com/PretendoNetwork/wiiu-chat-secure/globals"
nex "github.com/PretendoNetwork/nex-go/v2"
"github.com/PretendoNetwork/nex-go/v2/types"
"github.com/PretendoNetwork/wiiu-chat/database"
"github.com/PretendoNetwork/wiiu-chat/globals"
matchmake_extension "github.com/PretendoNetwork/nex-protocols-go/matchmake-extension"
"github.com/PretendoNetwork/nex-protocols-go/notifications"
notifications_types "github.com/PretendoNetwork/nex-protocols-go/notifications/types"
matchmake_extension "github.com/PretendoNetwork/nex-protocols-go/v2/matchmake-extension"
notifications "github.com/PretendoNetwork/nex-protocols-go/v2/notifications"
notifications_types "github.com/PretendoNetwork/nex-protocols-go/v2/notifications/types"
)
func GetFriendNotificationData(err error, client *nex.Client, callID uint32, uiType int32) {
dataList := make([]*notifications_types.NotificationEvent, 0)
func GetFriendNotificationData(err error, packet nex.PacketInterface, callID uint32, uiType types.Int32) (*nex.RMCMessage, *nex.Error) {
dataList := types.NewList[notifications_types.NotificationEvent]()
caller, target, ringing := database.GetCallInfoByTarget(client.PID())
caller, target, ringing := database.GetCallInfoByTarget(packet.Sender().PID())
// TODO: Multiple calls. Wii U Chat can handle it, but we don't support it yet
if caller != 0 && target == client.PID() && ringing {
if caller != 0 && target == packet.Sender().PID() && ringing {
// Being called
notificationType := notifications.BuildNotificationType(notifications.NotificationCategories.RequestJoinGathering, notifications.NotificationSubTypes.RequestJoinGathering.None)
notification := notifications_types.NewNotificationEvent()
notification.PIDSource = caller
notification.Type = notificationType
notification.Param1 = caller
notification.Param2 = target
notification.Type = types.NewUInt32(notificationType)
notification.Param1 = types.NewUInt32(uint32(caller))
notification.Param2 = types.NewUInt32(uint32(target))
notification.StrParam = "Invite Request"
dataList = append(dataList, notification)
}
rmcResponseStream := nex.NewStreamOut(globals.NEXServer)
rmcResponseStream.WriteListStructure(dataList)
rmcResponseStream := nex.NewByteStreamOut(globals.SecureServer.LibraryVersions, globals.SecureServer.ByteStreamSettings)
dataList.WriteTo(rmcResponseStream)
rmcResponseBody := rmcResponseStream.Bytes()
rmcResponse := nex.NewRMCSuccess(globals.SecureEndpoint, rmcResponseStream.Bytes())
rmcResponse.ProtocolID = matchmake_extension.ProtocolID
rmcResponse.CallID = callID
rmcResponse.MethodID = matchmake_extension.MethodGetFriendNotificationData
rmcResponse := nex.NewRMCResponse(matchmake_extension.ProtocolID, callID)
rmcResponse.SetSuccess(matchmake_extension.MethodGetFriendNotificationData, 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.NEXServer.Send(responsePacket)
return rmcResponse, nil
}

View File

@ -1,35 +1,29 @@
package nex_matchmake_extension
import (
nex "github.com/PretendoNetwork/nex-go"
matchmake_extension "github.com/PretendoNetwork/nex-protocols-go/matchmake-extension"
"github.com/PretendoNetwork/wiiu-chat-secure/database"
"github.com/PretendoNetwork/wiiu-chat-secure/globals"
nex "github.com/PretendoNetwork/nex-go/v2"
"github.com/PretendoNetwork/nex-go/v2/types"
matchmake_extension "github.com/PretendoNetwork/nex-protocols-go/v2/matchmake-extension"
"github.com/PretendoNetwork/wiiu-chat/database"
"github.com/PretendoNetwork/wiiu-chat/globals"
)
func JoinMatchmakeSessionEx(err error, client *nex.Client, callID uint32, gid uint32, strMessage string, dontCareMyBlockList bool, participationCount uint16) {
func JoinMatchmakeSessionEx(err error, packet nex.PacketInterface, callID uint32, gid types.UInt32, strMessage types.String, dontCareMyBlockList types.Bool, participationCount types.UInt16) (*nex.RMCMessage, *nex.Error) {
globals.Logger.Infof("gid: %d, strMessage: %s, dontCareMyBlockList: %t, participationCount: %d\r\n", gid, strMessage, dontCareMyBlockList, participationCount)
database.EndCallRinging(gid)
caller := types.NewPID(uint64(gid)) // Gathering ID and caller are the same here
output := nex.NewStreamOut(globals.NEXServer)
output.WriteBuffer(make([]byte, 32))
database.EndCallRinging(caller)
rmcResponse := nex.NewRMCResponse(matchmake_extension.ProtocolID, callID)
rmcResponse.SetSuccess(matchmake_extension.MethodJoinMatchmakeSessionEx, output.Bytes())
sessionKey := types.NewBuffer(make([]byte, 32))
rmcResponseBytes := rmcResponse.Bytes()
rmcResponseStream := nex.NewByteStreamOut(globals.SecureServer.LibraryVersions, globals.SecureServer.ByteStreamSettings)
sessionKey.WriteTo(rmcResponseStream)
responsePacket, _ := nex.NewPacketV1(client, nil)
rmcResponse := nex.NewRMCSuccess(globals.SecureEndpoint, rmcResponseStream.Bytes())
rmcResponse.ProtocolID = matchmake_extension.ProtocolID
rmcResponse.CallID = callID
rmcResponse.MethodID = matchmake_extension.MethodJoinMatchmakeSessionEx
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.NEXServer.Send(responsePacket)
return rmcResponse, nil
}

View File

@ -1,31 +1,20 @@
package nex_matchmake_extension
import (
nex "github.com/PretendoNetwork/nex-go"
"github.com/PretendoNetwork/wiiu-chat-secure/globals"
nex "github.com/PretendoNetwork/nex-go/v2"
"github.com/PretendoNetwork/nex-go/v2/types"
"github.com/PretendoNetwork/wiiu-chat/globals"
matchmake_extension "github.com/PretendoNetwork/nex-protocols-go/matchmake-extension"
matchmake_extension "github.com/PretendoNetwork/nex-protocols-go/v2/matchmake-extension"
)
func OpenParticipation(err error, client *nex.Client, callID uint32, gid uint32) {
func OpenParticipation(err error, packet nex.PacketInterface, callID uint32, gid types.UInt32) (*nex.RMCMessage, *nex.Error) {
// TODO: Implement this
// Build response packet
rmcResponse := nex.NewRMCResponse(matchmake_extension.ProtocolID, callID)
rmcResponse.SetSuccess(matchmake_extension.MethodOpenParticipation, nil)
rmcResponse := nex.NewRMCSuccess(globals.SecureEndpoint, nil)
rmcResponse.ProtocolID = matchmake_extension.ProtocolID
rmcResponse.CallID = callID
rmcResponse.MethodID = matchmake_extension.MethodOpenParticipation
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.NEXServer.Send(responsePacket)
return rmcResponse, nil
}

View File

@ -1,64 +1,53 @@
package nex_matchmake_extension
import (
nex "github.com/PretendoNetwork/nex-go"
"github.com/PretendoNetwork/wiiu-chat-secure/database"
"github.com/PretendoNetwork/wiiu-chat-secure/globals"
"github.com/PretendoNetwork/wiiu-chat-secure/grpc"
nex_notifications "github.com/PretendoNetwork/wiiu-chat-secure/nex/notifications"
"github.com/PretendoNetwork/nex-go/v2"
"github.com/PretendoNetwork/nex-go/v2/types"
"github.com/PretendoNetwork/wiiu-chat/database"
"github.com/PretendoNetwork/wiiu-chat/globals"
"github.com/PretendoNetwork/wiiu-chat/grpc"
nex_notifications "github.com/PretendoNetwork/wiiu-chat/nex/notifications"
matchmake_extension "github.com/PretendoNetwork/nex-protocols-go/matchmake-extension"
"github.com/PretendoNetwork/nex-protocols-go/notifications"
matchmake_extension "github.com/PretendoNetwork/nex-protocols-go/v2/matchmake-extension"
notifications "github.com/PretendoNetwork/nex-protocols-go/v2/notifications"
)
func UpdateNotificationData(err error, client *nex.Client, callID uint32, uiType uint32, uiParam1 uint32, uiParam2 uint32, strParam string) {
func UpdateNotificationData(err error, packet nex.PacketInterface, callID uint32, uiType types.UInt32, uiParam1 types.UInt32, uiParam2 types.UInt32, strParam types.String) (*nex.RMCMessage, *nex.Error) {
globals.Logger.Infof("uiType: %d, uiParam1: %d, uiParam2: %d, strParam: %s\r\n", uiType, uiParam1, uiParam2, strParam)
recipientClient := globals.NEXServer.FindClientFromPID(uiParam2)
recipientClient := globals.SecureEndpoint.FindConnectionByPID(uint64(uiParam2))
if uiType == notifications.NotificationCategories.RequestJoinGathering {
if uiType.Equals(types.NewUInt32(notifications.NotificationCategories.RequestJoinGathering)) {
notificationType := notifications.BuildNotificationType(notifications.NotificationCategories.RequestJoinGathering, notifications.NotificationSubTypes.RequestJoinGathering.None)
database.NewCall(client.PID(), uiParam2)
target := types.NewPID(uint64(uiParam2))
database.NewCall(packet.Sender().PID(), target)
// If they don't have a session with the app, tell Friends to alert them on the HOME menu.
if recipientClient != nil && recipientClient.StationURLs() != nil {
nex_notifications.ProcessNotificationEvent(callID, client.PID(), notificationType, uiParam1, uiParam2, strParam)
if recipientClient != nil && recipientClient.StationURLs != nil {
nex_notifications.ProcessNotificationEvent(callID, packet, types.NewUInt32(notificationType), uiParam1, uiParam2, strParam)
} else {
grpc.SendFriendsNotification(client.PID(), uiParam2, true)
grpc.SendFriendsNotification(packet.Sender().PID(), types.NewPID(uint64(uiParam2)), true)
}
}
if uiType == notifications.NotificationCategories.EndGathering {
if uiType.Equals(types.NewUInt32(notifications.NotificationCategories.EndGathering)) {
notificationType := notifications.BuildNotificationType(notifications.NotificationCategories.EndGathering, notifications.NotificationSubTypes.EndGathering.None)
database.EndCall(uiParam1)
caller := types.NewPID(uint64(uiParam1))
database.EndCall(caller)
// Alert the other side we aren't calling anymore.
if recipientClient != nil && recipientClient.StationURLs() != nil {
nex_notifications.ProcessNotificationEvent(callID, client.PID(), notificationType, uiParam1, uiParam2, strParam)
if recipientClient != nil && recipientClient.StationURLs != nil {
nex_notifications.ProcessNotificationEvent(callID, packet, types.NewUInt32(notificationType), uiParam1, uiParam2, strParam)
} else {
grpc.SendFriendsNotification(client.PID(), uiParam2, false)
grpc.SendFriendsNotification(packet.Sender().PID(), types.NewPID(uint64(uiParam2)), false)
}
// The user must be kicked, otherwise the app hangs forever.
globals.NEXServer.TimeoutKick(client)
}
// Build response packet
rmcResponse := nex.NewRMCResponse(matchmake_extension.ProtocolID, callID)
rmcResponse.SetSuccess(matchmake_extension.MethodUpdateNotificationData, nil)
rmcResponse := nex.NewRMCSuccess(globals.SecureEndpoint, nil)
rmcResponse.ProtocolID = matchmake_extension.ProtocolID
rmcResponse.CallID = callID
rmcResponse.MethodID = matchmake_extension.MethodUpdateNotificationData
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.NEXServer.Send(responsePacket)
return rmcResponse, nil
}

View File

@ -1,44 +1,54 @@
package nex_notifications
import (
nex "github.com/PretendoNetwork/nex-go"
"github.com/PretendoNetwork/nex-protocols-go/notifications"
notifications_types "github.com/PretendoNetwork/nex-protocols-go/notifications/types"
"github.com/PretendoNetwork/wiiu-chat-secure/globals"
nex "github.com/PretendoNetwork/nex-go/v2"
"github.com/PretendoNetwork/nex-go/v2/constants"
"github.com/PretendoNetwork/nex-go/v2/types"
notifications "github.com/PretendoNetwork/nex-protocols-go/v2/notifications"
notifications_types "github.com/PretendoNetwork/nex-protocols-go/v2/notifications/types"
"github.com/PretendoNetwork/wiiu-chat/globals"
)
func ProcessNotificationEvent(callID uint32, pidSource uint32, uiType uint32, uiParam1 uint32, uiParam2 uint32, strParam string) {
func ProcessNotificationEvent(callID uint32, packet nex.PacketInterface, uiType types.UInt32, uiParam1 types.UInt32, uiParam2 types.UInt32, strParam types.String) {
event := notifications_types.NewNotificationEvent()
event.PIDSource = pidSource // Sender PID
event.Type = uiType // Notification type
event.Param1 = uiParam1 // Gathering ID
event.Param2 = uiParam2 // Recipient PID
event.StrParam = strParam // Unknown
event.PIDSource = packet.Sender().PID() // Sender PID
event.Type = uiType // Notification type
event.Param1 = uiParam1 // Gathering ID
event.Param2 = uiParam2 // Recipient PID
event.StrParam = strParam // Unknown
eventObject := nex.NewStreamOut(globals.NEXServer)
eventObject.WriteStructure(event)
eventObject := nex.NewByteStreamOut(globals.SecureServer.LibraryVersions, globals.SecureServer.ByteStreamSettings)
event.WriteTo(eventObject)
rmcRequest := nex.NewRMCRequest()
rmcRequest.SetProtocolID(notifications.ProtocolID)
rmcRequest.SetCallID(0xFFFF + callID)
rmcRequest.SetMethodID(notifications.MethodProcessNotificationEvent)
rmcRequest.SetParameters(eventObject.Bytes())
rmcRequest := nex.NewRMCRequest(globals.SecureEndpoint)
rmcRequest.ProtocolID = notifications.ProtocolID
rmcRequest.CallID = 0xFFFF + callID
rmcRequest.MethodID = notifications.MethodProcessNotificationEvent
rmcRequest.Parameters = eventObject.Bytes()
rmcRequestBytes := rmcRequest.Bytes()
targetClient := globals.NEXServer.FindClientFromPID(uiParam2)
targetClient := globals.SecureEndpoint.FindConnectionByPID(uint64(uiParam2))
requestPacket, _ := nex.NewPacketV1(targetClient, nil)
var responsePacket nex.PacketInterface
var prudpPacket nex.PRUDPPacketInterface
requestPacket.SetVersion(1)
requestPacket.SetSource(0xA1)
requestPacket.SetDestination(0xAF)
requestPacket.SetType(nex.DataPacket)
requestPacket.SetPayload(rmcRequestBytes)
endpoint := globals.SecureEndpoint
server := endpoint.Server
prudpPacket, _ = nex.NewPRUDPPacketV1(server, targetClient, nil)
requestPacket.AddFlag(nex.FlagNeedsAck)
requestPacket.AddFlag(nex.FlagReliable)
prudpPacket.SetType(constants.DataPacket)
prudpPacket.AddFlag(constants.PacketFlagReliable)
prudpPacket.AddFlag(constants.PacketFlagNeedsAck)
prudpPacket.SetSourceVirtualPortStreamType(packet.(*nex.PRUDPPacketV1).DestinationVirtualPortStreamType())
prudpPacket.SetSourceVirtualPortStreamID(packet.(*nex.PRUDPPacketV1).DestinationVirtualPortStreamID())
prudpPacket.SetDestinationVirtualPortStreamType(packet.(*nex.PRUDPPacketV1).SourceVirtualPortStreamType())
prudpPacket.SetDestinationVirtualPortStreamID(packet.(*nex.PRUDPPacketV1).SourceVirtualPortStreamID())
prudpPacket.SetSubstreamID(packet.(*nex.PRUDPPacketV1).SubstreamID())
globals.NEXServer.Send(requestPacket)
responsePacket = prudpPacket
responsePacket.SetPayload(rmcRequestBytes)
packet.Sender().Endpoint().Send(responsePacket)
}

View File

@ -0,0 +1,34 @@
package nex
import (
"os"
"strconv"
"github.com/PretendoNetwork/nex-go/v2/constants"
"github.com/PretendoNetwork/nex-go/v2/types"
common_ticket_granting "github.com/PretendoNetwork/nex-protocols-common-go/v2/ticket-granting"
ticket_granting "github.com/PretendoNetwork/nex-protocols-go/v2/ticket-granting"
"github.com/PretendoNetwork/wiiu-chat/globals"
)
func registerCommonAuthenticationServerProtocols() {
ticketGrantingProtocol := ticket_granting.NewProtocol()
globals.AuthenticationEndpoint.RegisterServiceProtocol(ticketGrantingProtocol)
commonTicketGrantingProtocol := common_ticket_granting.NewCommonProtocol(ticketGrantingProtocol)
port, _ := strconv.Atoi(os.Getenv("PN_WUC_SECURE_SERVER_PORT"))
secureStationURL := types.NewStationURL("")
secureStationURL.SetURLType(constants.StationURLPRUDPS)
secureStationURL.SetAddress(os.Getenv("PN_WUC_SECURE_SERVER_HOST"))
secureStationURL.SetPortNumber(uint16(port))
secureStationURL.SetConnectionID(1)
secureStationURL.SetPrincipalID(types.NewPID(2))
secureStationURL.SetStreamID(1)
secureStationURL.SetStreamType(constants.StreamTypeRVSecure)
secureStationURL.SetType(uint8(constants.StationURLFlagPublic))
commonTicketGrantingProtocol.SecureStationURL = secureStationURL
commonTicketGrantingProtocol.BuildName = types.NewString(serverBuildString)
commonTicketGrantingProtocol.SecureServerAccount = globals.SecureServerAccount
}

View File

@ -1,13 +0,0 @@
package nex
import (
nat_traversal "github.com/PretendoNetwork/nex-protocols-common-go/nat-traversal"
secureconnection "github.com/PretendoNetwork/nex-protocols-common-go/secure-connection"
"github.com/PretendoNetwork/wiiu-chat-secure/globals"
)
func registerCommonProtocols() {
nat_traversal.NewCommonNATTraversalProtocol(globals.NEXServer)
secureconnection.NewCommonSecureConnectionProtocol(globals.NEXServer)
}

View File

@ -0,0 +1,47 @@
package nex
import (
"github.com/PretendoNetwork/nex-go/v2/types"
common_nat_traversal "github.com/PretendoNetwork/nex-protocols-common-go/v2/nat-traversal"
common_secure "github.com/PretendoNetwork/nex-protocols-common-go/v2/secure-connection"
match_making "github.com/PretendoNetwork/nex-protocols-go/v2/match-making"
match_making_ext "github.com/PretendoNetwork/nex-protocols-go/v2/match-making-ext"
matchmake_extension "github.com/PretendoNetwork/nex-protocols-go/v2/matchmake-extension"
nat_traversal "github.com/PretendoNetwork/nex-protocols-go/v2/nat-traversal"
secure "github.com/PretendoNetwork/nex-protocols-go/v2/secure-connection"
local_globals "github.com/PretendoNetwork/wiiu-chat/globals"
local_match_making "github.com/PretendoNetwork/wiiu-chat/nex/match-making"
local_match_making_ext "github.com/PretendoNetwork/wiiu-chat/nex/match-making-ext"
local_matchmake_extension "github.com/PretendoNetwork/wiiu-chat/nex/matchmake-extension"
)
func registerCommonSecureServerProtocols() {
secureProtocol := secure.NewProtocol()
local_globals.SecureEndpoint.RegisterServiceProtocol(secureProtocol)
secure := common_secure.NewCommonProtocol(secureProtocol)
secure.CreateReportDBRecord = func(pid types.PID, reportID types.UInt32, reportData types.QBuffer) error {
return nil
}
natTraversalProtocol := nat_traversal.NewProtocol()
local_globals.SecureEndpoint.RegisterServiceProtocol(natTraversalProtocol)
common_nat_traversal.NewCommonProtocol(natTraversalProtocol)
matchMakingProtocol := match_making.NewProtocol()
local_globals.SecureEndpoint.RegisterServiceProtocol(matchMakingProtocol)
matchMakingProtocol.FindBySingleID = local_match_making.FindBySingleID
matchMakingProtocol.GetSessionURLs = local_match_making.GetSessionUrls
matchMakingProtocol.UnregisterGathering = local_match_making.UnregisterGathering
matchMakingExtProtocol := match_making_ext.NewProtocol()
local_globals.SecureEndpoint.RegisterServiceProtocol(matchMakingExtProtocol)
matchMakingExtProtocol.EndParticipation = local_match_making_ext.EndParticipation
matchmakeExtensionProtocol := matchmake_extension.NewProtocol()
local_globals.SecureEndpoint.RegisterServiceProtocol(matchmakeExtensionProtocol)
matchmakeExtensionProtocol.GetFriendNotificationData = local_matchmake_extension.GetFriendNotificationData
matchmakeExtensionProtocol.UpdateNotificationData = local_matchmake_extension.UpdateNotificationData
matchmakeExtensionProtocol.CreateMatchmakeSession = local_matchmake_extension.CreateMatchmakeSession
matchmakeExtensionProtocol.JoinMatchmakeSessionEx = local_matchmake_extension.JoinMatchmakeSessionEx
matchmakeExtensionProtocol.OpenParticipation = local_matchmake_extension.OpenParticipation
}

View File

@ -1,31 +0,0 @@
package nex
import (
match_making "github.com/PretendoNetwork/nex-protocols-go/match-making"
match_making_ext "github.com/PretendoNetwork/nex-protocols-go/match-making-ext"
matchmake_extension "github.com/PretendoNetwork/nex-protocols-go/matchmake-extension"
"github.com/PretendoNetwork/wiiu-chat-secure/globals"
nex_match_making "github.com/PretendoNetwork/wiiu-chat-secure/nex/match-making"
nex_match_making_ext "github.com/PretendoNetwork/wiiu-chat-secure/nex/match-making-ext"
nex_matchmake_extension "github.com/PretendoNetwork/wiiu-chat-secure/nex/matchmake-extension"
)
func registerNEXProtocols() {
matchmakeExtensionProtocol := matchmake_extension.NewMatchmakeExtensionProtocol(globals.NEXServer)
matchmakeExtensionProtocol.OpenParticipation(nex_matchmake_extension.OpenParticipation)
matchmakeExtensionProtocol.CreateMatchmakeSession(nex_matchmake_extension.CreateMatchmakeSession)
matchmakeExtensionProtocol.UpdateNotificationData(nex_matchmake_extension.UpdateNotificationData)
matchmakeExtensionProtocol.GetFriendNotificationData(nex_matchmake_extension.GetFriendNotificationData)
matchmakeExtensionProtocol.JoinMatchmakeSessionEx(nex_matchmake_extension.JoinMatchmakeSessionEx)
matchMakingProtocol := match_making.NewMatchMakingProtocol(globals.NEXServer)
matchMakingProtocol.UnregisterGathering(nex_match_making.UnregisterGathering)
matchMakingProtocol.FindBySingleID(nex_match_making.FindBySingleID)
matchMakingProtocol.GetSessionURLs(nex_match_making.GetSessionUrls)
matchMakingExtProtocol := match_making_ext.NewMatchMakingExtProtocol(globals.NEXServer)
matchMakingExtProtocol.EndParticipation(nex_match_making_ext.EndParticipation)
}

41
nex/secure.go Normal file
View File

@ -0,0 +1,41 @@
package nex
import (
"fmt"
"os"
"strconv"
nex "github.com/PretendoNetwork/nex-go/v2"
"github.com/PretendoNetwork/wiiu-chat/globals"
)
func StartSecureServer() {
globals.SecureServer = nex.NewPRUDPServer()
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.ByteStreamSettings.UseStructureHeader = false
// Technically this title is 3.4.2; however, it uses older-style structures and is therefore defined here as 3.3.2
globals.SecureServer.LibraryVersions.SetDefault(nex.NewLibraryVersion(3, 3, 2))
globals.SecureServer.AccessKey = "e7a47214"
globals.SecureEndpoint.OnData(func(packet nex.PacketInterface) {
request := packet.RMCMessage()
fmt.Println("=== WUC - Secure ===")
fmt.Printf("Protocol ID: %d\n", request.ProtocolID)
fmt.Printf("Method ID: %d\n", request.MethodID)
fmt.Println("====================")
})
registerCommonSecureServerProtocols()
port, _ := strconv.Atoi(os.Getenv("PN_WUC_SECURE_SERVER_PORT"))
globals.SecureServer.Listen(port)
}

View File

@ -1,39 +0,0 @@
package nex
import (
"fmt"
"os"
nex "github.com/PretendoNetwork/nex-go"
_ "github.com/PretendoNetwork/nex-protocols-go"
"github.com/PretendoNetwork/wiiu-chat-secure/globals"
)
func StartNEXServer() {
globals.NEXServer = nex.NewServer()
globals.NEXServer.SetPRUDPVersion(1)
globals.NEXServer.SetPRUDPProtocolMinorVersion(2)
globals.NEXServer.SetKerberosPassword(os.Getenv("PN_WIIU_CHAT_KERBEROS_PASSWORD"))
globals.NEXServer.SetAccessKey("e7a47214")
globals.NEXServer.SetDefaultNEXVersion(&nex.NEXVersion{
Major: 3,
Minor: 4,
Patch: 2,
})
globals.NEXServer.SetPingTimeout(65535)
globals.NEXServer.On("Data", func(packet *nex.PacketV1) {
request := packet.RMCRequest()
fmt.Println("==WiiU Chat - Secure==")
fmt.Printf("Protocol ID: %#v\n", request.ProtocolID())
fmt.Printf("Method ID: %#v\n", request.MethodID())
fmt.Println("======================")
})
// * Register the common handlers first so that they can be overridden if needed
registerCommonProtocols()
registerNEXProtocols()
globals.NEXServer.Listen(":60005")
}