Événements

HyperPerms déclenche des événements lorsque les permissions sont vérifiées ou modifiées. Écoutez ces événements pour vous intégrer à d'autres plugins ou pour implémenter un comportement personnalisé.

Événements disponibles

evénements disponibles | |-------|------------|-------------| | PermissionCheckEvent | Une permission est vérifiée | Non (résultat modifiable) | | GroupCreateEvent | Un groupe est créé | Oui | | GroupDeleteEvent | Un groupe est supprimé | Oui | | GroupModifyEvent | Un groupe est modifié | Oui |

GroupModifyEventUn groupe est modifiéOui
UserModifyEventUn groupe est modifiéOui GroupModifyEvent
UserModifyEventLes données de l'utilisateur sont modifiéesOui
UserPromoteEventL'utilisateur est promu sur une pisteOui
UserDemoteEventL'utilisateur est rétrogradé sur une pisteOui

PermissionCheckEvent

Déclenché chaque fois qu'une permission est vérifiée pour un joueur. Utilisez-le pour modifier les résultats des permissions ou enregistrer les accès.

import dev.hyperperms.api.event.PermissionCheckEvent;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;

public class PermissionListener implements Listener {

    @EventHandler
    public void onPermissionCheck(PermissionCheckEvent event) {
        UUID player = event.getUser().getUuid();
        String permission = event.getPermission();
        boolean result = event.getResult();

        // Log the check
        System.out.println(player + " checked " + permission + " = " + result);

        // Modify the result (use carefully!)
        if (permission.equals("special.override")) {
            event.setResult(true);
        }
    }
}

Propriétés de l'événement

  • getUser() - L'utilisateur contrôlé
  • getPermission() - Le nœud de permission contrôlé
  • getContexts() - Les contextes pour cette vérification
  • getResult() - Le résultat calculé
  • setResult(boolean) - Surcharger le résultat

Avertissement: PermissionCheckEvent se déclenche très fréquemment. Gardez votre gestionnaire rapide pour éviter les problèmes de performance. Évitez les opérations lourdes dans cet événement.

GroupCreateEvent

Déclenché lors de la création d'un nouveau groupe.

import dev.hyperperms.api.event.GroupCreateEvent;

@EventHandler
public void onGroupCreate(GroupCreateEvent event) {
    String groupName = event.getGroupName();

    // Prevent creation of certain groups
    if (groupName.startsWith("reserved_")) {
        event.setCancelled(true);
        event.setCancelReason("Cannot create groups with 'reserved_' prefix");
        return;
    }

    getLogger().info("Group created: " + groupName);
}

GroupDeleteEvent

Déclenché lorsqu'un groupe est supprimé.

import dev.hyperperms.api.event.GroupDeleteEvent;

@EventHandler
public void onGroupDelete(GroupDeleteEvent event) {
    Group group = event.getGroup();

    // Prevent deletion of protected groups
    if (group.getName().equals("default")) {
        event.setCancelled(true);
        event.setCancelReason("Cannot delete the default group");
        return;
    }

    // Log the deletion
    getLogger().info("Group deleted: " + group.getName());
}

GroupModifyEvent

Déclenché lorsque les propriétés ou les autorisations d'un groupe sont modifiées.

import dev.hyperperms.api.event.GroupModifyEvent;
import dev.hyperperms.api.event.GroupModifyEvent.ModificationType;

@EventHandler
public void onGroupModify(GroupModifyEvent event) {
    Group group = event.getGroup();
    ModificationType type = event.getModificationType();

    switch (type) {
        case PERMISSION_ADD:
            getLogger().info("Permission added to " + group.getName());
            break;
        case PERMISSION_REMOVE:
            getLogger().info("Permission removed from " + group.getName());
            break;
        case PARENT_ADD:
            getLogger().info("Parent added to " + group.getName());
            break;
        case PARENT_REMOVE:
            getLogger().info("Parent removed from " + group.getName());
            break;
        case WEIGHT_CHANGE:
            getLogger().info("Weight changed for " + group.getName());
            break;
        case PREFIX_CHANGE:
            getLogger().info("Prefix changed for " + group.getName());
            break;
        case SUFFIX_CHANGE:
            getLogger().info("Suffix changed for " + group.getName());
            break;
    }
}

UserModifyEvent

Déclenché lorsque les autorisations, les groupes ou les propriétés d'un utilisateur sont modifiés.

import dev.hyperperms.api.event.UserModifyEvent;
import dev.hyperperms.api.event.UserModifyEvent.ModificationType;

@EventHandler
public void onUserModify(UserModifyEvent event) {
    User user = event.getUser();
    ModificationType type = event.getModificationType();

    switch (type) {
        case GROUP_ADD:
            Group addedGroup = (Group) event.getData();
            getLogger().info(user.getUsername() + " added to " + addedGroup.getName());
            break;
        case GROUP_REMOVE:
            Group removedGroup = (Group) event.getData();
            getLogger().info(user.getUsername() + " removed from " + removedGroup.getName());
            break;
        case PRIMARY_GROUP_CHANGE:
            Group newPrimary = (Group) event.getData();
            getLogger().info(user.getUsername() + " primary group set to " + newPrimary.getName());
            break;
        case PERMISSION_ADD:
        case PERMISSION_REMOVE:
            getLogger().info(user.getUsername() + " permissions modified");
            break;
    }
}

UserPromoteEvent

Déclenché lorsqu'un utilisateur est promu sur une piste.

import dev.hyperperms.api.event.UserPromoteEvent;

@EventHandler
public void onUserPromote(UserPromoteEvent event) {
    User user = event.getUser();
    Track track = event.getTrack();
    Group fromGroup = event.getFromGroup();
    Group toGroup = event.getToGroup();

    getLogger().info(String.format(
        "%s promoted from %s to %s on track %s",
        user.getUsername(),
        fromGroup.getName(),
        toGroup.getName(),
        track.getName()
    ));

    // Example: Send a message to the player
    Player player = Bukkit.getPlayer(user.getUuid());
    if (player != null) {
        player.sendMessage("Congratulations! You've been promoted to " + toGroup.getDisplayName());
    }
}

UserDemoteEvent

Déclenché lorsqu'un utilisateur est rétrogradé sur une piste.

import dev.hyperperms.api.event.UserDemoteEvent;

@EventHandler
public void onUserDemote(UserDemoteEvent event) {
    User user = event.getUser();
    Track track = event.getTrack();
    Group fromGroup = event.getFromGroup();
    Group toGroup = event.getToGroup();

    getLogger().info(String.format(
        "%s demoted from %s to %s on track %s",
        user.getUsername(),
        fromGroup.getName(),
        toGroup.getName(),
        track.getName()
    ));
}

Priorité de l'événement

Utilisez les priorités d'événements pour contrôler l'ordre dans lequel les récepteurs sont appelés :

import org.bukkit.event.EventPriority;

// Called early - good for logging
@EventHandler(priority = EventPriority.LOWEST)
public void onPermissionCheckLog(PermissionCheckEvent event) {
    // Log the original result
}

// Called late - good for overriding
@EventHandler(priority = EventPriority.HIGHEST)
public void onPermissionCheckOverride(PermissionCheckEvent event) {
    // Override the result if needed
}

Annulation d'événements

Les événements annulables peuvent être annulés pour empêcher l'action :

@EventHandler
public void onGroupDelete(GroupDeleteEvent event) {
    // Prevent deletion
    event.setCancelled(true);

    // Optionally provide a reason (shown to command executor)
    event.setCancelReason("Group deletion is disabled");
}

Tip: Lorsqu'un événement est annulé, l'action est empêchée mais la source (commande ou appel API) recevra une notification indiquant que l'événement a été annulé.

Enregistrer des auditeurs

public class MyPlugin extends JavaPlugin {

    @Override
    public void onEnable() {
        // Register your event listeners
        getServer().getPluginManager().registerEvents(
            new PermissionListener(),
            this
        );
    }
}

Meilleures pratiques

  • Garder les gestionnaires rapides - Particulièrement pour PermissionCheckEvent
  • Utilisez la priorité appropriée - Enregistrez tôt, modifiez tard
  • Ne pas bloquer - Éviter I/O or network calls in handlers
  • Gérer les exceptions - Ne pas laisser les erreurs se propager
  • ne pas bloquer** - Éviter les I/O or network calls in handlers Gérer les exceptions - Ne pas laisser les erreurs se propager

Voir aussi