GS2-Friend トランザクションアクション
アクションの組み合わせと同時実行
すべてのサービスに共通する前提は トランザクションアクションの組み合わせ にまとめています。先にそちらを読んでください。この節の残りは GS2-Friend 固有の内容です。
GS2-Friend がトランザクションに指定できるアクションは 1 つです。プロフィールはネームスペースとユーザーの組で決まり、1 ユーザーにつき 1 つです。更新のたびに全体が書き換わります。
| 操作 | 同じ行を重ねたとき | 入れ子越し | 別の対象になる境界 |
|---|---|---|---|
プロフィールの更新UpdateProfileByUserId | 同じ値なら 1 つにまとまる。値が違えばエラー (400) | 同じ値なら通る。値が違えば失敗する | ネームスペース・ユーザー |
更新はプロフィール全体を置き換えるため、2 つの更新を合成することはできません。内容が完全に同じ更新は 1 つにまとまり、値が違う更新はトランザクションの発行時にエラーになります。これは他のサービスの絶対値アクション (Set で始まるもの) と同じ扱いです。設定したいプロフィールを 1 つに決めて、1 回だけ指定してください。
フレンド申請・フォロー・ブロックはトランザクションアクションではないので、GS2-Friend の中でプロフィールを奪い合うものは他にありません。
入れ子になったトランザクションに注意
同じプロフィールが内側と外側の両方から更新された場合も、1 つのトランザクションの中と同じで、同じ値なら通り、値が違えば失敗します。違いはタイミングだけです。1 つのトランザクションの中なら発行時にエラーが返り、入れ子越しならコミット時に失敗します。
制限を回避したい場合
プロフィールの更新は入手アクションなので、内側と外側の衝突は acquireActionUseJobQueue を有効にすれば解消できます。enableAtomicCommit を無効にした場合も内側と外側の衝突はなくなりますが、このときは後に実行されたものが残ります。
同時実行とリトライ
プロフィールはリビジョンの照合を伴って全体が書き換わるため、同じプロフィールを複数のリクエストが同時に更新すると、後から確定した側がコンフリクト (409) になります。リクエストの内容に問題があるわけではないので、リトライすれば成功します。リトライ時にはプロフィールが読み直されます。
プロフィールは 1 人のユーザーのものなので、これが起こるのは同じユーザーのプロフィールを複数の箇所から同時に更新した場合だけです。
Acquire Action
入手アクション
Gs2Friend:UpdateProfileByUserId
ユーザーIDを指定してプロフィールを更新
指定されたユーザーのプロフィールを3つの異なる公開レベルで更新します(サーバーサイド操作):
- publicProfile: すべてのユーザーに公開
- followerProfile: フォロワーにのみ公開
- friendProfile: フレンドにのみ公開
数量指定可能なアクション:いいえ
反転可能なアクション:いいえ
| 型 | 有効化条件 | 必須 | デフォルト | 値の制限 | 説明 | |
|---|---|---|---|---|---|---|
| namespaceName | string | ✓ | ~ 128文字 | ネームスペース名 ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。 | ||
| userId | string | ✓ | ~ 128文字 | ユーザーID#{userId} と設定することでログイン中のユーザーIDに置換されます。 | ||
| publicProfile | string | ~ 1024文字 | 公開されるプロフィール 関係性に関わらずすべてのプレイヤーに表示されるプロフィール情報です。通常、表示名、アバター、その他公開可能な情報に使用されます。 | |||
| followerProfile | string | ~ 1024文字 | フォロワー向けに公開されるプロフィール このユーザーをフォローしているプレイヤーにのみ表示されるプロフィール情報です。公開プロフィールよりも詳細な情報(ゲームプレイ統計やステータスメッセージなど)を含むことができます。 | |||
| friendProfile | string | ~ 1024文字 | フレンド向けに公開されるプロフィール 相互フレンド関係が成立しているプレイヤーにのみ表示されるプロフィール情報です。最もプライベートなプロフィールレベルで、連絡先やプライベートメッセージなどの個人情報の共有に適しています。 | |||
| timeOffsetToken | string | ~ 1024文字 | タイムオフセットトークン |
{
"action": "Gs2Friend:UpdateProfileByUserId",
"request": {
"namespaceName": "[string]ネームスペース名",
"userId": "[string]ユーザーID",
"publicProfile": "[string]公開されるプロフィール",
"followerProfile": "[string]フォロワー向けに公開されるプロフィール",
"friendProfile": "[string]フレンド向けに公開されるプロフィール",
"timeOffsetToken": "[string]タイムオフセットトークン"
}
}action: Gs2Friend:UpdateProfileByUserId
request:
namespaceName: "[string]ネームスペース名"
userId: "[string]ユーザーID"
publicProfile: "[string]公開されるプロフィール"
followerProfile: "[string]フォロワー向けに公開されるプロフィール"
friendProfile: "[string]フレンド向けに公開されるプロフィール"
timeOffsetToken: "[string]タイムオフセットトークン"transaction.service("friend").acquire.update_profile_by_user_id({
namespaceName="[string]ネームスペース名",
userId="[string]ユーザーID",
publicProfile="[string]公開されるプロフィール",
followerProfile="[string]フォロワー向けに公開されるプロフィール",
friendProfile="[string]フレンド向けに公開されるプロフィール",
timeOffsetToken="[string]タイムオフセットトークン",
})