개발자 포털
실험적 봇 및 앱 플랫폼은 활발히 개발 중입니다. 자체 호스팅 서버 지원은 2026-08-13에 출시되었으며 클라우드보다 기능 범위가 좁습니다. 지원 항목 보기.
← 문서

메시지 컴포넌트

봇은 Discord와 똑같이 Discord 형식의 components를 메시지에 붙일 수 있고, 클릭은 평소의 토큰과 콜백 흐름을 갖춘 INTERACTION_CREATE로 도착하므로 라이브러리를 바꿀 필요가 없습니다. 이 페이지는 GameVox가 무엇을 표시하는지, 인터랙션이 앱에 어떻게 전달되는지, 그리고 Discord와 제한이 다른 부분을 다룹니다.

동작하는 것

  • 버튼(type 2, 스타일 1~5)과 문자열 선택(type 3)을 담는 액션 행(type 1). 링크 버튼(스타일 5)은 url을 열 뿐 인터랙션을 보내지 않습니다.
  • 클라우드와 자체 호스팅 서버 모두. 컴포넌트는 메시지와 함께 저장되고 REST 조회와 MESSAGE_CREATE / MESSAGE_UPDATE에서 반환됩니다. components: []로 메시지를 수정하면 제거됩니다.
  • 모든 클라이언트. 데스크톱·웹 클라이언트, iOS, Android가 버튼과 문자열 선택을 렌더링하고(메시지당 최대 5행 × 5개), 모달과 임시 응답도 표시합니다.
  • 모달(콜백 type 9)과 임시 응답(flags: 64). 아래에서 설명합니다.

버튼 한 행과 선택 메뉴가 있는 메시지:

POST /api/v10/channels/{channel_id}/messages

{
  "content": "Next map?",
  "components": [
    {
      "type": 1,
      "components": [
        { "type": 2, "style": 1, "label": "Vote", "custom_id": "vote" },
        { "type": 2, "style": 5, "label": "Rules", "url": "https://example.com/rules" }
      ]
    },
    {
      "type": 1,
      "components": [
        {
          "type": 3,
          "custom_id": "map",
          "placeholder": "Pick a map",
          "options": [
            { "label": "Dust", "value": "dust" },
            { "label": "Nuke", "value": "nuke" }
          ]
        }
      ]
    }
  ]
}

지원하지 않는 것

  • 사용자, 역할, 멘션 가능, 채널 선택(type 5~8). 받아들여 저장하지만 클라이언트가 비활성 상태로 표시하므로 인터랙션이 발생하지 않습니다.
  • 컴포넌트 v2 레이아웃 컴포넌트. 표시되지 않습니다.
  • 프리미엄 버튼(스타일 6). 비활성 상태로 표시됩니다.
  • DM. 컴포넌트 인터랙션, 모달, 임시 응답은 서버 채널에서만 동작합니다.

클릭 받기

클릭은 type: 3(MESSAGE_COMPONENT)인 INTERACTION_CREATE로 도착하며 data.custom_id, data.component_type, 그리고 선택 메뉴라면 data.values를 담습니다. message는 클릭된 메시지 전체이며, 봇의 인텐트와 관계없이 컴포넌트도 포함합니다. 제출된 모달은 type: 5(MODAL_SUBMIT)로 도착하고 입력값은 data.components에 들어 있습니다.

GameVox는 앱에 넘기기 전에 각 클릭을 저장된 메시지와 대조합니다. 해당 컨트롤이 아직 메시지에 있고 활성 상태여야 하며, 선택값은 옵션 중 하나이면서 min_values / max_values 범위 안이어야 하고, 멤버가 그 채널을 볼 수 있어야 합니다. 클릭은 그 메시지를 올린 봇의 앱에만 전달됩니다.

인터랙션은 봇의 게이트웨이 연결로 전달되며, 인터랙션 엔드포인트 URL을 설정했다면 그곳으로 POST됩니다(OAuth2 참고). HTTP 모드에서는 Discord와 두 가지가 다릅니다:

  • 그래도 게이트웨이 세션은 연결해 두세요. GameVox는 각 인터랙션을 이 세션을 통해 앱에 넘긴 뒤 엔드포인트로 POST합니다. 연결된 세션이 없으면 아무것도 전달되지 않고, 클릭한 멤버에게는 앱이 온라인이 아니라고 표시됩니다.
  • 응답 본문은 무시됩니다. POST /interactions/{id}/{token}/callback을 호출해 응답하세요. POST에 대한 응답 본문으로 돌려준 콜백은 아무에게도 전달되지 않습니다.

응답하기

평소의 콜백 엔드포인트를 사용합니다. 인터랙션 토큰은 15분 동안 유효합니다.

타입동작
4 CHANNEL_MESSAGE_WITH_SOURCE 채널에 응답을 올립니다. flags: 64를 주면 임시 응답이 됩니다.
5 DEFERRED_CHANNEL_MESSAGE_WITH_SOURCE 즉시 수신을 확인하고, 첫 PATCH .../messages/@original이 응답을 올립니다. flags: 64를 주면 그 응답은 임시 응답이 됩니다.
6 DEFERRED_UPDATE_MESSAGE 눈에 보이는 변화 없이 수신을 확인합니다. 이후 @original은 클릭된 메시지를 가리키므로, 나중의 PATCH .../messages/@original이 그 메시지를 수정합니다.
7 UPDATE_MESSAGE 클릭된 메시지를 컴포넌트까지 포함해 그 자리에서 수정합니다.
9 MODAL 클릭한 멤버에게 모달을 엽니다.

후속 응답(인터랙션당 최대 5개, 임시 응답은 flags: 64)과 @original 및 후속 메시지에 대한 GET / PATCH / DELETE는 Discord와 같이 동작합니다. 타입 4, 5, 9와 임시 응답은 슬래시 명령어에서도 동작하며, 타입 6과 7에는 클릭된 메시지가 필요합니다.

임시 응답

임시 응답은 인터랙션을 일으킨 멤버가 열어 둔 세션에만 전달되며, 그 멤버에게만 보인다고 표시됩니다. 채널에는 기록되지 않습니다. 메시지 기록에도 MESSAGE_CREATE에도 나타나지 않고, 멤버가 새로고침하면 사라지며, 앱은 15분 동안 이를 수정하거나 삭제할 수 있습니다. 임시 응답의 컴포넌트도 다른 컴포넌트와 똑같이 동작합니다. 클라우드와 자체 호스팅 서버 모두 동일합니다.

모달

  • 텍스트 입력(type 4) 액션 행을 최대 5개까지. 모달 안의 그 밖의 요소는 버려집니다. 스타일 1은 한 줄, 스타일 2는 문단입니다.
  • 제목과 라벨은 45자, 플레이스홀더는 100자로 잘립니다. 입력 칸에는 최대 4000자까지 들어갑니다. required의 기본값은 true입니다.
  • GameVox는 앱에 넘기기 전에 제출 내용을 열었던 모달과 대조합니다(필수 항목, min_length, max_length).
  • 모달은 15분 뒤 만료되며 한 번만 제출할 수 있습니다.

제한

  • 메시지 하나의 components: 클라우드 서버는 JSON 64 KiB, 자체 호스팅 서버는 128 KiB와 최상위 컴포넌트 40개까지. 이보다 큰 요청은 400으로 실패합니다.
  • custom_id: 최대 100자이며, 더 긴 값을 가진 컨트롤은 쓸 수 없습니다. 선택 메뉴: 값은 최대 25개, 각각 최대 100자.
  • 클릭: 컴포넌트 인터랙션은 멤버별, 서버별로 0.7초에 한 번까지입니다. 자체 호스팅 서버는 추가로 멤버당 5초에 최대 5번까지 허용합니다. 더 빠른 클릭은 거부되며 앱에 전달되지 않습니다.
  • 임시 응답과 모달: 합쳐서 앱별, 멤버별로 15분 동안 120개까지. 기존 것을 수정하는 것은 세지 않습니다. 한도를 넘으면 요청이 429로 실패합니다.
  • 임시 응답의 내용: 최대 4000자.

← 문서로 돌아가기