추첨
추첨 기능은 상품과 기간을 정해 Discord 채널에 추첨 카드를 올리고, 멤버가 버튼으로 참여한 뒤 마감 시간이 되면 당첨자를 뽑아 발표하는 기능이에요. 운영진이 직접 마감하거나 취소할 수도 있고, 끝난 추첨에서 재추첨도 할 수 있어요.
이 기능은 패널 설명만 있는 기능이 아니라 봇 런타임에서 실제로 동작해요. 추첨 상태와 참여 기록은 DB에 저장되고, 봇이 재시작돼도 마감 시간이 지난 추첨을 다시 찾아 처리해요.
할 수 있는 일
| 기능 | 설명 |
|---|---|
| 추첨 시작 | 상품, 기간, 당첨자 수, 게시 채널을 정해 추첨을 시작해요 |
| 참여 버튼 | 멤버가 Discord 메시지의 참여하기 버튼으로 응모해요 |
| 참여 조건 | 필수 역할, 계정 생성일, 서버 가입일 조건을 걸 수 있어요 |
| 자동 마감 | 마감 시간이 지나면 SOLE이 당첨자를 뽑고 결과를 발표해요 |
| 즉시 마감 | 운영진이 진행 중인 추첨을 바로 종료하고 당첨자를 뽑을 수 있어요 |
| 취소 | 진행 중인 추첨을 당첨자 없이 취소해요 |
| 재추첨 | 이미 끝난 추첨에서 이전 당첨자를 제외하고 다시 뽑아요 |
| 목록 | 지금 진행 중인 추첨과 참여 인원, 마감 시간을 확인해요 |
처음 시작하는 순서
- 추첨을 올릴 텍스트 채널을 정해요.
- SOLE이 그 채널을 볼 수 있고 메시지를 보낼 수 있는지 확인해요.
- 상품 이름과 안내 문구를 준비해요.
- 기간을 정해요. 30분, 2시간, 1일처럼 적을 수 있어요.
- 당첨자 수를 정해요. 최대 20명까지 뽑을 수 있어요.
- 필요하면 필수 역할, 계정 생성일, 서버 가입일 조건을 넣어요.
- 추첨을 시작한 뒤 Discord에 카드가 올라오는지 확인해요.
- 테스트 계정으로 참여 버튼을 눌러 참여 인원이 갱신되는지 확인해요.
명령어 흐름
| 명령 | 쓰는 상황 |
|---|---|
| /추첨 시작 | 새 추첨을 만들어요 |
| /추첨 목록 | 진행 중인 추첨과 마감 시간을 봐요 |
| /추첨 종료 | 마감 전이라도 지금 당첨자를 뽑아요 |
| /추첨 취소 | 추첨을 없애고 참여 기록을 정리해요 |
| /추첨 재추첨 | 끝난 추첨에서 새 당첨자를 다시 뽑아요 |
추첨을 시작하거나 종료, 취소, 재추첨하는 명령은 서버 관리 권한이 있는 운영진만 사용할 수 있어요. 목록은 서버 안에서 진행 중인 추첨을 확인하는 용도예요.
참여 조건
참여 조건은 새 계정이나 특정 역할이 없는 멤버의 참여를 제한할 때 써요.
| 조건 | 설명 |
|---|---|
| 필수 역할 | 지정한 역할을 가진 멤버만 참여할 수 있어요 |
| 계정 생성일 | Discord 계정이 만들어진 지 지정한 일수 이상이어야 해요 |
| 서버 가입일 | 현재 서버에 들어온 지 지정한 일수 이상이어야 해요 |
조건을 너무 높게 잡으면 정상 멤버도 참여하지 못할 수 있어요. 공개 이벤트는 조건을 낮게 두고, 상품 가치가 높거나 악용 가능성이 있는 이벤트만 조건을 높이는 편이 좋아요.
당첨자 추첨
마감되면 SOLE은 참여자 목록에서 중복을 제거하고 당첨자 수만큼 무작위로 뽑아요. 참여자 수가 당첨자 수보다 적으면 참여한 사람이 모두 당첨돼요.
당첨 결과는 원래 추첨 채널에 발표돼요. 발표 메시지에는 당첨자 멘션과 추첨 메시지로 이동하는 버튼이 들어갈 수 있어요. 채널이 삭제됐거나 봇에게 메시지 전송 권한이 없으면 결과 발표가 실패할 수 있고, SOLE은 일정 시간 동안 다시 발표를 시도해요.
재시작과 복구
추첨 마감 시각은 메모리 타이머가 아니라 DB에 저장돼요. 그래서 봇이 중간에 재시작돼도 진행 중인 추첨이 사라지지 않아요. 봇이 다시 켜지면 마감 시간이 지난 추첨을 찾아 종료 처리해요.
당첨자를 뽑는 순간에는 상태를 마감 처리 중으로 바꿔 두어 같은 추첨을 두 번 뽑지 않게 막아요. 만약 처리 중에 워커가 죽으면 일정 시간이 지난 뒤 다시 처리할 수 있게 되어 있어요.
재추첨
재추첨은 이미 끝난 추첨에서만 가능해요. 이전 당첨자는 제외하고 남은 참여자 중에서 다시 뽑아요. 남은 참여자가 없으면 재추첨할 수 없어요.
재추첨 인원도 1명에서 20명 사이여야 해요. 기존 당첨자 수를 그대로 쓸 수도 있고, 새 인원을 지정할 수도 있어요.
과장하면 안 되는 것
- 추첨은 상품 지급을 자동으로 완료하는 기능이 아니에요. 상품 전달은 운영진이 따로 처리해야 해요.
- 부스트 가중치나 확률 가중치는 현재 코드 기준으로 확인되지 않았어요.
- 완전한 부정 참여 탐지 시스템이라고 쓰면 안 돼요.
- 결과 발표는 Discord 채널 권한과 채널 존재 여부에 영향을 받아요.
- 참여 인원 표시는 Discord 속도 제한 때문에 매 클릭마다 즉시 갱신되지 않을 수 있어요.
캡처 기준
| 캡처 | 보여 줄 내용 |
|---|---|
| 시작 명령 | 상품, 기간, 당첨자 수, 채널, 조건 입력 화면 |
| 추첨 카드 | 상품, 마감 시간, 참여 인원, 참여하기 버튼 |
| 참여 완료 | 버튼 클릭 뒤 개인 응답으로 참여 완료가 뜨는 화면 |
| 목록 명령 | 진행 중인 추첨, 참여 인원, 마감 시간 |
| 결과 발표 | 당첨자 멘션과 추첨 메시지 이동 버튼 |
| 재추첨 | 끝난 추첨을 골라 다시 당첨자를 뽑는 흐름 |