앱 소유 이모지
애플리케이션에 업로드한 이모지는 봇이 게시하는 어떤 서버에서도, 그 서버의 이모지 슬롯을 쓰지 않고 사용할 수 있습니다. Discord와 동등하게 와이어 포맷도, 메시지 본문의 <:name:id> 문법도 같습니다.
제한
- 애플리케이션당 2,000개(소프트 한도이며 생성 시 확인합니다).
- 256 KB 최대 파일 크기.
- 콘텐츠 유형:
image/png,image/jpeg,image/gif,image/webp. - 이름: 2~32자, 사용 가능한 문자는
[a-zA-Z0-9_]. 앱마다 고유해야 하며 대소문자는 구분하지 않습니다(BotIcon과boticon은 충돌합니다).
움직임 감지
animated 플래그는 업로드의 콘텐츠 유형을 보고 서버에서 설정합니다. image/gif로 업로드된 것은 움직이는 이모지로 처리되며, 클라이언트가 이를 덮어쓸 수 없습니다. 메시지 본문에서 움직이는 이모지를 참조할 때는 <a:name:id> 접두사를 사용하세요(Discord와 동일합니다).
REST 엔드포인트(봇용)
봇 API는 애플리케이션의 이모지에 대한 읽기 전용 접근을 제공합니다. Authorization: Bot {token}으로 인증하세요.
GET /applications/{application.id}/emojis
GET /applications/{application.id}/emojis/{emoji.id} 응답 형태(목록 항목과 단건 GET 모두 Discord와 같은 형태입니다):
{
"id": "1199283740192847360",
"name": "thinking_orange",
"animated": false,
"user": { "id": "...", "username": "you" },
"managed": false,
"available": true
} 생성 / 수정 / 삭제는 봇 API에서 제공하지 않습니다. Discord의 POST /applications/{id}/emojis, PATCH, DELETE 경로는 GameVox에서 404를 반환합니다. 이모지 관리는 모두 개발자 포털(아래)에서 이루어집니다. 포털 쪽 조정 파이프라인이 사람 손 없이 운영될 만큼 안정되면 Discord 형태의 쓰기 엔드포인트를 제공할 계획입니다.
메시지에서 이모지 사용하기
서버 이모지와 똑같이 content 안에서 앱 이모지를 참조하세요.
// 정지 이미지
"hello <:thinking_orange:1199283740192847360>"
// 움직이는 이미지(앞의 `a:`에 주의)
"thanks <a:wave_orange:1199283740192847361>" 반응에서는 Discord와 마찬가지로 PUT /channels/{channel.id}/messages/{message.id}/reactions/{emoji}/@me의 URL 인코딩된 이모지 경로에 name:id를 전달합니다.
포털의 업로드 절차
개발자 포털은 아바타·앱 아이콘과 같은 사전 서명 URL 파이프라인으로 이모지를 업로드합니다.
purpose=bot_app_emoji와application_id를 담아POST /api/uploads/presign.- 반환된 S3 URL로 파일을
PUT. - 반환된
file_id를 담아POST /api/uploads/complete. {name, file_id}를 담아POST /developer-portal/applications/{id}/emojis.
서버는 파일의 s3_key 접두사가 bot-emojis/{application_id}/와 일치하는지 확인하므로, 다른 앱에서 유출된 file_id로는 연결에 실패합니다.
저장
공개 버킷 gamevox-files-prod의 bot-emojis/{application_id}/{file_id}.{ext}에 저장됩니다. 논리 삭제된 행은 S3 객체를 그대로 두며, 남겨진 객체는 백그라운드 스위퍼가 정리합니다.