63 lines
2.3 KiB
Java
63 lines
2.3 KiB
Java
package tc.oc.commons.bukkit.listeners;
|
|
|
|
import com.google.common.eventbus.Subscribe;
|
|
import java.util.Map;
|
|
import java.util.Objects;
|
|
import javax.annotation.Nullable;
|
|
import javax.inject.Inject;
|
|
import org.bukkit.permissions.Permissible;
|
|
import org.bukkit.permissions.Permission;
|
|
import org.bukkit.permissions.PermissionDefault;
|
|
import org.bukkit.plugin.PluginManager;
|
|
import tc.oc.api.bukkit.users.OnlinePlayers;
|
|
import tc.oc.api.docs.Server;
|
|
import tc.oc.api.minecraft.servers.LocalServerReconfigureEvent;
|
|
import tc.oc.api.util.Permissions;
|
|
import tc.oc.commons.core.plugin.PluginFacet;
|
|
|
|
/**
|
|
* Create and update magic permission groups from the local server document
|
|
*/
|
|
public class PermissionGroupListener implements PluginFacet {
|
|
|
|
private final PluginManager pluginManager;
|
|
private final Server localServer;
|
|
private final OnlinePlayers onlinePlayers;
|
|
|
|
@Inject PermissionGroupListener(PluginManager pluginManager, Server localServer, OnlinePlayers onlinePlayers) {
|
|
this.pluginManager = pluginManager;
|
|
this.localServer = localServer;
|
|
this.onlinePlayers = onlinePlayers;
|
|
}
|
|
|
|
@Override
|
|
public void enable() {
|
|
updateServer(null, localServer);
|
|
}
|
|
|
|
@Subscribe
|
|
public void onReconfigure(LocalServerReconfigureEvent event) {
|
|
updateServer(event.getOldConfig(), event.getNewConfig());
|
|
}
|
|
|
|
private void updateServer(@Nullable Server before, Server after) {
|
|
boolean dirty = false;
|
|
dirty |= updatePermission(Permissions.OBSERVER, before == null ? null : before.observer_permissions(), after.observer_permissions());
|
|
dirty |= updatePermission(Permissions.PARTICIPANT, before == null ? null : before.participant_permissions(), after.participant_permissions());
|
|
dirty |= updatePermission(Permissions.MAPMAKER, before == null ? null : before.mapmaker_permissions(), after.mapmaker_permissions());
|
|
|
|
if(dirty) {
|
|
onlinePlayers.all().forEach(Permissible::recalculatePermissions);
|
|
}
|
|
}
|
|
|
|
private boolean updatePermission(String name, Map<String, Boolean> before, Map<String, Boolean> after) {
|
|
if(Objects.equals(before, after)) return false;
|
|
|
|
final Permission perm = new Permission(name, PermissionDefault.FALSE, after);
|
|
pluginManager.removePermission(perm);
|
|
pluginManager.addPermission(perm);
|
|
return true;
|
|
}
|
|
}
|