> For the complete documentation index, see [llms.txt](/llms.txt)

# GS2-Friend トランザクションアクション

検証/消費/入手の各トランザクションアクションの仕様




## アクションの組み合わせと同時実行

すべてのサービスに共通する前提は [トランザクションアクションの組み合わせ]() にまとめています。先にそちらを読んでください。この節の残りは GS2-Friend 固有の内容です。

GS2-Friend がトランザクションに指定できるアクションは 1 つです。プロフィールはネームスペースとユーザーの組で決まり、1 ユーザーにつき 1 つです。更新のたびに全体が書き換わります。

操作 | 同じ行を重ねたとき | 入れ子越し | 別の対象になる境界 | 直列実行モード有効時
--- | --- | --- | --- | ---
プロフィールの更新<br>`UpdateProfileByUserId` | 同値なら統合。値が違えば発行時にエラー | 同じ値なら通る。値が違えば失敗する | ネームスペース・ユーザー | 変わらない。同じ値なら通り、値が違えば引き続きエラー (400)。プロフィールの 3 つの項目は値の絶対指定として書き込まれるため、後から実行された方が先の値を黙って上書きすることは許されない。指定しなかった項目は空として書き込まれるので、それぞれ別の項目だけを更新する 2 件も「値が違う」扱いになる

更新はプロフィール全体を置き換えるため、2 つの更新を合成することはできません。内容が完全に同じ更新は 1 つにまとまり、値が違う更新はトランザクションの発行時にエラーになります。これは他のサービスの絶対値アクション (`Set` で始まるもの) と同じ扱いです。設定したいプロフィールを 1 つに決めて、1 回だけ指定してください。

フレンド申請・フォロー・ブロックはトランザクションアクションではないので、GS2-Friend の中でプロフィールを奪い合うものは他にありません。

### 入れ子になったトランザクションに注意

同じプロフィールが内側と外側の両方から更新された場合も、1 つのトランザクションの中と同じで、同じ値なら通り、値が違えば失敗します。違いはタイミングだけです。1 つのトランザクションの中なら発行時にエラーが返り、入れ子越しならコミット時に失敗します。

**直列実行モード（`enableSequentialExecution` または `TransactionSettingV2`）を有効にすると、値が違う場合の扱いが変わります。内側のトランザクションは外側と同じ直列実行の区間で実行されるようになるため、コミット時に失敗する代わりに、後から実行された方の更新の値でプロフィールが確定します。**

### 制限を回避したい場合

プロフィールの更新は入手アクションなので、内側と外側の衝突は `acquireActionUseJobQueue` を有効にすれば解消できます。`enableAtomicCommit` を無効にした場合も内側と外側の衝突はなくなりますが、このときは後に実行されたものが残ります。

### 同時実行とリトライ

プロフィールはリビジョンの照合を伴って全体が書き換わるため、同じプロフィールを複数のリクエストが同時に更新すると、後から確定した側がコンフリクト (409) になります。リクエストの内容に問題があるわけではないので、リトライすれば成功します。リトライ時にはプロフィールが読み直されます。

プロフィールは 1 人のユーザーのものなので、これが起こるのは同じユーザーのプロフィールを複数の箇所から同時に更新した場合だけです。

---




## Acquire Action

入手アクション

### Gs2Friend:UpdateProfileByUserId

ユーザーIDを指定してプロフィールを更新<br>

指定されたユーザーのプロフィールを3つの異なる公開レベルで更新します（サーバーサイド操作）：<br>
- publicProfile: すべてのユーザーに公開<br>
- followerProfile: フォロワーにのみ公開<br>
- friendProfile: フレンドにのみ公開

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

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

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




**JSON**
```json
{
    "action": "Gs2Friend:UpdateProfileByUserId",
    "request": {
        "namespaceName": "[string]ネームスペース名",
        "userId": "[string]ユーザーID",
        "publicProfile": "[string]公開されるプロフィール",
        "followerProfile": "[string]フォロワー向けに公開されるプロフィール",
        "friendProfile": "[string]フレンド向けに公開されるプロフィール",
        "timeOffsetToken": "[string]タイムオフセットトークン"
    }
}
```

**YAML**
```yaml

action: Gs2Friend:UpdateProfileByUserId
request:
  namespaceName: "[string]ネームスペース名"
  userId: "[string]ユーザーID"
  publicProfile: "[string]公開されるプロフィール"
  followerProfile: "[string]フォロワー向けに公開されるプロフィール"
  friendProfile: "[string]フレンド向けに公開されるプロフィール"
  timeOffsetToken: "[string]タイムオフセットトークン"
```

**GS2-Script**
```lua

transaction.service("friend").acquire.update_profile_by_user_id({
    namespaceName="[string]ネームスペース名",
    userId="[string]ユーザーID",
    publicProfile="[string]公開されるプロフィール",
    followerProfile="[string]フォロワー向けに公開されるプロフィール",
    friendProfile="[string]フレンド向けに公開されるプロフィール",
    timeOffsetToken="[string]タイムオフセットトークン",
})
```


---



