권한과 레벨
devplorer의 권한은 레벨과 능력으로 나뉩니다.
게임이 Provider로 레벨을 정하면, 서버는 요청마다 그 레벨의 능력을 기준으로 요청을 다시 검사합니다.
레벨은 세 가지이고, 위 레벨은 아래 레벨의 능력을 모두 포함합니다.
| 레벨 | 대상 | 새로 얻는 능력 |
|---|---|---|
Tester |
플레이 테스터 | View, Server, ServerValues, Logs |
MainTester |
테스터 중 가장 높은 권한을 가진 사람 | Edit |
Developer |
개발자 | Execute |
| 능력 | 허용하는 일 |
|---|---|
View |
클라이언트 쪽 Explorer와 Properties. 이 능력이 없으면 창에서 아무 일도 할 수 없습니다. |
Server |
서버 트리 보기(이름과 클래스). |
ServerValues |
서버 인스턴스의 속성, 특성 값, 태그 읽기. Server가 있어야 합니다. |
Logs |
Output 보기(서버 출력 포함). |
Edit |
서버 트리 편집(속성, 특성, 태그, 만들기, 지우기, 옮기기, 복제)과 클라이언트 트리 편집. 서버 편집에는 Server와 ServerValues도 필요합니다. |
Execute |
스크립트와 관련된 편집, Remote와 Bindable 디버깅, 인터프리터. |
Provider
섹션 제목: “Provider”Provider는 Server.Start에 넘기는 판정 함수입니다. 형태는 (player: Player) -> Level?입니다.
- 요청마다 호출되므로 yield하지 않도록 가볍게 작성해야 합니다. 그룹 랭크처럼 웹 호출이 필요한 판정은 게임에서 미리 캐시해 둔 값을 읽는 방식을 권합니다.
- 에러가 나거나 레벨이 아닌 값을 돌려주면 권한 없음으로 처리됩니다.
- 레벨이 바뀌면 열려 있는 창을 새 레벨로 다시 보내고, 권한이 사라지면 창을 닫습니다.
Devplorer.Start({ Provider = function(player: Player): string? if Developers[player.UserId] then return "Developer" end return nil end,})Provider가 읽어도 되는 값과 안 되는 값
섹션 제목: “Provider가 읽어도 되는 값과 안 되는 값”- 읽어도 되는 값: 코드 안의 UserId 목록, DataStore나 그룹 랭크를 캐시해 둔 서버 모듈의 테이블, 아래
Secret으로 가린 인스턴스. - 읽으면 안 되는 값: 플레이어의 특성, 태그, 팀, 그리고 편집할 수 있는 위치에 있는 값 객체.
Edit 권한을 받은 사람이 이런 값을 바꾸면 스스로 레벨을 올릴 수 있기 때문입니다.
devplorer는 Provider가 무엇을 읽는지 알 수 없어 코드로 막을 수 없으므로, 게임 개발자가 직접 지켜야 합니다.
Provider가 읽는 인스턴스는 Secret으로 가린 곳(예: ServerStorage) 아래에 두는 것을 권합니다.
서버 콘솔 명령
섹션 제목: “서버 콘솔 명령”서버 콘솔(F9)에서 서버 코드를 실행할 수 있는 개발자는 Provider와 별개로 권한을 직접 줄 수 있습니다.
콘솔에서 준 권한은 해당 서버가 살아 있는 동안 Provider보다 우선합니다.
local D = require(game.ServerStorage.Devplorer.Server)D.Grant("Username", "MainTester")D.Open("Username")| 명령 | 하는 일 |
|---|---|
Grant(대상, 레벨) |
해당 서버에서 레벨을 줍니다. 창이 열려 있으면 새 레벨로 다시 보냅니다. |
Open(대상) |
권한이 있으면 창(번들)을 보냅니다. |
Close(대상) |
창만 닫습니다. 권한은 그대로입니다. |
Revoke(대상) |
해당 서버에서 권한을 없앱니다. Provider가 준 권한도 막고 창을 닫습니다. |
Reset(대상) |
콘솔로 덮어쓴 권한을 지우고 Provider의 판정으로 돌아갑니다. |
List() |
서버에 있는 플레이어의 레벨, 덮어쓴 권한, 창 상태를 출력하고 테이블로도 돌려줍니다. |
대상은 Player, UserId(숫자), 사용자명(문자열)으로 지정할 수 있습니다.
Grant,Revoke,Reset은 사용자명(대소문자 무시, 정확히 일치)과 UserId만 받습니다. 표시 이름은 다른 사람의 사용자명과 같게 지을 수 있어서 받지 않습니다.Open과Close는 표시 이름도 받습니다. 표시 이름이 둘 이상 겹치면 후보를 보여 주고 에러를 냅니다.- 아직 서버에 들어오지 않은 사람에게
Grant를 쓰려면 UserId로 지정하면 됩니다. - 레벨 이름을 잘못 쓰면 에러가 납니다. 오타로 권한이 바뀌는 일을 막기 위해서입니다.
주의할 점
섹션 제목: “주의할 점”레벨별 능력 바꾸기
섹션 제목: “레벨별 능력 바꾸기”Start의 LevelCapabilities로 레벨마다 능력을 다시 정할 수 있습니다.
여기에 적은 레벨은 적힌 능력만 가집니다(아래 레벨의 능력이 누적되지 않습니다). 적지 않은 레벨은 기본 구성을 따릅니다.
Devplorer.Start({ Provider = provider, LevelCapabilities = { -- 서버 값 읽기는 MainTester부터 Tester = { "View", "Server", "Logs" }, },})- 알 수 없는 레벨이나 능력 이름을 쓰면
Start가 에러를 냅니다. View가 없는 레벨이 있으면 그 레벨의 창에서는 아무 일도 할 수 없으므로Start가 경고를 출력합니다.- 서버 편집에는
Server,ServerValues,Edit가 모두 필요합니다.