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

# GS2-Guild SDK for Game Engine API 레퍼런스

게임 엔진용 GS2-Guild SDK의 모델 사양과 API 레퍼런스



## 모델

### EzGuild

길드<br>

길드는 최대 5개의 속성을 가질 수 있으며, 길드 검색이나 길드 목록 표시 시 이용할 수 있습니다.<br>

길드에는 참가 정책을 설정할 수 있으며, 자유 참가와 승인제를 선택할 수 있습니다.<br>
자유 참가를 선택한 경우, 길드에 참가 요청을 하면 즉시 길드 멤버가 됩니다.<br>
승인제를 선택한 경우, 길드에 참가 요청을 하면 길드 마스터 또는 길드 멤버가 승인할 때까지 길드 멤버가 되지 않습니다.<br>

길드 멤버에게는 역할을 설정할 수 있으며, 길드 마스터, 길드 멤버에 더해 길드가 독자적으로 정의한 최대 10개의 커스텀 역할을 설정할 수 있습니다.<br>
길드 멤버는 길드에 참가했을 때 기본으로 부여되는 역할을 설정할 수 있습니다.

|  | 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 |
| --- | --- | --- | --- | --- | --- | --- |
| guildModelName | string |  | ✓ |  |  ~ 128자 | 길드 모델 이름<br>길드 모델 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| name | string |  | ✓ | UUID |  ~ 36자 | 길드명<br>길드의 고유한 이름을 유지합니다.<br>이름은 UUID(Universally Unique Identifier) 형식으로 자동 생성되며, 각 길드를 식별하는 데 사용됩니다. |
| displayName | string |  | ✓ |  |  ~ 64자 | 표시 이름<br>UI에서 플레이어에게 표시되는, 사람이 읽을 수 있는 길드 이름입니다. 길드명(시스템에서 생성되는 UUID)과 달리, 표시 이름은 길드 생성자가 설정하며 갱신도 가능합니다. 길드 검색 결과, 멤버 목록, 기타 플레이어 대상 화면에 사용됩니다. |
| attribute1 | int |  |  |  | 0 ~ 2147483645 | 속성1<br>길드 검색에서 필터링이나 정렬에 사용할 수 있는 길드의 숫자 속성입니다. 레벨, 지역, 플레이 스타일, 활동 요건 등의 커스텀 길드 속성을 정의하기 위해, 최대 5개의 속성을 개발자가 이용할 수 있습니다. |
| attribute2 | int |  |  |  | 0 ~ 2147483645 | 속성2<br>길드 검색에서 필터링이나 정렬에 사용할 수 있는 길드의 숫자 속성입니다. 자세한 내용은 attribute1 을 참조하십시오. |
| attribute3 | int |  |  |  | 0 ~ 2147483645 | 속성3<br>길드 검색에서 필터링이나 정렬에 사용할 수 있는 길드의 숫자 속성입니다. 자세한 내용은 attribute1 을 참조하십시오. |
| attribute4 | int |  |  |  | 0 ~ 2147483645 | 속성4<br>길드 검색에서 필터링이나 정렬에 사용할 수 있는 길드의 숫자 속성입니다. 자세한 내용은 attribute1 을 참조하십시오. |
| attribute5 | int |  |  |  | 0 ~ 2147483645 | 속성5<br>길드 검색에서 필터링이나 정렬에 사용할 수 있는 길드의 숫자 속성입니다. 자세한 내용은 attribute1 을 참조하십시오. |
| metadata | string |  |  |  |  ~ 1024자 | 길드 메타데이터<br>GS2 동작에 영향을 미치지 않는, 길드에 연결된 임의의 데이터입니다. 길드 엠블럼, 설명, 모집 메시지 등 게임 고유의 정보를 저장하는 데 사용할 수 있습니다. |
| joinPolicy | 문자열 열거형<br>enum {<br>"anybody",<br>"approval"<br>}<br> |  | ✓ |  |  | 참가 방침<br>사용자가 이 길드에 어떻게 참가할 수 있는지를 제어합니다. "anybody" 는 승인 없이 임의의 사용자가 즉시 참가할 수 있습니다. "approval" 은 사용자가 멤버가 되기 전에 길드 마스터 또는 권한을 가진 멤버가 참가 요청을 승인해야 합니다. 길드 마스터가 언제든지 변경할 수 있습니다.anybody: 자유 참가 / approval: 승인제 /  |
| customRoles | [List&lt;EzRoleModel&gt;](#ezrolemodel) |  |  | [] | 0 ~ 10 items | 커스텀 역할 목록<br>모델 레벨의 역할을 오버라이드하거나 확장하는 길드 고유의 커스텀 역할 정의 목록입니다. 각 길드는 고유한 권한 집합을 가진 최대 10개의 커스텀 역할을 정의할 수 있습니다. 이 역할들은 모델 레벨의 역할에 더해 멤버에게 할당할 수 있습니다. |
| members | [List&lt;EzMember&gt;](#ezmember) |  |  | [] | 0 ~ 100 items | 길드 멤버 목록<br>길드 마스터와 일반 멤버를 포함한, 이 길드의 모든 현재 멤버 목록입니다. 각 항목에는 멤버의 사용자 ID, 할당된 역할, 메타데이터, 참가 타임스탬프가 포함됩니다. 멤버 수는 currentMaximumMemberCount 를 초과할 수 없습니다. |

**관련 메서드:**
batchUpdateGuildMemberRole - 여러 길드 멤버의 역할을 한꺼번에 변경하기
createGuild - 길드를 신규 작성하기
deleteGuild - 길드를 해산(삭제)하기
deleteMemberFromGuild - 멤버를 길드에서 제명하기
getGuild - 길드의 상세 정보를 가져오기
listGuilds - 참가할 수 있는 길드를 검색하기
updateGuild - 길드의 설정을 업데이트하기
updateGuildMemberRole - 길드 멤버의 역할을 변경하기
acceptRequest - 플레이어의 가입 신청을 승인한다
sendRequest - 길드에 가입 신청을 전송한다
updateMemberMetadata - 길드 내 자신의 멤버 메타데이터를 갱신한다
withdrawGuild - 길드에서 자발적으로 탈퇴하기
addIgnoreUser - 플레이어의 길드 참가를 차단한다
getLastGuildMasterActivity - 길드 마스터의 마지막 활동 일시를 확인한다
promoteSeniorMember - 비활성 상태인 길드 마스터를 최고참 멤버로 교체한다


---

### EzReceiveMemberRequest

받은 참가 요청<br>

멤버 등록 신청을 접수한 상태임을 나타내는 엔티티입니다.<br>
해당 길드가 받은 참가 요청입니다.<br>
해당 길드가 승인하면 참가 요청은 삭제되고 멤버 목록에 등록됩니다.

|  | 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 |
| --- | --- | --- | --- | --- | --- | --- |
| userId | string |  | ✓ |  |  ~ 128자 | 사용자 ID<br>이 길드에 참가 요청을 보낸 플레이어의 GS2 사용자 ID입니다. 신청자를 식별하며, 승인 시 길드의 멤버 목록에 추가하거나 거부 시 통지하기 위해 사용됩니다. |
| targetGuildName | string |  | ✓ |  |  ~ 128자 | 대상 길드명<br>이 참가 요청을 수신한 길드의 고유한 이름(UUID)입니다. 이 보류 중인 요청을 수신함에 가지고 있는 특정 길드 인스턴스를 식별하며, 길드의 멤버 관리 조작과 요청을 대조하기 위해 사용됩니다. |

**관련 메서드:**
acceptRequest - 플레이어의 가입 신청을 승인한다
getReceiveRequest - 특정 가입 신청의 상세 정보를 취득한다
listReceiveRequests - 길드가 받은 가입 신청 목록을 취득한다
rejectRequest - 플레이어의 가입 신청을 거부한다


---

### EzSendMemberRequest

송신한 참가 요청<br>

멤버 등록을 신청 중인 상태를 나타내는 엔티티입니다.<br>
해당 사용자가 길드에 대해 송신한 참가 요청입니다.<br>
대상 길드가 승인하면 참가 요청은 삭제되고 멤버 목록에 등록됩니다.

|  | 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 |
| --- | --- | --- | --- | --- | --- | --- |
| userId | string |  | ✓ |  |  ~ 128자 | 사용자 ID<br>이 길드 참가 요청을 송신한 플레이어의 GS2 사용자 ID입니다. 요청을 보낸 사용자를 식별하며, 승인 시 길드의 멤버 목록에 추가하기 위해 사용됩니다. |
| targetGuildName | string |  | ✓ |  |  ~ 128자 | 대상 길드 이름<br>참가 요청이 송신된 길드의 고유한 이름(UUID)입니다. 사용자가 참가를 요청하고 있는 특정 길드 인스턴스를 식별하며, 요청 처리를 위해 길드의 수신함을 특정하는 데 사용됩니다. |

**관련 메서드:**
cancelRequest - 플레이어가 전송한 가입 신청을 취소한다
getSendRequest - 플레이어가 전송한 가입 신청의 상세 정보를 취득한다
listSendRequests - 플레이어가 전송한 가입 신청 목록을 취득한다
sendRequest - 길드에 가입 신청을 전송한다


---

### EzJoinedGuild

가입 중인 길드<br>

특정 길드에 대한 사용자의 멤버십을 나타냅니다. 사용자가 길드에 가입할 때(직접 가입 또는 신청 승인) 생성되며, 사용자가 탈퇴 또는 추방될 때 삭제됩니다. 사용자가 현재 어느 길드에 소속되어 있는지를 추적하여 maxConcurrentJoinGuilds 제한의 적용을 가능하게 합니다.

|  | 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 |
| --- | --- | --- | --- | --- | --- | --- |
| guildModelName | string |  | ✓ |  |  ~ 128자 | 길드 모델 이름<br>가입 중인 길드가 속한 길드 모델의 이름입니다. 멤버십 제한, 롤 설정, 기타 길드 타입 설정을 포함하는 길드 모델 정의를 참조합니다. |
| guildName | string |  | ✓ |  |  ~ 128자 | 길드 이름<br>사용자가 가입한 길드의 고유한 이름(UUID)입니다. 길드 모델 내의 특정 길드 인스턴스를 식별하기 위해 사용됩니다. |
| userId | string |  | ✓ |  |  ~ 128자 | 사용자ID |
| createdAt | long |  | ※ | 현재 시각 |  | 생성일시<br>UNIX 시간・밀리초<br>※ 서버가 자동으로 설정 |

**관련 메서드:**
getJoinedGuild - 플레이어가 소속된 특정 길드의 상세 정보를 취득한다
listJoinedGuilds - 플레이어가 소속된 길드 목록을 취득한다
withdrawGuild - 길드에서 자발적으로 탈퇴하기


---

### EzIgnoreUser

거부 사용자<br>

특정 길드에 대한 가입이 차단된 사용자를 나타냅니다. 사용자가 거부 리스트에 추가되면 참가 신청이 자동으로 거부되며, 가입 정책이 자유 가입으로 설정되어 있어도 길드에 가입할 수 없습니다. 길드 마스터가 원치 않는 멤버를 관리하기 위해 사용합니다.

|  | 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 |
| --- | --- | --- | --- | --- | --- | --- |
| userId | string |  | ✓ |  |  ~ 128자 | 사용자ID |

**관련 메서드:**
addIgnoreUser - 플레이어의 길드 참가를 차단한다
deleteIgnoreUser - 길드의 차단 목록에서 플레이어를 해제한다
getIgnoreUser - 특정 플레이어가 길드의 차단 목록에 등록되어 있는지 확인한다
listIgnoreUsers - 길드의 차단 목록을 취득한다


---

### EzLastGuildMasterActivity

마지막 길드 마스터 활동<br>

길드 내에서 길드 마스터가 마지막으로 활동을 수행한 일시를 추적합니다. 이 타임스탬프는 비활성 기반 계승 시스템에서 사용됩니다. 길드 모델에서 설정된 inactivityPeriodDays가 길드 마스터의 활동 없이 경과하면, 리더십을 다른 멤버에게 자동으로 이양할 수 있습니다. 각 길드는 길드 마스터가 길드 조작을 수행할 때마다 업데이트되는 하나의 활동 기록을 가집니다.

|  | 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 |
| --- | --- | --- | --- | --- | --- | --- |
| userId | string |  | ✓ |  |  ~ 128자 | 사용자ID |
| updatedAt | long |  | ※ | 현재 시각 |  | 최종 갱신일시<br>UNIX 시간・밀리초<br>※ 서버가 자동으로 설정 |

**관련 메서드:**
getLastGuildMasterActivity - 길드 마스터의 마지막 활동 일시를 확인한다
promoteSeniorMember - 비활성 상태인 길드 마스터를 최고참 멤버로 교체한다


---

### EzGuildModel

길드 모델<br>

길드 모델이란 길드에 가입 가능한 최대 인원수 설정 및 길드 내 직책별 권한 설정을 가지는 엔티티입니다.

|  | 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 |
| --- | --- | --- | --- | --- | --- | --- |
| name | string |  | ✓ |  |  ~ 128자 | 길드 모델 이름<br>길드 모델 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| metadata | string |  |  |  |  ~ 2048자 | 메타데이터<br>메타데이터에는 임의의 값을 설정할 수 있습니다.<br>이 값들은 GS2의 동작에는 영향을 주지 않으므로, 게임 내에서 사용하는 정보를 저장하는 용도로 사용할 수 있습니다. |
| defaultMaximumMemberCount | int |  | ✓ |  | 1 ~ 2147483646 | 기본 최대 멤버 수<br>새 길드가 생성될 때 허용되는 초기 최대 멤버 수입니다. 이 값은 신규 길드의 currentMaximumMemberCount 초기값으로 사용됩니다. 길드 조작이나 입수 액션을 통해 나중에 maximumMemberCount 상한까지 늘릴 수 있습니다. |
| maximumMemberCount | int |  | ✓ |  | 1 ~ 2147483646 | 최대 멤버 수 상한<br>길드가 가질 수 있는 멤버 수의 절대적인 상한입니다. 길드의 currentMaximumMemberCount는 이 값을 초과할 수 없습니다. 길드가 의도된 규모를 넘어 성장하는 것을 방지하는 하드 캡으로 작동합니다. |
| roles | [List&lt;EzRoleModel&gt;](#ezrolemodel) |  | ✓ |  | 1 ~ 10 items | 롤 모델 리스트<br>이 타입의 길드 내에서 이용 가능한 롤 정의 리스트입니다. guildMasterRole 및 guildMemberDefaultRole에서 참조되는 롤을 최소한 포함해야 합니다. 각 롤은 정책 문서를 통해 고유한 권한 집합을 정의합니다. 최대 10개의 롤을 정의할 수 있습니다. |
| rejoinCoolTimeMinutes | int |  |  | 0 | 0 ~ 2147483646 | 재가입 쿨타임(분)<br>사용자가 길드를 탈퇴한 후 다시 길드에 가입할 수 있게 되기까지의 쿨다운 기간(분)입니다. 0으로 설정하면 즉시 재가입이 가능합니다. 사용자가 길드에 반복적으로 가입·탈퇴하는 악용 패턴을 방지합니다. |

**관련 메서드:**
getGuildModel - 이름을 지정하여 길드 타입 정의를 취득한다
listGuildModels - 길드 타입 정의 목록을 취득한다


---

### EzRoleModel

롤 모델<br>

롤 모델은 길드 내에서의 역할을 정의하고, 각 역할별로 실행할 수 있는 처리에 관한 권한을 설정합니다.

|  | 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 |
| --- | --- | --- | --- | --- | --- | --- |
| name | string |  | ✓ |  |  ~ 128자 | 롤 모델 이름<br>롤 모델 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| metadata | string |  |  |  |  ~ 2048자 | 메타데이터<br>메타데이터에는 임의의 값을 설정할 수 있습니다.<br>이 값들은 GS2의 동작에는 영향을 주지 않으므로, 게임 내에서 사용하는 정보를 저장하는 용도로 사용할 수 있습니다. |
| policyDocument | string |  | ✓ |  |  ~ 10240자 | 정책 문서<br>이 역할의 권한을 정의하는 JSON 형식의 정책 문서입니다. 이 역할에 할당된 멤버에 대해 어떤 길드 조작(참가 요청 승인/거부, 멤버 추방, 길드 정보 업데이트, 멤버 역할 변경 등)이 허용되거나 거부되는지를 지정합니다. |

**관련 메서드:**
createGuild - 길드를 신규 작성하기
updateGuild - 길드의 설정을 업데이트하기


**관련 모델:**
EzGuild - 길드
EzGuildModel - 길드 모델



---

### EzMember

멤버<br>

길드 멤버 목록을 관리하는 엔티티

|  | 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 |
| --- | --- | --- | --- | --- | --- | --- |
| userId | string |  | ✓ |  |  ~ 128자 | 사용자ID |
| roleName | string |  | ✓ |  |  ~ 128자 | 롤 모델 이름<br>롤 모델 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| metadata | string |  |  |  |  ~ 512자 | 길드 멤버의 메타데이터<br>GS2의 동작에 영향을 주지 않는, 이 길드 멤버와 연결된 임의의 데이터입니다. 공헌 포인트, 마지막 로그인 시간, 길드 임원에게 표시되는 메모 등 멤버 고유의 정보를 저장하는 데 사용할 수 있습니다. |
| joinedAt | long |  | ※ | 현재 시각 |  | 참가 일시<br>UNIX 시간·밀리초 |

**관련 메서드:**
batchUpdateGuildMemberRole - 여러 길드 멤버의 역할을 한꺼번에 변경하기


**관련 모델:**
EzGuild - 길드



---

### EzVerifyActionResult

검증 액션 실행 결과

|  | 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 |
| --- | --- | --- | --- | --- | --- | --- |
| action | 문자열 열거형<br>enum {<br>}<br> |  | ✓ |  |  | 검증 액션에서 실행할 액션의 종류 |
| verifyRequest | string |  | ✓ |  |  ~ 524288자 | 액션 실행 시 사용되는 요청의 JSON 문자열 |
| statusCode | int |  |  |  | 0 ~ 999 | 상태 코드 |
| verifyResult | string |  |  |  |  ~ 1048576자 | 결과 내용 |


**관련 모델:**
EzTransactionResult - 트랜잭션 실행 결과



---

### EzConsumeActionResult

소비 액션 실행 결과

|  | 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 |
| --- | --- | --- | --- | --- | --- | --- |
| action | 문자열 열거형<br>enum {<br>}<br> |  | ✓ |  |  | 소비 액션에서 실행할 액션의 종류 |
| consumeRequest | string |  | ✓ |  |  ~ 524288자 | 액션 실행 시 사용되는 요청의 JSON 문자열 |
| statusCode | int |  |  |  | 0 ~ 999 | 상태 코드 |
| consumeResult | string |  |  |  |  ~ 1048576자 | 결과 내용 |


**관련 모델:**
EzTransactionResult - 트랜잭션 실행 결과



---

### EzAcquireActionResult

획득 액션 실행 결과

|  | 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 |
| --- | --- | --- | --- | --- | --- | --- |
| action | 문자열 열거형<br>enum {<br>}<br> |  | ✓ |  |  | 입수 액션에서 실행할 액션의 종류 |
| acquireRequest | string |  | ✓ |  |  ~ 524288자 | 액션 실행 시 사용되는 요청의 JSON 문자열 |
| statusCode | int |  |  |  | 0 ~ 999 | 상태 코드 |
| acquireResult | string |  |  |  |  ~ 1048576자 | 결과 내용 |


**관련 모델:**
EzTransactionResult - 트랜잭션 실행 결과



---

### EzTransactionResult

트랜잭션 실행 결과<br>

서버 사이드에서 트랜잭션 자동 실행 기능을 이용하여 실행된 트랜잭션의 실행 결과

|  | 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 |
| --- | --- | --- | --- | --- | --- | --- |
| transactionId | string |  | ✓ |  | 36 ~ 36자 | 트랜잭션 ID |
| verifyResults | [List&lt;EzVerifyActionResult&gt;](#ezverifyactionresult) |  |  |  | 0 ~ 10 items | 검증 액션의 실행 결과 목록 |
| consumeResults | [List&lt;EzConsumeActionResult&gt;](#ezconsumeactionresult) |  |  | [] | 0 ~ 10 items | 소비 액션의 실행 결과 목록 |
| acquireResults | [List&lt;EzAcquireActionResult&gt;](#ezacquireactionresult) |  |  | [] | 0 ~ 100 items | 획득 액션 실행 결과 리스트 |


---

## 메서드

### getGuildModel

이름을 지정하여 길드 타입 정의를 취득한다<br>

이름을 지정하여 길드 모델을 1건 취득합니다.<br>
취득할 수 있는 정보에는 멤버 상한, 역할 정의와 그 권한, 가입 방식 설정, 재가입 쿨다운 기간, 비활성 길드 마스터의 승계 설정이 포함됩니다.<br>
특정 길드 타입의 규칙을 표시할 때 사용합니다. 예를 들어 길드 생성 화면이나 상세 화면에서 "최대 멤버: 30명, 가입: 승인제, 역할: 마스터 / 부길드장 / 멤버"와 같이 표시할 수 있습니다.

#### Request

|  | 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 |
| --- | --- | --- | --- | --- | --- | --- |
| namespaceName | string |  | ✓|  |  ~ 128자 | 네임스페이스 이름<br>네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| guildModelName | string |  | ✓|  |  ~ 128자 | 길드 모델 이름<br>길드 모델 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |

#### Result

|  | 타입 | 설명 |
| --- | --- | --- |
| item | [EzGuildModel](#ezguildmodel) | 길드 모델|

#### 구현 예제




**Unity (UniTask)**
```csharp
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).GuildModel(
        guildModelName: "guild-0001"
    );
    var item = await domain.ModelAsync();

```

**Unity (Vanilla)**
```cs
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).GuildModel(
        guildModelName: "guild-0001"
    );
    var future = domain.ModelFuture();
    yield return future;
    var item = future.Result;

```

**Unreal Engine 5**
```cpp
    const auto Domain = Gs2->Guild->Namespace(
        "namespace-0001" // namespaceName
    )->GuildModel(
        "guild-0001" // guildModelName
    );
    const auto Future = Domain->Model();
    Future->StartSynchronousTask();
    if (Future->GetTask().IsError())
    {
        return false;
    }

```

**Godot**
```gdscript

var domain = ez.guild.namespace_(
        "namespace-0001"
    ).guild_model(
        "guild-0001"
    )

var async_result = await domain.model()
if async_result.error != null:
    push_error(str(async_result.error))
    return

var result = async_result.result

```


##### 값 변경 이벤트 핸들링




**Unity (UniTask)**
```csharp
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).GuildModel(
        guildModelName: "guild-0001"
    );
    
    // 이벤트 핸들링 시작
    var callbackId = domain.Subscribe(
        value => {
            // 값이 변화했을 때 호출됨
            // value에는 변경 후의 값이 전달됨
        }
    );

    // 이벤트 핸들링 정지
    domain.Unsubscribe(callbackId);

```

**Unity (Vanilla)**
```cs
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).GuildModel(
        guildModelName: "guild-0001"
    );
    
    // 이벤트 핸들링 시작
    var callbackId = domain.Subscribe(
        value => {
            // 값이 변화했을 때 호출됨
            // value에는 변경 후의 값이 전달됨
        }
    );

    // 이벤트 핸들링 정지
    domain.Unsubscribe(callbackId);

```

**Unreal Engine 5**
```cpp
    const auto Domain = Gs2->Guild->Namespace(
        "namespace-0001" // namespaceName
    )->GuildModel(
        "guild-0001" // guildModelName
    );
    
    // 이벤트 핸들링 시작
    const auto CallbackId = Domain->Subscribe(
        [](TSharedPtr<Gs2::Guild::Model::FGuildModel> value) {
            // 값이 변화했을 때 호출됨
            // value에는 변경 후의 값이 전달됨
        }
    );

    // 이벤트 핸들링 정지
    Domain->Unsubscribe(CallbackId);

```

**Godot**
```gdscript

var domain = ez.guild.namespace_(
        "namespace-0001"
    ).guild_model(
        "guild-0001"
    )

# 이벤트 핸들링 시작
var callback_id = domain.subscribe_model(func(value):
    # 값이 변화했을 때 호출됨
    # value에는 변경 후의 값이 전달됩니다
    pass
)

# 이벤트 핸들링 정지
domain.unsubscribe_model(callback_id)

```


**⚠️ Warning**

이 이벤트는 SDK가 가진 로컬 캐시의 값이 변경되었을 때 호출됩니다.

로컬 캐시는 SDK가 가진 API의 실행, 또는 GS2-Gateway의 알림을 활성화한 GS2-Distributor를 통한 스탬프 시트의 실행, 또는 GS2-Gateway의 알림을 활성화한 GS2-JobQueue의 실행에 의해 변화한 것만이 대상이 됩니다.

따라서 이 방법 이외로 값이 변경된 경우 콜백은 호출되지 않습니다.

---

### listGuildModels

길드 타입 정의 목록을 취득한다<br>

이 네임스페이스에 등록된 모든 길드 모델을 취득합니다.<br>
길드 모델은 길드의 규칙을 정의합니다. 최대 멤버 수, 역할 권한(예: "부길드장은 멤버를 추방할 수 있다"), 가입 방식(자유 가입/승인제), 재가입 쿨다운, 플레이어가 동시에 소속될 수 있는 길드 수 등입니다.<br>
길드 마스터가 장기간 로그인하지 않을 경우의 자동 교체(최고참 멤버로의 승계) 설정도 포함됩니다.<br>
플레이어가 길드를 둘러보거나 생성할 때, 어떤 유형의 길드가 있는지 표시하는 데 사용합니다.

#### Request

|  | 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 |
| --- | --- | --- | --- | --- | --- | --- |
| namespaceName | string |  | ✓|  |  ~ 128자 | 네임스페이스 이름<br>네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |

#### Result

|  | 타입 | 설명 |
| --- | --- | --- |
| items | [List&lt;EzGuildModel&gt;](#ezguildmodel) | 길드 모델 목록|

#### 구현 예제




**Unity (UniTask)**
```csharp
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    );
    var items = await domain.GuildModelsAsync(
    ).ToListAsync();

```

**Unity (Vanilla)**
```cs
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    );
    var it = domain.GuildModels(
    );
    List<EzGuildModel> items = new List<EzGuildModel>();
    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;
        }
    }

```

**Unreal Engine 5**
```cpp
    const auto Domain = Gs2->Guild->Namespace(
        "namespace-0001" // namespaceName
    );
    const auto It = Domain->GuildModels(
    );
    TArray<Gs2::UE5::Guild::Model::FEzGuildModelPtr> Result;
    for (auto Item : *It)
    {
        if (Item.IsError())
        {
            return false;
        }
        Result.Add(Item.Current());
    }

```


##### 값 변경 이벤트 핸들링




**Unity (UniTask)**
```csharp
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    );
    
    // 이벤트 핸들링 시작
    var callbackId = domain.SubscribeGuildModels(
        () => {
            // 리스트의 요소가 변화했을 때 호출됨
        }
    );

    // 이벤트 핸들링 정지
    domain.UnsubscribeGuildModels(callbackId);

```

**Unity (Vanilla)**
```cs
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    );
    
    // 이벤트 핸들링 시작
    var callbackId = domain.SubscribeGuildModels(
        () => {
            // 리스트의 요소가 변화했을 때 호출됨
        }
    );

    // 이벤트 핸들링 정지
    domain.UnsubscribeGuildModels(callbackId);

```

**Unreal Engine 5**
```cpp
    const auto Domain = Gs2->Guild->Namespace(
        "namespace-0001" // namespaceName
    );
    
    // 이벤트 핸들링 시작
    const auto CallbackId = Domain->SubscribeGuildModels(
        []() {
            // 리스트의 요소가 변화했을 때 호출됨
        }
    );

    // 이벤트 핸들링 정지
    Domain->UnsubscribeGuildModels(CallbackId);

```


**⚠️ Warning**

이 이벤트는 SDK가 가진 로컬 캐시의 값이 변경되었을 때 호출됩니다.

로컬 캐시는 SDK가 가진 API의 실행, 또는 GS2-Gateway의 알림을 활성화한 GS2-Distributor를 통한 스탬프 시트의 실행, 또는 GS2-Gateway의 알림을 활성화한 GS2-JobQueue의 실행에 의해 변화한 것만이 대상이 됩니다.

따라서 이 방법 이외로 값이 변경된 경우 콜백은 호출되지 않습니다.

---

### assume

길드의 대리로서 조작할 권한을 취득하기<br>

길드로서 조작을 수행하기 위한 길드 액세스 토큰을 취득합니다. 길드 설정 업데이트, 참가 요청 승인, 멤버 제명 등의 조작에 필요합니다.<br>
플레이어는 해당 길드의 멤버여야 하며, 실행할 수 있는 조작은 역할 권한에 따라 달라집니다.<br>
UpdateGuild, AcceptRequest, RejectRequest, DeleteMemberFromGuild 등의 길드 관리 API를 호출하기 전에 반드시 필요한 단계입니다.<br>
"길드 관리 모드로 전환하는" 것과 같은 이미지입니다. 이를 호출한 후, 반환된 토큰을 사용하여 이어지는 길드 조작을 수행합니다.

#### Request

|  | 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 |
| --- | --- | --- | --- | --- | --- | --- |
| namespaceName | string |  | ✓|  |  ~ 128자 | 네임스페이스 이름<br>네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| guildModelName | string |  | ✓|  |  ~ 128자 | 길드 모델 이름<br>길드 모델 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| gameSession | GameSession | | ✓|  |  | GameSession |
| guildName | string |  | ✓| UUID |  ~ 36자 | 길드명<br>길드의 고유한 이름을 유지합니다.<br>이름은 UUID(Universally Unique Identifier) 형식으로 자동 생성되며, 각 길드를 식별하는 데 사용됩니다. |

#### Result

|  | 타입 | 설명 |
| --- | --- | --- |
| token | string | 길드용 액세스 토큰|
| userId | string | 사용자ID|
| expire | long | 유효기간<br>토큰의 유효기간을 나타내는 타임스탬프입니다. 이 시각에 도달하면 토큰이 무효가 됩니다.<br>UNIX 시간(밀리초)|

#### Error

이 API에는 특별한 예외가 정의되어 있습니다.<br>
GS2-SDK for Game Engine에서는 게임 내에서 핸들링이 필요할 것으로 예상되는 에러를, 일반적인 예외에서 파생된 특수화된 예외로 제공하여 다루기 쉽게 하고 있습니다.<br>
일반적인 에러의 종류와 핸들링 방법은 [여기]() 문서를 참고해 주세요.

| 타입 | 베이스 클래스 | 설명 |
| --- | --- | --- |
| NotIncludedGuildMemberException | NotFoundException | 길드 멤버가 아닙니다. |

#### 구현 예제




**Unity (UniTask)**
```csharp

try {
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    );
    var result = await domain.AssumeAsync(
        gatewaySetting: new GatewaySetting {
            gatewayNamespaceName = "namespace-0001",
            allowConcurrentAccess = false
        },
        guildModelName: "guild-model-0001",
        guildName: "guild-0001"
    );
} catch(Gs2.Gs2Guild.Exception.NotIncludedGuildMemberException e) {
    // You are not a member of the guild.
}

```

**Unity (Vanilla)**
```cs
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    );
    var future = domain.AssumeFuture(
        gatewaySetting: new GatewaySetting {
            gatewayNamespaceName = "namespace-0001",
            allowConcurrentAccess = false
        },
        guildModelName: "guild-model-0001",
        guildName: "guild-0001"
    );
    yield return future;
    if (future.Error != null)
    {
        if (future.Error is Gs2.Gs2Guild.Exception.NotIncludedGuildMemberException)
        {
            // You are not a member of the guild.
        }
        onError.Invoke(future.Error, null);
        yield break;
    }

```

**Unreal Engine 5**
```cpp
    const auto Domain = Gs2->Guild->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        GameSession
    );
    const auto Future = Domain->Assume(
        MakeShared<Gs2::UE5::Util::FGatewaySetting>(
            "namespace-0001", // gatewayNamespaceName
            false // allowConcurrentAccess
        ),
        "guild-model-0001", // guildModelName
        "guild-0001" // guildName
    );
    Future->StartSynchronousTask();
    if (Future->GetTask().IsError())
    {
        auto e = Future->GetTask().Error();
        if (e->IsChildOf(Gs2::Guild::Error::FNotIncludedGuildMemberError::Class))
        {
            // You are not a member of the guild.
        }
        return false;
    }
    const auto Result = Future->GetTask().Result();

```

**Godot**
```gdscript

var domain = ez.guild.namespace_(
        "namespace-0001"
    ).me(game_session)

var async_result = await domain.assume(
    "guild-model-0001", # guild_model_name
    "guild-0001" # guild_name
)
if async_result.error != null:
    if async_result.error is Gs2GuildNotIncludedGuildMemberException:
        # 길드 멤버가 아닙니다.
        pass
    push_error(str(async_result.error))
    return

var result = async_result.result

```


---

### batchUpdateGuildMemberRole

여러 길드 멤버의 역할을 한꺼번에 변경하기<br>

여러 길드 멤버의 역할을 한 번의 API 호출로 한꺼번에 업데이트합니다. 예를 들어 여러 멤버를 동시에 "임원"으로 승격시키는 것과 같은 작업입니다.<br>
이 API는 길드로서 호출합니다(먼저 Assume이 필요합니다). 적절한 역할 권한을 가진 멤버만 이 작업을 실행할 수 있습니다.<br>
길드 마스터가 다수의 멤버 역할을 한 번에 재편성하고 싶을 때, 한 명씩 변경하는 대신 사용합니다.

#### Request

|  | 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 |
| --- | --- | --- | --- | --- | --- | --- |
| namespaceName | string |  | ✓|  |  ~ 128자 | 네임스페이스 이름<br>네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| guildModelName | string |  | ✓|  |  ~ 128자 | 길드 모델 이름<br>길드 모델 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| guildGameSession | GuildGameSession | | ✓|  |  ~ 128자 | GuildGameSession<br>`assume`으로 취득한 GuildGameSession입니다.<br>권한은 `assume`을 호출한 멤버의 역할에 연결된 `PolicyDocument`로 결정됩니다.<br>변경을 수행하려면 해당 역할의 `PolicyDocument`에 `Gs2Guild:BatchUpdateMemberRole` 권한이 필요합니다. |
| members | [List&lt;EzMember&gt;](#ezmember) |  | ✓|  | 1 ~ 100 items | 업데이트할 멤버 목록 |

#### Result

|  | 타입 | 설명 |
| --- | --- | --- |
| item | [EzGuild](#ezguild) | 업데이트한 길드|

#### 구현 예제




**Unity (UniTask)**
```csharp
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    );
    var result = await domain.BatchUpdateGuildMemberRoleAsync(
        guildModelName: "guild-model-0001",
        accessToken: null,
        members: new List<Gs2.Unity.Gs2Guild.Model.EzMember> {
            new Gs2.Unity.Gs2Guild.Model.EzMember() {
                UserId = "user-0002",
                RoleName = "role-0001",
            },
            new Gs2.Unity.Gs2Guild.Model.EzMember() {
                UserId = "user-0003",
                RoleName = "role-0002",
            },
        }
    );
    var item = await result.ModelAsync();

```

**Unity (Vanilla)**
```cs
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    );
    var future = domain.BatchUpdateGuildMemberRoleFuture(
        guildModelName: "guild-model-0001",
        accessToken: null,
        members: new List<Gs2.Unity.Gs2Guild.Model.EzMember> {
            new Gs2.Unity.Gs2Guild.Model.EzMember() {
                UserId = "user-0002",
                RoleName = "role-0001",
            },
            new Gs2.Unity.Gs2Guild.Model.EzMember() {
                UserId = "user-0003",
                RoleName = "role-0002",
            },
        }
    );
    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;

```

**Unreal Engine 5**
```cpp
    const auto Domain = Gs2->Guild->Namespace(
        "namespace-0001" // namespaceName
    );
    const auto Future = Domain->BatchUpdateGuildMemberRole(
        "guild-model-0001", // guildModelName
        nullptr, // accessToken
        []
        {
            auto v = MakeShared<TArray<TSharedPtr<Gs2::UE5::Guild::Model::FEzMember>>>();
            v->Add(
                MakeShared<Gs2::UE5::Guild::Model::FEzMember>()
                ->WithUserId(TOptional<FString>("user-0002"))
                ->WithRoleName(TOptional<FString>("role-0001"))
            );
            v->Add(
                MakeShared<Gs2::UE5::Guild::Model::FEzMember>()
                ->WithUserId(TOptional<FString>("user-0003"))
                ->WithRoleName(TOptional<FString>("role-0002"))
            );
            return v;
        }() // members
    );
    Future->StartSynchronousTask();
    if (Future->GetTask().IsError())
    {
        return false;
    }

    // 변경된 값 / 결과 값을 취득
    const auto Future2 = Future->GetTask().Result()->Model();
    Future2->StartSynchronousTask();
    if (Future2->GetTask().IsError())
    {
        return Future2->GetTask().Error();
    }
    const auto Result = Future2->GetTask().Result();

```


---

### createGuild

길드를 신규 작성하기<br>

플레이어를 길드 마스터(리더)로 하여 새로운 길드를 작성합니다.<br>
길드의 표시 이름, 최대 5개의 커스텀 속성(플레이 스타일, 활동 시간, 언어 등), 메타데이터, 참가 방식(자유 참가/승인제), 커스텀 역할 정의를 설정할 수 있습니다.<br>
길드를 작성한 플레이어는 자동으로 길드 마스터 역할을 가진 첫 번째 멤버가 됩니다.<br>
"길드 작성" 버튼이나 폼에 사용합니다. 플레이어가 새로운 길드의 이름, 규칙, 설정을 정하는 화면입니다.

#### Request

|  | 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 |
| --- | --- | --- | --- | --- | --- | --- |
| namespaceName | string |  | ✓|  |  ~ 128자 | 네임스페이스 이름<br>네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| guildModelName | string |  | ✓|  |  ~ 128자 | 길드 모델 이름<br>길드 모델 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| gameSession | GameSession | | ✓|  |  | GameSession |
| displayName | string |  | ✓|  |  ~ 64자 | 표시 이름<br>UI에서 플레이어에게 표시되는, 사람이 읽을 수 있는 길드 이름입니다. 길드명(시스템에서 생성되는 UUID)과 달리, 표시 이름은 길드 생성자가 설정하며 갱신도 가능합니다. 길드 검색 결과, 멤버 목록, 기타 플레이어 대상 화면에 사용됩니다. |
| attribute1 | int |  | |  | 0 ~ 2147483645 | 속성1<br>길드 검색에서 필터링이나 정렬에 사용할 수 있는 길드의 숫자 속성입니다. 레벨, 지역, 플레이 스타일, 활동 요건 등의 커스텀 길드 속성을 정의하기 위해, 최대 5개의 속성을 개발자가 이용할 수 있습니다. |
| attribute2 | int |  | |  | 0 ~ 2147483645 | 속성2<br>길드 검색에서 필터링이나 정렬에 사용할 수 있는 길드의 숫자 속성입니다. 자세한 내용은 attribute1 을 참조하십시오. |
| attribute3 | int |  | |  | 0 ~ 2147483645 | 속성3<br>길드 검색에서 필터링이나 정렬에 사용할 수 있는 길드의 숫자 속성입니다. 자세한 내용은 attribute1 을 참조하십시오. |
| attribute4 | int |  | |  | 0 ~ 2147483645 | 속성4<br>길드 검색에서 필터링이나 정렬에 사용할 수 있는 길드의 숫자 속성입니다. 자세한 내용은 attribute1 을 참조하십시오. |
| attribute5 | int |  | |  | 0 ~ 2147483645 | 속성5<br>길드 검색에서 필터링이나 정렬에 사용할 수 있는 길드의 숫자 속성입니다. 자세한 내용은 attribute1 을 참조하십시오. |
| metadata | string |  | |  |  ~ 1024자 | 길드 메타데이터<br>GS2 동작에 영향을 미치지 않는, 길드에 연결된 임의의 데이터입니다. 길드 엠블럼, 설명, 모집 메시지 등 게임 고유의 정보를 저장하는 데 사용할 수 있습니다. |
| memberMetadata | string |  | |  |  ~ 512자 | 길드 멤버의 메타데이터<br>GS2의 동작에 영향을 주지 않는, 이 길드 멤버와 연결된 임의의 데이터입니다. 공헌 포인트, 마지막 로그인 시간, 길드 임원에게 표시되는 메모 등 멤버 고유의 정보를 저장하는 데 사용할 수 있습니다. |
| joinPolicy | 문자열 열거형<br>enum {<br>"anybody",<br>"approval"<br>}<br> |  | ✓|  |  | 참가 방침<br>사용자가 이 길드에 어떻게 참가할 수 있는지를 제어합니다. "anybody" 는 승인 없이 임의의 사용자가 즉시 참가할 수 있습니다. "approval" 은 사용자가 멤버가 되기 전에 길드 마스터 또는 권한을 가진 멤버가 참가 요청을 승인해야 합니다. 길드 마스터가 언제든지 변경할 수 있습니다.anybody: 자유 참가 / approval: 승인제 /  |
| customRoles | [List&lt;EzRoleModel&gt;](#ezrolemodel) |  | | [] | 0 ~ 10 items | 커스텀 역할 목록<br>모델 레벨의 역할을 오버라이드하거나 확장하는 길드 고유의 커스텀 역할 정의 목록입니다. 각 길드는 고유한 권한 집합을 가진 최대 10개의 커스텀 역할을 정의할 수 있습니다. 이 역할들은 모델 레벨의 역할에 더해 멤버에게 할당할 수 있습니다. |
| guildMemberDefaultRole | string |  | |  |  ~ 128자 | 기본 커스텀 역할<br>이 특정 길드에 새 멤버가 참가했을 때 자동으로 할당되는 커스텀 역할입니다. 설정한 경우, 이 길드에 대해 길드 모델의 guildMemberDefaultRole 을 오버라이드합니다. customRoles 목록에 정의된 역할을 참조해야 합니다. |

#### Result

|  | 타입 | 설명 |
| --- | --- | --- |
| item | [EzGuild](#ezguild) | 생성한 길드|

#### 구현 예제




**Unity (UniTask)**
```csharp
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    );
    var result = await domain.CreateGuildAsync(
        guildModelName: "guild-model-0001",
        displayName: "My Guild",
        joinPolicy: "anybody",
        attribute1: 1,
        attribute2: null,
        attribute3: null,
        attribute4: null,
        attribute5: null,
        metadata: null,
        memberMetadata: null,
        customRoles: null,
        guildMemberDefaultRole: null
    );
    var item = await result.ModelAsync();

```

**Unity (Vanilla)**
```cs
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    );
    var future = domain.CreateGuildFuture(
        guildModelName: "guild-model-0001",
        displayName: "My Guild",
        joinPolicy: "anybody",
        attribute1: 1,
        attribute2: null,
        attribute3: null,
        attribute4: null,
        attribute5: null,
        metadata: null,
        memberMetadata: null,
        customRoles: null,
        guildMemberDefaultRole: null
    );
    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;

```

**Unreal Engine 5**
```cpp
    const auto Domain = Gs2->Guild->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        GameSession
    );
    const auto Future = Domain->CreateGuild(
        "guild-model-0001", // guildModelName
        "My Guild", // displayName
        "anybody", // joinPolicy
        1 // attribute1
        // attribute2
        // attribute3
        // attribute4
        // attribute5
        // metadata
        // memberMetadata
        // customRoles
        // guildMemberDefaultRole
    );
    Future->StartSynchronousTask();
    if (Future->GetTask().IsError())
    {
        return false;
    }

    // 변경된 값 / 결과 값을 취득
    const auto Future2 = Future->GetTask().Result()->Model();
    Future2->StartSynchronousTask();
    if (Future2->GetTask().IsError())
    {
        return Future2->GetTask().Error();
    }
    const auto Result = Future2->GetTask().Result();

```

**Godot**
```gdscript

var domain = ez.guild.namespace_(
        "namespace-0001"
    ).me(game_session)

var async_result = await domain.create_guild(
    "guild-model-0001", # guild_model_name
    "My Guild", # display_name
    "anybody", # join_policy
    1, # attribute1
    null, # attribute2
    null, # attribute3
    null, # attribute4
    null, # attribute5
    null, # metadata
    null, # member_metadata
    null, # custom_roles
    null # guild_member_default_role
)
if async_result.error != null:
    push_error(str(async_result.error))
    return

var result = async_result.result

```


---

### deleteGuild

길드를 해산(삭제)하기<br>

길드를 완전히 삭제합니다. 모든 멤버가 탈퇴하며 길드는 사라집니다.<br>
이 API는 길드로서 호출합니다(먼저 Assume이 필요합니다). 일반적으로 길드 마스터만 길드를 해산할 권한을 가집니다.<br>
길드 설정 화면의 "길드 해산" 버튼에 사용합니다. 모든 멤버에게 영향을 미치는 파괴적인 작업이므로 반드시 확인 대화상자를 표시하세요.

#### Request

|  | 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 |
| --- | --- | --- | --- | --- | --- | --- |
| namespaceName | string |  | ✓|  |  ~ 128자 | 네임스페이스 이름<br>네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| guildModelName | string |  | ✓|  |  ~ 128자 | 길드 모델 이름<br>길드 모델 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| guildGameSession | GuildGameSession | | ✓|  |  ~ 128자 | GuildGameSession<br>`assume`으로 취득한 GuildGameSession입니다.<br>권한은 `assume`을 호출한 멤버의 역할에 연결된 `PolicyDocument`로 결정됩니다.<br>삭제를 수행하려면 해당 역할의 `PolicyDocument`에 `Gs2Guild:DeleteGuild` 권한이 필요합니다. |

#### Result

|  | 타입 | 설명 |
| --- | --- | --- |
| item | [EzGuild](#ezguild) | 삭제한 길드|

#### 구현 예제




**Unity (UniTask)**
```csharp
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).GuildGameSession(
        guildModelName: "guild-model-0001",
        guildGameSession: GuildGameSession
    );
    var result = await domain.DeleteGuildAsync(
    );

```

**Unity (Vanilla)**
```cs
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).GuildGameSession(
        guildModelName: "guild-model-0001",
        guildGameSession: GuildGameSession
    );
    var future = domain.DeleteGuildFuture(
    );
    yield return future;
    if (future.Error != null)
    {
        onError.Invoke(future.Error, null);
        yield break;
    }

```

**Unreal Engine 5**
```cpp
    const auto Domain = Gs2->Guild->Namespace(
        "namespace-0001" // namespaceName
    )->GuildGameSession(
        "guild-model-0001", // guildModelName
        GuildGameSession // GuildGameSession
    );
    const auto Future = Domain->DeleteGuild(
    );
    Future->StartSynchronousTask();
    if (Future->GetTask().IsError())
    {
        return false;
    }
    const auto Result = Future->GetTask().Result();

```

**Godot**
```gdscript

var domain = ez.guild.namespace_(
        "namespace-0001"
    ).guild_game_session(
        "guild-model-0001",
        guild_game_session
    )

var async_result = await domain.delete_guild(
    guild_game_session.access_token # access_token
)
if async_result.error != null:
    push_error(str(async_result.error))
    return

var result = async_result.result

```


---

### deleteMemberFromGuild

멤버를 길드에서 제명하기<br>

지정한 플레이어를 길드의 멤버 목록에서 삭제합니다.<br>
이 API는 길드로서 호출합니다(먼저 Assume이 필요합니다). 적절한 역할 권한을 가진 멤버(일반적으로 길드 마스터나 임원)만 멤버를 제명할 수 있습니다.<br>
멤버 관리 화면의 "제명" 버튼에 사용합니다. 작업을 취소하기 어려우므로 확인 대화상자 표시를 권장합니다.

#### Request

|  | 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 |
| --- | --- | --- | --- | --- | --- | --- |
| namespaceName | string |  | ✓|  |  ~ 128자 | 네임스페이스 이름<br>네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| guildModelName | string |  | ✓|  |  ~ 128자 | 길드 모델 이름<br>길드 모델 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| guildGameSession | GuildGameSession | | ✓|  |  ~ 128자 | GuildGameSession<br>`assume`으로 취득한 GuildGameSession입니다.<br>권한은 `assume`을 호출한 멤버의 역할에 연결된 `PolicyDocument`로 결정됩니다.<br>제명을 수행하려면 해당 역할의 `PolicyDocument`에 `Gs2Guild:DeleteMember` 권한이 필요합니다. |
| targetUserId | string |  | ✓|  |  ~ 128자 | 제명할 사용자 ID |

#### Result

|  | 타입 | 설명 |
| --- | --- | --- |
| item | [EzGuild](#ezguild) | 업데이트한 길드|

#### Error

이 API에는 특별한 예외가 정의되어 있습니다.<br>
GS2-SDK for Game Engine에서는 게임 내에서 핸들링이 필요할 것으로 예상되는 에러를, 일반적인 예외에서 파생된 특수화된 예외로 제공하여 다루기 쉽게 하고 있습니다.<br>
일반적인 에러의 종류와 핸들링 방법은 [여기]() 문서를 참고해 주세요.

| 타입 | 베이스 클래스 | 설명 |
| --- | --- | --- |
| GuildMasterRequiredException | BadRequestException | 길드 마스터 권한을 가진 멤버가 최소 1명 필요합니다. |

#### 구현 예제




**Unity (UniTask)**
```csharp

try {
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).GuildGameSession(
        guildModelName: "guild-model-0001",
        guildGameSession: GuildGameSession
    );
    var result = await domain.DeleteMemberFromGuildAsync(
        targetUserId: "user-0002"
    );
} catch(Gs2.Gs2Guild.Exception.GuildMasterRequiredException e) {
    // At least one member with guild master privileges is required.
}

```

**Unity (Vanilla)**
```cs
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).GuildGameSession(
        guildModelName: "guild-model-0001",
        guildGameSession: GuildGameSession
    );
    var future = domain.DeleteMemberFromGuildFuture(
        targetUserId: "user-0002"
    );
    yield return future;
    if (future.Error != null)
    {
        if (future.Error is Gs2.Gs2Guild.Exception.GuildMasterRequiredException)
        {
            // At least one member with guild master privileges is required.
        }
        onError.Invoke(future.Error, null);
        yield break;
    }

```

**Unreal Engine 5**
```cpp
    const auto Domain = Gs2->Guild->Namespace(
        "namespace-0001" // namespaceName
    )->GuildGameSession(
        "guild-model-0001", // guildModelName
        GuildGameSession // GuildGameSession
    );
    const auto Future = Domain->DeleteMemberFromGuild(
        "user-0002" // targetUserId
    );
    Future->StartSynchronousTask();
    if (Future->GetTask().IsError())
    {
        auto e = Future->GetTask().Error();
        if (e->IsChildOf(Gs2::Guild::Error::FGuildMasterRequiredError::Class))
        {
            // At least one member with guild master privileges is required.
        }
        return false;
    }
    const auto Result = Future->GetTask().Result();

```

**Godot**
```gdscript

var domain = ez.guild.namespace_(
        "namespace-0001"
    ).guild_game_session(
        "guild-model-0001",
        guild_game_session
    )

var async_result = await domain.delete_member_from_guild(
    guild_game_session.access_token, # access_token
    "user-0002" # target_user_id
)
if async_result.error != null:
    if async_result.error is Gs2GuildGuildMasterRequiredException:
        # 길드 마스터 권한을 가진 멤버가 최소 1명 필요합니다.
        pass
    push_error(str(async_result.error))
    return

var result = async_result.result

```


---

### getGuild

길드의 상세 정보를 가져오기<br>

특정 길드의 상세 정보를 가져옵니다. 표시 이름, 커스텀 속성, 메타데이터, 멤버 목록, 참가 방식 등이 포함됩니다.<br>
반환되는 정보는 요청한 플레이어와 길드의 관계에 따라 달라집니다. 길드 멤버는 멤버 목록을 포함한 전체 정보를 볼 수 있지만, 비멤버는 공개 정보만 볼 수 있습니다.<br>
길드 상세 화면을 표시하는 데 사용합니다. 예를 들어 "Dragon Knights — 25/30명 — 참가: 승인제"와 같이 표시할 수 있습니다.

#### Request

|  | 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 |
| --- | --- | --- | --- | --- | --- | --- |
| namespaceName | string |  | ✓|  |  ~ 128자 | 네임스페이스 이름<br>네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| guildModelName | string |  | ✓|  |  ~ 128자 | 길드 모델 이름<br>길드 모델 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| gameSession | GameSession | | ✓|  |  | GameSession |
| guildName | string |  | ✓| UUID |  ~ 36자 | 길드명<br>길드의 고유한 이름을 유지합니다.<br>이름은 UUID(Universally Unique Identifier) 형식으로 자동 생성되며, 각 길드를 식별하는 데 사용됩니다. |

#### Result

|  | 타입 | 설명 |
| --- | --- | --- |
| item | [EzGuild](#ezguild) | 길드|

#### 구현 예제




**Unity (UniTask)**
```csharp
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).GuildGameSession(
        guildModelName: "guild-model-0001",
        guildGameSession: GuildGameSession
    );
    var item = await domain.ModelAsync();

```

**Unity (Vanilla)**
```cs
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).GuildGameSession(
        guildModelName: "guild-model-0001",
        guildGameSession: GuildGameSession
    );
    var future = domain.ModelFuture();
    yield return future;
    var item = future.Result;

```

**Unreal Engine 5**
```cpp
    const auto Domain = Gs2->Guild->Namespace(
        "namespace-0001" // namespaceName
    )->GuildGameSession(
        "guild-model-0001", // guildModelName
        GuildGameSession // GuildGameSession
    );
    const auto Future = Domain->Model();
    Future->StartSynchronousTask();
    if (Future->GetTask().IsError())
    {
        return false;
    }

```

**Godot**
```gdscript

var domain = ez.guild.namespace_(
        "namespace-0001"
    ).guild_game_session(
        "guild-model-0001",
        guild_game_session
    )

var async_result = await domain.model()
if async_result.error != null:
    push_error(str(async_result.error))
    return

var result = async_result.result

```


##### 값 변경 이벤트 핸들링




**Unity (UniTask)**
```csharp
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).GuildGameSession(
        guildModelName: "guild-model-0001",
        guildGameSession: GuildGameSession
    );
    
    // 이벤트 핸들링 시작
    var callbackId = domain.Subscribe(
        value => {
            // 값이 변화했을 때 호출됨
            // value에는 변경 후의 값이 전달됨
        }
    );

    // 이벤트 핸들링 정지
    domain.Unsubscribe(callbackId);

```

**Unity (Vanilla)**
```cs
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).GuildGameSession(
        guildModelName: "guild-model-0001",
        guildGameSession: GuildGameSession
    );
    
    // 이벤트 핸들링 시작
    var callbackId = domain.Subscribe(
        value => {
            // 값이 변화했을 때 호출됨
            // value에는 변경 후의 값이 전달됨
        }
    );

    // 이벤트 핸들링 정지
    domain.Unsubscribe(callbackId);

```

**Unreal Engine 5**
```cpp
    const auto Domain = Gs2->Guild->Namespace(
        "namespace-0001" // namespaceName
    )->GuildGameSession(
        "guild-model-0001", // guildModelName
        GuildGameSession // GuildGameSession
    );
    
    // 이벤트 핸들링 시작
    const auto CallbackId = Domain->Subscribe(
        [](TSharedPtr<Gs2::Guild::Model::FGuild> value) {
            // 값이 변화했을 때 호출됨
            // value에는 변경 후의 값이 전달됨
        }
    );

    // 이벤트 핸들링 정지
    Domain->Unsubscribe(CallbackId);

```

**Godot**
```gdscript

var domain = ez.guild.namespace_(
        "namespace-0001"
    ).guild_game_session(
        "guild-model-0001",
        guild_game_session
    )

# 이벤트 핸들링 시작
var callback_id = domain.subscribe_model(func(value):
    # 값이 변화했을 때 호출됨
    # value에는 변경 후의 값이 전달됩니다
    pass
)

# 이벤트 핸들링 정지
domain.unsubscribe_model(callback_id)

```


**⚠️ Warning**

이 이벤트는 SDK가 가진 로컬 캐시의 값이 변경되었을 때 호출됩니다.

로컬 캐시는 SDK가 가진 API의 실행, 또는 GS2-Gateway의 알림을 활성화한 GS2-Distributor를 통한 스탬프 시트의 실행, 또는 GS2-Gateway의 알림을 활성화한 GS2-JobQueue의 실행에 의해 변화한 것만이 대상이 됩니다.

따라서 이 방법 이외로 값이 변경된 경우 콜백은 호출되지 않습니다.

---

### listGuilds

참가할 수 있는 길드를 검색하기<br>

플레이어가 참가할 수 있는 길드를 검색합니다. 표시 이름, 속성, 참가 방식으로 필터링할 수 있습니다.<br>
최대 5개의 커스텀 속성(플레이 스타일, 언어, 활동 수준 등)과 참가 방식(자유 참가/승인제)으로 필터링할 수 있습니다.<br>
이미 정원에 도달한 길드를 포함할지 여부도 선택할 수 있습니다.<br>
주의: 최근 24시간 이내에 업데이트된 길드만 검색 결과에 표시됩니다. 길드를 검색 대상으로 유지하고 싶다면 변경 사항이 없어도 정기적으로 UpdateGuild를 호출하세요.<br>
"길드 찾기" 화면을 구성하여 검색 필터와 일치하는 길드 목록을 표시하는 데 사용합니다.

#### Request

|  | 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 |
| --- | --- | --- | --- | --- | --- | --- |
| namespaceName | string |  | ✓|  |  ~ 128자 | 네임스페이스 이름<br>네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| gameSession | GameSession | | ✓|  |  | GameSession |
| displayName | string |  | |  |  ~ 64자 | 검색할 길드 표시 이름 |
| attributes1 | List&lt;int&gt; |  | |  | 0 ~ 10 items | 검색할 속성1 |
| attributes2 | List&lt;int&gt; |  | |  | 0 ~ 10 items | 검색할 속성2 |
| attributes3 | List&lt;int&gt; |  | |  | 0 ~ 10 items | 검색할 속성3 |
| attributes4 | List&lt;int&gt; |  | |  | 0 ~ 10 items | 검색할 속성4 |
| attributes5 | List&lt;int&gt; |  | |  | 0 ~ 10 items | 검색할 속성5 |
| joinPolicies | List&lt;string&gt; |  | |  | 0 ~ 10 items | 검색할 길드 참가 방법 목록 |
| includeFullMembersGuild | bool |  | | false |  | 길드 멤버가 정원을 채운 길드를 검색 결과에 포함할지 여부 |
| orderBy | 문자열 열거형<br>enum {<br>"number_of_players",<br>"attribute1_asc",<br>"attribute1_desc",<br>"attribute2_asc",<br>"attribute2_desc",<br>"attribute3_asc",<br>"attribute3_desc",<br>"attribute4_asc",<br>"attribute4_desc",<br>"attribute5_asc",<br>"attribute5_desc",<br>"last_updated"<br>}<br> |  | | "number_of_players" |  | 정렬 순서number_of_players: 참가 플레이어 수 / attribute1_asc: 속성1 오름차순 / attribute1_desc: 속성1 내림차순 / attribute2_asc: 속성2 오름차순 / attribute2_desc: 속성2 내림차순 / attribute3_asc: 속성3 오름차순 / attribute3_desc: 속성3 내림차순 / attribute4_asc: 속성4 오름차순 / attribute4_desc: 속성4 내림차순 / attribute5_asc: 속성5 오름차순 / attribute5_desc: 속성5 내림차순 / last_updated: 최종 갱신 일시 /  |
| pageToken | string |  | |  |  ~ 1024자 | 데이터 취득을 시작할 위치를 지정하는 토큰 |
| limit | int |  | | 30 | 1 ~ 1000 | 취득할 데이터 건수 |

#### Result

|  | 타입 | 설명 |
| --- | --- | --- |
| items | [List&lt;EzGuild&gt;](#ezguild) | 길드 목록|
| nextPageToken | string | 목록의 나머지를 취득하기 위한 페이지 토큰|

#### 구현 예제




**Unity (UniTask)**
```csharp
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    );
    var items = await domain.SearchGuildsAsync(
        guildModelName: "guild-model-0001"
    ).ToListAsync();

```

**Unity (Vanilla)**
```cs
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    );
    var it = domain.SearchGuilds(
        guildModelName: "guild-model-0001"
    );
    List<EzGuild> items = new List<EzGuild>();
    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;
        }
    }

```

**Unreal Engine 5**
```cpp
    const auto Domain = Gs2->Guild->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        GameSession
    );
    const auto It = Domain->SearchGuilds(
        "guild-model-0001" // guildModelName
    );
    TArray<Gs2::UE5::Guild::Model::FEzGuildPtr> Result;
    for (auto Item : *It)
    {
        if (Item.IsError())
        {
            return false;
        }
        Result.Add(Item.Current());
    }

```

**Godot**
```gdscript

var domain = ez.guild.namespace_(
        "namespace-0001"
    ).me(game_session)

var async_result = await domain.search_guilds(
    "guild-model-0001", # guild_model_name
    null, # display_name
    null, # attributes1
    null, # attributes2
    null, # attributes3
    null, # attributes4
    null, # attributes5
    null, # join_policies
    null, # include_full_members_guild
    null # order_by
).load()
if async_result.error != null:
    push_error(str(async_result.error))
    return

var result = async_result.result

```


---

### updateGuild

길드의 설정을 업데이트하기<br>

길드의 표시 이름, 커스텀 속성, 메타데이터, 참가 방식, 역할 정의를 업데이트합니다.<br>
이 API는 길드로서 호출합니다. 먼저 Assume으로 길드의 액세스 토큰을 취득한 후 호출하세요.<br>
적절한 역할 권한을 가진 멤버만 길드 설정을 업데이트할 수 있습니다.<br>
또한 이를 정기적으로 호출하면 길드가 검색 결과에 계속 표시됩니다(24시간 동안 업데이트가 없는 길드는 검색에서 숨겨집니다).<br>
"길드 설정" 화면에 사용합니다. 임원이나 길드 마스터가 길드 이름, 설명, 모집 방침을 변경하는 화면입니다.

#### Request

|  | 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 |
| --- | --- | --- | --- | --- | --- | --- |
| namespaceName | string |  | ✓|  |  ~ 128자 | 네임스페이스 이름<br>네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| guildModelName | string |  | ✓|  |  ~ 128자 | 길드 모델 이름<br>길드 모델 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| guildGameSession | GuildGameSession | | ✓|  |  ~ 128자 | GuildGameSession<br>`assume`으로 취득한 GuildGameSession입니다.<br>권한은 `assume`을 호출한 멤버의 역할에 연결된 `PolicyDocument`로 결정됩니다.<br>업데이트를 수행하려면 해당 역할의 `PolicyDocument`에 `Gs2Guild:UpdateGuild` 권한이 필요합니다. |
| displayName | string |  | ✓|  |  ~ 64자 | 표시 이름<br>UI에서 플레이어에게 표시되는, 사람이 읽을 수 있는 길드 이름입니다. 길드명(시스템에서 생성되는 UUID)과 달리, 표시 이름은 길드 생성자가 설정하며 갱신도 가능합니다. 길드 검색 결과, 멤버 목록, 기타 플레이어 대상 화면에 사용됩니다. |
| attribute1 | int |  | |  | 0 ~ 2147483645 | 속성1<br>길드 검색에서 필터링이나 정렬에 사용할 수 있는 길드의 숫자 속성입니다. 레벨, 지역, 플레이 스타일, 활동 요건 등의 커스텀 길드 속성을 정의하기 위해, 최대 5개의 속성을 개발자가 이용할 수 있습니다. |
| attribute2 | int |  | |  | 0 ~ 2147483645 | 속성2<br>길드 검색에서 필터링이나 정렬에 사용할 수 있는 길드의 숫자 속성입니다. 자세한 내용은 attribute1 을 참조하십시오. |
| attribute3 | int |  | |  | 0 ~ 2147483645 | 속성3<br>길드 검색에서 필터링이나 정렬에 사용할 수 있는 길드의 숫자 속성입니다. 자세한 내용은 attribute1 을 참조하십시오. |
| attribute4 | int |  | |  | 0 ~ 2147483645 | 속성4<br>길드 검색에서 필터링이나 정렬에 사용할 수 있는 길드의 숫자 속성입니다. 자세한 내용은 attribute1 을 참조하십시오. |
| attribute5 | int |  | |  | 0 ~ 2147483645 | 속성5<br>길드 검색에서 필터링이나 정렬에 사용할 수 있는 길드의 숫자 속성입니다. 자세한 내용은 attribute1 을 참조하십시오. |
| metadata | string |  | |  |  ~ 1024자 | 길드 메타데이터<br>GS2 동작에 영향을 미치지 않는, 길드에 연결된 임의의 데이터입니다. 길드 엠블럼, 설명, 모집 메시지 등 게임 고유의 정보를 저장하는 데 사용할 수 있습니다. |
| joinPolicy | 문자열 열거형<br>enum {<br>"anybody",<br>"approval"<br>}<br> |  | ✓|  |  | 참가 방침<br>사용자가 이 길드에 어떻게 참가할 수 있는지를 제어합니다. "anybody" 는 승인 없이 임의의 사용자가 즉시 참가할 수 있습니다. "approval" 은 사용자가 멤버가 되기 전에 길드 마스터 또는 권한을 가진 멤버가 참가 요청을 승인해야 합니다. 길드 마스터가 언제든지 변경할 수 있습니다.anybody: 자유 참가 / approval: 승인제 /  |
| customRoles | [List&lt;EzRoleModel&gt;](#ezrolemodel) |  | | [] | 0 ~ 10 items | 커스텀 역할 목록<br>모델 레벨의 역할을 오버라이드하거나 확장하는 길드 고유의 커스텀 역할 정의 목록입니다. 각 길드는 고유한 권한 집합을 가진 최대 10개의 커스텀 역할을 정의할 수 있습니다. 이 역할들은 모델 레벨의 역할에 더해 멤버에게 할당할 수 있습니다. |
| guildMemberDefaultRole | string |  | |  |  ~ 128자 | 기본 커스텀 역할<br>이 특정 길드에 새 멤버가 참가했을 때 자동으로 할당되는 커스텀 역할입니다. 설정한 경우, 이 길드에 대해 길드 모델의 guildMemberDefaultRole 을 오버라이드합니다. customRoles 목록에 정의된 역할을 참조해야 합니다. |

#### Result

|  | 타입 | 설명 |
| --- | --- | --- |
| item | [EzGuild](#ezguild) | 업데이트한 길드|

#### 구현 예제




**Unity (UniTask)**
```csharp
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).GuildGameSession(
        guildModelName: "guild-model-0001",
        guildGameSession: GuildGameSession
    );
    var result = await domain.UpdateGuildAsync(
        displayName: "My Guild",
        joinPolicy: "anybody",
        attribute1: 1,
        attribute2: null,
        attribute3: null,
        attribute4: null,
        attribute5: null,
        metadata: null,
        customRoles: null,
        guildMemberDefaultRole: null
    );
    var item = await result.ModelAsync();

```

**Unity (Vanilla)**
```cs
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).GuildGameSession(
        guildModelName: "guild-model-0001",
        guildGameSession: GuildGameSession
    );
    var future = domain.UpdateGuildFuture(
        displayName: "My Guild",
        joinPolicy: "anybody",
        attribute1: 1,
        attribute2: null,
        attribute3: null,
        attribute4: null,
        attribute5: null,
        metadata: null,
        customRoles: null,
        guildMemberDefaultRole: null
    );
    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;

```

**Unreal Engine 5**
```cpp
    const auto Domain = Gs2->Guild->Namespace(
        "namespace-0001" // namespaceName
    )->GuildGameSession(
        "guild-model-0001", // guildModelName
        GuildGameSession // GuildGameSession
    );
    const auto Future = Domain->UpdateGuild(
        "My Guild", // displayName
        "anybody", // joinPolicy
        1 // attribute1
        // attribute2
        // attribute3
        // attribute4
        // attribute5
        // metadata
        // customRoles
        // guildMemberDefaultRole
    );
    Future->StartSynchronousTask();
    if (Future->GetTask().IsError())
    {
        return false;
    }

    // 변경된 값 / 결과 값을 취득
    const auto Future2 = Future->GetTask().Result()->Model();
    Future2->StartSynchronousTask();
    if (Future2->GetTask().IsError())
    {
        return Future2->GetTask().Error();
    }
    const auto Result = Future2->GetTask().Result();

```

**Godot**
```gdscript

var domain = ez.guild.namespace_(
        "namespace-0001"
    ).guild_game_session(
        "guild-model-0001",
        guild_game_session
    )

var async_result = await domain.update_guild(
    guild_game_session.access_token, # access_token
    "My Guild", # display_name
    "anybody", # join_policy
    1, # attribute1
    null, # attribute2
    null, # attribute3
    null, # attribute4
    null, # attribute5
    null, # metadata
    null, # custom_roles
    null # guild_member_default_role
)
if async_result.error != null:
    push_error(str(async_result.error))
    return

var result = async_result.result

```


---

### updateGuildMemberRole

길드 멤버의 역할을 변경하기<br>

특정 길드 멤버의 역할을 변경합니다. 예를 들어 멤버를 "임원"으로 승격시키거나, 임원을 "멤버"로 강등시킬 수 있습니다.<br>
이 API는 길드로서 호출합니다(먼저 Assume이 필요합니다). 적절한 역할 권한을 가진 멤버만 다른 멤버의 역할을 변경할 수 있습니다.<br>
"멤버 관리" 화면에 사용합니다. 길드 마스터나 임원이 멤버를 승격·강등시키는 화면입니다.

#### Request

|  | 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 |
| --- | --- | --- | --- | --- | --- | --- |
| namespaceName | string |  | ✓|  |  ~ 128자 | 네임스페이스 이름<br>네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| guildModelName | string |  | ✓|  |  ~ 128자 | 길드 모델 이름<br>길드 모델 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| guildGameSession | GuildGameSession | | ✓|  |  ~ 128자 | GuildGameSession<br>`assume`으로 취득한 GuildGameSession입니다.<br>권한은 `assume`을 호출한 멤버의 역할에 연결된 `PolicyDocument`로 결정됩니다.<br>역할 업데이트를 수행하려면 해당 역할의 `PolicyDocument`에 `Gs2Guild:UpdateMemberRole` 권한이 필요합니다. |
| targetUserId | string |  | ✓|  |  ~ 128자 | 업데이트할 사용자 ID |
| roleName | string |  | ✓|  |  ~ 128자 | 롤 모델 이름<br>롤 모델 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |

#### Result

|  | 타입 | 설명 |
| --- | --- | --- |
| item | [EzGuild](#ezguild) | 업데이트한 길드|

#### 구현 예제




**Unity (UniTask)**
```csharp
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).GuildGameSession(
        guildModelName: "guild-model-0001",
        guildGameSession: GuildGameSession
    );
    var result = await domain.UpdateGuildMemberRoleAsync(
        targetUserId: "user-0002",
        roleName: "role-0001"
    );
    var item = await result.ModelAsync();

```

**Unity (Vanilla)**
```cs
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).GuildGameSession(
        guildModelName: "guild-model-0001",
        guildGameSession: GuildGameSession
    );
    var future = domain.UpdateGuildMemberRoleFuture(
        targetUserId: "user-0002",
        roleName: "role-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;

```

**Unreal Engine 5**
```cpp
    const auto Domain = Gs2->Guild->Namespace(
        "namespace-0001" // namespaceName
    )->GuildGameSession(
        "guild-model-0001", // guildModelName
        GuildGameSession // GuildGameSession
    );
    const auto Future = Domain->UpdateGuildMemberRole(
        "user-0002", // targetUserId
        "role-0001" // roleName
    );
    Future->StartSynchronousTask();
    if (Future->GetTask().IsError())
    {
        return false;
    }

    // 변경된 값 / 결과 값을 취득
    const auto Future2 = Future->GetTask().Result()->Model();
    Future2->StartSynchronousTask();
    if (Future2->GetTask().IsError())
    {
        return Future2->GetTask().Error();
    }
    const auto Result = Future2->GetTask().Result();

```

**Godot**
```gdscript

var domain = ez.guild.namespace_(
        "namespace-0001"
    ).guild_game_session(
        "guild-model-0001",
        guild_game_session
    )

var async_result = await domain.update_guild_member_role(
    guild_game_session.access_token, # access_token
    "user-0002", # target_user_id
    "role-0001" # role_name
)
if async_result.error != null:
    push_error(str(async_result.error))
    return

var result = async_result.result

```


---

### acceptRequest

플레이어의 가입 신청을 승인한다<br>

보류 중인 가입 신청을 승인하여, 신청한 플레이어를 길드의 멤버 목록에 추가합니다.<br>
이 API는 길드로서 호출합니다(먼저 Assume이 필요합니다). 적절한 역할 권한을 가진 멤버만 가입 신청을 승인할 수 있습니다.<br>
승인 후 플레이어는 길드 모델에 정의된 기본 역할로 길드 멤버가 됩니다.<br>
가입 신청 상세 화면이나 목록 화면의 "승인" 버튼에 사용합니다.

#### Request

|  | 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 |
| --- | --- | --- | --- | --- | --- | --- |
| namespaceName | string |  | ✓|  |  ~ 128자 | 네임스페이스 이름<br>네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| guildGameSession | GuildGameSession | | ✓|  |  ~ 128자 | GuildGameSession<br>`assume`으로 취득한 GuildGameSession입니다.<br>권한은 `assume`을 호출한 멤버의 역할의 `PolicyDocument`에 따라 결정됩니다.<br>승인하려면 해당 역할의 `PolicyDocument`에 `Gs2Guild:AcceptRequest` 권한이 필요합니다. |
| guildModelName | string |  | ✓|  |  ~ 128자 | 길드 모델 이름<br>길드 모델 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| fromUserId | string |  | ✓|  |  ~ 128자 | 사용자ID |

#### Result

|  | 타입 | 설명 |
| --- | --- | --- |
| item | [EzReceiveMemberRequest](#ezreceivememberrequest) | 수락한 참가 요청|
| guild | [EzGuild](#ezguild) | 길드|

#### Error

이 API에는 특별한 예외가 정의되어 있습니다.<br>
GS2-SDK for Game Engine에서는 게임 내에서 핸들링이 필요할 것으로 예상되는 에러를, 일반적인 예외에서 파생된 특수화된 예외로 제공하여 다루기 쉽게 하고 있습니다.<br>
일반적인 에러의 종류와 핸들링 방법은 [여기]() 문서를 참고해 주세요.

| 타입 | 베이스 클래스 | 설명 |
| --- | --- | --- |
| MaximumJoinedGuildsReachedException | BadRequestException | 길드 동시 참가 수가 최댓값에 도달했습니다. |
| MaximumMembersReachedException | BadRequestException | 멤버 수가 상한에 도달했습니다. |

#### 구현 예제




**Unity (UniTask)**
```csharp

try {
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).GuildGameSession(
        guildModelName: "guild-0001",
        guildGameSession: GuildGameSession
    ).ReceiveMemberRequest(
        fromUserId: null
    );
    var result = await domain.AcceptRequestAsync(
    );
} catch(Gs2.Gs2Guild.Exception.MaximumJoinedGuildsReachedException e) {
    // The number of guilds you can join at the same time has reached the upper limit.
} catch(Gs2.Gs2Guild.Exception.MaximumMembersReachedException e) {
    // The number of members has reached the upper limit.
}

```

**Unity (Vanilla)**
```cs
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).GuildGameSession(
        guildModelName: "guild-0001",
        guildGameSession: GuildGameSession
    ).ReceiveMemberRequest(
        fromUserId: null
    );
    var future = domain.AcceptRequestFuture(
    );
    yield return future;
    if (future.Error != null)
    {
        if (future.Error is Gs2.Gs2Guild.Exception.MaximumJoinedGuildsReachedException)
        {
            // The number of guilds you can join at the same time has reached the upper limit.
        }
        if (future.Error is Gs2.Gs2Guild.Exception.MaximumMembersReachedException)
        {
            // The number of members has reached the upper limit.
        }
        onError.Invoke(future.Error, null);
        yield break;
    }

```

**Unreal Engine 5**
```cpp
    const auto Domain = Gs2->Guild->Namespace(
        "namespace-0001" // namespaceName
    )->GuildGameSession(
        "guild-0001", // guildModelName
        GuildGameSession // GuildGameSession
    )->ReceiveMemberRequest(
        nullptr // fromUserId
    );
    const auto Future = Domain->AcceptRequest(
    );
    Future->StartSynchronousTask();
    if (Future->GetTask().IsError())
    {
        auto e = Future->GetTask().Error();
        if (e->IsChildOf(Gs2::Guild::Error::FMaximumJoinedGuildsReachedError::Class))
        {
            // The number of guilds you can join at the same time has reached the upper limit.
        }
        if (e->IsChildOf(Gs2::Guild::Error::FMaximumMembersReachedError::Class))
        {
            // The number of members has reached the upper limit.
        }
        return false;
    }
    const auto Result = Future->GetTask().Result();

```

**Godot**
```gdscript

var domain = ez.guild.namespace_(
        "namespace-0001"
    ).guild_game_session(
        "guild-0001",
        guild_game_session
    ).receive_member_request(
        null
    )

var async_result = await domain.accept_request(
    guild_game_session.access_token # access_token
)
if async_result.error != null:
    if async_result.error is Gs2GuildMaximumJoinedGuildsReachedException:
        # 길드 동시 참가 수가 최댓값에 도달했습니다.
        pass
    if async_result.error is Gs2GuildMaximumMembersReachedException:
        # 멤버 수가 상한에 도달했습니다.
        pass
    push_error(str(async_result.error))
    return

var result = async_result.result

```


---

### getReceiveRequest

특정 가입 신청의 상세 정보를 취득한다<br>

발신자의 사용자 ID를 지정하여, 길드가 받은 특정 가입 신청의 상세 정보를 취득합니다.<br>
이 API는 길드로서 호출합니다(먼저 Assume이 필요합니다).<br>
가입 신청 상세 화면을 표시하는 데 사용합니다. 예를 들어 신청자의 프로필, 메시지, "승인" / "거부" 버튼을 표시하는 화면입니다.

#### Request

|  | 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 |
| --- | --- | --- | --- | --- | --- | --- |
| namespaceName | string |  | ✓|  |  ~ 128자 | 네임스페이스 이름<br>네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| guildGameSession | GuildGameSession | | ✓|  |  ~ 128자 | GuildGameSession<br>`assume`으로 취득한 GuildGameSession입니다.<br>권한은 `assume`을 호출한 멤버의 역할의 `PolicyDocument`에 따라 결정됩니다.<br>취득하려면 해당 역할의 `PolicyDocument`에 `Gs2Guild:GetReceiveRequest` 권한이 필요합니다. |
| guildModelName | string |  | ✓|  |  ~ 128자 | 길드 모델 이름<br>길드 모델 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| fromUserId | string |  | ✓|  |  ~ 128자 | 사용자ID |

#### Result

|  | 타입 | 설명 |
| --- | --- | --- |
| item | [EzReceiveMemberRequest](#ezreceivememberrequest) | 참가 요청|

#### 구현 예제




**Unity (UniTask)**
```csharp
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).GuildGameSession(
        guildModelName: "guild-0001",
        guildGameSession: GuildGameSession
    ).ReceiveMemberRequest(
        fromUserId: null
    );
    var item = await domain.ModelAsync();

```

**Unity (Vanilla)**
```cs
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).GuildGameSession(
        guildModelName: "guild-0001",
        guildGameSession: GuildGameSession
    ).ReceiveMemberRequest(
        fromUserId: null
    );
    var future = domain.ModelFuture();
    yield return future;
    var item = future.Result;

```

**Unreal Engine 5**
```cpp
    const auto Domain = Gs2->Guild->Namespace(
        "namespace-0001" // namespaceName
    )->GuildGameSession(
        "guild-0001", // guildModelName
        GuildGameSession // GuildGameSession
    )->ReceiveMemberRequest(
        nullptr // fromUserId
    );
    const auto Future = Domain->Model();
    Future->StartSynchronousTask();
    if (Future->GetTask().IsError())
    {
        return false;
    }

```

**Godot**
```gdscript

var domain = ez.guild.namespace_(
        "namespace-0001"
    ).guild_game_session(
        "guild-0001",
        guild_game_session
    ).receive_member_request(
        null
    )

var async_result = await domain.model()
if async_result.error != null:
    push_error(str(async_result.error))
    return

var result = async_result.result

```


##### 값 변경 이벤트 핸들링




**Unity (UniTask)**
```csharp
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).GuildGameSession(
        guildModelName: "guild-0001",
        guildGameSession: GuildGameSession
    ).ReceiveMemberRequest(
        fromUserId: null
    );
    
    // 이벤트 핸들링 시작
    var callbackId = domain.Subscribe(
        value => {
            // 값이 변화했을 때 호출됨
            // value에는 변경 후의 값이 전달됨
        }
    );

    // 이벤트 핸들링 정지
    domain.Unsubscribe(callbackId);

```

**Unity (Vanilla)**
```cs
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).GuildGameSession(
        guildModelName: "guild-0001",
        guildGameSession: GuildGameSession
    ).ReceiveMemberRequest(
        fromUserId: null
    );
    
    // 이벤트 핸들링 시작
    var callbackId = domain.Subscribe(
        value => {
            // 값이 변화했을 때 호출됨
            // value에는 변경 후의 값이 전달됨
        }
    );

    // 이벤트 핸들링 정지
    domain.Unsubscribe(callbackId);

```

**Unreal Engine 5**
```cpp
    const auto Domain = Gs2->Guild->Namespace(
        "namespace-0001" // namespaceName
    )->GuildGameSession(
        "guild-0001", // guildModelName
        GuildGameSession // GuildGameSession
    )->ReceiveMemberRequest(
        nullptr // fromUserId
    );
    
    // 이벤트 핸들링 시작
    const auto CallbackId = Domain->Subscribe(
        [](TSharedPtr<Gs2::Guild::Model::FReceiveMemberRequest> value) {
            // 값이 변화했을 때 호출됨
            // value에는 변경 후의 값이 전달됨
        }
    );

    // 이벤트 핸들링 정지
    Domain->Unsubscribe(CallbackId);

```

**Godot**
```gdscript

var domain = ez.guild.namespace_(
        "namespace-0001"
    ).guild_game_session(
        "guild-0001",
        guild_game_session
    ).receive_member_request(
        null
    )

# 이벤트 핸들링 시작
var callback_id = domain.subscribe_model(func(value):
    # 값이 변화했을 때 호출됨
    # value에는 변경 후의 값이 전달됩니다
    pass
)

# 이벤트 핸들링 정지
domain.unsubscribe_model(callback_id)

```


**⚠️ Warning**

이 이벤트는 SDK가 가진 로컬 캐시의 값이 변경되었을 때 호출됩니다.

로컬 캐시는 SDK가 가진 API의 실행, 또는 GS2-Gateway의 알림을 활성화한 GS2-Distributor를 통한 스탬프 시트의 실행, 또는 GS2-Gateway의 알림을 활성화한 GS2-JobQueue의 실행에 의해 변화한 것만이 대상이 됩니다.

따라서 이 방법 이외로 값이 변경된 경우 콜백은 호출되지 않습니다.

---

### listReceiveRequests

길드가 받은 가입 신청 목록을 취득한다<br>

플레이어들이 이 길드에 보낸, 보류 중인 가입 신청을 모두 취득합니다.<br>
이 API는 길드로서 호출합니다(먼저 Assume으로 길드의 액세스 토큰을 취득해야 합니다).<br>
각 신청에는 발신자와 첨부된 메시지 또는 메타데이터가 포함됩니다.<br>
길드 관리 패널의 "가입 신청" 화면을 구성하는 데 사용합니다. 예를 들어 "PlayerA가 가입을 희망(메시지: Lv50 힐러, 매일 접속)"과 같은 목록을 표시할 수 있습니다.

#### Request

|  | 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 |
| --- | --- | --- | --- | --- | --- | --- |
| namespaceName | string |  | ✓|  |  ~ 128자 | 네임스페이스 이름<br>네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| guildGameSession | GuildGameSession | | ✓|  |  ~ 128자 | GuildGameSession<br>`assume`으로 취득한 GuildGameSession입니다.<br>권한은 `assume`을 호출한 멤버의 역할의 `PolicyDocument`에 따라 결정됩니다.<br>목록을 취득하려면 해당 역할의 `PolicyDocument`에 `Gs2Guild:DescribeReceiveRequests` 권한이 필요합니다. |
| guildModelName | string |  | ✓|  |  ~ 128자 | 길드 모델 이름<br>길드 모델 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| pageToken | string |  | |  |  ~ 1024자 | 데이터 취득을 시작할 위치를 지정하는 토큰 |
| limit | int |  | | 30 | 1 ~ 1000 | 취득할 데이터 건수 |

#### Result

|  | 타입 | 설명 |
| --- | --- | --- |
| items | [List&lt;EzReceiveMemberRequest&gt;](#ezreceivememberrequest) | 참가 요청 리스트|
| nextPageToken | string | 목록의 나머지를 취득하기 위한 페이지 토큰|

#### 구현 예제




**Unity (UniTask)**
```csharp
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).GuildGameSession(
        guildModelName: "guild-0001",
        guildGameSession: GuildGameSession
    );
    var items = await domain.ReceiveRequestsAsync(
    ).ToListAsync();

```

**Unity (Vanilla)**
```cs
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).GuildGameSession(
        guildModelName: "guild-0001",
        guildGameSession: GuildGameSession
    );
    var it = domain.ReceiveRequests(
    );
    List<EzReceiveMemberRequest> items = new List<EzReceiveMemberRequest>();
    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;
        }
    }

```

**Unreal Engine 5**
```cpp
    const auto Domain = Gs2->Guild->Namespace(
        "namespace-0001" // namespaceName
    )->GuildGameSession(
        "guild-0001", // guildModelName
        GuildGameSession // GuildGameSession
    );
    const auto It = Domain->ReceiveRequests(
    );
    TArray<Gs2::UE5::Guild::Model::FEzReceiveMemberRequestPtr> Result;
    for (auto Item : *It)
    {
        if (Item.IsError())
        {
            return false;
        }
        Result.Add(Item.Current());
    }

```


---

### rejectRequest

플레이어의 가입 신청을 거부한다<br>

보류 중인 가입 신청을 거부합니다. 신청한 플레이어는 길드에 추가되지 않습니다.<br>
이 API는 길드로서 호출합니다(먼저 Assume이 필요합니다). 적절한 역할 권한을 가진 멤버만 가입 신청을 거부할 수 있습니다.<br>
거부된 플레이어는 길드의 차단 목록(IgnoreUser)에 추가되지 않은 한, 나중에 다시 가입 신청을 보낼 수 있습니다.<br>
가입 신청 상세 화면이나 목록 화면의 "거부" 버튼에 사용합니다.

#### Request

|  | 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 |
| --- | --- | --- | --- | --- | --- | --- |
| namespaceName | string |  | ✓|  |  ~ 128자 | 네임스페이스 이름<br>네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| guildGameSession | GuildGameSession | | ✓|  |  ~ 128자 | GuildGameSession<br>`assume`으로 취득한 GuildGameSession입니다.<br>권한은 `assume`을 호출한 멤버의 역할의 `PolicyDocument`에 따라 결정됩니다.<br>거부하려면 해당 역할의 `PolicyDocument`에 `Gs2Guild:RejectRequest` 권한이 필요합니다. |
| guildModelName | string |  | ✓|  |  ~ 128자 | 길드 모델 이름<br>길드 모델 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| fromUserId | string |  | ✓|  |  ~ 128자 | 사용자ID |

#### Result

|  | 타입 | 설명 |
| --- | --- | --- |
| item | [EzReceiveMemberRequest](#ezreceivememberrequest) | 거부한 참가 요청|

#### 구현 예제




**Unity (UniTask)**
```csharp
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).GuildGameSession(,
        guildGameSession: GuildGameSession
    ).ReceiveMemberRequest(
        guildModelName: null,
        fromUserId: "user-0002"
    );
    var result = await domain.RejectRequestAsync(
    );

```

**Unity (Vanilla)**
```cs
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).GuildGameSession(,
        guildGameSession: GuildGameSession
    ).ReceiveMemberRequest(
        guildModelName: null,
        fromUserId: "user-0002"
    );
    var future = domain.RejectRequestFuture(
    );
    yield return future;
    if (future.Error != null)
    {
        onError.Invoke(future.Error, null);
        yield break;
    }

```

**Unreal Engine 5**
```cpp
    const auto Domain = Gs2->Guild->Namespace(
        "namespace-0001" // namespaceName
    )->GuildGameSession(
        GuildGameSession // GuildGameSession
    )->ReceiveMemberRequest(
        nullptr, // guildModelName
        "user-0002" // fromUserId
    );
    const auto Future = Domain->RejectRequest(
    );
    Future->StartSynchronousTask();
    if (Future->GetTask().IsError())
    {
        return false;
    }
    const auto Result = Future->GetTask().Result();

```

**Godot**
```gdscript

var domain = ez.guild.namespace_(
        "namespace-0001"
    ).guild_game_session(
        null,
        guild_game_session
    ).receive_member_request(
        "user-0002"
    )

var async_result = await domain.reject_request(
    guild_game_session.access_token # access_token
)
if async_result.error != null:
    push_error(str(async_result.error))
    return

var result = async_result.result

```


---

### cancelRequest

플레이어가 전송한 가입 신청을 취소한다<br>

플레이어가 이전에 길드에 보낸, 보류 중인 가입 신청을 취소(철회)합니다.<br>
취소 후 신청은 플레이어의 전송 신청 목록과 길드의 수신 신청 목록 양쪽에서 모두 삭제됩니다.<br>
취소 후에는 같은 길드에 새로운 가입 신청을 다시 보낼 수 있습니다.<br>
신청 중인 요청 상세 화면의 "신청 취소", "요청 철회" 버튼에 사용합니다.

#### Request

|  | 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 |
| --- | --- | --- | --- | --- | --- | --- |
| namespaceName | string |  | ✓|  |  ~ 128자 | 네임스페이스 이름<br>네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| gameSession | GameSession | | ✓|  |  | GameSession |
| guildModelName | string |  | ✓|  |  ~ 128자 | 길드 모델 이름<br>길드 모델 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| targetGuildName | string |  | ✓|  |  ~ 128자 | 대상 길드 이름<br>참가 요청이 송신된 길드의 고유한 이름(UUID)입니다. 사용자가 참가를 요청하고 있는 특정 길드 인스턴스를 식별하며, 요청 처리를 위해 길드의 수신함을 특정하는 데 사용됩니다. |

#### Result

|  | 타입 | 설명 |
| --- | --- | --- |
| item | [EzSendMemberRequest](#ezsendmemberrequest) | 삭제된 참가 요청|

#### 구현 예제




**Unity (UniTask)**
```csharp
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    );
    var result = await domain.CancelRequestAsync(
        guildModelName: "guild-0002",
        targetGuildName: "guild-0002"
    );

```

**Unity (Vanilla)**
```cs
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    );
    var future = domain.CancelRequestFuture(
        guildModelName: "guild-0002",
        targetGuildName: "guild-0002"
    );
    yield return future;
    if (future.Error != null)
    {
        onError.Invoke(future.Error, null);
        yield break;
    }

```

**Unreal Engine 5**
```cpp
    const auto Domain = Gs2->Guild->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        GameSession
    );
    const auto Future = Domain->CancelRequest(
        "guild-0002", // guildModelName
        "guild-0002" // targetGuildName
    );
    Future->StartSynchronousTask();
    if (Future->GetTask().IsError())
    {
        return false;
    }
    const auto Result = Future->GetTask().Result();

```

**Godot**
```gdscript

var domain = ez.guild.namespace_(
        "namespace-0001"
    ).me(game_session)

var async_result = await domain.cancel_request(
    "guild-0002", # guild_model_name
    "guild-0002" # target_guild_name
)
if async_result.error != null:
    push_error(str(async_result.error))
    return

var result = async_result.result

```


---

### getSendRequest

플레이어가 전송한 가입 신청의 상세 정보를 취득한다<br>

플레이어가 길드에 전송한 특정 가입 신청의 상세 정보를 취득합니다.<br>
취득할 수 있는 정보에는 신청 대상 길드와 신청에 첨부된 메타데이터(메시지)가 포함됩니다.<br>
신청 중인 요청의 상세 정보를 표시하는 데 사용합니다. 예를 들어 "드래곤 나이츠에 신청 중 — 메시지: Lv50 힐러"와 "취소" 버튼을 표시하는 화면에 유용합니다.

#### Request

|  | 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 |
| --- | --- | --- | --- | --- | --- | --- |
| namespaceName | string |  | ✓|  |  ~ 128자 | 네임스페이스 이름<br>네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| gameSession | GameSession | | ✓|  |  | GameSession |
| guildModelName | string |  | ✓|  |  ~ 128자 | 길드 모델 이름<br>길드 모델 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| targetGuildName | string |  | ✓|  |  ~ 128자 | 대상 길드 이름<br>참가 요청이 송신된 길드의 고유한 이름(UUID)입니다. 사용자가 참가를 요청하고 있는 특정 길드 인스턴스를 식별하며, 요청 처리를 위해 길드의 수신함을 특정하는 데 사용됩니다. |

#### Result

|  | 타입 | 설명 |
| --- | --- | --- |
| item | [EzSendMemberRequest](#ezsendmemberrequest) | 참가 요청|

#### 구현 예제




**Unity (UniTask)**
```csharp
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).SendMemberRequest(
        guildModelName: "guild-0002",
        guildName: null
    );
    var item = await domain.ModelAsync();

```

**Unity (Vanilla)**
```cs
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).SendMemberRequest(
        guildModelName: "guild-0002",
        guildName: null
    );
    var future = domain.ModelFuture();
    yield return future;
    var item = future.Result;

```

**Unreal Engine 5**
```cpp
    const auto Domain = Gs2->Guild->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        GameSession
    )->SendMemberRequest(
        "guild-0002", // guildModelName
        nullptr // guildName
    );
    const auto Future = Domain->Model();
    Future->StartSynchronousTask();
    if (Future->GetTask().IsError())
    {
        return false;
    }

```

**Godot**
```gdscript

var domain = ez.guild.namespace_(
        "namespace-0001"
    ).me(game_session).send_member_request(
        "guild-0002",
        null
    )

var async_result = await domain.model()
if async_result.error != null:
    push_error(str(async_result.error))
    return

var result = async_result.result

```


##### 값 변경 이벤트 핸들링




**Unity (UniTask)**
```csharp
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).SendMemberRequest(
        guildModelName: "guild-0002",
        guildName: null
    );
    
    // 이벤트 핸들링 시작
    var callbackId = domain.Subscribe(
        value => {
            // 값이 변화했을 때 호출됨
            // value에는 변경 후의 값이 전달됨
        }
    );

    // 이벤트 핸들링 정지
    domain.Unsubscribe(callbackId);

```

**Unity (Vanilla)**
```cs
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).SendMemberRequest(
        guildModelName: "guild-0002",
        guildName: null
    );
    
    // 이벤트 핸들링 시작
    var callbackId = domain.Subscribe(
        value => {
            // 값이 변화했을 때 호출됨
            // value에는 변경 후의 값이 전달됨
        }
    );

    // 이벤트 핸들링 정지
    domain.Unsubscribe(callbackId);

```

**Unreal Engine 5**
```cpp
    const auto Domain = Gs2->Guild->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        GameSession
    )->SendMemberRequest(
        "guild-0002", // guildModelName
        nullptr // guildName
    );
    
    // 이벤트 핸들링 시작
    const auto CallbackId = Domain->Subscribe(
        [](TSharedPtr<Gs2::Guild::Model::FSendMemberRequest> value) {
            // 값이 변화했을 때 호출됨
            // value에는 변경 후의 값이 전달됨
        }
    );

    // 이벤트 핸들링 정지
    Domain->Unsubscribe(CallbackId);

```

**Godot**
```gdscript

var domain = ez.guild.namespace_(
        "namespace-0001"
    ).me(game_session).send_member_request(
        "guild-0002",
        null
    )

# 이벤트 핸들링 시작
var callback_id = domain.subscribe_model(func(value):
    # 값이 변화했을 때 호출됨
    # value에는 변경 후의 값이 전달됩니다
    pass
)

# 이벤트 핸들링 정지
domain.unsubscribe_model(callback_id)

```


**⚠️ Warning**

이 이벤트는 SDK가 가진 로컬 캐시의 값이 변경되었을 때 호출됩니다.

로컬 캐시는 SDK가 가진 API의 실행, 또는 GS2-Gateway의 알림을 활성화한 GS2-Distributor를 통한 스탬프 시트의 실행, 또는 GS2-Gateway의 알림을 활성화한 GS2-JobQueue의 실행에 의해 변화한 것만이 대상이 됩니다.

따라서 이 방법 이외로 값이 변경된 경우 콜백은 호출되지 않습니다.

---

### listSendRequests

플레이어가 전송한 가입 신청 목록을 취득한다<br>

플레이어가 각 길드에 전송한, 아직 보류 중인 가입 신청을 모두 취득합니다.<br>
각 항목에는 신청을 보낸 길드와 신청에 첨부된 메타데이터(메시지)가 포함됩니다.<br>
"신청 중", "보류 중인 신청" 화면을 구성하는 데 사용합니다. 예를 들어 "드래곤 나이츠에 신청 중(보류), 스타 얼라이언스에 신청 중(보류)"와 같은 표시에 유용합니다.

#### Request

|  | 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 |
| --- | --- | --- | --- | --- | --- | --- |
| namespaceName | string |  | ✓|  |  ~ 128자 | 네임스페이스 이름<br>네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| gameSession | GameSession | | ✓|  |  | GameSession |
| guildModelName | string |  | ✓|  |  ~ 128자 | 길드 모델 이름<br>길드 모델 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| pageToken | string |  | |  |  ~ 1024자 | 데이터 취득을 시작할 위치를 지정하는 토큰 |
| limit | int |  | | 30 | 1 ~ 1000 | 취득할 데이터 건수 |

#### Result

|  | 타입 | 설명 |
| --- | --- | --- |
| items | [List&lt;EzSendMemberRequest&gt;](#ezsendmemberrequest) | 참가 요청 목록|
| nextPageToken | string | 목록의 나머지를 취득하기 위한 페이지 토큰|

#### 구현 예제




**Unity (UniTask)**
```csharp
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    );
    var items = await domain.SendRequestsAsync(
        guildModelName: "guild-0002"
    ).ToListAsync();

```

**Unity (Vanilla)**
```cs
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    );
    var it = domain.SendRequests(
        guildModelName: "guild-0002"
    );
    List<EzSendMemberRequest> items = new List<EzSendMemberRequest>();
    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;
        }
    }

```

**Unreal Engine 5**
```cpp
    const auto Domain = Gs2->Guild->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        GameSession
    );
    const auto It = Domain->SendRequests(
        "guild-0002" // guildModelName
    );
    TArray<Gs2::UE5::Guild::Model::FEzSendMemberRequestPtr> Result;
    for (auto Item : *It)
    {
        if (Item.IsError())
        {
            return false;
        }
        Result.Add(Item.Current());
    }

```


---

### sendRequest

길드에 가입 신청을 전송한다<br>

지정한 길드에 가입 신청을 전송합니다. 길드의 가입 방식이 "자유 가입"인 경우 즉시 가입되며, "승인제"인 경우 길드의 수신함에 심사 대기 상태로 전달됩니다.<br>
신청에 메타데이터(예: "Lv50 힐러, 레이드 그룹을 찾고 있습니다" 같은 메시지)를 첨부할 수 있습니다.<br>
플레이어가 길드의 차단 목록(IgnoreUser)에 등록되어 있는 경우 신청은 자동으로 거부됩니다.<br>
길드 상세 화면의 "가입 신청", "참가 신청" 버튼에 사용합니다.

#### Request

|  | 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 |
| --- | --- | --- | --- | --- | --- | --- |
| namespaceName | string |  | ✓|  |  ~ 128자 | 네임스페이스 이름<br>네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| gameSession | GameSession | | ✓|  |  | GameSession |
| guildModelName | string |  | ✓|  |  ~ 128자 | 길드 모델 이름<br>길드 모델 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| targetGuildName | string |  | ✓|  |  ~ 128자 | 전송 대상 길드 이름 |
| metadata | string |  | |  |  ~ 512자 | 길드 멤버의 메타데이터<br>GS2의 동작에 영향을 주지 않는, 이 길드 멤버와 연결된 임의의 데이터입니다. 공헌 포인트, 마지막 로그인 시간, 길드 임원에게 표시되는 메모 등 멤버 고유의 정보를 저장하는 데 사용할 수 있습니다. |

#### Result

|  | 타입 | 설명 |
| --- | --- | --- |
| item | [EzGuild](#ezguild) | 참가한 길드<br>승인이 필요하지 않은 길드에 참가했을 때 응답됩니다|
| sendMemberRequest | [EzSendMemberRequest](#ezsendmemberrequest) | 보낸 참가 요청<br>승인이 필요한 길드에 참가 요청을 보냈을 때 응답됩니다|

#### Error

이 API에는 특별한 예외가 정의되어 있습니다.<br>
GS2-SDK for Game Engine에서는 게임 내에서 핸들링이 필요할 것으로 예상되는 에러를, 일반적인 예외에서 파생된 특수화된 예외로 제공하여 다루기 쉽게 하고 있습니다.<br>
일반적인 에러의 종류와 핸들링 방법은 [여기]() 문서를 참고해 주세요.

| 타입 | 베이스 클래스 | 설명 |
| --- | --- | --- |
| MaximumMembersReachedException | BadRequestException | 멤버 수가 상한에 도달했습니다. |
| MaximumJoinedGuildsReachedException | BadRequestException | 길드 동시 참가 수가 최댓값에 도달했습니다. |
| MaximumReceiveRequestsReachedException | BadRequestException | 길드에 대한 참가 요청 수가 상한에 도달했습니다. |
| MaximumSendRequestsReachedException | BadRequestException | 자신이 보낸 참가 요청 수가 상한에 도달했습니다. |
| DotMeetJoinRequirementsException | BadRequestException | 길드 참가 조건을 충족하지 않습니다. |

#### 구현 예제




**Unity (UniTask)**
```csharp

try {
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    );
    var result = await domain.SendRequestAsync(
        guildModelName: "guild-0002",
        targetGuildName: "guild-0002",
        metadata: null
    );
    var item = await result.ModelAsync();
} catch(Gs2.Gs2Guild.Exception.MaximumMembersReachedException e) {
    // The number of members has reached the upper limit.
} catch(Gs2.Gs2Guild.Exception.MaximumJoinedGuildsReachedException e) {
    // The number of guilds you can join at the same time has reached the upper limit.
} catch(Gs2.Gs2Guild.Exception.MaximumReceiveRequestsReachedException e) {
    // The number of requests to join the guild has reached the upper limit.
} catch(Gs2.Gs2Guild.Exception.MaximumSendRequestsReachedException e) {
    // You have reached the maximum number of requests you can send.
} catch(Gs2.Gs2Guild.Exception.DotMeetJoinRequirementsException e) {
    // You do not meet the requirements to join the guild.
}

```

**Unity (Vanilla)**
```cs
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    );
    var future = domain.SendRequestFuture(
        guildModelName: "guild-0002",
        targetGuildName: "guild-0002",
        metadata: null
    );
    yield return future;
    if (future.Error != null)
    {
        if (future.Error is Gs2.Gs2Guild.Exception.MaximumMembersReachedException)
        {
            // The number of members has reached the upper limit.
        }
        if (future.Error is Gs2.Gs2Guild.Exception.MaximumJoinedGuildsReachedException)
        {
            // The number of guilds you can join at the same time has reached the upper limit.
        }
        if (future.Error is Gs2.Gs2Guild.Exception.MaximumReceiveRequestsReachedException)
        {
            // The number of requests to join the guild has reached the upper limit.
        }
        if (future.Error is Gs2.Gs2Guild.Exception.MaximumSendRequestsReachedException)
        {
            // You have reached the maximum number of requests you can send.
        }
        if (future.Error is Gs2.Gs2Guild.Exception.DotMeetJoinRequirementsException)
        {
            // You do not meet the requirements to join the guild.
        }
        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;

```

**Unreal Engine 5**
```cpp
    const auto Domain = Gs2->Guild->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        GameSession
    );
    const auto Future = Domain->SendRequest(
        "guild-0002", // guildModelName
        "guild-0002" // targetGuildName
        // metadata
    );
    Future->StartSynchronousTask();
    if (Future->GetTask().IsError())
    {
        auto e = Future->GetTask().Error();
        if (e->IsChildOf(Gs2::Guild::Error::FMaximumMembersReachedError::Class))
        {
            // The number of members has reached the upper limit.
        }
        if (e->IsChildOf(Gs2::Guild::Error::FMaximumJoinedGuildsReachedError::Class))
        {
            // The number of guilds you can join at the same time has reached the upper limit.
        }
        if (e->IsChildOf(Gs2::Guild::Error::FMaximumReceiveRequestsReachedError::Class))
        {
            // The number of requests to join the guild has reached the upper limit.
        }
        if (e->IsChildOf(Gs2::Guild::Error::FMaximumSendRequestsReachedError::Class))
        {
            // You have reached the maximum number of requests you can send.
        }
        if (e->IsChildOf(Gs2::Guild::Error::FDotMeetJoinRequirementsError::Class))
        {
            // You do not meet the requirements to join the guild.
        }
        return false;
    }

    // 변경된 값 / 결과 값을 취득
    const auto Future2 = Future->GetTask().Result()->Model();
    Future2->StartSynchronousTask();
    if (Future2->GetTask().IsError())
    {
        return Future2->GetTask().Error();
    }
    const auto Result = Future2->GetTask().Result();

```

**Godot**
```gdscript

var domain = ez.guild.namespace_(
        "namespace-0001"
    ).me(game_session)

var async_result = await domain.send_request(
    "guild-0002", # guild_model_name
    "guild-0002", # target_guild_name
    null # metadata
)
if async_result.error != null:
    if async_result.error is Gs2GuildMaximumMembersReachedException:
        # 멤버 수가 상한에 도달했습니다.
        pass
    if async_result.error is Gs2GuildMaximumJoinedGuildsReachedException:
        # 길드 동시 참가 수가 최댓값에 도달했습니다.
        pass
    if async_result.error is Gs2GuildMaximumReceiveRequestsReachedException:
        # 길드에 대한 참가 요청 수가 상한에 도달했습니다.
        pass
    if async_result.error is Gs2GuildMaximumSendRequestsReachedException:
        # 자신이 보낸 참가 요청 수가 상한에 도달했습니다.
        pass
    if async_result.error is Gs2GuildDotMeetJoinRequirementsException:
        # 길드 참가 조건을 충족하지 않습니다.
        pass
    push_error(str(async_result.error))
    return

var result = async_result.result

```


---

### getJoinedGuild

플레이어가 소속된 특정 길드의 상세 정보를 취득한다<br>

플레이어가 가입한 특정 길드의 멤버십 상세 정보를 취득합니다.<br>
취득할 수 있는 정보에는 길드 이름, 플레이어의 역할, 가입일, 멤버십 메타데이터가 포함됩니다.<br>
특정 길드에서의 플레이어 멤버십 정보를 표시하는 데 사용합니다. 예를 들어 "가입일: 2024-01-15, 역할: 부길드장, 메모: 탱커 메인"과 같이 표시할 수 있습니다.

#### Request

|  | 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 |
| --- | --- | --- | --- | --- | --- | --- |
| namespaceName | string |  | ✓|  |  ~ 128자 | 네임스페이스 이름<br>네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| gameSession | GameSession | | ✓|  |  | GameSession |
| guildModelName | string |  | ✓|  |  ~ 128자 | 길드 모델 이름<br>길드 모델 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| guildName | string |  | ✓| UUID |  ~ 36자 | 길드명<br>길드의 고유한 이름을 유지합니다.<br>이름은 UUID(Universally Unique Identifier) 형식으로 자동 생성되며, 각 길드를 식별하는 데 사용됩니다. |

#### Result

|  | 타입 | 설명 |
| --- | --- | --- |
| item | [EzJoinedGuild](#ezjoinedguild) | 참가 중인 길드|

#### 구현 예제




**Unity (UniTask)**
```csharp
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).JoinedGuild(
        guildModelName: "guild-model-0001",
        guildName: "guild-0001"
    );
    var item = await domain.ModelAsync();

```

**Unity (Vanilla)**
```cs
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).JoinedGuild(
        guildModelName: "guild-model-0001",
        guildName: "guild-0001"
    );
    var future = domain.ModelFuture();
    yield return future;
    var item = future.Result;

```

**Unreal Engine 5**
```cpp
    const auto Domain = Gs2->Guild->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        GameSession
    )->JoinedGuild(
        "guild-model-0001", // guildModelName
        "guild-0001" // guildName
    );
    const auto Future = Domain->Model();
    Future->StartSynchronousTask();
    if (Future->GetTask().IsError())
    {
        return false;
    }

```

**Godot**
```gdscript

var domain = ez.guild.namespace_(
        "namespace-0001"
    ).me(game_session).joined_guild(
        "guild-model-0001",
        "guild-0001"
    )

var async_result = await domain.model()
if async_result.error != null:
    push_error(str(async_result.error))
    return

var result = async_result.result

```


##### 값 변경 이벤트 핸들링




**Unity (UniTask)**
```csharp
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).JoinedGuild(
        guildModelName: "guild-model-0001",
        guildName: "guild-0001"
    );
    
    // 이벤트 핸들링 시작
    var callbackId = domain.Subscribe(
        value => {
            // 값이 변화했을 때 호출됨
            // value에는 변경 후의 값이 전달됨
        }
    );

    // 이벤트 핸들링 정지
    domain.Unsubscribe(callbackId);

```

**Unity (Vanilla)**
```cs
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).JoinedGuild(
        guildModelName: "guild-model-0001",
        guildName: "guild-0001"
    );
    
    // 이벤트 핸들링 시작
    var callbackId = domain.Subscribe(
        value => {
            // 값이 변화했을 때 호출됨
            // value에는 변경 후의 값이 전달됨
        }
    );

    // 이벤트 핸들링 정지
    domain.Unsubscribe(callbackId);

```

**Unreal Engine 5**
```cpp
    const auto Domain = Gs2->Guild->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        GameSession
    )->JoinedGuild(
        "guild-model-0001", // guildModelName
        "guild-0001" // guildName
    );
    
    // 이벤트 핸들링 시작
    const auto CallbackId = Domain->Subscribe(
        [](TSharedPtr<Gs2::Guild::Model::FJoinedGuild> value) {
            // 값이 변화했을 때 호출됨
            // value에는 변경 후의 값이 전달됨
        }
    );

    // 이벤트 핸들링 정지
    Domain->Unsubscribe(CallbackId);

```

**Godot**
```gdscript

var domain = ez.guild.namespace_(
        "namespace-0001"
    ).me(game_session).joined_guild(
        "guild-model-0001",
        "guild-0001"
    )

# 이벤트 핸들링 시작
var callback_id = domain.subscribe_model(func(value):
    # 값이 변화했을 때 호출됨
    # value에는 변경 후의 값이 전달됩니다
    pass
)

# 이벤트 핸들링 정지
domain.unsubscribe_model(callback_id)

```


**⚠️ Warning**

이 이벤트는 SDK가 가진 로컬 캐시의 값이 변경되었을 때 호출됩니다.

로컬 캐시는 SDK가 가진 API의 실행, 또는 GS2-Gateway의 알림을 활성화한 GS2-Distributor를 통한 스탬프 시트의 실행, 또는 GS2-Gateway의 알림을 활성화한 GS2-JobQueue의 실행에 의해 변화한 것만이 대상이 됩니다.

따라서 이 방법 이외로 값이 변경된 경우 콜백은 호출되지 않습니다.

---

### listJoinedGuilds

플레이어가 소속된 길드 목록을 취득한다<br>

플레이어가 현재 멤버로 소속되어 있는 모든 길드를 취득합니다.<br>
길드 모델 이름으로 필터링할 수도 있습니다. 생략하면 모든 유형의 길드가 반환됩니다.<br>
각 항목에는 길드 이름, 가입 일시, 현재 역할이 포함됩니다.<br>
"내 길드" 화면을 구성하여 플레이어의 길드 소속 현황을 표시하는 데 사용합니다. 예를 들어 "드래곤 나이츠(부길드장), 스타 얼라이언스(멤버)"와 같이 표시할 수 있습니다.

#### Request

|  | 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 |
| --- | --- | --- | --- | --- | --- | --- |
| namespaceName | string |  | ✓|  |  ~ 128자 | 네임스페이스 이름<br>네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| gameSession | GameSession | | ✓|  |  | GameSession |
| guildModelName | string |  | |  |  ~ 128자 | 길드 모델 이름<br>길드 모델 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| pageToken | string |  | |  |  ~ 1024자 | 데이터 취득을 시작할 위치를 지정하는 토큰 |
| limit | int |  | | 30 | 1 ~ 1000 | 취득할 데이터 건수 |

#### Result

|  | 타입 | 설명 |
| --- | --- | --- |
| items | [List&lt;EzJoinedGuild&gt;](#ezjoinedguild) | 참가 중인 길드|
| nextPageToken | string | 목록의 나머지를 취득하기 위한 페이지 토큰|

#### 구현 예제




**Unity (UniTask)**
```csharp
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    );
    var items = await domain.JoinedGuildsAsync(
        guildModelName: "guild-model-0001"
    ).ToListAsync();

```

**Unity (Vanilla)**
```cs
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    );
    var it = domain.JoinedGuilds(
        guildModelName: "guild-model-0001"
    );
    List<EzJoinedGuild> items = new List<EzJoinedGuild>();
    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;
        }
    }

```

**Unreal Engine 5**
```cpp
    const auto Domain = Gs2->Guild->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        GameSession
    );
    const auto It = Domain->JoinedGuilds(
        "guild-model-0001" // guildModelName
    );
    TArray<Gs2::UE5::Guild::Model::FEzJoinedGuildPtr> Result;
    for (auto Item : *It)
    {
        if (Item.IsError())
        {
            return false;
        }
        Result.Add(Item.Current());
    }

```


##### 값 변경 이벤트 핸들링




**Unity (UniTask)**
```csharp
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    );
    
    // 이벤트 핸들링 시작
    var callbackId = domain.SubscribeJoinedGuilds(
        () => {
            // 리스트의 요소가 변화했을 때 호출됨
        }
    );

    // 이벤트 핸들링 정지
    domain.UnsubscribeJoinedGuilds(callbackId);

```

**Unity (Vanilla)**
```cs
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    );
    
    // 이벤트 핸들링 시작
    var callbackId = domain.SubscribeJoinedGuilds(
        () => {
            // 리스트의 요소가 변화했을 때 호출됨
        }
    );

    // 이벤트 핸들링 정지
    domain.UnsubscribeJoinedGuilds(callbackId);

```

**Unreal Engine 5**
```cpp
    const auto Domain = Gs2->Guild->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        GameSession
    );
    
    // 이벤트 핸들링 시작
    const auto CallbackId = Domain->SubscribeJoinedGuilds(
        []() {
            // 리스트의 요소가 변화했을 때 호출됨
        }
    );

    // 이벤트 핸들링 정지
    Domain->UnsubscribeJoinedGuilds(CallbackId);

```


**⚠️ Warning**

이 이벤트는 SDK가 가진 로컬 캐시의 값이 변경되었을 때 호출됩니다.

로컬 캐시는 SDK가 가진 API의 실행, 또는 GS2-Gateway의 알림을 활성화한 GS2-Distributor를 통한 스탬프 시트의 실행, 또는 GS2-Gateway의 알림을 활성화한 GS2-JobQueue의 실행에 의해 변화한 것만이 대상이 됩니다.

따라서 이 방법 이외로 값이 변경된 경우 콜백은 호출되지 않습니다.

---

### updateMemberMetadata

길드 내 자신의 멤버 메타데이터를 갱신한다<br>

길드 내에서 플레이어 자신의 메타데이터를 갱신합니다. 메타데이터는 자유 형식의 텍스트로, 멤버 고유의 정보를 무엇이든 저장할 수 있습니다.<br>
예를 들어 희망 역할("힐러"), 자기소개("레이드 동료 모집 중"), 플레이 스타일 설정 등을 저장할 수 있습니다.<br>
자기 자신의 메타데이터만 갱신할 수 있으며, 다른 멤버의 메타데이터는 변경할 수 없습니다.<br>
"길드 내 프로필 편집" 기능에 사용합니다. 멤버가 길드 내에서의 상태나 메모를 설정하는 화면에 유용합니다.

#### Request

|  | 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 |
| --- | --- | --- | --- | --- | --- | --- |
| namespaceName | string |  | ✓|  |  ~ 128자 | 네임스페이스 이름<br>네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| guildModelName | string |  | ✓|  |  ~ 128자 | 길드 모델 이름<br>길드 모델 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| guildName | string |  | ✓| UUID |  ~ 36자 | 길드명<br>길드의 고유한 이름을 유지합니다.<br>이름은 UUID(Universally Unique Identifier) 형식으로 자동 생성되며, 각 길드를 식별하는 데 사용됩니다. |
| gameSession | GameSession | | ✓|  |  | GameSession |
| metadata | string |  | |  |  ~ 512자 | 길드 멤버의 메타데이터<br>GS2의 동작에 영향을 주지 않는, 이 길드 멤버와 연결된 임의의 데이터입니다. 공헌 포인트, 마지막 로그인 시간, 길드 임원에게 표시되는 메모 등 멤버 고유의 정보를 저장하는 데 사용할 수 있습니다. |

#### Result

|  | 타입 | 설명 |
| --- | --- | --- |
| item | [EzGuild](#ezguild) | 업데이트한 길드|

#### 구현 예제




**Unity (UniTask)**
```csharp
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).JoinedGuild(
        guildModelName: "guild-model-0001",
        guildName: "guild-0001"
    );
    var result = await domain.UpdateMemberMetadataAsync(
        metadata: "metadata-0001"
    );
    var item = await result.ModelAsync();

```

**Unity (Vanilla)**
```cs
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).JoinedGuild(
        guildModelName: "guild-model-0001",
        guildName: "guild-0001"
    );
    var future = domain.UpdateMemberMetadataFuture(
        metadata: "metadata-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;

```

**Unreal Engine 5**
```cpp
    const auto Domain = Gs2->Guild->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        GameSession
    )->JoinedGuild(
        "guild-model-0001", // guildModelName
        "guild-0001" // guildName
    );
    const auto Future = Domain->UpdateMemberMetadata(
        "metadata-0001" // metadata
    );
    Future->StartSynchronousTask();
    if (Future->GetTask().IsError())
    {
        return false;
    }

    // 변경된 값 / 결과 값을 취득
    const auto Future2 = Future->GetTask().Result()->Model();
    Future2->StartSynchronousTask();
    if (Future2->GetTask().IsError())
    {
        return Future2->GetTask().Error();
    }
    const auto Result = Future2->GetTask().Result();

```

**Godot**
```gdscript

var domain = ez.guild.namespace_(
        "namespace-0001"
    ).me(game_session).joined_guild(
        "guild-model-0001",
        "guild-0001"
    )

var async_result = await domain.update_member_metadata(
    "metadata-0001" # metadata
)
if async_result.error != null:
    push_error(str(async_result.error))
    return

var result = async_result.result

```


---

### withdrawGuild

길드에서 자발적으로 탈퇴하기<br>

플레이어가 현재 소속되어 있는 길드에서 탈퇴합니다. 탈퇴 후 플레이어는 길드의 멤버 목록에서 삭제됩니다.<br>
어떤 멤버든 자신의 의지로 탈퇴할 수 있습니다. 길드 마스터의 승인은 필요하지 않습니다.<br>
주의: 길드 모델에 재가입 쿨다운이 설정되어 있는 경우, 쿨다운 기간이 지날 때까지 동일한 길드에 재가입할 수 없습니다.<br>
길드 상세 화면이나 설정 화면의 "길드 탈퇴" 버튼에 사용합니다. 재가입 시 쿨다운이 있을 수 있으므로 확인 대화상자 표시를 권장합니다.

#### Request

|  | 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 |
| --- | --- | --- | --- | --- | --- | --- |
| namespaceName | string |  | ✓|  |  ~ 128자 | 네임스페이스 이름<br>네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| gameSession | GameSession | | ✓|  |  | GameSession |
| guildModelName | string |  | ✓|  |  ~ 128자 | 길드 모델 이름<br>길드 모델 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| guildName | string |  | ✓| UUID |  ~ 36자 | 길드명<br>길드의 고유한 이름을 유지합니다.<br>이름은 UUID(Universally Unique Identifier) 형식으로 자동 생성되며, 각 길드를 식별하는 데 사용됩니다. |

#### Result

|  | 타입 | 설명 |
| --- | --- | --- |
| item | [EzJoinedGuild](#ezjoinedguild) | 탈퇴한 길드|
| guild | [EzGuild](#ezguild) | 길드|

#### Error

이 API에는 특별한 예외가 정의되어 있습니다.<br>
GS2-SDK for Game Engine에서는 게임 내에서 핸들링이 필요할 것으로 예상되는 에러를, 일반적인 예외에서 파생된 특수화된 예외로 제공하여 다루기 쉽게 하고 있습니다.<br>
일반적인 에러의 종류와 핸들링 방법은 [여기]() 문서를 참고해 주세요.

| 타입 | 베이스 클래스 | 설명 |
| --- | --- | --- |
| GuildMasterRequiredException | BadRequestException | 길드 마스터 권한을 가진 멤버가 최소 1명 필요합니다. |

#### 구현 예제




**Unity (UniTask)**
```csharp

try {
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).JoinedGuild(
        guildModelName: "guild-model-0001",
        guildName: "guild-0001"
    );
    var result = await domain.WithdrawGuildAsync(
    );
    var item = await result.ModelAsync();
} catch(Gs2.Gs2Guild.Exception.GuildMasterRequiredException e) {
    // At least one member with guild master privileges is required.
}

```

**Unity (Vanilla)**
```cs
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).JoinedGuild(
        guildModelName: "guild-model-0001",
        guildName: "guild-0001"
    );
    var future = domain.WithdrawGuildFuture(
    );
    yield return future;
    if (future.Error != null)
    {
        if (future.Error is Gs2.Gs2Guild.Exception.GuildMasterRequiredException)
        {
            // At least one member with guild master privileges is required.
        }
        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;

```

**Unreal Engine 5**
```cpp
    const auto Domain = Gs2->Guild->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        GameSession
    )->JoinedGuild(
        "guild-model-0001", // guildModelName
        "guild-0001" // guildName
    );
    const auto Future = Domain->WithdrawGuild(
    );
    Future->StartSynchronousTask();
    if (Future->GetTask().IsError())
    {
        auto e = Future->GetTask().Error();
        if (e->IsChildOf(Gs2::Guild::Error::FGuildMasterRequiredError::Class))
        {
            // At least one member with guild master privileges is required.
        }
        return false;
    }

    // 변경된 값 / 결과 값을 취득
    const auto Future2 = Future->GetTask().Result()->Model();
    Future2->StartSynchronousTask();
    if (Future2->GetTask().IsError())
    {
        return Future2->GetTask().Error();
    }
    const auto Result = Future2->GetTask().Result();

```

**Godot**
```gdscript

var domain = ez.guild.namespace_(
        "namespace-0001"
    ).me(game_session).joined_guild(
        "guild-model-0001",
        "guild-0001"
    )

var async_result = await domain.withdraw_guild(
)
if async_result.error != null:
    if async_result.error is Gs2GuildGuildMasterRequiredException:
        # 길드 마스터 권한을 가진 멤버가 최소 1명 필요합니다.
        pass
    push_error(str(async_result.error))
    return

var result = async_result.result

```


---

### addIgnoreUser

플레이어의 길드 참가를 차단한다<br>

플레이어를 길드의 차단 목록에 추가합니다. 차단되면 해당 플레이어는 이 길드에 참가 요청을 보낼 수 없게 되고, 이후의 요청은 자동으로 거부됩니다.<br>
이 API는 길드로서 호출합니다(먼저 Assume이 필요합니다). 적절한 역할 권한을 가진 멤버만 차단 목록을 관리할 수 있습니다.<br>
'차단' 버튼에 사용합니다. 예를 들어, 문제가 있는 멤버를 제명한 후 재가입 요청을 방지하려는 경우에 유용합니다.

#### Request

|  | 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 |
| --- | --- | --- | --- | --- | --- | --- |
| namespaceName | string |  | ✓|  |  ~ 128자 | 네임스페이스 이름<br>네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| guildModelName | string |  | ✓|  |  ~ 128자 | 길드 모델 이름<br>길드 모델 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| guildGameSession | GuildGameSession | | ✓|  |  ~ 128자 | GuildGameSession<br>`assume`으로 취득한 GuildGameSession입니다.<br>권한은 `assume`을 호출한 멤버의 역할의 `PolicyDocument`에 따라 결정됩니다.<br>추가하려면 해당 역할의 `PolicyDocument`에 `Gs2Guild:AddIgnoreUser` 권한이 필요합니다. |
| userId | string |  | ✓|  |  ~ 128자 | 사용자ID |

#### Result

|  | 타입 | 설명 |
| --- | --- | --- |
| item | [EzIgnoreUser](#ezignoreuser) | 참가를 거부하는 사용자 ID|
| guild | [EzGuild](#ezguild) | 길드|

#### 구현 예제




**Unity (UniTask)**
```csharp
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).GuildGameSession(
        guildModelName: "guild-model-0001",
        guildGameSession: GuildGameSession
    );
    var result = await domain.AddIgnoreUserAsync(
        userId: "user-0001"
    );
    var item = await result.ModelAsync();

```

**Unity (Vanilla)**
```cs
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).GuildGameSession(
        guildModelName: "guild-model-0001",
        guildGameSession: GuildGameSession
    );
    var future = domain.AddIgnoreUserFuture(
        userId: "user-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;

```

**Unreal Engine 5**
```cpp
    const auto Domain = Gs2->Guild->Namespace(
        "namespace-0001" // namespaceName
    )->GuildGameSession(
        "guild-model-0001", // guildModelName
        GuildGameSession // GuildGameSession
    );
    const auto Future = Domain->AddIgnoreUser(
        "user-0001" // userId
    );
    Future->StartSynchronousTask();
    if (Future->GetTask().IsError())
    {
        return false;
    }

    // 변경된 값 / 결과 값을 취득
    const auto Future2 = Future->GetTask().Result()->Model();
    Future2->StartSynchronousTask();
    if (Future2->GetTask().IsError())
    {
        return Future2->GetTask().Error();
    }
    const auto Result = Future2->GetTask().Result();

```

**Godot**
```gdscript

var domain = ez.guild.namespace_(
        "namespace-0001"
    ).guild_game_session(
        "guild-model-0001",
        guild_game_session
    )

var async_result = await domain.add_ignore_user(
    guild_game_session.access_token, # access_token
    "user-0001" # user_id
)
if async_result.error != null:
    push_error(str(async_result.error))
    return

var result = async_result.result

```


---

### deleteIgnoreUser

길드의 차단 목록에서 플레이어를 해제한다<br>

플레이어를 길드의 차단 목록에서 삭제합니다. 차단 해제 후, 그 플레이어는 다시 이 길드에 참가 요청을 보낼 수 있게 됩니다.<br>
이 API는 길드로서 호출합니다(먼저 Assume이 필요합니다). 적절한 역할 권한을 가진 멤버만 차단 목록을 관리할 수 있습니다.<br>
차단 중인 플레이어 관리 화면의 '차단 해제' 버튼에 사용합니다.

#### Request

|  | 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 |
| --- | --- | --- | --- | --- | --- | --- |
| namespaceName | string |  | ✓|  |  ~ 128자 | 네임스페이스 이름<br>네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| guildModelName | string |  | ✓|  |  ~ 128자 | 길드 모델 이름<br>길드 모델 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| guildGameSession | GuildGameSession | | ✓|  |  ~ 128자 | GuildGameSession<br>`assume`으로 취득한 GuildGameSession입니다.<br>권한은 `assume`을 호출한 멤버의 역할의 `PolicyDocument`에 따라 결정됩니다.<br>삭제하려면 해당 역할의 `PolicyDocument`에 `Gs2Guild:DeleteIgnoreUser` 권한이 필요합니다. |
| userId | string |  | ✓|  |  ~ 128자 | 사용자ID |

#### Result

|  | 타입 | 설명 |
| --- | --- | --- |
| item | [EzIgnoreUser](#ezignoreuser) | 참가를 거부하는 사용자 ID|

#### 구현 예제




**Unity (UniTask)**
```csharp
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).GuildGameSession(
        guildModelName: "guild-model-0001",
        guildGameSession: GuildGameSession
    ).IgnoreUser(
    );
    var result = await domain.DeleteIgnoreUserAsync(
        userId: "user-0001"
    );

```

**Unity (Vanilla)**
```cs
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).GuildGameSession(
        guildModelName: "guild-model-0001",
        guildGameSession: GuildGameSession
    ).IgnoreUser(
    );
    var future = domain.DeleteIgnoreUserFuture(
        userId: "user-0001"
    );
    yield return future;
    if (future.Error != null)
    {
        onError.Invoke(future.Error, null);
        yield break;
    }

```

**Unreal Engine 5**
```cpp
    const auto Domain = Gs2->Guild->Namespace(
        "namespace-0001" // namespaceName
    )->GuildGameSession(
        "guild-model-0001", // guildModelName
        GuildGameSession // GuildGameSession
    )->IgnoreUser(
    );
    const auto Future = Domain->DeleteIgnoreUser(
        "user-0001" // userId
    );
    Future->StartSynchronousTask();
    if (Future->GetTask().IsError())
    {
        return false;
    }
    const auto Result = Future->GetTask().Result();

```

**Godot**
```gdscript

var domain = ez.guild.namespace_(
        "namespace-0001"
    ).guild_game_session(
        "guild-model-0001",
        guild_game_session
    ).ignore_user(
    )

var async_result = await domain.delete_ignore_user(
    guild_game_session.access_token, # access_token
    "user-0001" # user_id
)
if async_result.error != null:
    push_error(str(async_result.error))
    return

var result = async_result.result

```


---

### getIgnoreUser

특정 플레이어가 길드의 차단 목록에 등록되어 있는지 확인한다<br>

특정 플레이어가 이 길드에 참가하는 것이 차단되어 있는지 확인합니다.<br>
이 API는 길드로서 호출합니다(먼저 Assume이 필요합니다).<br>
'차단'/'차단 해제' 버튼을 표시하기 전에 플레이어의 차단 상태를 확인하는 데 사용합니다. 예를 들어, 멤버 관리 화면이나 플레이어 프로필 화면에서 활용할 수 있습니다.

#### Request

|  | 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 |
| --- | --- | --- | --- | --- | --- | --- |
| namespaceName | string |  | ✓|  |  ~ 128자 | 네임스페이스 이름<br>네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| guildModelName | string |  | ✓|  |  ~ 128자 | 길드 모델 이름<br>길드 모델 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| guildGameSession | GuildGameSession | | ✓|  |  ~ 128자 | GuildGameSession<br>`assume`으로 취득한 GuildGameSession입니다.<br>권한은 `assume`을 호출한 멤버의 역할의 `PolicyDocument`에 따라 결정됩니다.<br>취득하려면 해당 역할의 `PolicyDocument`에 `Gs2Guild:GetIgnoreUser` 권한이 필요합니다. |
| userId | string |  | ✓|  |  ~ 128자 | 사용자ID |

#### Result

|  | 타입 | 설명 |
| --- | --- | --- |
| item | [EzIgnoreUser](#ezignoreuser) | 참가를 거부하는 사용자 ID|

#### 구현 예제




**Unity (UniTask)**
```csharp
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).GuildGameSession(
        guildModelName: "guild-model-0001",
        guildGameSession: GuildGameSession
    ).IgnoreUser(
    );
    var item = await domain.ModelAsync();

```

**Unity (Vanilla)**
```cs
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).GuildGameSession(
        guildModelName: "guild-model-0001",
        guildGameSession: GuildGameSession
    ).IgnoreUser(
    );
    var future = domain.ModelFuture();
    yield return future;
    var item = future.Result;

```

**Unreal Engine 5**
```cpp
    const auto Domain = Gs2->Guild->Namespace(
        "namespace-0001" // namespaceName
    )->GuildGameSession(
        "guild-model-0001", // guildModelName
        GuildGameSession // GuildGameSession
    )->IgnoreUser(
    );
    const auto Future = Domain->Model();
    Future->StartSynchronousTask();
    if (Future->GetTask().IsError())
    {
        return false;
    }

```

**Godot**
```gdscript

var domain = ez.guild.namespace_(
        "namespace-0001"
    ).guild_game_session(
        "guild-model-0001",
        guild_game_session
    ).ignore_user(
    )

var async_result = await domain.model()
if async_result.error != null:
    push_error(str(async_result.error))
    return

var result = async_result.result

```


##### 값 변경 이벤트 핸들링




**Unity (UniTask)**
```csharp
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).GuildGameSession(
        guildModelName: "guild-model-0001",
        guildGameSession: GuildGameSession
    ).IgnoreUser(
    );
    
    // 이벤트 핸들링 시작
    var callbackId = domain.Subscribe(
        value => {
            // 값이 변화했을 때 호출됨
            // value에는 변경 후의 값이 전달됨
        }
    );

    // 이벤트 핸들링 정지
    domain.Unsubscribe(callbackId);

```

**Unity (Vanilla)**
```cs
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).GuildGameSession(
        guildModelName: "guild-model-0001",
        guildGameSession: GuildGameSession
    ).IgnoreUser(
    );
    
    // 이벤트 핸들링 시작
    var callbackId = domain.Subscribe(
        value => {
            // 값이 변화했을 때 호출됨
            // value에는 변경 후의 값이 전달됨
        }
    );

    // 이벤트 핸들링 정지
    domain.Unsubscribe(callbackId);

```

**Unreal Engine 5**
```cpp
    const auto Domain = Gs2->Guild->Namespace(
        "namespace-0001" // namespaceName
    )->GuildGameSession(
        "guild-model-0001", // guildModelName
        GuildGameSession // GuildGameSession
    )->IgnoreUser(
    );
    
    // 이벤트 핸들링 시작
    const auto CallbackId = Domain->Subscribe(
        [](TSharedPtr<Gs2::Guild::Model::FIgnoreUser> value) {
            // 값이 변화했을 때 호출됨
            // value에는 변경 후의 값이 전달됨
        }
    );

    // 이벤트 핸들링 정지
    Domain->Unsubscribe(CallbackId);

```

**Godot**
```gdscript

var domain = ez.guild.namespace_(
        "namespace-0001"
    ).guild_game_session(
        "guild-model-0001",
        guild_game_session
    ).ignore_user(
    )

# 이벤트 핸들링 시작
var callback_id = domain.subscribe_model(func(value):
    # 값이 변화했을 때 호출됨
    # value에는 변경 후의 값이 전달됩니다
    pass
)

# 이벤트 핸들링 정지
domain.unsubscribe_model(callback_id)

```


**⚠️ Warning**

이 이벤트는 SDK가 가진 로컬 캐시의 값이 변경되었을 때 호출됩니다.

로컬 캐시는 SDK가 가진 API의 실행, 또는 GS2-Gateway의 알림을 활성화한 GS2-Distributor를 통한 스탬프 시트의 실행, 또는 GS2-Gateway의 알림을 활성화한 GS2-JobQueue의 실행에 의해 변화한 것만이 대상이 됩니다.

따라서 이 방법 이외로 값이 변경된 경우 콜백은 호출되지 않습니다.

---

### listIgnoreUsers

길드의 차단 목록을 취득한다<br>

길드가 참가를 차단하고 있는 플레이어의 목록을 취득합니다.<br>
이 API는 길드로서 호출합니다(먼저 Assume으로 길드의 액세스 토큰을 취득하세요).<br>
차단된 플레이어는 이 길드에 참가 요청을 보낼 수 없습니다. 요청은 자동으로 거부됩니다.<br>
길드 설정의 '차단 중인 플레이어' 관리 화면을 구축하는 데 사용합니다. 예를 들어, 차단 중인 플레이어의 목록과 '차단 해제' 버튼을 표시하는 화면입니다.

#### Request

|  | 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 |
| --- | --- | --- | --- | --- | --- | --- |
| namespaceName | string |  | ✓|  |  ~ 128자 | 네임스페이스 이름<br>네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| guildModelName | string |  | ✓|  |  ~ 128자 | 길드 모델 이름<br>길드 모델 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| guildGameSession | GuildGameSession | | ✓|  |  ~ 128자 | GuildGameSession<br>`assume`으로 취득한 GuildGameSession입니다.<br>권한은 `assume`을 호출한 멤버의 역할의 `PolicyDocument`에 따라 결정됩니다.<br>목록을 취득하려면 해당 역할의 `PolicyDocument`에 `Gs2Guild:DescribeIgnoreUser` 권한이 필요합니다. |
| pageToken | string |  | |  |  ~ 1024자 | 데이터 취득을 시작할 위치를 지정하는 토큰 |
| limit | int |  | | 30 | 1 ~ 1000 | 취득할 데이터 건수 |

#### Result

|  | 타입 | 설명 |
| --- | --- | --- |
| items | [List&lt;EzIgnoreUser&gt;](#ezignoreuser) | 참가를 거부하는 사용자 ID 리스트|
| nextPageToken | string | 목록의 나머지를 취득하기 위한 페이지 토큰|

#### 구현 예제




**Unity (UniTask)**
```csharp
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).GuildGameSession(
        guildModelName: "guild-model-0001",
        guildGameSession: GuildGameSession
    );
    var items = await domain.IgnoreUsersAsync(
    ).ToListAsync();

```

**Unity (Vanilla)**
```cs
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).GuildGameSession(
        guildModelName: "guild-model-0001",
        guildGameSession: GuildGameSession
    );
    var it = domain.IgnoreUsers(
    );
    List<EzIgnoreUser> items = new List<EzIgnoreUser>();
    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;
        }
    }

```

**Unreal Engine 5**
```cpp
    const auto Domain = Gs2->Guild->Namespace(
        "namespace-0001" // namespaceName
    )->GuildGameSession(
        "guild-model-0001", // guildModelName
        GuildGameSession // GuildGameSession
    );
    const auto It = Domain->IgnoreUsers(
    );
    TArray<Gs2::UE5::Guild::Model::FEzIgnoreUserPtr> Result;
    for (auto Item : *It)
    {
        if (Item.IsError())
        {
            return false;
        }
        Result.Add(Item.Current());
    }

```


##### 값 변경 이벤트 핸들링




**Unity (UniTask)**
```csharp
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).GuildGameSession(
        guildModelName: "guild-model-0001",
        guildGameSession: GuildGameSession
    );
    
    // 이벤트 핸들링 시작
    var callbackId = domain.SubscribeIgnoreUsers(
        () => {
            // 리스트의 요소가 변화했을 때 호출됨
        }
    );

    // 이벤트 핸들링 정지
    domain.UnsubscribeIgnoreUsers(callbackId);

```

**Unity (Vanilla)**
```cs
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).GuildGameSession(
        guildModelName: "guild-model-0001",
        guildGameSession: GuildGameSession
    );
    
    // 이벤트 핸들링 시작
    var callbackId = domain.SubscribeIgnoreUsers(
        () => {
            // 리스트의 요소가 변화했을 때 호출됨
        }
    );

    // 이벤트 핸들링 정지
    domain.UnsubscribeIgnoreUsers(callbackId);

```

**Unreal Engine 5**
```cpp
    const auto Domain = Gs2->Guild->Namespace(
        "namespace-0001" // namespaceName
    )->GuildGameSession(
        "guild-model-0001", // guildModelName
        GuildGameSession // GuildGameSession
    );
    
    // 이벤트 핸들링 시작
    const auto CallbackId = Domain->SubscribeIgnoreUsers(
        []() {
            // 리스트의 요소가 변화했을 때 호출됨
        }
    );

    // 이벤트 핸들링 정지
    Domain->UnsubscribeIgnoreUsers(CallbackId);

```


**⚠️ Warning**

이 이벤트는 SDK가 가진 로컬 캐시의 값이 변경되었을 때 호출됩니다.

로컬 캐시는 SDK가 가진 API의 실행, 또는 GS2-Gateway의 알림을 활성화한 GS2-Distributor를 통한 스탬프 시트의 실행, 또는 GS2-Gateway의 알림을 활성화한 GS2-JobQueue의 실행에 의해 변화한 것만이 대상이 됩니다.

따라서 이 방법 이외로 값이 변경된 경우 콜백은 호출되지 않습니다.

---

### getLastGuildMasterActivity

길드 마스터의 마지막 활동 일시를 확인한다<br>

길드 마스터의 가장 최근 활동 일시를 취득합니다.<br>
이 API는 길드로서 호출합니다(먼저 Assume으로 길드의 액세스 토큰을 취득해야 합니다).<br>
길드 마스터의 활동 상태를 표시하는 데 사용합니다. 예를 들어 "길드 마스터 마지막 로그인: 3일 전"과 같이 표시할 수 있습니다.<br>
이 정보는 길드 마스터가 충분히 오랫동안 비활성 상태여서 자동 교체(PromoteSeniorMember)를 실행해야 하는지 판단하는 데 유용합니다.

#### Request

|  | 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 |
| --- | --- | --- | --- | --- | --- | --- |
| namespaceName | string |  | ✓|  |  ~ 128자 | 네임스페이스 이름<br>네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| guildModelName | string |  | ✓|  |  ~ 128자 | 길드 모델 이름<br>길드 모델 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| guildGameSession | GuildGameSession | | ✓|  |  ~ 128자 | GuildGameSession<br>`assume`으로 취득한 GuildGameSession입니다.<br>권한은 `assume`을 호출한 멤버의 역할의 `PolicyDocument`에 따라 결정됩니다.<br>취득하려면 해당 역할의 `PolicyDocument`에 `Gs2Guild:GetLastGuildMasterActivity` 권한이 필요합니다. |

#### Result

|  | 타입 | 설명 |
| --- | --- | --- |
| item | [EzLastGuildMasterActivity](#ezlastguildmasteractivity) | 마지막 길드 마스터 활동|
| guild | [EzGuild](#ezguild) | 길드|

#### 구현 예제




**Unity (UniTask)**
```csharp
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).GuildGameSession(
        guildModelName: "guild-model-0001",
        guildGameSession: GuildGameSession
    ).LastGuildMasterActivity(
    );
    var item = await domain.ModelAsync();

```

**Unity (Vanilla)**
```cs
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).GuildGameSession(
        guildModelName: "guild-model-0001",
        guildGameSession: GuildGameSession
    ).LastGuildMasterActivity(
    );
    var future = domain.ModelFuture();
    yield return future;
    var item = future.Result;

```

**Unreal Engine 5**
```cpp
    const auto Domain = Gs2->Guild->Namespace(
        "namespace-0001" // namespaceName
    )->GuildGameSession(
        "guild-model-0001", // guildModelName
        GuildGameSession // GuildGameSession
    )->LastGuildMasterActivity(
    );
    const auto Future = Domain->Model();
    Future->StartSynchronousTask();
    if (Future->GetTask().IsError())
    {
        return false;
    }

```

**Godot**
```gdscript

var domain = ez.guild.namespace_(
        "namespace-0001"
    ).guild_game_session(
        "guild-model-0001",
        guild_game_session
    ).last_guild_master_activity(
    )

var async_result = await domain.model()
if async_result.error != null:
    push_error(str(async_result.error))
    return

var result = async_result.result

```


##### 값 변경 이벤트 핸들링




**Unity (UniTask)**
```csharp
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).GuildGameSession(
        guildModelName: "guild-model-0001",
        guildGameSession: GuildGameSession
    ).LastGuildMasterActivity(
    );
    
    // 이벤트 핸들링 시작
    var callbackId = domain.Subscribe(
        value => {
            // 값이 변화했을 때 호출됨
            // value에는 변경 후의 값이 전달됨
        }
    );

    // 이벤트 핸들링 정지
    domain.Unsubscribe(callbackId);

```

**Unity (Vanilla)**
```cs
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).GuildGameSession(
        guildModelName: "guild-model-0001",
        guildGameSession: GuildGameSession
    ).LastGuildMasterActivity(
    );
    
    // 이벤트 핸들링 시작
    var callbackId = domain.Subscribe(
        value => {
            // 값이 변화했을 때 호출됨
            // value에는 변경 후의 값이 전달됨
        }
    );

    // 이벤트 핸들링 정지
    domain.Unsubscribe(callbackId);

```

**Unreal Engine 5**
```cpp
    const auto Domain = Gs2->Guild->Namespace(
        "namespace-0001" // namespaceName
    )->GuildGameSession(
        "guild-model-0001", // guildModelName
        GuildGameSession // GuildGameSession
    )->LastGuildMasterActivity(
    );
    
    // 이벤트 핸들링 시작
    const auto CallbackId = Domain->Subscribe(
        [](TSharedPtr<Gs2::Guild::Model::FLastGuildMasterActivity> value) {
            // 값이 변화했을 때 호출됨
            // value에는 변경 후의 값이 전달됨
        }
    );

    // 이벤트 핸들링 정지
    Domain->Unsubscribe(CallbackId);

```

**Godot**
```gdscript

var domain = ez.guild.namespace_(
        "namespace-0001"
    ).guild_game_session(
        "guild-model-0001",
        guild_game_session
    ).last_guild_master_activity(
    )

# 이벤트 핸들링 시작
var callback_id = domain.subscribe_model(func(value):
    # 값이 변화했을 때 호출됨
    # value에는 변경 후의 값이 전달됩니다
    pass
)

# 이벤트 핸들링 정지
domain.unsubscribe_model(callback_id)

```


**⚠️ Warning**

이 이벤트는 SDK가 가진 로컬 캐시의 값이 변경되었을 때 호출됩니다.

로컬 캐시는 SDK가 가진 API의 실행, 또는 GS2-Gateway의 알림을 활성화한 GS2-Distributor를 통한 스탬프 시트의 실행, 또는 GS2-Gateway의 알림을 활성화한 GS2-JobQueue의 실행에 의해 변화한 것만이 대상이 됩니다.

따라서 이 방법 이외로 값이 변경된 경우 콜백은 호출되지 않습니다.

---

### promoteSeniorMember

비활성 상태인 길드 마스터를 최고참 멤버로 교체한다<br>

길드 모델의 비활성 설정에 정의된 기간 동안 길드 마스터가 활동하지 않은 경우, 가장 오래 소속되어 있는 멤버를 새로운 길드 마스터로 승격시킵니다.<br>
이 API는 길드로서 호출합니다(먼저 Assume이 필요합니다). 비활성 기간의 임계값은 길드 모델에서 설정됩니다.<br>
길드 마스터가 게임을 플레이하지 않게 되었을 때 길드가 "정체"되는 것을 방지합니다.<br>
길드 마스터가 비활성 상태일 때 표시되는 "리더십 이어받기" 버튼에 사용합니다. 예를 들어 "길드 마스터가 30일간 로그인하지 않았습니다. 최고참 멤버로서 당신이 이어받을 수 있습니다."와 같이 표시할 수 있습니다.

#### Request

|  | 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 |
| --- | --- | --- | --- | --- | --- | --- |
| namespaceName | string |  | ✓|  |  ~ 128자 | 네임스페이스 이름<br>네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| guildModelName | string |  | ✓|  |  ~ 128자 | 길드 모델 이름<br>길드 모델 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| guildGameSession | GuildGameSession | | ✓|  |  ~ 128자 | GuildGameSession<br>`assume`으로 취득한 GuildGameSession입니다.<br>권한은 `assume`을 호출한 멤버의 역할의 `PolicyDocument`에 따라 결정됩니다.<br>승격하려면 해당 역할의 `PolicyDocument`에 `Gs2Guild:PromoteSeniorMember` 권한이 필요합니다. |

#### Result

|  | 타입 | 설명 |
| --- | --- | --- |
| item | [EzLastGuildMasterActivity](#ezlastguildmasteractivity) | 마지막 길드 마스터 활동|
| guild | [EzGuild](#ezguild) | 길드|

#### 구현 예제




**Unity (UniTask)**
```csharp
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).GuildGameSession(
        guildModelName: "guild-model-0001",
        guildGameSession: GuildGameSession
    );
    var result = await domain.PromoteSeniorMemberAsync(
    );
    var item = await result.ModelAsync();

```

**Unity (Vanilla)**
```cs
    var domain = gs2.Guild.Namespace(
        namespaceName: "namespace-0001"
    ).GuildGameSession(
        guildModelName: "guild-model-0001",
        guildGameSession: GuildGameSession
    );
    var future = domain.PromoteSeniorMemberFuture(
    );
    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;

```

**Unreal Engine 5**
```cpp
    const auto Domain = Gs2->Guild->Namespace(
        "namespace-0001" // namespaceName
    )->GuildGameSession(
        "guild-model-0001", // guildModelName
        GuildGameSession // GuildGameSession
    );
    const auto Future = Domain->PromoteSeniorMember(
    );
    Future->StartSynchronousTask();
    if (Future->GetTask().IsError())
    {
        return false;
    }

    // 변경된 값 / 결과 값을 취득
    const auto Future2 = Future->GetTask().Result()->Model();
    Future2->StartSynchronousTask();
    if (Future2->GetTask().IsError())
    {
        return Future2->GetTask().Error();
    }
    const auto Result = Future2->GetTask().Result();

```

**Godot**
```gdscript

var domain = ez.guild.namespace_(
        "namespace-0001"
    ).guild_game_session(
        "guild-model-0001",
        guild_game_session
    )

var async_result = await domain.promote_senior_member(
    guild_game_session.access_token # access_token
)
if async_result.error != null:
    push_error(str(async_result.error))
    return

var result = async_result.result

```


---

## 이벤트 핸들러

### OnReceiveRequestNotification

참가 요청을 수신했을 때 사용하는 푸시 알림

 | 이름 | 타입 | 설명 |
| --- | --- | --- |
| namespaceName | string |네임스페이스 이름<br>네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다.|
| guildModelName | string |길드 모델 이름<br>길드 모델 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다.|
| guildName | string |길드명<br>길드의 고유한 이름을 유지합니다.<br>이름은 UUID(Universally Unique Identifier) 형식으로 자동 생성되며, 각 길드를 식별하는 데 사용됩니다.|
| fromUserId | string |사용자ID|

#### 구현 예제





**Unity (UniTask)**
```csharp

    gs2.Guild.OnReceiveRequestNotification += notification =>
    {
        var namespaceName = notification.NamespaceName;
        var guildModelName = notification.GuildModelName;
        var guildName = notification.GuildName;
        var fromUserId = notification.FromUserId;
    };
```

**Unity (Vanilla)**
```cs

    gs2.Guild.OnReceiveRequestNotification += notification =>
    {
        var namespaceName = notification.NamespaceName;
        var guildModelName = notification.GuildModelName;
        var guildName = notification.GuildName;
        var fromUserId = notification.FromUserId;
    };
```

**Unreal Engine 5**
```cpp

    Gs2->Guild->OnReceiveRequestNotification().AddLambda([](const auto Notification)
    {
        const auto NamespaceName = Notification->NamespaceNameValue;
        const auto GuildModelName = Notification->GuildModelNameValue;
        const auto GuildName = Notification->GuildNameValue;
        const auto FromUserId = Notification->FromUserIdValue;
    });
```

**Godot**
```gdscript

    ez.guild.receive_request_notification.connect(func(notification):
        var namespace_name = notification.namespace_name
        var guild_model_name = notification.guild_model_name
        var guild_name = notification.guild_name
        var from_user_id = notification.from_user_id
    )
```


---

### OnRemoveRequestNotification

참가 요청이 삭제되었을 때 사용하는 푸시 알림

 | 이름 | 타입 | 설명 |
| --- | --- | --- |
| namespaceName | string |네임스페이스 이름<br>네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다.|
| guildModelName | string |길드 모델 이름<br>길드 모델 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다.|
| guildName | string |길드명<br>길드의 고유한 이름을 유지합니다.<br>이름은 UUID(Universally Unique Identifier) 형식으로 자동 생성되며, 각 길드를 식별하는 데 사용됩니다.|
| fromUserId | string |사용자ID|

#### 구현 예제





**Unity (UniTask)**
```csharp

    gs2.Guild.OnRemoveRequestNotification += notification =>
    {
        var namespaceName = notification.NamespaceName;
        var guildModelName = notification.GuildModelName;
        var guildName = notification.GuildName;
        var fromUserId = notification.FromUserId;
    };
```

**Unity (Vanilla)**
```cs

    gs2.Guild.OnRemoveRequestNotification += notification =>
    {
        var namespaceName = notification.NamespaceName;
        var guildModelName = notification.GuildModelName;
        var guildName = notification.GuildName;
        var fromUserId = notification.FromUserId;
    };
```

**Unreal Engine 5**
```cpp

    Gs2->Guild->OnRemoveRequestNotification().AddLambda([](const auto Notification)
    {
        const auto NamespaceName = Notification->NamespaceNameValue;
        const auto GuildModelName = Notification->GuildModelNameValue;
        const auto GuildName = Notification->GuildNameValue;
        const auto FromUserId = Notification->FromUserIdValue;
    });
```

**Godot**
```gdscript

    ez.guild.remove_request_notification.connect(func(notification):
        var namespace_name = notification.namespace_name
        var guild_model_name = notification.guild_model_name
        var guild_name = notification.guild_name
        var from_user_id = notification.from_user_id
    )
```


---

### OnChangeNotification

길드 정보가 갱신되었을 때 발행되는 푸시 알림

 | 이름 | 타입 | 설명 |
| --- | --- | --- |
| namespaceName | string |네임스페이스 이름<br>네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다.|
| guildModelName | string |길드 모델 이름<br>길드 모델 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다.|
| guildName | string |길드명<br>길드의 고유한 이름을 유지합니다.<br>이름은 UUID(Universally Unique Identifier) 형식으로 자동 생성되며, 각 길드를 식별하는 데 사용됩니다.|

#### 구현 예제





**Unity (UniTask)**
```csharp

    gs2.Guild.OnChangeNotification += notification =>
    {
        var namespaceName = notification.NamespaceName;
        var guildModelName = notification.GuildModelName;
        var guildName = notification.GuildName;
    };
```

**Unity (Vanilla)**
```cs

    gs2.Guild.OnChangeNotification += notification =>
    {
        var namespaceName = notification.NamespaceName;
        var guildModelName = notification.GuildModelName;
        var guildName = notification.GuildName;
    };
```

**Unreal Engine 5**
```cpp

    Gs2->Guild->OnChangeNotification().AddLambda([](const auto Notification)
    {
        const auto NamespaceName = Notification->NamespaceNameValue;
        const auto GuildModelName = Notification->GuildModelNameValue;
        const auto GuildName = Notification->GuildNameValue;
    });
```

**Godot**
```gdscript

    ez.guild.change_notification.connect(func(notification):
        var namespace_name = notification.namespace_name
        var guild_model_name = notification.guild_model_name
        var guild_name = notification.guild_name
    )
```


---

### OnJoinNotification

길드 멤버가 추가되었을 때 발행되는 푸시 알림

 | 이름 | 타입 | 설명 |
| --- | --- | --- |
| namespaceName | string |네임스페이스 이름<br>네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다.|
| guildModelName | string |길드 모델 이름<br>길드 모델 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다.|
| guildName | string |길드명<br>길드의 고유한 이름을 유지합니다.<br>이름은 UUID(Universally Unique Identifier) 형식으로 자동 생성되며, 각 길드를 식별하는 데 사용됩니다.|
| joinedUserId | string |사용자ID|

#### 구현 예제





**Unity (UniTask)**
```csharp

    gs2.Guild.OnJoinNotification += notification =>
    {
        var namespaceName = notification.NamespaceName;
        var guildModelName = notification.GuildModelName;
        var guildName = notification.GuildName;
        var joinedUserId = notification.JoinedUserId;
    };
```

**Unity (Vanilla)**
```cs

    gs2.Guild.OnJoinNotification += notification =>
    {
        var namespaceName = notification.NamespaceName;
        var guildModelName = notification.GuildModelName;
        var guildName = notification.GuildName;
        var joinedUserId = notification.JoinedUserId;
    };
```

**Unreal Engine 5**
```cpp

    Gs2->Guild->OnJoinNotification().AddLambda([](const auto Notification)
    {
        const auto NamespaceName = Notification->NamespaceNameValue;
        const auto GuildModelName = Notification->GuildModelNameValue;
        const auto GuildName = Notification->GuildNameValue;
        const auto JoinedUserId = Notification->JoinedUserIdValue;
    });
```

**Godot**
```gdscript

    ez.guild.join_notification.connect(func(notification):
        var namespace_name = notification.namespace_name
        var guild_model_name = notification.guild_model_name
        var guild_name = notification.guild_name
        var joined_user_id = notification.joined_user_id
    )
```


---

### OnLeaveNotification

길드 멤버가 제외되었을 때 발행되는 푸시 알림

 | 이름 | 타입 | 설명 |
| --- | --- | --- |
| namespaceName | string |네임스페이스 이름<br>네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다.|
| guildModelName | string |길드 모델 이름<br>길드 모델 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다.|
| guildName | string |길드명<br>길드의 고유한 이름을 유지합니다.<br>이름은 UUID(Universally Unique Identifier) 형식으로 자동 생성되며, 각 길드를 식별하는 데 사용됩니다.|
| leavedUserId | string |사용자ID|

#### 구현 예제





**Unity (UniTask)**
```csharp

    gs2.Guild.OnLeaveNotification += notification =>
    {
        var namespaceName = notification.NamespaceName;
        var guildModelName = notification.GuildModelName;
        var guildName = notification.GuildName;
        var leavedUserId = notification.LeavedUserId;
    };
```

**Unity (Vanilla)**
```cs

    gs2.Guild.OnLeaveNotification += notification =>
    {
        var namespaceName = notification.NamespaceName;
        var guildModelName = notification.GuildModelName;
        var guildName = notification.GuildName;
        var leavedUserId = notification.LeavedUserId;
    };
```

**Unreal Engine 5**
```cpp

    Gs2->Guild->OnLeaveNotification().AddLambda([](const auto Notification)
    {
        const auto NamespaceName = Notification->NamespaceNameValue;
        const auto GuildModelName = Notification->GuildModelNameValue;
        const auto GuildName = Notification->GuildNameValue;
        const auto LeavedUserId = Notification->LeavedUserIdValue;
    });
```

**Godot**
```gdscript

    ez.guild.leave_notification.connect(func(notification):
        var namespace_name = notification.namespace_name
        var guild_model_name = notification.guild_model_name
        var guild_name = notification.guild_name
        var leaved_user_id = notification.leaved_user_id
    )
```


---

### OnChangeMemberNotification

멤버 정보가 갱신되었을 때 발행되는 푸시 알림

 | 이름 | 타입 | 설명 |
| --- | --- | --- |
| namespaceName | string |네임스페이스 이름<br>네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다.|
| guildModelName | string |길드 모델 이름<br>길드 모델 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다.|
| guildName | string |길드명<br>길드의 고유한 이름을 유지합니다.<br>이름은 UUID(Universally Unique Identifier) 형식으로 자동 생성되며, 각 길드를 식별하는 데 사용됩니다.|
| changedUserId | string |사용자ID|

#### 구현 예제





**Unity (UniTask)**
```csharp

    gs2.Guild.OnChangeMemberNotification += notification =>
    {
        var namespaceName = notification.NamespaceName;
        var guildModelName = notification.GuildModelName;
        var guildName = notification.GuildName;
        var changedUserId = notification.ChangedUserId;
    };
```

**Unity (Vanilla)**
```cs

    gs2.Guild.OnChangeMemberNotification += notification =>
    {
        var namespaceName = notification.NamespaceName;
        var guildModelName = notification.GuildModelName;
        var guildName = notification.GuildName;
        var changedUserId = notification.ChangedUserId;
    };
```

**Unreal Engine 5**
```cpp

    Gs2->Guild->OnChangeMemberNotification().AddLambda([](const auto Notification)
    {
        const auto NamespaceName = Notification->NamespaceNameValue;
        const auto GuildModelName = Notification->GuildModelNameValue;
        const auto GuildName = Notification->GuildNameValue;
        const auto ChangedUserId = Notification->ChangedUserIdValue;
    });
```

**Godot**
```gdscript

    ez.guild.change_member_notification.connect(func(notification):
        var namespace_name = notification.namespace_name
        var guild_model_name = notification.guild_model_name
        var guild_name = notification.guild_name
        var changed_user_id = notification.changed_user_id
    )
```


---



