Documentation index for AI agents

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: フレンドにのみ公開

数量指定可能なアクション:いいえ

反転可能なアクション:いいえ

有効化条件必須デフォルト値の制限説明
namespaceNamestring
~ 128文字ネームスペース名
ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。
userIdstring
~ 128文字ユーザーID
#{userId} と設定することでログイン中のユーザーIDに置換されます。
publicProfilestring~ 1024文字公開されるプロフィール
関係性に関わらずすべてのプレイヤーに表示されるプロフィール情報です。通常、表示名、アバター、その他公開可能な情報に使用されます。
followerProfilestring~ 1024文字フォロワー向けに公開されるプロフィール
このユーザーをフォローしているプレイヤーにのみ表示されるプロフィール情報です。公開プロフィールよりも詳細な情報(ゲームプレイ統計やステータスメッセージなど)を含むことができます。
friendProfilestring~ 1024文字フレンド向けに公開されるプロフィール
相互フレンド関係が成立しているプレイヤーにのみ表示されるプロフィール情報です。最もプライベートなプロフィールレベルで、連絡先やプライベートメッセージなどの個人情報の共有に適しています。
timeOffsetTokenstring~ 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]タイムオフセットトークン",
})