İzinler

Uyarı

These docs were written for SpongeAPI 7 and are likely out of date. If you feel like you can help update them, please submit a PR!

If you are interested in the permissions that are used in vanilla commands have a look at this page. For customizing the permission levels refer to the server permissions page or your permission plugin’s documentation.

İzin

İzin, büyük/küçük harf duyarlı olmayan bir konunun belirli bir işlemi yapıp yapamayacağını belirlemek için kullanılan, hiyerarşik bir dize anahtarıdır. Dize, ayrı parçalara nokta karakterini kullanarak bölünür. İzinler şu şekilde planlanmalıdır.

<PluginID>.<MainGroup>.<Subgroup1>...

İzin verilen karakterler:

  • “A” - “Z”

  • “a” - “z”

  • “0” - “9”

  • “_”

  • “-”

  • “.”

Kalıtım

Bir kullanıcının izni varsa myplugin.commands``bunlar gibi otomatik olarak tüm alt izinlere sahip olurlar ``myplugin.commands.teleport izinler açıkça kaldırılmadığı sürece.

Not

`myplugin.commands.*``vahşi kart izni diye bir şey yoktur. Bunun için ``myplugin.commands``ı kullanınız.

Yapı-Örnek

Aşağıdaki örnek, izinleri yapılandırmanın olası bir yolunu göstermektedir, ancak bu yapıyı izlemek hiç gerekli değildir.

  • myplugin
    • Grantların tüm eklenti izinlerine erişimleri vardır.

  • myplugin.commands`
    • Grantların tüm eklenti komutlarına erişimi vardır.

  • myplugin.commands.teleport.execute
    • Only grants the user the permission to execute the command. Without this permission he is not able to execute the command even if he has other teleport permissions. (With this permission alone, the user would only be able to teleport himself to others in his current world.)

  • myplugin.commands.teleport.all
    • Kullanıcıya sadece tek seferde tüm oyuncuları ışınlama iznini verir.

  • myplugin.commands.teleport.worlds
    • Kullanıcıya sadece tüm dünyalara ışınlanabilme izni verir.

  • myplugin.commands.teleport.worlds.mynetherworld
    • Kullanıcıya sadece mynetherworld’e ışınlanabilme izni verir.

PermissionDescription

:javadoc:`PermissionDescription belli bir izinde detaylı bir sunucu sağlamayı amaçlayan bir hizmet programı yazılımıdır. ``PermissionDescription``ları bir :javadoc:`PermissionService`in sağlayabileceği opsiyonel bir özelliktir. Bir PermissionDescription oluşturmanın iznin var olup olmadığı,kimin erişimi olduğu veya varsayılan değerinin ne olduğuna hiç bir etkisi yoktur.

Açıklamanın içeriği:

  • hedef izin kimliği

  • Bir metin açıklaması

  • bir veya daha fazla atanan rol

  • sahip olma eklentisi

Eğer World veya ItemType gibi dinamik bir öğeniz varsa, o halde <TemplateParts> kullanabilirsiniz.

Kullanım örnekleri

import net.kyori.adventure.text.Component;
import org.spongepowered.api.service.permission.PermissionDescription;
import org.spongepowered.api.service.permission.PermissionDescription.Builder;
import org.spongepowered.api.service.permission.PermissionService;

PluginContainer plugin = ...;
Builder builder = permissionService.newDescriptionBuilder(plugin);

builder.id("myplugin.commands.teleport.execute")
       .description(Component.text("Allows the user to execute the teleport command."))
       .assign(PermissionDescription.ROLE_STAFF, true)
       .register();

Basit-Sonuç

myplugin.commands.teleport.execute

Description: Allows the user to execute the teleport command.
Role: user
Owner: MyPlugin v1.2.3

Basit-Sonuç

myplugin.commands.teleport.worlds.<World>

Description: Allows the user to teleport to the world <World>.
Role: staff
Owner: MyPlugin v1.2.3

Tüyo

Anlamı yalnızca izin yapısı olan ve tanımlanmış alt yetki türetilebileceğinden “myPlugin.commands.teleport.worlds` veya” myPlugin.commands ” gibi bazı üst izin gruplarına yönelik açıklamaları atlayabilirsiniz.

Başlık

A Subject`atanan izinlerin tutucusudur. ``PermissionService``den :javadoc:`SubjectCollection`ları yoluyla alınabilir.:javadoc:`Player gibi :javadoc:`CommandSource`lar varsayılan olarak``Subject``lerdir ama daha başka bir çok türde ``Subject``ler vardır. İzne sahip olan her şey sadece sınırlı Subject kontrollerini temsil etse bile bir Subject’dir. Subjecte izinler verilebilir veya reddedilebilir.Eğer izin ne verilmiş ne reddedilmişse ayarları bir başkası için devredilir.Inheritance’a bakın.Subject’ler belli bir izinleri olup olmadığını kontrol etmek için yöntemler sunarlar.Bu yöntemi kullanan eklentiler sadece kontrol etmek istedikleri belli başlı izinleri sorgulamalıdır.

Örnek

Aşağıdaki örnek, Player’ın teleport komutu yürütmesine izin verilip verilmediğini kontrol etmek için kullanılabilir.

import org.spongepowered.api.entity.living.player.Player;
import org.spongepowered.api.world.World;

public boolean canTeleport(Player subject, World targetWorld) {
    return subject.hasPermission("myplugin.command.teleport.execute")
            && (subject.getWorld() == targetWorld
                    || subject.hasPermission("myplugin.command.teleport." + targetWorld.getName()));
}

Kalıtım

Eğer bir Subject``e atanmış bir izin varsa, o değeri kullanacaktır. Aksi halde, herhangi bir kaynak ``Subject’ten devralınacaktır. Hangi tür kaynağın (örneğin, grup veya oyuncu) Subject olabileceği önemli değildir.

Ne özne ne de ebeveynlerin herhangi biri, izin vermez veya reddederse, o zaman varsayılan olarak``Subject``alınacaktır. Her SubjectCollection kendi varsayılanına sahiptir. Küresel ve en zayıf varsayılan tema PermissionService’den alınabilir Her başlatma işlemi esnasında eklentiler SubjectData ile kendi izinlerinin varsayılan öntanımlı olarak atayabilir. Sunucu sahiplerinin varsayılan olarak kalıcı SubjectData kullanarak ihtiyaçlarına göre eklentiler tarafından tanımlanan varsayılanların üzerine yazmalarını sağlar. Sunucu sahipleri için bir yapılandırma rehberi sunmak isterseniz bunun yerine PermissionDescription’ın rol şablonlarını kullanın.

Uyarı

You should think carefully before granting default permissions to users. By granting the permissions you are assuming that all server owners will want these defaults (at least the first time the plugin runs) and that exceptions will require server owners to explicitly deny the permissions (which can’t even be done without a custom permissions service implementation). This should roughly correspond to a guest on a single player lan world without cheats. For example, a chat plugin would allow sending chat messages by default to imitate vanilla game behavior for features that were changed by the plugin.

Not

Varsayılan ``Subject``lerin kalıcı ``SubjectData``larının geçici olanlara göre önceliği vardır. Diğer tüm ``Subject``ler için ise geçici ``SubjectData``nın kalıcı olanlara göre üstünlüğü vardır.

Eğer ne konu ne de konunun kaynaklarının hiçbiri veya varsayılanlar bir izne bir değer atamazsa izin otomatik olarak reddedilir.

Not

Azalan sırayla öncelik sırası:

  • Konunun kendisi
    • Geçici

    • Kalıcı

  • Ana konular
    • Geçici

    • Kalıcı

  • Konu Koleksiyonu Varsayılanları
    • Kalıcı

    • Geçici

  • İzin Servis Varsayılanları
    • Kalıcı

    • Geçici

  • Izin vermeyi reddet

SubjectCollections

İsme göre bir Konu elde etmek için kullanılabilecek konular için bir konteyner. Bunlar varsayılan Konu Koleksiyonları:

  • Kullanıcı
    • Bütün çevrimiçi ``Player``ları ve bütün çevrimdışı ``User``ları (en azından varsayılan ayarlı olmayanlar) içerir.

  • Grup
    • Bütün Subject gruplarını içerir. Gruplar adlandırılmış ``Subject``leri kullanan kalıtım ağacı ``Subject``lerini oluşturmanın basit bir yoludur. Gruplar eğer belli bir ``Subject``alt kümesinin takım, grup veya görev gibi fazladan izni varsa kullanılmalıdır.

  • Sistem
    • Contains other Subjects used by the server such as the console and possible remote consoles.

  • Komut bloğu
    • Komut engeli için tüm Subject``leri içerir.Bunlar eğer sadece oluşturucunun izniyle bir ``CommandBlock çalıştırmak isterseniz faydalıdır.

  • Rol şablonu
    • `` PermissionDescription`` s’de kullanılan tüm rol şablonu konularını içerir. Bir kullanıcı için önerilen tüm izinleri bulmakta kullanışlıdır. Bunlar devralma için kullanılmamalıdır.

Not

SubjectCollection``lar bir ``Subject için sorgulandığında eğer çoktan mevcut değillerse otomatik olarak oluşturulacaklardır. Ancak varsayılan olmayan değerler ayarlanmadığı takdirde kesin olarak``getAllSubjects()``de görünmeyebilirler.

SubjectData

SubjectData, konuya bağlı olan gerçek bir izin deposudur. İki tür konu mağazası vardır:

  • Geçici = Sadece oturumun süresi boyunca sürer, hiçbir zaman kaydedilmez

  • Düzenli (sürekli) = Bir yere kaydedilmiş ve bu yüzden depolamayı sürdürmüş ve sonsuza kadar var olmuş olabilir. Bu kalıcı bi belleğe uygulamak amacıyla PermissionService için önerilir ancak bu bir gereklilik değildir. Bu konunun türüne de bağlı olabilir. Eğer kalıcılık yoksa o zaman geçici bellek her iki yöntemle de geri dönmüş olacaktır.

Eklenti yazarları, aralarında seçim yaparken bir değeri sürdürmeye gerek olup olmadığını düşünmelidir.

  • Kısa bir süre için (ör. Bir minigame sırasında) ise, geçici olanını kullanın.

  • Eğer uzun süredir veya sonsuza kadar sürecekse (örn. VIP için bir promosyon) normal (sürekli) olanı kullanılır.

Geçici ve sürekli ``SubjectData``ların kalıtım özelliği ve önceliği ile ilgili daha fazla bilgiye sahip olmak istiyorsanız lütfen Kalıtım Özelliği bölümüne bakın.

Örnek

The following example could be used to give a player a permission with global context and a true value

import org.spongepowered.api.entity.living.player.Player;

public void setPermission(Player player, String permission) {
    if(!player.hasPermission(permission)
        player.getSubjectData().setPermission(SubjectData.GLOBAL_CONTEXT, permission, Tristate.TRUE);
}

Not

In the above example Tristate.TRUE was used but you can also use Tristate.FALSE for a false permission and Tristate.UNDEFINED to unset the permission entirely.

Konu Seçenekleri

Konular ayrıca satır seçeneklerini saklamak için olanak sağlar. Bunlar basit olarak atanabilen ve devralınabilen anahtar değer çiftleridir. İzin satırlarının aksine, anahtarlar hiyerarşik değildir ve herhangi bir devretme mekanizması sağlamazlar, ancak anahtar değer çiftlerinin kendileri, izinlerin verildiği şekilde Subjects’ den devralınır.

Bağlamlar

Eğer siz her izni ayrıcalık veya birşey yapabilme kabiliyeti olarak düşünürseniz, bir Context bu ayrıcalıkların kullanılabilir olduğu koşullardır.

Bir şeyler yapmak için bir Subject``izni vermek isteyebilirsiniz yalnız sadece ``Subject belli bir dünyada veya belli bir bölgede olduğunda yapabilirsiniz.

İçerikler Subject tarafından biriktirilir ve sonra Subject``in ayrıcalığı olup olmadığına karar vermek için ``PermissionService tarafından kullanılır.

Sponge bir takım varsayılan içerikler sağlar ama genel olarak ContextCalculator kanalıyla PermissionService’e ek içerikler sağlamak için diğer eklentilerin altındadır.

Eğer bu içerikler paylaşılmak isteniyorsa lütfen kendi eklentilerinizi oluştururken diğer eklentilerle çakışmasından kaçının (Örneğin eklenti kimliğinizle birlikte içerik anahtarını önüne ekleyerek.).

Not

Please make sure that your ContextCalculator responds as fast as possible as it will get called frequently.

Uyarı

ContextCalculator implementations must be thread safe, because they may be called from outside of the main thread, or even called in parallel. For to this reason, all non-name or non-uuid based ContextCalculators (such as location-based ones) have to utilize a cache and must be to be updated using event listeners or synchronized schedulers.

Örnek

``ContextCalculator``ınız böyle görünebilir:

import org.spongepowered.api.command.CommandSource;
import org.spongepowered.api.service.context.Context;
import org.spongepowered.api.service.context.ContextCalculator;
import org.spongepowered.api.service.permission.Subject;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;

public class ExampleCalculator implements ContextCalculator<Subject> {

    private static final Context IN_ANY_ARENA = new Context("myarenaplugin-inAnyArena", "true");
    private static final Context NOT_ANY_ARENA = new Context("myarenaplugin-inAnyArena", "false");
    private static final String ARENA_KEY = "myarenaplugin-arena";

    private final Map<UUID, String> playerArenas = new ConcurrentHashMap<>();

    @Override
    public void accumulateContexts(Subject subject, Set<Context> accumulator) {
        CommandSource commandSource = subject.getCommandSource().orElse(null);

        if (commandSource instanceof Player) {
            UUID uuid = ((Player) commandSource).getUniqueId();

            String arena = this.playerArenas.get(uuid);
            if (arena != null) {
                accumulator.add(IN_ANY_ARENA);
                accumulator.add(new Context(ARENA_KEY, arena));
            } else {
                accumulator.add(NOT_ANY_ARENA);
            }
        }
    }

    @Override
    public boolean matches(Context context, Subject subject) {
        CommandSource commandSource = subject.getCommandSource().orElse(null);

        if (commandSource instanceof Player) {
            UUID uuid = ((Player) commandSource).getUniqueId();

            if (context.equals(IN_ANY_ARENA)) {
                return this.playerArenas.containsKey(uuid);
            } else if (context.equals(NOT_ANY_ARENA)) {
                return !this.playerArenas.containsKey(uuid);
            } else if (context.getKey().equals(ARENA_KEY)) {
                return context.getValue().equals(this.playerArenas.get(uuid));
            }
        }

        return false;
    }

}

ContextCalculator şu yollarla kaydedilebilir:

permissionService.registerContextCalculator(contextCalculator);

Modları Düzenlemek İçin

Bir Forge modunun yazarıysanız ve yeni Forge PermissionsAPI’sini kullanmıyorsanız, ancak OP kontrollerini yapıyorsanız, o zaman Sponge’ın izinleri alması için zaten doğru yoldasınız demektir.

SpongeAPI’ye bağlı olmayan Forge modunda bir Sponge izni oluşturmak için en basit yol, `` ICommandSender`` içindeki Vanilla Minecraft kodunun sağladığı yöntemi kullanmaktır, yani `` ICommandSender.canCommandSenderUseCommand (int permLevel, String commandName) ``. Bu metoda geçirilen dize, Vanilla Forge ortamında hiç bir kullanıma sahip değildir, ancak SpongeForge eklendiğinde otomatik olarak o dizeyi alır ve bir çalışma iznine dönüştürür.

Örnek

public class AwesomeBlock extends Block {
    @Override
    public boolean onBlockActivated(World world, BlockPos pos, IBlockState state,
            EntityPlayer player, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) {
        if (player.canUseCommand(4, "examplemod.awesomeblock.interact")) {
            // Do cool stuff
            return true;
        }
        return false;
    }
}

Görebildiğiniz gibi OP seviyesini kontrol ettik ve Sponge kullanıldığında izin olarak kullanmak istediğiniz rastgele bir Dize’yi gönderiyoruz. Forge kendi başına kullanıldığında, oyuncu sadece OP seviyesini gerektirir, bu nedenle 0 değeri geçmek tüm kullanıcıların blokla etkileşime girmesine izin verir, ancak SpongeForge eklendiğinde `` examplemod.awesomeblock.interact`` izin düğümünü gerektirir.. Yukarıda açıklandığı gibi izin yapısına uyulması önerilir. İzin devralma bu kontroller için de geçerlidir.

Not

Bu yöntem için SRG adı func_70003_b.