Skip to content

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() のネットワーク種別として渡すのが推奨されます。

Released under the MIT License.