SigCommand

Custom command module

명령어를 추상화 하는 모듈입니다. Foundation SimpleCommand의 대체를 목적으로 합니다.

Reason

  • Fo의 SimpleCommand는 유닛 테스트를 방해합니다.

  • SimpleCommandargs는 명령어 실행 당시가 아닌 현재 값을 나타내므로 비동기 실행에 적합하지 않습니다.

  • CommandAPI 등의 대안 라이브러리에는 사용 상의 부족한 점이 존재합니다.

Usage

  1. SigCommandextends 합니다.

  2. 생성자에 super("명령어 이름") 을 작성합니다.

  3. onCommand() 메서드에 필요한 로직을 작성합니다.

  4. 컨트롤러 등에서 SigCommand#register(JavaPlugin) 로 명령어를 등록합니다. (혹은 SigCommandController#register(SigCommand) 사용 가능

Implementation

@Slf4j
public class TestSigCommand extends SigCommand {

  public TestSigCommand() {
    super("testcmd");

    setPermission("siglib.testcmd");
    addCommand(new TestSubCommandShow(),
      new TestSubCommandAdd(),
      new TestSubCommandDelete(),
      new TestSubCommandPerm(),
      new TestSubCommandRecursive());
  }

  @Override
  public void onCommand(@NotNull SigCommandInput input) {
    log.info("test main command");
  }

  @Override
  protected List<String> tabComplete(@NotNull SigCommandInput input) {
    return completeSubCommands();
  }

}

Register

Feature

Namespace

네임스페이스는 명령어 실행 시 중복을 방지하기 위해 namespace:command_name 의 포맷으로 명령어를 실행할 때 사용되는 값입니다.

또한 이 값은 명령어 펄미션의 기본 값과 쿨다운 id의 기본 값에 사용됩니다.

네임스페이스의 기본 값은 sigcommand 입니다.

Execute command

  • 입력 값은 SigCommandInput를 통해 받아서 실행할 수 있습니다. 자세한 사항은 해당 목록을 참고해주세요.

Aliases

  • addAlias(String): 이 명령어에 사용될 별칭을 추가합니다.

  • setAliases(String...): 이 명령어에 사용될 별칭을 설정합니다. 이는 다른 명령어에 등록된 상태여도 작동합니다.

  • setMatcher(Predicate): Predicate를 통한 별칭 기능을 제공합니다.

Description

버킷에 전달되는 description과 usage는 해당 메서드를 재정의 함으로서 구현 가능합니다.

Sub command

  • addSubCommand(SigCommand): 하위 명령어를 추가합니다.

  • addSubCommand(String, Consumer<SigCommandInput>): 빠르게 하위 명령어를 추가합니다.

Tab complete

  • completeWords(input, String...): 입력된 단어들을 반환합니다.

  • completeSubCommands(input): 밑에 등록된 명령어의 getName() 들을 반환합니다.

  • completeSubCommands(input, CommandSender): 위와 동일하나 펄미션이 있는 명령어 만을 반환합니다.

  • completePlayerNames(input): 현재 온라인인 플레이어의 이름들을 반환합니다.

  • completeEmpty() 또는 NO_COMPLETE: Tab complete를 수행하지 않습니다.

  • args.length에 따라 탭 자동 완성을 하는 명령어의 경우 아래와 같이 구현할 수 있습니다.

Register

SigCommandController#register를 이용하는 방법과 SigCommand 메서드를 이용하는 방식이 있습니다. SigCommand 등록 메서드는 아래와 같습니다.

  • register(): namespace를 sigcommand 로 하여 명령어를 등록합니다.

  • register(String): 입력된 값에 따라 namespace를 설정하여 명령어를 등록합니다.

  • register(JavaPlugin): 플러그인의 getName().toLowerCase()를 namespace로 명령어를 등록합니다. 또한 JavaPlugin을 command에 등록합니다.

Miscellaneous

  • checkPlayer(SigCommandInput): 실행자가 플레이어인 경우 경고를 표시합니다.

  • checkConsole(SigCommandInput): 실행자가 콘솔인 경우 경고를 표시합니다.

SigCommandConstraint

명령어의 실행 제약 조건을 다룹니다.

Permission

명령어에 대한 펄미션을 설정합니다.

  • 펄미션이 설정되지 않았을 경우 기본 펄미션은 (namespace).command.(command_names) 입니다. 예) siglib.command.testcmd, siglib.command.testcmd.add

  • removePermission(): 펄미션을 삭제합니다. 아무 유저나 실행할 수 있게 됩니다.

  • setPermissionMessage(String): 펄미션이 없을 시 표시될 메시지를 지정합니다. onNoPermission()에 의해 덮어 쓰여질 수 있습니다.

register()를 호출하기 전의 코드 상 기본 펄미션 값은 sigcommand.default 입니다.

Cooldown

명령어에 대한 쿨다운을 설정합니다. 기본적으로는 쿨다운은 존재하지 않습니다.

  • 쿨다운 id가 설정되지 않았을 경우 기본 id는 (namespace)_(command_names) 입니다. 예) siglib_testcmd, siglib_testcmd_add

  • setCooldownId(String): 적용될 쿨다운 ID를 설정합니다.

  • setCooldown(Duration): 이 명령어를 실행할 때 적용될 쿨다운의 시간을 설정합니다.

  • addCooldown(): 설정된 Duration에 따른 쿨다운을 즉시 적용합니다.

  • addCooldown(Duration): 해당 Duration 만큼의 쿨다운을 즉시 적용합니다.

  • setCooldownMessage(String): 쿨다운 중 일시 표시될 메시지를 지정합니다. onCooldown()에 의해 덮어 쓰여질 수 있습니다.

register()를 호출하기 전 코드 상 기본 쿨다운 id 값은 sigcommand_default 입니다.

SigCommandInput

실행 중인 명령어의 입력 정보를 포함하는 데이터 입니다.

  • getSender(): 명령어를 보낸 CommandSender 를 반환합니다. 콘솔일 수도 있습니다.

  • getNamespace(): 입력 시 사용된 네임스페이스를 반환합니다. null 일 수 있습니다.

  • getLabel(): 입력 시 사용된 명령어의 이름을 나타냅니다. Aliases로 입력했을 경우 이를 나타냅니다.

  • getDepth(): 현재 명령어의 실행 깊이를 나타냅니다. 예를 들어 최상위 명령어인 경우 값은 0 입니다.

  • getArgs(): 입력 시 사용된 명령어의 전체 인자들을 나타냅니다. getArgs().get(0)은 Label을 제외하고 첫 번째로 입력된 값을 나타냅니다.

  • getArg(Integer): 입력된 순서의 인자를 나타냅니다. args[index]와 같습니다. 존재하지 않을 경우 null을 반환 합니다.

  • getLength(): 인자의 갯수를 나타냅니다. args.length 와 같습니다.

  • getTabLength(): 탭 자동 완성에 사용되는 인자의 갯수를 나타냅니다. isLastBlank() == true인 경우 1을 더합니다.

  • getNowArg(): 현재 명령어를 실행하는 순서의 인자를 나타냅니다. Label은 제외됩니다. 이 값은 하위 명령어인 경우 SigCommand#getName()과 같습니다.

  • getNextArg(): 다음 위치에 있는 인자를 나타냅니다. 없을 경우 null을 반환합니다.

  • getNextArg(Integer): 값만큼 다음 위치에 있는 인자를 나타냅니다. 없을 경우 null을 반환합니다.

  • getPrevArg(): 이전 위치에 있는 인자를 나타냅니다. 없을 경우 null을 반환합니다.

  • getPrevArg(Integer): 값만큼 이전 위치에 있는 인자를 나타냅니다. 없을 경우 null을 반환합니다.

  • getInput(): 입력된 명령 줄을 /를 제외하고 재구성해 반환합니다.

  • getSlashInput(): 입력된 명령 줄을 /를 포함하여 재구성해 반환합니다.

  • isLastBlank(): 마지막 입력 문자가 공백인지 확인합니다.

기존 명령어 시스템과 달리, 유효한 글자가 입력 되어야 하나의 Argument로 취급합니다. 즉, ""와 같은 빈 문자열은 제외 됩니다.

SigCommandBuilder

SigCommand 를 만들 수 있는 빌더 입니다.

SigCommandException

오류 발생 시 반환 되는 Exception 입니다. 오류 메시지와 입력 시 사용된 SigCommandInput을 포함하고 있습니다.

Caution

  • SigCommand#init을 외부에서 호출하지 마세요. 호출할 필요가 없으며 버그를 유발할 수 있습니다.

Last updated