API Cookbook

Short recipes for common integration tasks. For full method signatures, see Javadoc.


Setup

import ru.tehkode.permissions.bukkit.PermissionsEx;

if (!PermissionsEx.isAvailable()) {
    getLogger().warning("PEX not loaded");
    return;
}
var api = PermissionsEx.getApi();

Maven (provided scope):

<dependency>
  <groupId>dev.rono.permissions</groupId>
  <artifactId>permissionsex-api</artifactId>
  <version>1.23.5</version>
  <scope>provided</scope>
</dependency>

Check a permission

var user = api.getUserManager().getUser(player.getUniqueId());
if (user.has("myplugin.use")) {
    // allowed
}

Javadoc: User · PermissionSubject.has()


Add a permission to a user

var user = api.getUserManager().getUser(player.getUniqueId());
user.addPermission("myplugin.reward");
user.save();

Always call save() after mutations.

Javadoc: User.addPermission()


Add a permission to a group

var group = api.getGroupManager().getGroup("vip");
group.addPermission("essentials.fly");
group.save();

Javadoc: GroupManager · Group


Create a group

var group = api.getGroupManager().createGroup("vip");
group.addParent("default");
group.addPermission("essentials.fly");
group.setPrefix("&6[VIP] ");
group.save();

Javadoc: GroupManager.createGroup()


Add a user to a group

var user = api.getUserManager().getUser(player.getUniqueId());
user.addGroup("vip");
user.save();

Replace all groups:

user.setGroups(java.util.List.of("admin"));
user.save();

Javadoc: User.addGroup()


Timed permission

user.addTimedPermission("essentials.fly", 604800); // 7 days in seconds
user.save();

Javadoc: PermissionSubject.addTimedPermission()


World-scoped permissions

import dev.rono.permissions.api.permission.PermissionContext;

var ctx = PermissionContext.of(player.getWorld().getName());
var scoped = user.inContext(ctx);
if (scoped.has("myplugin.nether-only")) {
    // ...
}
scoped.addPermission("myplugin.visited");
user.save();

Javadoc: PermissionContext · SubjectContext


Promote / demote

try {
    user.promote("staff");
} catch (RankingException e) {
    getLogger().warning("Cannot promote: " + e.getMessage());
}

Javadoc: User.promote()


Listen for changes (Spigot)

Legacy Bukkit events — still the recommended way on game servers:

import ru.tehkode.permissions.events.PermissionEntityEvent;
import org.bukkit.event.EventHandler;

@EventHandler
public void onChange(PermissionEntityEvent event) {
    getLogger().info("Changed: " + event.getIdentifier());
}

Modern event bus:

api.events().subscribe(dispatch -> {
    getLogger().info("Dispatch: " + dispatch);
});

Javadoc: PermissionEntityEvent · PermissionsExApi.events()


Legacy API (existing plugins)

import ru.tehkode.permissions.PermissionUser;
import ru.tehkode.permissions.bukkit.PermissionsEx;

PermissionUser user = PermissionsEx.getUser(player);
boolean ok = PermissionsEx.getPermissionManager()
    .has(player, "myplugin.use", player.getWorld().getName());

Javadoc: PermissionManager · PermissionUser


Which API?

Situation API
New plugin Modern — PermissionsEx.getApi()
Existing PEX 1.23.x plugin Legacy — usually works without changes
Bukkit events on Spigot Legacy events
Bungee/Velocity proxy dev.rono.permissions.bungee.PermissionsEx.getApi()

Full class reference: Javadoc

Sample plugins: GitHub /plugin