7.17. 応用機能 - セッションのパスワード設定

セッションにパスワードを設定することができます。設定できるパスワードにはユーザーパスワードとシステムパスワードがあります。

参考:

セッションのパスワード設定機能は LAN マッチメイクでは対応していません。

ユーザーパスワード

同じパスワードを設定している参加者だけがセッションに参加できるようにするパスワードです。パスワードはユーザーが任意に設定可能で、セッション作成時とセッション参加時にパスワードを設定します。

ユーザーパスワードが設定されたセッションを作成するには、インターネットマッチメイクでは inet::NexCreateSessionSetting クラス、ローカルマッチメイクでは local::LocalCreateSessionSetting 派生クラスの SetSessionUserPassword() でパスワードを設定します。
ユーザーパスワードとして設定できる最大文字数はインターネットマッチメイクでは inet::SessionUserPasswordLengthMax、ローカルマッチメイクでは local::SessionUserPasswordLengthMax です。

コード 7-38. ユーザーパスワードの設定処理
// プレイヤーが入力したパスワードとその文字数を下記変数に保持します。
nn::pia::common::String userPassword(SessionUserPassword);

// 作成するセッションにユーザーパスワードを設定します。
nn::pia::inet::NexCreateSessionSetting createSessionSetting;
createSessionSetting.SetSessionUserPassword(userPassword);

// ユーザーパスワードを設定したセッションを作成します。
nn::Result result = nn::pia::session::Session::GetInstance()->CreateSessionAsync(&createSessionSetting);

ユーザーパスワードが設定されたセッションは、ランダムマッチメイク機能ではマッチメイクされなくなります。インターネットマッチメイクではブラウズマッチメイク機能で inet::NexSessionSearchCriteria の SetExcludeUserPasswordSet() に false を設定した場合にのみ、ローカルマッチメイクでは無条件でユーザーパスワードの設定されたセッションを検索結果として取得でき、マッチメイクできます。取得した検索結果のうち、ユーザーパスワード付きのセッションであるかを判定するためには、inet::NexSessionInfo や local::LocalSessionInfo 派生クラスに用意されている IsRestrictedByUserPassword() を使用します。

ユーザーパスワードが設定されたセッションに参加するには、インターネットマッチメイクでは inet::NexJoinSessionSetting クラス、ローカルマッチメイクでは local::LocalJoinSessionSetting 派生クラスの SetSessionUserPassword() に正しいパスワードを設定してセッション参加処理を行います。正しくないパスワードを設定した場合はセッション参加処理に失敗し、非同期処理結果としてResultSessionUserPasswordUnmatch が返されます。

コード 7-39. ユーザーパスワードが設定されたセッションの検索と参加
// インターネットマッチメイクでユーザーパスワードの設定されたセッションを検索するには次の設定が必要です。
nn::pia::inet::NexSessionSearchCriteria searchCriteria;
searchCriteria.SetExcludeUserPasswordSet(false);

// ユーザーパスワードの設定されたセッションも含む検索を行います。
nn::pia::Result result = nn::pia::session::Session::GetInstance()->BrowseSessionAsync(&searchCriteria);

while (true)
{
    if (nn::pia::session::Session::GetInstance()->IsBrowseSessionCompleted())
    {
        result = nn::pia::session::Session::GetInstance()->GetBrowseSessionResult();
        if (result.IsFailure())
        {
            // エラー処理
        }
        break;
    }
}

// 検索の非同期処理完了後、ユーザーパスワードの設定されたセッションを設定します。
nn::pia::inet::NexJoinSessionSetting joinSessionSetting;
pTargetSessionInfo = GetSessionInfoOfUserPasswordSet(nn::pia::session::Session::GetInstance()->GetBrowsedSessionInfoList());
joinSessionSetting.SetSessionInfoPtr(pTargetSessionInfo);

// ユーザーが入力したパスワードとその文字数を下記変数に保持します。
nn::pia::common::String userPassword(SessionUserPassword);

// 参加時の設定にユーザーパスワードを設定します。
joinSessionSetting.SetSessionUserPassword(userPassword);

// 設定したユーザーパスワードが一致していたら、参加に成功します。
result = nn::pia::session::Session::GetInstance()->JoinSessionAsync(&joinSessionSetting);

システムパスワード

参考:

システムパスワードはインターネットマッチメイクのみ対応しています。

システムパスワードはセッション参加者間で共有されるパスワードです。ホストがサーバーにパスワード発行を要求することで、サーバー側でパスワードを生成し、セッション参加者にパスワードが通知されます。
システムパスワードは特定のプレイヤーが参加するのを待つケースなどで有用です。 例えば対戦中に意図せずサーバーから切断したプレイヤーが元のセッションに復帰したい場合、対戦を開始する前にシステムパスワードを発行しておき、切断が発生した際にシステムパスワードを使ってセッションに戻るという使い方ができます。

セッション参加中にホストが session::Session::GenerateSessionSystemPasswordAsync() を呼び出すことで、サーバーにシステムパスワードの発行を要求できます。システムパスワードが発行されると、セッションに参加しているステーションに対して、session::Session::RegisterSessionEventCallback() で登録したコールバックに session::Session::EventType_SetSessionSystemPassword イベントが通知されます。コールバック内で session::Session::GetSessionSystemPassword() を呼び出すことで発行されたシステムパスワードが取得できます。 session::Session::GenerateSessionSystemPasswordAsync() を呼び出したステーションであれば、非同期処理完了時に引数に設定したバッファにもシステムパスワードが保存されます。

session::Session::GetSessionSystemPassword() でシステムパスワードを取得できる期間は、session::Session::EventType_SetSessionSystemPassword イベントが通知されてから、後述する session::Session::EventType_ClearSessionSystemPassword イベントが通知されるまでの間となります。また、session::Session::Cleanup() 後も取得できなくなります。

システムパスワードの文字数は inet::SessionSystemPasswordLengthMax となっており、アプリケーションでシステムパスワードを保存する nn::pia::common::FixedString クラスのインスタンスを用意する必要があります。

コード 7-40. システムパスワードの生成と取得
// システムパスワードとセッション ID を保持します。
// Pia のクリーンアップ処理を行うと取得できなくなる情報なので、アプリケーション側で格納先を用意する必要があります。
u32 sessionId;
nn::pia::common::FixedString<nn::pia::inet::SessionSystemPasswordLengthMax> systemPassword;

// セッション状態変化イベントコールバック関数
void sampleSessionCallback(nn::pia::session::Session::EventType eventType, nn::pia::StationId stationId)
{
    // 引数 eventType は、発生した状態変化の内容を示す列挙型です
    switch (eventType)
    {
    // システムパスワードが生成された際、セッションに参加してるステーションに通知されます
    case nn::pia::session::Session::EventType_SetSessionSystemPassword:
        // セッション ID とシステムパスワードを記録します。
        sessionId = nn::pia::session::Session::GetInstance()->GetSessionId();
        systemPassword.Copy(nn::pia::session::Session::GetInstance()->GetSessionSystemPassword());
        break;
    }
}

// セッション参加中の任意のタイミングでシステムパスワードを生成します。
nn::pia::Result result = nn::pia::session::Session::GetInstance()->GenerateSessionSystemPasswordAsync();

システムパスワードが発行されたセッションは、ランダムマッチメイク機能やブラウズマッチメイク機能を使用してもマッチメイクされなくなります。システムパスワードが設定されたセッションに参加するためには、 inet::NexJoinSessionSetting に記録しておいたセッション ID と システムパスワードを設定してセッション参加処理を行います。正しくないパスワードを設定した場合はセッション参加処理に失敗し、非同期処理結果として ResultSessionSystemPasswordUnmatch が返されます。

コード 7-41. システムパスワードが設定されたセッションへの参加
// システムパスワードとセッション ID を保持します。
u32 sessionId;
nn::pia::common::FixedString<nn::pia::inet::SessionSystemPasswordLengthMax> systemPassword;

// 参加するセッション ID とシステムパスワードを設定します。
nn::pia::inet::NexJoinSessionSetting joinSessionSetting;
joinSessionSetting.SetSessionId(sessionId);
joinSessionSetting.SetSessionSystemPassword(systemPassword);

// 指定したセッション ID が残っていて、設定したシステムパスワードが一致していたら、参加に成功します。
nn::pia::Result result = nn::pia::session::Session::GetInstance()->JoinSessionAsync(&joinSessionSetting);

セッション参加中にホストが session::Session::ClearSessionSystemPasswordAsync() を呼び出すことで、設定したシステムパスワードを解除することも可能です。システムパスワードが解除されると、セッションに参加しているステーションに対して、session::Session::RegisterSessionEventCallback() で登録したコールバックへ session::Session::EventType_ClearSessionSystemPassword イベントが通知されます。解除された後は、通常のセッションと同様に検索、参加処理が行えるようになります。

コード 7-42. システムパスワードの解除
// セッション状態変化イベントコールバック関数
void sampleSessionCallback(nn::pia::session::Session::EventType eventType, nn::pia::StationId stationId)
{
    // 引数 eventType は、発生した状態変化の内容を示す列挙型です
    switch (eventType)
    {
    // システムパスワードが生成された際にセッションに参加してるステーションに通知されます
    case nn::pia::session::Session::EventType_ClearSessionSystemPassword:
        // システムパスワードが解除されました。
        break;
    }
}

// セッション参加中の任意のタイミングでシステムパスワードを解除します。
nn::pia::Result result = nn::pia::session::Session::GetInstance()->ClearSessionSystemPasswordAsync();