Bendera perintah

Bendera perintah berguna untuk menentukan parameter tambahan yang akan digunakan untuk memproses perintah yang tidak termasuk dalam argumen perintah.

Untuk membuat bendera, pertama-tama kita perlu builder untuk bendera. Kita hanya dapat menggunakan GenericArguments#bendera() metode ditawarkan oleh GenericArguments untuk mendapatkan builder yang kita butuhkan. Dari sana, kita dapat menentukan apa jenis bendera yang kita inginkan untuk membuat. Perhatikan bahwa bendera yang ditentukan sebagai argumen.

import org.spongepowered.api.command.args.GenericArguments;
import org.spongepowered.api.command.spec.CommandSpec;

CommandSpec myCommand = CommandSpec.builder()
    .executor(new MyCommand())
    .arguments(GenericArguments.flags().flag("s").buildWith(GenericArguments.none()))
    .build();

Ini akan membuat perintah bendera, sehingga ketika pemain melakukan /kita-perintah -s, bendera s akan menjadi kenyataan. Perhatikan bahwa bangunan GenericArguments#tidakada() akan mencegah perintah dari memiliki argumen. Jika anda berharap untuk perintah untuk memiliki argumen dan bendera, anda akan perlu untuk menentukan argumen anda dalam CommandFlags.Builder#buildWith(CommandElement) metode.

Sekarang bahwa kita telah menetapkan bahwa perintah ini dapat dijalankan dengan bendera, sekarang kita bisa mendapatkan nilai flag. Untuk yang sederhana boolean flag seperti yang kita telah disebutkan di atas, kita dapat hanya memeriksa jika ada. Dalam contoh di bawah ini, kami akan memeriksa jika CommandContext untuk perintah memiliki nilai s.

import org.spongepowered.api.text.Text;

if (args.hasAny("s")) {
    src.sendMessage(Text.of("The command flag s was specified!"));
}

Izin Bendera

Kami bendera sejauh ini adalah luar biasa, tapi bagaimana jika kita ingin memilikinya sehingga pemain perlu izin untuk menggunakan bendera? Kita dapat menggunakan CommandFlags.Builder#permissionFlag(String, String...) metode pada bendera kita builder. Hal ini akan membutuhkan pemain untuk memiliki izin khusus untuk menjalankan perintah dengan bendera. Contoh dari hal ini adalah di bawah ini:

CommandSpec myCommand = CommandSpec.builder()
        .executor(new MyCommand())
        .arguments(GenericArguments.flags().permissionFlag("myplugin.command.flag",
            "s").buildWith(GenericArguments.none()))
        .build();

Jika seorang pemain tidak memiliki izin myplugin.perintah.bendera, maka mereka tidak akan diizinkan untuk mengeksekusi perintah kita dengan perintah bendera s.

Nilai Bendera

Boolean dapat menjadi besar, tetapi bagaimana jika kita ingin bendera untuk hal-hal seperti string atau integer? Ini adalah di mana nilai flags datang ke dalam bermain. Kita hanya perlu menggunakan CommandFlags.Builder#valueFlag(CommandElement, String...) metode pada bendera kita builder. Menggunakan valueFlag() metode, kita dapat menentukan jenis bendera yang ingin kita buat, seperti integer atau string. Menciptakan nilai integer bendera dapat dilakukan seperti:

CommandSpec myCommand = CommandSpec.builder()
        .executor(new MyCommand())
        .arguments(GenericArguments.flags().valueFlag(GenericArguments
                .integer(Text.of("value")), "s").buildWith(GenericArguments.none()))
        .build();

Anda dapat mengganti GenericArguments#integer(Teks) dengan bendera lainnya jenis yang ingin anda tentukan, seperti GenericArguments#string(Teks).

Sekarang untuk mengambil kembali nilai bendera dari perintah kami, kami bisa memperlakukannya seperti pada argumen perintah lainnya. Kami hanya butuh memeriksa apakah itu ada sebelum mengambilnya kembali:

import java.util.Optional;

Optional<Integer> optional = args.<Integer>getOne("value");
if (optional.isPresent()) {
    int value = optional.get().intValue();
} else {
    src.sendMessage(Text.of("The value flag was not specified."));
}

Panjang bendera

Sebagai alternatif untuk bendera pendek seperti yang kita gunakan di atas, kita juga bisa menggunakan flag yang panjang. Dengan menggunakan flag yang panjang, Anda dapat menentukan nilai beserta flag yang sama dengan perintah. Untuk membuat bendera panjang, cukup awali bendera normal Anda dengan tanda dash `` -``, seperti:

CommandSpec myCommand = CommandSpec.builder()
        .executor(new MyCommand())
        .arguments(GenericArguments.flags().flag("-myflag")
            .buildWith(GenericArguments.none()))
        .build();

Kita dapat mengambil kembali nilai yang telah ditentukan dengan bendera kita dengan nilai yang sama:

Optional<String> optional = args.<String>getOne("myflag");
if (optional.isPresent()) {
    String value = optional.get();
}

Jadi jika pengguna menjalankan /our-command --myflag=Flag_Value, Flag_Value akan disimpan di dalam string value.

Tidak Diketahui Bendera Perilaku

Sekarang bagaimana jika kita tidak menentukan sebuah bendera yang spesifik untuk mengikuti perintah kita, Tetapi tetap ingin untuk menerima bendera yang tidak diketahui? Kita dapat mengatur tingkah laku bendera yang tidak diketahui dari perintah kita untuk mencapai hal ini:

import org.spongepowered.api.command.args.CommandFlags;

CommandSpec myCommand = CommandSpec.builder()
            .executor(new MyCommand())
            .arguments(GenericArguments.flags()
                    .setUnknownShortFlagBehavior(
                        CommandFlags.UnknownFlagBehavior.ACCEPT_VALUE)
                    .buildWith(GenericArguments.none()))
            .build();

Dengan menggunakan ini, kita dapat menentukan bahwa setiap bendera singkat dengan nilai yang telah ditentukan akan diterima. Tanpa ini, mencoba untuk menggunakan aplikasi yang tidak diketahui bendera akan melempar pengecualian. Beberapa mungkin tidak diketahui bendera perilaku adalah KESALAHAN, ACCEPT_NONVALUE, ACCEPT_VALUE, dan MENGABAIKAN. Perhatikan bahwa perilaku default untuk diketahui bendera adalah KESALAHAN.