차단 모델
보고된 시드는 일정 시간 SLMAPS에서 조회되지 않습니다. 그 시간이 어떻게 정해지고 언제 끝나는지 설명합니다.
용어
| 용어 | 뜻 |
|---|---|
| 차단 | 한 시드가 조회되지 않는 시간입니다. 첫 보고에 시작되고 round_end 또는 상한에서 끝납니다. |
| 상한 | 차단 한 번의 최대 길이입니다. 게임 서버에서 직접 보내는 등록은 1시간, 디스코드 HTTP 키는 20분입니다. |
| 예산 | 한 시드가 지금까지와 앞으로 차단될 수 있는 총 시간입니다. 상한과 같은 값이며, 차단이 끝날 때마다 실제로 차단된 시간만큼 줄어듭니다. |
| 쿨다운 (시드 기준) | 차단이 끝난 시드는 5분 동안 다시 차단되지 않습니다. 어느 서버 키로 보고해도 같습니다. |
| 서버당 차단 하나 (서버 기준) | 한 서버 키는 한 번에 시드 하나만 차단합니다. 다음 시드는 이전 차단이 끝나고, 이전 차단을 시작한 지 5분이 지나야 차단됩니다. 시드 쿨다운과는 별개의 규칙입니다. |
차단이 시작되는 조건
round_start 또는 periodic 보고가 차단을 시작합니다. round_end는 차단을 시작하지 않습니다. 차단 길이는 다음과 같이 정해집니다.
차단 길이 = min(상한, 남은 예산) 상한 = 60분 (직접 등록, 플러그인) 또는 20분 (HTTP 키) 남은 예산 = 상한 − 이 시드가 지금까지 차단된 시간의 합
남은 예산이 0이면 차단되지 않고 응답에 "exhausted": true 가 붙습니다. HTTP 키로 20분을 다 쓴 시드를 직접 등록 키가 이어서 차단하는 것은 됩니다. 60분을 다 쓴 시드는 어느 키로도 다시 차단되지 않습니다.
차단이 끝나는 조건
- round_end 보고를 받으면 즉시 끝납니다. 실제로 차단된 시간만 예산에서 빠집니다.
- 시작한 지 차단 길이만큼 지나면 끝납니다.
- 차단 중에 같은 시드의 보고가 또 와도 그대로입니다. 연장되지 않습니다.
서버당 차단 하나
차단 중에 같은 서버 키로 다른 시드를 보고해도 그 시드는 차단되지 않습니다. 다음 차단은 이전 차단이 끝나고, 시작한 지 5분이 지난 뒤에 가능합니다. 라운드가 끝나면 round_end를 보내 차단을 끝내야 다음 라운드의 시드가 제때 차단됩니다.
두 규칙은 기준이 다릅니다. 시드 쿨다운은 "그 시드"가 5분 동안 다시 차단되지 않는 것이고, 서버당 차단 하나는 "그 서버 키"가 다음 시드를 언제 차단할 수 있는지입니다. 라운드가 20분이었다면 round_end 뒤 바로 다음 시드를 차단할 수 있고(시작한 지 5분이 지났으므로), 라운드가 3분 만에 끝났다면 2분을 더 기다립니다.
보고 응답으로 알 수 있는 것
형식이 맞고 키가 유효한 보고는 모두 200입니다. 차단됐는지는 blockedUntil로 판단합니다.
| 상황 | blockedUntil | exhausted |
|---|---|---|
| 차단 시작 | 차단이 끝나는 시각 | 없음 |
| 같은 시드, 이미 차단 중 | 그대로 | 없음 |
| round_end로 차단 끝 | null | 없음 |
| 시드 쿨다운 중 | null | 없음 |
| 이 서버가 다른 시드를 차단 중 | null | 없음 |
| 예산 소진 | null | true |
조회하는 쪽에서 보이는 것
- GET /api/maps/{seed}, GET /api/jobs/{seed}: 403 {"error":"blocked","blockedUntil":"…"}. blockedUntil 이후 다시 요청하면 됩니다.
- GET /api/seeds: 차단 중인 시드는 목록에서 빠지고, 차단이 끝나면 다시 나타납니다.
- 공개 통계: 수치는 차단과 관계없이 집계됩니다. 차단 중인 시드 값은 어디에도 공개되지 않습니다.
- 수집: 차단이 시작되는 순간 그 시드로 최근 5분 안에 들어온 감지 기록이 지워지고, 차단이 끝날 때까지 새 감지도 기록되지 않습니다.
예시
| 상황 | 직접 등록 키 (상한 60분) | HTTP 키 (상한 20분) |
|---|---|---|
| 08:00 round_start, 08:23 round_end | 08:00부터 08:23까지 차단. 남은 예산 37분 | 08:00부터 08:20까지 차단. 08:20에 상한으로 끝나고 남은 예산 0 |
| round_end 없이 방치 | 09:00까지 차단. 남은 예산 0 | 08:20까지 차단. 남은 예산 0 |
| 라운드 도중 재시작으로 새 시드 | 이전 차단이 끝날 때까지 새 시드는 보입니다. round_end를 먼저 보냈다면 이전 차단을 시작한 지 5분 뒤에 새 시드가 차단됩니다 | 같음 |
| 같은 시드가 다음 날 다시 나옴 | 남은 예산만큼만 차단. 위 첫 줄 뒤라면 37분 | 남은 예산 0이라 차단되지 않고 exhausted: true |
설계 의도
차단은 한 라운드 동안 자기 서버의 시드를 숨기는 용도입니다. 예산은 하나의 시드를 영구히 숨기는 것을 막고, 서버당 차단 하나는 키 하나로 여러 시드를 한꺼번에 숨기는 것을 막습니다.