GS2-Account SDK for Game Engine API リファレンス
モデル
EzAccount
ゲームプレイヤーアカウント
ゲームプレイヤーを識別するID情報のエンティティです。
ゲームプレイヤーアカウントは匿名アカウントであり、ユーザーID(UUID)とパスワード(ランダムな32文字の文字列)で構成されるため、ゲームプレイヤーはメールアドレスなどの情報を入力する必要はありません。
発行されたゲームプレイヤーアカウントは、デバイスのローカルストレージに保存しておき、次回以降ログインに使用します。
型 | 必須 | デフォルト | 値の制限 | 説明 | |
---|---|---|---|---|---|
userId | string | ✓ | UUID | ~ 128文字 | ユーザーID |
password | string | ✓ | ~ 128文字 | パスワード | |
createdAt | long | ✓ | 現在時刻 | 作成日時 (UNIX時間 単位:ミリ秒) |
EzTakeOver
引継ぎ情報
引継ぎ情報とは、デバイスの機種変更やプラットフォーム間のアカウントの移動・共有時に使用する情報です。
個人を識別するユニークな文字列とパスワードで構成され、その適切な組み合わせを入力することで、Account(匿名アカウント)を取得することができます。
1つの Account に対して複数の引継ぎ情報を設定できます。
複数の引継ぎ情報を設定するにはそれぞれ異なるスロットを指定する必要があります。
スロットには0~1024を指定できますので、最大1025種類の引継ぎ情報を設定可能です。
具体的な用例としては 0 には Twitter のアカウント情報を、1 には Sign-in Apple のアカウント情報を、2 には Google のアカウント情報を保存するようにする。というような使い方が想定されています。
あくまでこの引継ぎ情報はデータホルダーであり、ソーシャルアカウントとの認証の仕組みは別途用意する必要があります。
型 | 必須 | デフォルト | 値の制限 | 説明 | |
---|---|---|---|---|---|
userId | string | ✓ | ~ 128文字 | ユーザーID | |
type | int | ✓ | ~ 1024 | スロット番号 | |
userIdentifier | string | ✓ | ~ 1024文字 | 引き継ぎ用ユーザーID | |
createdAt | long | ✓ | 現在時刻 | 作成日時 (UNIX時間 単位:ミリ秒) |
EzPlatformId
各種プラットフォームID
X、Instagram、facebook などの各種プラットフォームにおけるIDを保持します。
他のプレイヤーは各種プラットフォームIDを使用して、プレイヤーを検索することができます。
Instagram のフォロワーや、facebook のフレンドをゲーム内のフレンドとしてインポートする際に、GS2-Account のアカウントを特定するために使用します。
型 | 必須 | デフォルト | 値の制限 | 説明 | |
---|---|---|---|---|---|
type | int | ✓ | ~ 1024 | スロット番号 | |
userIdentifier | string | ✓ | ~ 1024文字 | 各種プラットフォームにおけるユーザーID | |
userId | string | ✓ | ~ 128文字 | ユーザーID | |
createdAt | long | ✓ | 現在時刻 | 作成日時 (UNIX時間 単位:ミリ秒) |
EzPlatformUser
各種プラットフォームにおけるユーザー情報
型 | 必須 | デフォルト | 値の制限 | 説明 | |
---|---|---|---|---|---|
type | int | ✓ | ~ 1024 | スロット番号 | |
userIdentifier | string | ✓ | ~ 1024文字 | 各種プラットフォームにおけるユーザーID | |
userId | string | ✓ | ~ 128文字 | ユーザーID |
EzBanStatus
アカウントBANの情報
ゲームプレイヤーアカウントに適用されたBAN(アクセス禁止)状態に関する情報を表します。
この型は、BANが適用された理由、BANの名称、およびBANの解除予定日時などの詳細情報を含みます。
BAN状態は、不正行為や規約違反など、様々な理由でアカウントに適用されることがあり、この型はその状態を管理するのに役立ちます。
システムは、この情報を基にアカウントのアクセス権限を制御し、必要に応じてアクセスの制限や解除を行います。
型 | 必須 | デフォルト | 値の制限 | 説明 | |
---|---|---|---|---|---|
name | string | ✓ | UUID | ~ 36文字 | BANステータス名 |
reason | string | ✓ | ~ 256文字 | アカウントBANされた理由 | |
releaseTimestamp | long | ✓ | BANが解除される日時 (UNIX時間 単位:ミリ秒) |
メソッド
authentication
アカウントの認証
create 関数で発行したユーザID・パスワードを使用してゲームプレイヤーの認証を行います。
認証が完了すると アカウント認証情報
と 署名
が発行されます。アカウント認証情報
と 署名
を GS2-Auth::Login にわたすことで、GS2の各サービスにアクセスするための アクセストークン
を得ることができます。
なおこのAPIとGS2-Auth::LoginをひとまとめにしたものがGS2-Profile::Loginではじめかた⇒サンプルプログラムで解説しています。
アカウント認証情報
と 署名
は1時間の有効期限が存在します。
Request
型 | 必須 | デフォルト | 値の制限 | 説明 | |
---|---|---|---|---|---|
namespaceName | string | ✓ | ~ 128文字 | ネームスペース名 | |
userId | string | ✓ | ~ 128文字 | ユーザーID | |
keyId | string | ✓ | “grn:gs2:{region}:{ownerId}:key:default:key:default” | ~ 1024文字 | 暗号鍵GRN |
password | string | ✓ | ~ 128文字 | パスワード |
Result
型 | 説明 | |
---|---|---|
item | EzAccount | ゲームプレイヤーアカウント |
banStatuses | List<EzBanStatus> | BAN状態リスト |
body | string | 署名対象のアカウント情報 |
signature | string | 署名 |
Error
このAPIには特別な例外が定義されています。
GS2-SDK for GameEngine ではゲーム内でハンドリングが必要そうなエラーは一般的な例外から派生した特殊化した例外を用意することでハンドリングしやすくしています。
一般的なエラーの種類や、ハンドリング方法は こちら のドキュメントを参考にしてください。
型 | 基底クラス | 説明 |
---|---|---|
PasswordIncorrectException | UnauthorizedException | パスワードの指定が不適切です |
BannedInfinityException | UnauthorizedException | アカウントが利用停止されています |
実装例
try {
var domain = gs2.Account.Namespace(
namespaceName: "namespace-0001"
).Account(
userId: "user-0001"
);
var result = await domain.AuthenticationAsync(
password: "password-0001",
keyId: "grn:gs2:ap-northeast-1:owner_id:key:namespace-0001:key:key-0001"
);
var item = await result.ModelAsync();
var banStatuses = result.BanStatuses;
var body = result.Body;
var signature = result.Signature;
} catch(Gs2.Gs2Account.Exception.PasswordIncorrect e) {
// Incorrect password specified.
} catch(Gs2.Gs2Account.Exception.BannedInfinity e) {
// Account has been suspended.
}
var domain = gs2.Account.Namespace(
namespaceName: "namespace-0001"
).Account(
userId: "user-0001"
);
var future = domain.AuthenticationFuture(
password: "password-0001",
keyId: "grn:gs2:ap-northeast-1:owner_id:key:namespace-0001:key:key-0001"
);
yield return future;
if (future.Error != null)
{
if (future.Error is Gs2.Gs2Account.Exception.PasswordIncorrectException)
{
// Incorrect password specified.
}
if (future.Error is Gs2.Gs2Account.Exception.BannedInfinityException)
{
// Account has been suspended.
}
onError.Invoke(future.Error, null);
yield break;
}
var future2 = future.Result.ModelFuture();
yield return future2;
if (future2.Error != null)
{
onError.Invoke(future2.Error, null);
yield break;
}
var result = future2.Result;
var banStatuses = future.Result.BanStatuses;
var body = future.Result.Body;
var signature = future.Result.Signature;
const auto Domain = Gs2->Account->Namespace(
"namespace-0001" // namespaceName
)->Account(
"user-0001" // userId
);
const auto Future = Domain->Authentication(
"password-0001", // password
"grn:gs2:ap-northeast-1:owner_id:key:namespace-0001:key:key-0001" // keyId
);
Future->StartSynchronousTask();
if (Future->GetTask().IsError())
{
auto e = Future->GetTask().Error();
if (e->IsChildOf(Gs2::Account::Error::FPasswordIncorrectError::Class))
{
// Incorrect password specified.
}
if (e->IsChildOf(Gs2::Account::Error::FBannedInfinityError::Class))
{
// Account has been suspended.
}
return false;
}
// obtain changed values / result values
const auto Future2 = Future->GetTask().Result()->Model();
Future2->StartSynchronousTask();
if (Future2->GetTask().IsError())
{
return Future2->GetTask().Error();
}
const auto Result = Future2->GetTask().Result();
const auto BanStatuses = Result->BanStatuses;
const auto Body = Result->Body;
const auto Signature = Result->Signature;
create
ゲームプレイヤーを識別するアカウントを新規作成
このAPIの実行に成功すると、作成したアカウントの情報が返ります。
返ったアカウント情報のうち、認証処理に使用するユーザIDとパスワードを永続化してください。
ここで発行されるパスワードはランダム値であり、ゲームプレイヤーの任意の値を指定することはできません。引き継ぎ設定
としてゲームプレイヤーにとってわかりやすい識別子を登録することができます。
Request
型 | 必須 | デフォルト | 値の制限 | 説明 | |
---|---|---|---|---|---|
namespaceName | string | ✓ | ~ 128文字 | ネームスペース名 |
Result
型 | 説明 | |
---|---|---|
item | EzAccount | 作成したゲームプレイヤーアカウント |
実装例
var domain = gs2.Account.Namespace(
namespaceName: "namespace-0001"
);
var result = await domain.CreateAsync(
);
var item = await result.ModelAsync();
var domain = gs2.Account.Namespace(
namespaceName: "namespace-0001"
);
var future = domain.CreateFuture(
);
yield return future;
if (future.Error != null)
{
onError.Invoke(future.Error, null);
yield break;
}
var future2 = future.Result.ModelFuture();
yield return future2;
if (future2.Error != null)
{
onError.Invoke(future2.Error, null);
yield break;
}
var result = future2.Result;
const auto Domain = Gs2->Account->Namespace(
"namespace-0001" // namespaceName
);
const auto Future = Domain->Create(
);
Future->StartSynchronousTask();
if (Future->GetTask().IsError())
{
return false;
}
// obtain changed values / result values
const auto Future2 = Future->GetTask().Result()->Model();
Future2->StartSynchronousTask();
if (Future2->GetTask().IsError())
{
return Future2->GetTask().Error();
}
const auto Result = Future2->GetTask().Result();
addTakeOverSetting
引き継ぎ設定
を追加
引き継ぎ設定
は機種変更などを行ったときにアカウントの引き継ぎをできるようにする設定です。引き継ぎ設定
は 引き継ぎ用ユーザーID
と 引き継ぎ用パスワード
の組み合わせで実行できるようにします。
スロット番号
に異なる値を指定することで、1つのアカウントに対して複数の 引き継ぎ設定
を保持できます。
たとえば、 スロット番号:0
にメールアドレス・パスワード を、 スロット番号:1
にソーシャルメディアのID情報を格納するようにし、
ゲームプレイヤーは好みの引き継ぎ手段を選択できるようにする。といった運用が可能です。
Request
型 | 必須 | デフォルト | 値の制限 | 説明 | |
---|---|---|---|---|---|
namespaceName | string | ✓ | ~ 128文字 | ネームスペース名 | |
accessToken | string | ✓ | ~ 128文字 | ユーザーID | |
type | int | ✓ | ~ 1024 | スロット番号 | |
userIdentifier | string | ✓ | ~ 1024文字 | 引き継ぎ用ユーザーID | |
password | string | ✓ | ~ 128文字 | パスワード |
Result
型 | 説明 | |
---|---|---|
item | EzTakeOver | 作成した引き継ぎ設定 |
実装例
var domain = gs2.Account.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).TakeOver(
type: 0,
userIdentifier: "user-0001@gs2.io"
);
var result = await domain.AddTakeOverSettingAsync(
password: "password-0001"
);
var item = await result.ModelAsync();
var domain = gs2.Account.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).TakeOver(
type: 0,
userIdentifier: "user-0001@gs2.io"
);
var future = domain.AddTakeOverSettingFuture(
password: "password-0001"
);
yield return future;
if (future.Error != null)
{
onError.Invoke(future.Error, null);
yield break;
}
var future2 = future.Result.ModelFuture();
yield return future2;
if (future2.Error != null)
{
onError.Invoke(future2.Error, null);
yield break;
}
var result = future2.Result;
const auto Domain = Gs2->Account->Namespace(
"namespace-0001" // namespaceName
)->Me(
GameSession
)->TakeOver(
0, // type
"user-0001@gs2.io" // userIdentifier
);
const auto Future = Domain->AddTakeOverSetting(
"password-0001" // password
);
Future->StartSynchronousTask();
if (Future->GetTask().IsError())
{
return false;
}
// obtain changed values / result values
const auto Future2 = Future->GetTask().Result()->Model();
Future2->StartSynchronousTask();
if (Future2->GetTask().IsError())
{
return Future2->GetTask().Error();
}
const auto Result = Future2->GetTask().Result();
addTakeOverSettingOpenIdConnect
OpenID Connect の認証結果を使用して引き継ぎ設定
を追加
引き継ぎ設定
は機種変更などを行ったときにアカウントの引き継ぎをできるようにする設定です。引き継ぎ設定
の設定には Google や Apple、Facebook のような OpenID Connect
の認証結果を使用します。
この機能を利用する場合はパスワードの設定は不要です。
この機能を利用する場合は、事前に スロット番号
がどの認証サービスを使用するかを指定しておく必要があります。
また、マスターデータで OpenID Connect との連携設定が行われると、そのスロットに対しては 引き継ぎ用ユーザーID
と 引き継ぎ用パスワード
の組み合わせによる引き継ぎ設定を行うことができなくなります。
Request
型 | 必須 | デフォルト | 値の制限 | 説明 | |
---|---|---|---|---|---|
namespaceName | string | ✓ | ~ 128文字 | ネームスペース名 | |
accessToken | string | ✓ | ~ 128文字 | ユーザーID | |
type | int | ✓ | ~ 1024 | スロット番号 | |
idToken | string | ✓ | ~ 1024文字 | OpenID Connect ID Token |
Result
型 | 説明 | |
---|---|---|
item | EzTakeOver | 作成した引き継ぎ設定 |
実装例
var domain = gs2.Account.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).TakeOver(
type: null,
userIdentifier: null
);
var result = await domain.AddTakeOverSettingOpenIdConnectAsync(
idToken: "0123456789"
);
var item = await result.ModelAsync();
var domain = gs2.Account.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).TakeOver(
type: null,
userIdentifier: null
);
var future = domain.AddTakeOverSettingOpenIdConnectFuture(
idToken: "0123456789"
);
yield return future;
if (future.Error != null)
{
onError.Invoke(future.Error, null);
yield break;
}
var future2 = future.Result.ModelFuture();
yield return future2;
if (future2.Error != null)
{
onError.Invoke(future2.Error, null);
yield break;
}
var result = future2.Result;
const auto Domain = Gs2->Account->Namespace(
"namespace-0001" // namespaceName
)->Me(
GameSession
)->TakeOver(
nullptr, // type
nullptr // userIdentifier
);
const auto Future = Domain->AddTakeOverSettingOpenIdConnect(
"0123456789" // idToken
);
Future->StartSynchronousTask();
if (Future->GetTask().IsError())
{
return false;
}
// obtain changed values / result values
const auto Future2 = Future->GetTask().Result()->Model();
Future2->StartSynchronousTask();
if (Future2->GetTask().IsError())
{
return Future2->GetTask().Error();
}
const auto Result = Future2->GetTask().Result();
deleteTakeOverSetting
引き継ぎ設定
の削除
設定されている 引き継ぎ設定
を削除します。
Request
型 | 必須 | デフォルト | 値の制限 | 説明 | |
---|---|---|---|---|---|
namespaceName | string | ✓ | ~ 128文字 | ネームスペース名 | |
accessToken | string | ✓ | ~ 128文字 | ユーザーID | |
type | int | ✓ | ~ 1024 | スロット番号 |
Result
型 | 説明 | |
---|---|---|
item | EzTakeOver | 削除した引き継ぎ設定 |
実装例
var domain = gs2.Account.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
);
var result = await domain.DeleteTakeOverSettingAsync(
type: 0
);
var domain = gs2.Account.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
);
var future = domain.DeleteTakeOverSettingFuture(
type: 0
);
yield return future;
if (future.Error != null)
{
onError.Invoke(future.Error, null);
yield break;
}
const auto Domain = Gs2->Account->Namespace(
"namespace-0001" // namespaceName
)->Me(
GameSession
);
const auto Future = Domain->DeleteTakeOverSetting(
0 // type
);
Future->StartSynchronousTask();
if (Future->GetTask().IsError())
{
return false;
}
const auto Result = Future->GetTask().Result();
doTakeOver
引き継ぎを実行
指定された 引き継ぎ用ユーザID
と 引き継ぎ用パスワード
が一致していた場合、設定されたアカウント情報を応答します。
応答されたアカウント情報から ユーザID
と パスワード
を永続化して利用してください。
Request
型 | 必須 | デフォルト | 値の制限 | 説明 | |
---|---|---|---|---|---|
namespaceName | string | ✓ | ~ 128文字 | ネームスペース名 | |
type | int | ✓ | ~ 1024 | スロット番号 | |
userIdentifier | string | ✓ | ~ 1024文字 | 引き継ぎ用ユーザーID | |
password | string | ✓ | ~ 128文字 | パスワード |
Result
型 | 説明 | |
---|---|---|
item | EzAccount | ゲームプレイヤーアカウント |
Error
このAPIには特別な例外が定義されています。
GS2-SDK for GameEngine ではゲーム内でハンドリングが必要そうなエラーは一般的な例外から派生した特殊化した例外を用意することでハンドリングしやすくしています。
一般的なエラーの種類や、ハンドリング方法は こちら のドキュメントを参考にしてください。
型 | 基底クラス | 説明 |
---|---|---|
PasswordIncorrectException | UnauthorizedException | パスワードの指定が不適切です |
実装例
try {
var domain = gs2.Account.Namespace(
namespaceName: "namespace-0001"
);
var result = await domain.DoTakeOverAsync(
type: 0,
userIdentifier: "user-0001@gs2.io",
password: "password-0001"
);
var item = await result.ModelAsync();
} catch(Gs2.Gs2Account.Exception.PasswordIncorrect e) {
// Incorrect password specified.
}
var domain = gs2.Account.Namespace(
namespaceName: "namespace-0001"
);
var future = domain.DoTakeOverFuture(
type: 0,
userIdentifier: "user-0001@gs2.io",
password: "password-0001"
);
yield return future;
if (future.Error != null)
{
if (future.Error is Gs2.Gs2Account.Exception.PasswordIncorrectException)
{
// Incorrect password specified.
}
onError.Invoke(future.Error, null);
yield break;
}
var future2 = future.Result.ModelFuture();
yield return future2;
if (future2.Error != null)
{
onError.Invoke(future2.Error, null);
yield break;
}
var result = future2.Result;
const auto Domain = Gs2->Account->Namespace(
"namespace-0001" // namespaceName
);
const auto Future = Domain->DoTakeOver(
0, // type
"user-0001@gs2.io", // userIdentifier
"password-0001" // password
);
Future->StartSynchronousTask();
if (Future->GetTask().IsError())
{
auto e = Future->GetTask().Error();
if (e->IsChildOf(Gs2::Account::Error::FPasswordIncorrectError::Class))
{
// Incorrect password specified.
}
return false;
}
// obtain changed values / result values
const auto Future2 = Future->GetTask().Result()->Model();
Future2->StartSynchronousTask();
if (Future2->GetTask().IsError())
{
return Future2->GetTask().Error();
}
const auto Result = Future2->GetTask().Result();
doTakeOverOpenIdConnect
OpenID Connect の認証結果を使用して 引き継ぎを実行
指定された Open ID Connect の認証情報と関連づけられたアカウント情報を応答します。
応答されたアカウント情報から ユーザID
と パスワード
を永続化して利用してください。
Request
型 | 必須 | デフォルト | 値の制限 | 説明 | |
---|---|---|---|---|---|
namespaceName | string | ✓ | ~ 128文字 | ネームスペース名 | |
type | int | ✓ | ~ 1024 | スロット番号 | |
idToken | string | ✓ | ~ 1024文字 | OpenID Connect ID Token |
Result
型 | 説明 | |
---|---|---|
item | EzAccount | ゲームプレイヤーアカウント |
実装例
var domain = gs2.Account.Namespace(
namespaceName: "namespace-0001"
);
var result = await domain.DoTakeOverOpenIdConnectAsync(
type: ,
idToken: "0123456789"
);
var item = await result.ModelAsync();
var domain = gs2.Account.Namespace(
namespaceName: "namespace-0001"
);
var future = domain.DoTakeOverOpenIdConnectFuture(
type: ,
idToken: "0123456789"
);
yield return future;
if (future.Error != null)
{
onError.Invoke(future.Error, null);
yield break;
}
var future2 = future.Result.ModelFuture();
yield return future2;
if (future2.Error != null)
{
onError.Invoke(future2.Error, null);
yield break;
}
var result = future2.Result;
const auto Domain = Gs2->Account->Namespace(
"namespace-0001" // namespaceName
);
const auto Future = Domain->DoTakeOverOpenIdConnect(
, // type
"0123456789" // idToken
);
Future->StartSynchronousTask();
if (Future->GetTask().IsError())
{
return false;
}
// obtain changed values / result values
const auto Future2 = Future->GetTask().Result()->Model();
Future2->StartSynchronousTask();
if (Future2->GetTask().IsError())
{
return Future2->GetTask().Error();
}
const auto Result = Future2->GetTask().Result();
get
タイプを指定して引き継ぎ設定を取得
Request
型 | 必須 | デフォルト | 値の制限 | 説明 | |
---|---|---|---|---|---|
namespaceName | string | ✓ | ~ 128文字 | ネームスペース名 | |
accessToken | string | ✓ | ~ 128文字 | ユーザーID | |
type | int | ✓ | ~ 1024 | スロット番号 |
Result
型 | 説明 | |
---|---|---|
item | EzTakeOver | 引き継ぎ設定 |
実装例
var domain = gs2.Account.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).TakeOver(
type: 0,
userIdentifier: "user-0001@gs2.io"
);
var item = await domain.ModelAsync();
var domain = gs2.Account.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).TakeOver(
type: 0,
userIdentifier: "user-0001@gs2.io"
);
var future = domain.ModelFuture();
yield return future;
var item = future.Result;
const auto Domain = Gs2->Account->Namespace(
"namespace-0001" // namespaceName
)->Me(
GameSession
)->TakeOver(
0, // type
"user-0001@gs2.io" // userIdentifier
);
const auto Future = Domain->Model();
Future->StartSynchronousTask();
if (Future->GetTask().IsError())
{
return false;
}
値の変更イベントハンドリング
var domain = gs2.Account.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).TakeOver(
type: 0,
userIdentifier: "user-0001@gs2.io"
);
// イベントハンドリングを開始
var callbackId = domain.Subscribe(
value => {
// 値が変化した時に呼び出される
// value には変更後の値が渡ってくる
}
);
// イベントハンドリングを停止
domain.Unsubscribe(callbackId);
var domain = gs2.Account.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).TakeOver(
type: 0,
userIdentifier: "user-0001@gs2.io"
);
var future = domain.ModelFuture();
yield return future;
var item = future.Result;
const auto Domain = Gs2->Account->Namespace(
"namespace-0001" // namespaceName
)->Me(
GameSession
)->TakeOver(
0, // type
"user-0001@gs2.io" // userIdentifier
);
// イベントハンドリングを開始
const auto CallbackId = Domain->Subscribe(
[](TSharedPtr<Gs2::Account::Model::FTakeOver> value) {
// 値が変化した時に呼び出される
// value には変更後の値が渡ってくる
}
);
// イベントハンドリングを停止
Domain->Unsubscribe(CallbackId);
Warning
このイベントはSDKがもつローカルキャッシュの値が変更された時に呼び出されます。
ローカルキャッシュは SDK が持つ API の実行、または GS2-Gateway の通知を有効にした GS2-Distributor 経由でのスタンプシートの実行、または GS2-Gateway の通知を有効にした GS2-JobQueue の実行によって変化したもののみが対象となります。
そのため、これらの方法以外で値が変更されてもコールバックは呼び出されません。
getAuthorizationUrl
OpenID Connect の認証URLを取得
Request
型 | 必須 | デフォルト | 値の制限 | 説明 | |
---|---|---|---|---|---|
namespaceName | string | ✓ | ~ 128文字 | ネームスペース名 | |
accessToken | string | ✓ | ~ 128文字 | ユーザーID | |
type | int | ✓ | ~ 1024 | スロット番号 |
Result
型 | 説明 | |
---|---|---|
authorizationUrl | string | 認証URL |
実装例
var domain = gs2.Account.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
);
var result = await domain.GetAuthorizationUrlAsync(
type: 0
);
var authorizationUrl = result.AuthorizationUrl;
var domain = gs2.Account.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
);
var future = domain.GetAuthorizationUrlFuture(
type: 0
);
yield return future;
if (future.Error != null)
{
onError.Invoke(future.Error, null);
yield break;
}
var authorizationUrl = future.Result.AuthorizationUrl;
const auto Domain = Gs2->Account->Namespace(
"namespace-0001" // namespaceName
)->Me(
GameSession
);
const auto Future = Domain->GetAuthorizationUrl(
0 // type
);
Future->StartSynchronousTask();
if (Future->GetTask().IsError())
{
return false;
}
const auto Result = Future->GetTask().Result();
const auto AuthorizationUrl = Result->AuthorizationUrl;
listTakeOverSettings
設定されている 引き継ぎ設定
の一覧を取得
ゲームプレイヤーが設定した 引き継ぎ設定
の一覧を取得できます。
設定されている 引き継ぎ用パスワード
の値は取得できません。
Request
型 | 必須 | デフォルト | 値の制限 | 説明 | |
---|---|---|---|---|---|
namespaceName | string | ✓ | ~ 128文字 | ネームスペース名 | |
accessToken | string | ✓ | ~ 128文字 | ユーザーID | |
pageToken | string | ~ 1024文字 | データの取得を開始する位置を指定するトークン | ||
limit | int | ✓ | 30 | 1 ~ 1000 | データの取得件数 |
Result
型 | 説明 | |
---|---|---|
items | List<EzTakeOver> | 引き継ぎ設定のリスト |
nextPageToken | string | リストの続きを取得するためのページトークン |
実装例
var domain = gs2.Account.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
);
var items = await domain.TakeOversAsync(
).ToListAsync();
var domain = gs2.Account.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
);
var it = domain.TakeOvers(
);
List<EzTakeOver> items = new List<EzTakeOver>();
while (it.HasNext())
{
yield return it.Next();
if (it.Error != null)
{
onError.Invoke(it.Error, null);
break;
}
if (it.Current != null)
{
items.Add(it.Current);
}
else
{
break;
}
}
const auto Domain = Gs2->Account->Namespace(
"namespace-0001" // namespaceName
)->Me(
GameSession
);
const auto It = Domain->TakeOvers(
);
TArray<Gs2::UE5::Account::Model::FEzTakeOverPtr> Result;
for (auto Item : *It)
{
if (Item.IsError())
{
return false;
}
Result.Add(Item.Current());
}
値の変更イベントハンドリング
var domain = gs2.Account.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
);
// イベントハンドリングを開始
var callbackId = domain.SubscribeTakeOvers(
() => {
// リストの要素が変化した時に呼び出される
}
);
// イベントハンドリングを停止
domain.UnsubscribeTakeOvers(callbackId);
var domain = gs2.Account.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
);
var it = domain.TakeOvers(
);
List<EzTakeOver> items = new List<EzTakeOver>();
while (it.HasNext())
{
yield return it.Next();
if (it.Error != null)
{
onError.Invoke(it.Error, null);
break;
}
if (it.Current != null)
{
items.Add(it.Current);
}
else
{
break;
}
}
const auto Domain = Gs2->Account->Namespace(
"namespace-0001" // namespaceName
)->Me(
GameSession
);
// イベントハンドリングを開始
const auto CallbackId = Domain->SubscribeTakeOvers(
[]() {
// リストの要素が変化した時に呼び出される
}
);
// イベントハンドリングを停止
Domain->UnsubscribeTakeOvers(CallbackId);
Warning
このイベントはSDKがもつローカルキャッシュの値が変更された時に呼び出されます。
ローカルキャッシュは SDK が持つ API の実行、または GS2-Gateway の通知を有効にした GS2-Distributor 経由でのスタンプシートの実行、または GS2-Gateway の通知を有効にした GS2-JobQueue の実行によって変化したもののみが対象となります。
そのため、これらの方法以外で値が変更されてもコールバックは呼び出されません。
updateTakeOverSetting
引き継ぎ設定
のパスワードを変更する
このAPIを経由して 引き継ぎ用パスワード
を更新するためには、すでに設定されている 引き継ぎ用パスワード
を知っていなければ実行できません。
セキュアな 引き継ぎ設定
の更新を実現したい場合に使用します。
このAPIを使用する際には、 引き継ぎ設定
の削除APIのアクセス権限を剥奪することを忘れないようにしてください。
ゲームプレイヤーが自分の 引き継ぎ設定
の削除するにはパスワードの認証が必要ありません。
削除して再作成することで、実質的に 引き継ぎ用パスワード
の変更ができてしまいます。
Request
型 | 必須 | デフォルト | 値の制限 | 説明 | |
---|---|---|---|---|---|
namespaceName | string | ✓ | ~ 128文字 | ネームスペース名 | |
accessToken | string | ✓ | ~ 128文字 | ユーザーID | |
type | int | ✓ | ~ 1024 | スロット番号 | |
oldPassword | string | ✓ | ~ 128文字 | 古いパスワード | |
password | string | ✓ | ~ 128文字 | パスワード |
Result
型 | 説明 | |
---|---|---|
item | EzTakeOver | 引き継ぎ設定 |
Error
このAPIには特別な例外が定義されています。
GS2-SDK for GameEngine ではゲーム内でハンドリングが必要そうなエラーは一般的な例外から派生した特殊化した例外を用意することでハンドリングしやすくしています。
一般的なエラーの種類や、ハンドリング方法は こちら のドキュメントを参考にしてください。
型 | 基底クラス | 説明 |
---|---|---|
PasswordIncorrectException | UnauthorizedException | パスワードの指定が不適切です |
実装例
try {
var domain = gs2.Account.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).TakeOver(
type: 0,
userIdentifier: "user-0001@gs2.io"
);
var result = await domain.UpdateTakeOverSettingAsync(
oldPassword: "password-0001",
password: "password-1001"
);
var item = await result.ModelAsync();
} catch(Gs2.Gs2Account.Exception.PasswordIncorrect e) {
// Incorrect password specified.
}
var domain = gs2.Account.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).TakeOver(
type: 0,
userIdentifier: "user-0001@gs2.io"
);
var future = domain.UpdateTakeOverSettingFuture(
oldPassword: "password-0001",
password: "password-1001"
);
yield return future;
if (future.Error != null)
{
if (future.Error is Gs2.Gs2Account.Exception.PasswordIncorrectException)
{
// Incorrect password specified.
}
onError.Invoke(future.Error, null);
yield break;
}
var future2 = future.Result.ModelFuture();
yield return future2;
if (future2.Error != null)
{
onError.Invoke(future2.Error, null);
yield break;
}
var result = future2.Result;
const auto Domain = Gs2->Account->Namespace(
"namespace-0001" // namespaceName
)->Me(
GameSession
)->TakeOver(
0, // type
"user-0001@gs2.io" // userIdentifier
);
const auto Future = Domain->UpdateTakeOverSetting(
"password-0001", // oldPassword
"password-1001" // password
);
Future->StartSynchronousTask();
if (Future->GetTask().IsError())
{
auto e = Future->GetTask().Error();
if (e->IsChildOf(Gs2::Account::Error::FPasswordIncorrectError::Class))
{
// Incorrect password specified.
}
return false;
}
// obtain changed values / result values
const auto Future2 = Future->GetTask().Result()->Model();
Future2->StartSynchronousTask();
if (Future2->GetTask().IsError())
{
return Future2->GetTask().Error();
}
const auto Result = Future2->GetTask().Result();
addPlatformIdSetting
プラットフォームIDを追加
プラットフォームIDとは、X、Instagram、Facebook などの各種プラットフォームにおけるIDを保持するための情報です。
タイプには 0 から 1024 までの範囲で指定され、プラットフォームの種類を識別するために使用します。
ユーザー識別子は、各プラットフォームにおけるユーザーIDを指定します。
他プレイヤーはタイプとユーザー識別子を指定してプレイヤーを検索することができます。
Request
型 | 必須 | デフォルト | 値の制限 | 説明 | |
---|---|---|---|---|---|
namespaceName | string | ✓ | ~ 128文字 | ネームスペース名 | |
accessToken | string | ✓ | ~ 128文字 | ユーザーID | |
type | int | ✓ | ~ 1024 | スロット番号 | |
userIdentifier | string | ✓ | ~ 1024文字 | 各種プラットフォームにおけるユーザーID |
Result
型 | 説明 | |
---|---|---|
item | EzPlatformId | 作成した各種プラットフォームにおけるユーザーID |
実装例
var domain = gs2.Account.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).PlatformId(
type: 0,
userIdentifier: "123456"
);
var result = await domain.AddPlatformIdSettingAsync(
);
var item = await result.ModelAsync();
var domain = gs2.Account.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).PlatformId(
type: 0,
userIdentifier: "123456"
);
var future = domain.AddPlatformIdSettingFuture(
);
yield return future;
if (future.Error != null)
{
onError.Invoke(future.Error, null);
yield break;
}
var future2 = future.Result.ModelFuture();
yield return future2;
if (future2.Error != null)
{
onError.Invoke(future2.Error, null);
yield break;
}
var result = future2.Result;
const auto Domain = Gs2->Account->Namespace(
"namespace-0001" // namespaceName
)->Me(
GameSession
)->PlatformId(
0, // type
"123456" // userIdentifier
);
const auto Future = Domain->AddPlatformIdSetting(
);
Future->StartSynchronousTask();
if (Future->GetTask().IsError())
{
return false;
}
// obtain changed values / result values
const auto Future2 = Future->GetTask().Result()->Model();
Future2->StartSynchronousTask();
if (Future2->GetTask().IsError())
{
return Future2->GetTask().Error();
}
const auto Result = Future2->GetTask().Result();
deletePlatformIdSetting
プラットフォームID
の削除
設定されている プラットフォームID
を削除します。
Request
型 | 必須 | デフォルト | 値の制限 | 説明 | |
---|---|---|---|---|---|
namespaceName | string | ✓ | ~ 128文字 | ネームスペース名 | |
accessToken | string | ✓ | ~ 128文字 | ユーザーID | |
type | int | ✓ | ~ 1024 | スロット番号 |
Result
型 | 説明 | |
---|---|---|
item | EzPlatformId | 削除した各種プラットフォームにおけるユーザーID |
実装例
var domain = gs2.Account.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).PlatformId(
type: 0,
userIdentifier: "123456"
);
var result = await domain.DeletePlatformIdSettingAsync(
);
var domain = gs2.Account.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).PlatformId(
type: 0,
userIdentifier: "123456"
);
var future = domain.DeletePlatformIdSettingFuture(
);
yield return future;
if (future.Error != null)
{
onError.Invoke(future.Error, null);
yield break;
}
const auto Domain = Gs2->Account->Namespace(
"namespace-0001" // namespaceName
)->Me(
GameSession
)->PlatformId(
0, // type
"123456" // userIdentifier
);
const auto Future = Domain->DeletePlatformIdSetting(
);
Future->StartSynchronousTask();
if (Future->GetTask().IsError())
{
return false;
}
const auto Result = Future->GetTask().Result();
findPlatformUser
プラットフォームタイプとユーザー識別子を指定してユーザーを検索
Request
型 | 必須 | デフォルト | 値の制限 | 説明 | |
---|---|---|---|---|---|
namespaceName | string | ✓ | ~ 128文字 | ネームスペース名 | |
type | int | ✓ | ~ 1024 | スロット番号 | |
userIdentifier | string | ✓ | ~ 1024文字 | 各種プラットフォームにおけるユーザーID |
Result
型 | 説明 | |
---|---|---|
item | EzPlatformUser | 各種プラットフォームにおけるユーザー情報 |
実装例
var domain = gs2.Account.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).PlatformId(
type: 0,
userIdentifier: "123456"
);
var result = await domain.FindPlatformUserAsync(
);
var item = await result.ModelAsync();
var domain = gs2.Account.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).PlatformId(
type: 0,
userIdentifier: "123456"
);
var future = domain.FindPlatformUserFuture(
);
yield return future;
if (future.Error != null)
{
onError.Invoke(future.Error, null);
yield break;
}
var future2 = future.Result.ModelFuture();
yield return future2;
if (future2.Error != null)
{
onError.Invoke(future2.Error, null);
yield break;
}
var result = future2.Result;
const auto Domain = Gs2->Account->Namespace(
"namespace-0001" // namespaceName
)->Me(
GameSession
)->PlatformId(
0, // type
"123456" // userIdentifier
);
const auto Future = Domain->FindPlatformUser(
);
Future->StartSynchronousTask();
if (Future->GetTask().IsError())
{
return false;
}
// obtain changed values / result values
const auto Future2 = Future->GetTask().Result()->Model();
Future2->StartSynchronousTask();
if (Future2->GetTask().IsError())
{
return Future2->GetTask().Error();
}
const auto Result = Future2->GetTask().Result();
getPlatformId
ユーザーIDを指定して引き継ぎ設定を取得
Request
型 | 必須 | デフォルト | 値の制限 | 説明 | |
---|---|---|---|---|---|
namespaceName | string | ✓ | ~ 128文字 | ネームスペース名 | |
accessToken | string | ✓ | ~ 128文字 | ユーザーID | |
type | int | ✓ | ~ 1024 | スロット番号 |
Result
型 | 説明 | |
---|---|---|
item | EzPlatformId | 各種プラットフォームにおけるユーザーID |
実装例
var domain = gs2.Account.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).PlatformId(
type: 0,
userIdentifier: "123456"
);
var item = await domain.ModelAsync();
var domain = gs2.Account.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).PlatformId(
type: 0,
userIdentifier: "123456"
);
var future = domain.ModelFuture();
yield return future;
var item = future.Result;
const auto Domain = Gs2->Account->Namespace(
"namespace-0001" // namespaceName
)->Me(
GameSession
)->PlatformId(
0, // type
"123456" // userIdentifier
);
const auto Future = Domain->Model();
Future->StartSynchronousTask();
if (Future->GetTask().IsError())
{
return false;
}
値の変更イベントハンドリング
var domain = gs2.Account.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).PlatformId(
type: 0,
userIdentifier: "123456"
);
// イベントハンドリングを開始
var callbackId = domain.Subscribe(
value => {
// 値が変化した時に呼び出される
// value には変更後の値が渡ってくる
}
);
// イベントハンドリングを停止
domain.Unsubscribe(callbackId);
var domain = gs2.Account.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).PlatformId(
type: 0,
userIdentifier: "123456"
);
var future = domain.ModelFuture();
yield return future;
var item = future.Result;
const auto Domain = Gs2->Account->Namespace(
"namespace-0001" // namespaceName
)->Me(
GameSession
)->PlatformId(
0, // type
"123456" // userIdentifier
);
// イベントハンドリングを開始
const auto CallbackId = Domain->Subscribe(
[](TSharedPtr<Gs2::Account::Model::FPlatformId> value) {
// 値が変化した時に呼び出される
// value には変更後の値が渡ってくる
}
);
// イベントハンドリングを停止
Domain->Unsubscribe(CallbackId);
Warning
このイベントはSDKがもつローカルキャッシュの値が変更された時に呼び出されます。
ローカルキャッシュは SDK が持つ API の実行、または GS2-Gateway の通知を有効にした GS2-Distributor 経由でのスタンプシートの実行、または GS2-Gateway の通知を有効にした GS2-JobQueue の実行によって変化したもののみが対象となります。
そのため、これらの方法以外で値が変更されてもコールバックは呼び出されません。
listPlatformIdSettings
設定されている プラットフォームID
の一覧を取得
ゲームプレイヤーが設定した プラットフォームID
の一覧を取得できます。
Request
型 | 必須 | デフォルト | 値の制限 | 説明 | |
---|---|---|---|---|---|
namespaceName | string | ✓ | ~ 128文字 | ネームスペース名 | |
accessToken | string | ✓ | ~ 128文字 | ユーザーID | |
pageToken | string | ~ 1024文字 | データの取得を開始する位置を指定するトークン | ||
limit | int | ✓ | 30 | 1 ~ 1000 | データの取得件数 |
Result
型 | 説明 | |
---|---|---|
items | List<EzPlatformId> | 各種プラットフォームにおけるユーザーIDのリスト |
nextPageToken | string | リストの続きを取得するためのページトークン |
実装例
var domain = gs2.Account.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
);
var items = await domain.PlatformIdsAsync(
).ToListAsync();
var domain = gs2.Account.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
);
var it = domain.PlatformIds(
);
List<EzPlatformId> items = new List<EzPlatformId>();
while (it.HasNext())
{
yield return it.Next();
if (it.Error != null)
{
onError.Invoke(it.Error, null);
break;
}
if (it.Current != null)
{
items.Add(it.Current);
}
else
{
break;
}
}
const auto Domain = Gs2->Account->Namespace(
"namespace-0001" // namespaceName
)->Me(
GameSession
);
const auto It = Domain->PlatformIds(
);
TArray<Gs2::UE5::Account::Model::FEzPlatformIdPtr> Result;
for (auto Item : *It)
{
if (Item.IsError())
{
return false;
}
Result.Add(Item.Current());
}
値の変更イベントハンドリング
var domain = gs2.Account.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
);
// イベントハンドリングを開始
var callbackId = domain.SubscribePlatformIds(
() => {
// リストの要素が変化した時に呼び出される
}
);
// イベントハンドリングを停止
domain.UnsubscribePlatformIds(callbackId);
var domain = gs2.Account.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
);
var it = domain.PlatformIds(
);
List<EzPlatformId> items = new List<EzPlatformId>();
while (it.HasNext())
{
yield return it.Next();
if (it.Error != null)
{
onError.Invoke(it.Error, null);
break;
}
if (it.Current != null)
{
items.Add(it.Current);
}
else
{
break;
}
}
const auto Domain = Gs2->Account->Namespace(
"namespace-0001" // namespaceName
)->Me(
GameSession
);
// イベントハンドリングを開始
const auto CallbackId = Domain->SubscribePlatformIds(
[]() {
// リストの要素が変化した時に呼び出される
}
);
// イベントハンドリングを停止
Domain->UnsubscribePlatformIds(CallbackId);
Warning
このイベントはSDKがもつローカルキャッシュの値が変更された時に呼び出されます。
ローカルキャッシュは SDK が持つ API の実行、または GS2-Gateway の通知を有効にした GS2-Distributor 経由でのスタンプシートの実行、または GS2-Gateway の通知を有効にした GS2-JobQueue の実行によって変化したもののみが対象となります。
そのため、これらの方法以外で値が変更されてもコールバックは呼び出されません。