Realms への接続
minecraft/realms パッケージを使用すると、Minecraft 公式のサブスクリプション型サーバー「Realms」の一覧取得や、アドレスの解決、gophertunnel による直接接続が可能です。
Realms API クライアントの作成
Realms へのアクセスには Xbox Live 認証トークンが必要です。
go
package main
import (
"context"
"fmt"
"log"
"github.com/sandertv/gophertunnel/minecraft"
"github.com/sandertv/gophertunnel/minecraft/auth"
"github.com/sandertv/gophertunnel/minecraft/realms"
)
func main() {
src := auth.TokenSource
// Realms クライアントの初期化
realmsClient := realms.NewClient(src, nil)
// 参加可能なRealm一覧を取得
ctx := context.Background()
realmList, err := realmsClient.Realms(ctx)
if err != nil {
log.Fatalf("Realms取得失敗: %v", err)
}
fmt.Println("=== 参加可能なRealms ===")
for i, r := range realmList {
fmt.Printf("[%d] %s (ID: %d, 状態: %s, オーナーXUID: %s)\n",
i, r.Name, r.ID, r.State, r.OwnerUUID)
}
}Realm への接続手順
Realms は直接IPアドレスが公開されているわけではなく、接続要求を送って動的に割り当てられたアドレス(およびネットワークプロトコル: RakNet または NetherNet)を取得して接続します。
go
package main
import (
"context"
"fmt"
"log"
"time"
"github.com/sandertv/gophertunnel/minecraft"
"github.com/sandertv/gophertunnel/minecraft/auth"
"github.com/sandertv/gophertunnel/minecraft/realms"
)
func main() {
src := auth.TokenSource
client := realms.NewClient(src, nil)
ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second)
defer cancel()
// 招待コードから参加する場合:
// realm, err := client.JoinCode(ctx, "招待コード")
// またはRealm一覧から選択
realmList, err := client.Realms(ctx)
if err != nil || len(realmList) == 0 {
log.Fatal("Realmが見つかりません")
}
targetRealm := realmList[0]
// 接続先アドレスを要求(Realmがスリープ中の場合は起動完了まで待機します)
fmt.Printf("%s のサーバーアドレスを取得中...\n", targetRealm.Name)
addr, err := targetRealm.Address(ctx)
if err != nil {
log.Fatalf("アドレス解決失敗: %v", err)
}
fmt.Printf("接続先: %s (プロトコル: %s)\n", addr.Address, addr.NetworkProtocol)
// Dialer にトークンとネットワークを指定して接続
dialer := minecraft.Dialer{
TokenSource: src,
}
conn, err := dialer.Dial(string(addr.NetworkProtocol), addr.Address)
if err != nil {
log.Fatalf("Realm接続失敗: %v", err)
}
defer conn.Close()
fmt.Println("Realm に正常にログインしました!")
}NetherNet と RakNet
Realms では環境によって raknet だけでなく、WebRTCベースの nethernet プロトコルが返される場合があります。gophertunnel は両方のネットワークドライバをサポートしているため、取得した addr.NetworkProtocol をそのまま dialer.Dial() のネットワーク種別として渡すのが推奨されます。