İ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.
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ı:
- Sistem
Contains other
Subject
s 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 Subject
s’ 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 ContextCalculator
s
(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
.