PagedCommand

CoreProtect의 검색 결과처럼, 페이지화 된 채팅 UI를 구현할 수 있는 SigCommand 템플릿 입니다.

Usage

  • extends PagedCommand<T extends Paged>를 구현합니다. 이때 Paged는 유저의 검색 결과를 저장하는 역할을 합니다.

  • 아래는 일반적인 사용 예시입니다.

    @Override
    public void onCommand(@NotNull SigCommandInput input) {
        checkConsole(input);
        runAsync(() -> {
            String subCmd = input.getNextArg();
            if (ParseUtil.isInteger(subCmd)) {
                sendPage(input, setPage(input, Integer.parseInt(subCmd)));
                // 숫자 입력시 저장된 검색 결과(Paged)의 페이지를 바꾸고 검색 결과를 표시함

                return;
            }

            Player player = input.getPlayer();
            String value = input.readToEnd(1);
            SigItemId itemId = Optional
                    .ofNullable(value)
                    .map(ItemUtil::getIdFromSearch)
                    .orElseGet(() -> SigItemAPI.getItemId(player.getInventory().getItemInMainHand()));

            setPaged(input, new UserShopSearcher(itemId)); // 검색 결과를 저장함
            sendPage(input, setPage(input, 1));
        });
    }
    
    private void sendPage(@NotNull SigCommandInput input,
                          @NotNull UserShopSearcher userShopSearcher) {
        if (userShopSearcher.getItemId() == null)
            send(input, getMessage("USER_SHOP_SEARCH_NOT_FOUND"));
        else
            sendSearchResult(input, searchShops(userShopSearcher.getItemId()), getLocaleId());
    }

    private void sendSearchResult(@NotNull SigCommandInput input,
                                  @NotNull List<UserShopData> shops,
                                  @NotNull String localeId) {
        send(input, new SigStringEditor()
                .replace("{count}", String.valueOf(shops.size()))
                .replace("{itemName}", shops.getFirst().getItemName())
                .edit(getMultipleMessage("USER_SHOP_SEARCH_RESULT")));

        for (UserShopData shop : paginate(shops, input)) {
            sendData(input, localeId, shop);
        }
        // paginate를 통해 검색 결과에서 표시할 검색 결과만을 골라낼 수 있음

        send(input, formatPage(input, shops)
            .edit(getMultipleMessage("USER_SHOP_SEARCH_RESULT_FOOTER")));
        // formatPage로 {page} 및 {maxPage}를 표시할 수 있음
    }

Last updated