Skip to content

Instantly share code, notes, and snippets.

@aikar
Created August 27, 2015 22:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save aikar/bf25d6009f66f86d4529 to your computer and use it in GitHub Desktop.
Save aikar/bf25d6009f66f86d4529 to your computer and use it in GitHub Desktop.
/*
* Copyright (c) 2015. Starlis LLC / dba Empire Minecraft
*
* This source code is proprietary software and must not be redistributed without Starlis LLC's approval
*
*/
package com.empireminecraft.systems.perms;
import com.empireminecraft.config.EmpireServer;
import com.empireminecraft.config.meta.TempMetaKey;
import com.empireminecraft.data.EmpireGroup;
import com.empireminecraft.data.EmpireUser;
import com.empireminecraft.systems.db.DbRow;
import com.empireminecraft.systems.db.EmpireDb;
import com.empireminecraft.systems.residence.protection.Residence;
import com.empireminecraft.util.Meta;
import com.empireminecraft.util.UserUtil;
import com.empireminecraft.util.Util;
import org.bukkit.Bukkit;
import org.bukkit.GameMode;
import org.bukkit.World;
import org.bukkit.entity.Player;
import org.bukkit.permissions.PermissionAttachment;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
public final class Permissions {
private Permissions() {}
public static void initialize() {
try {
final List<DbRow> results = EmpireDb.getResults("SELECT * FROM permission_type ORDER BY id");
for (DbRow row : results) {
Integer id = row.get("id");
PermType type = PermType.getById(id);
if (type == null) {
continue;
}
type.name = row.get("name");
type.desc = row.get("desc");
type.maxLevel = row.get("max_level");
}
} catch (Exception e) {
Util.printException("Could not get permissions from database", e);
Bukkit.getServer().shutdown();
}
}
public static void registerPlayerPerms(Player player, Integer group, Integer groupSecond) {
if (Meta.hasMetadata(player, TempMetaKey.PERMISSIONS_ATTACHMENT)) {
unregisterPlayerPerms(player);
}
PermissionAttachment attachment = player.addAttachment(Util.getEmpire());
attachment.setPermission("empire.everyone", true);
// everyone (not including guests)
if (group > 0) {
attachment.setPermission("empire.normal", true);
}
//Iron supporters and above
if (group > 1) {
attachment.setPermission("empire.supporter.iron", true);
}
//Gold supporters and above
if (group > 2) {
attachment.setPermission("empire.supporter.gold", true);
}
//Diamond supporters and above
if (group > 3) {
attachment.setPermission("empire.supporter.diamond", true);
}
//staff and above
if (group > 5) {
attachment.setPermission("empire.staff", true);
if (EmpireServer.getServerId().equals(100)) {
attachment.setPermission("empire.mode", true);
}
attachment.setPermission("empire.staff.mod", true);
}
//senior moderators and above
if (group > 7) {
attachment.setPermission("empire.staff.srstaff", true);
}
//admin and superadmin
if (group > 8) {
attachment.setPermission("empire.staff.admin", true);
}
//secondary groups
if (!groupSecond.equals(0)) {
//chat moderator
if (groupSecond == 1) {
attachment.setPermission("empire.staff.chatmod", true);
}
//fly mode
if (groupSecond == 2) {
attachment.setPermission("empire.fly.town", true);
}
}
attachment.setPermission("empire.user." + player.getName(), true);
String server = EmpireServer.isDev ? "dev" : EmpireServer.getServerName().toLowerCase();
attachment.setPermission("empire.server." + server, true);
Meta.setMetadata(player, TempMetaKey.PERMISSIONS_ATTACHMENT, attachment);
}
public static void unregisterPlayerPerms(Player player) {
PermissionAttachment attachment = Meta.removeMetadata(player, TempMetaKey.PERMISSIONS_ATTACHMENT);
if (attachment != null) {
player.removeAttachment(attachment);
}
}
public static void handleWorldChange(Player player, String from) {
String to = player.getWorld().getName().toLowerCase();
String server = EmpireServer.isDev ? "dev" : EmpireServer.getServerName().toLowerCase();
if (from != null) {
from = from.toLowerCase();
setPermission(player, "empire.world." + from, false);
setPermission(player, "empire.server." + server + ".world." + from, false);
setGroupWorldPerms(player, from, false);
}
setPermission(player, "empire.world." + to, true);
setPermission(player, "empire.server." + server + ".world." + to, true);
setGroupWorldPerms(player, to, true);
checkFlyPerms(player, Residence.getResidence(player.getLocation()), player.getWorld());
}
public static void setGroupWorldPerms(Player player, String world, boolean perm) {
EmpireUser user = EmpireUser.getUser(player);
Integer groupId = user.groupId;
String server = EmpireServer.getServerName().toLowerCase();
for (int i = 0; i <= groupId; i++) {
String group = EmpireGroup.groupName(i).toLowerCase();
if (perm) {
setPermission(player, "empire.server." + server + ".group." + group, true);
setPermission(player, "empire.group." + group + ".world." + world, true);
setPermission(player, "empire.server." + server + ".group." + group + ".world." + world, true);
} else {
removePermission(player, "empire.server." + server + ".group." + group);
removePermission(player, "empire.group." + group + ".world." + world);
removePermission(player, "empire.server." + server + ".group." + group + ".world." + world);
}
}
}
public static void checkFlyPerms(Player player, Residence res, World world) {
if (UserUtil.isSrStaff(player) || player.getGameMode() == GameMode.CREATIVE) {
return;
}
if ((
player.hasPermission("empire.fly") ||
player.hasPermission("empire.fly." + player.getWorld().getName().toLowerCase())
) && Residence.checkPerms(res, player, world, null, true, "fly")) {
player.setAllowFlight(true);
} else {
if (player.isFlying()) {
player.sendMessage("§cYou don't have permission to fly here.");
}
player.setAllowFlight(false);
}
}
public static void setPermission(Player player, String perm, boolean value) {
PermissionAttachment attachment = Meta.getMetadata(player, TempMetaKey.PERMISSIONS_ATTACHMENT);
if (attachment == null) {
throw new RuntimeException("setPermission called before registerPlayerPerms");
}
attachment.setPermission(perm, value);
}
public static void removePermission(Player player, String perm) {
PermissionAttachment attachment = Meta.getMetadata(player, TempMetaKey.PERMISSIONS_ATTACHMENT);
if (attachment == null) {
throw new RuntimeException("removePermission called before registerPlayerPerms");
}
attachment.unsetPermission(perm);
}
public static class CheckPermValidTask implements Runnable {
@Override
public void run() {
for (Player player : Bukkit.getOnlinePlayers()) {
EmpireUser user = EmpireUser.getUser(player);
final Map<PermType, PlayerPerm> permMap = user.extended().permMap;
for (Iterator<PlayerPerm> iterator = permMap.values().iterator(); iterator.hasNext(); ) {
PlayerPerm perm = iterator.next();
if (!perm.isValid()) {
iterator.remove();
perm.resetPerm(player);
}
}
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment