Skip to content

WebSocket

VRChatのパイプラインサーバーへのWebSocket接続を管理し、リアルタイムイベントを受信します。

セットアップ

go
import (
    "context"
    "github.com/kqnade/vrcgo/vrcws"
    "github.com/kqnade/vrcgo/shared"
)

// REST APIクライアントで事前に認証が必要
ws, err := vrcws.New(context.Background(), client)
if err != nil {
    log.Fatal(err)
}
defer ws.Close()

// ハンドラー登録後、接続を維持
ws.Wait()

イベントハンドラー

On(eventType, handler)

任意のイベント型にハンドラーを登録します。ワイルドカード "*" で全イベントをキャッチできます。

go
ws.On("friend-online", func(e shared.Event) {
    fmt.Printf("Raw event: %s\n", e.Content)
})

ws.On("*", func(e shared.Event) {
    fmt.Printf("Any event: %s\n", e.Type)
})

OnNotification(handler)

通知イベントを受信します。

go
ws.OnNotification(func(n shared.NotificationEvent) {
    fmt.Printf("通知 [%s]: %s\n", n.Type, n.Message)
})

OnFriendOnline(handler)

フレンドがオンラインになったとき。

go
ws.OnFriendOnline(func(e shared.FriendOnlineEvent) {
    fmt.Printf("%s がオンラインになりました (場所: %s)\n", e.UserID, e.Location)
})

OnFriendOffline(handler)

フレンドがオフラインになったとき。

go
ws.OnFriendOffline(func(e shared.FriendOfflineEvent) {
    fmt.Printf("%s がオフラインになりました\n", e.UserID)
})

OnFriendLocation(handler)

フレンドのロケーションが変わったとき。

go
ws.OnFriendLocation(func(e shared.FriendLocationEvent) {
    fmt.Printf("%s%s に移動しました\n", e.UserID, e.Location)
})

OnFriendActive(handler)

フレンドがアクティブになったとき(ゲームを起動したなど)。

go
ws.OnFriendActive(func(e shared.FriendActiveEvent) {
    fmt.Printf("%s がアクティブになりました\n", e.UserID)
})

OnFriendAdd(handler) / OnFriendDelete(handler)

フレンドが追加・削除されたとき。

go
ws.OnFriendAdd(func(e shared.FriendAddEvent) {
    fmt.Printf("%s とフレンドになりました\n", e.UserID)
})

ws.OnFriendDelete(func(e shared.FriendDeleteEvent) {
    fmt.Printf("%s とのフレンドが解消されました\n", e.UserID)
})

OnUserUpdate(handler)

自分のユーザー情報が更新されたとき。

go
ws.OnUserUpdate(func(e shared.UserUpdateEvent) {
    fmt.Printf("ユーザー情報が更新されました\n")
})

対応イベント一覧

イベント型ハンドラー説明
notificationOnNotification通知
friend-onlineOnFriendOnlineフレンドがオンラインに
friend-offlineOnFriendOfflineフレンドがオフラインに
friend-activeOnFriendActiveフレンドがアクティブに
friend-locationOnFriendLocationフレンドのロケーション変更
friend-addOnFriendAddフレンド追加
friend-deleteOnFriendDeleteフレンド削除
friend-updateフレンド情報更新
user-updateOnUserUpdate自分のユーザー情報更新
user-location自分のロケーション変更
notification-v2通知V2
notification-v2-update通知V2更新
notification-v2-delete通知V2削除
group-joinedグループ参加
group-leftグループ脱退
group-member-updatedグループメンバー更新
group-role-updatedグループロール更新

自動再接続

接続が切断された場合、WebSocketクライアントは自動的に再接続を試みます。

  • 初回再接続遅延: 5秒
  • 最大遅延: 60秒
  • バックオフ倍率: 2倍(指数バックオフ)
go
// 再接続をキャンセルしたい場合は ctx をキャンセルする
ctx, cancel := context.WithCancel(context.Background())
ws, _ := vrcws.New(ctx, client)

// 切断して再接続しない
cancel()
ws.Wait()

その他のメソッド

Close()

WebSocket接続を閉じます。

go
ws.Close()

Wait()

接続が終了するまでブロックします。メインゴルーチンで呼び出すことで、プログラムを接続維持状態に保てます。

go
ws.Wait()

Released under the Apache-2.0 License.