Created
August 27, 2015 22:11
-
-
Save aikar/bf25d6009f66f86d4529 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* 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