package mc.unraveled.reforged.permission; import mc.unraveled.reforged.api.Baker; import mc.unraveled.reforged.plugin.Traverse; import mc.unraveled.reforged.storage.DBGroup; import mc.unraveled.reforged.util.Tuple; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; import org.bukkit.command.CommandSender; import org.bukkit.command.ConsoleCommandSender; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.UUID; public class RankManager implements Baker { private final Traverse plugin; private final List, List>> rankQueue = new ArrayList<>(); private final List bakedGroups = new ArrayList<>(); private boolean baked = false; public RankManager(@NotNull Traverse plugin) { this.plugin = plugin; DBGroup groupHandler = new DBGroup(plugin.getSQLManager().establish()); Arrays.stream(Rank.values()).forEach(groupHandler::createTable); Rank[] ranks = Rank.values(); for (Rank rank : ranks) { Tuple, List> rankTuple; List playerList; List permissionList; playerList = groupHandler.getPlayers(rank); permissionList = groupHandler.getPermissions(rank); rankTuple = new Tuple<>(rank, playerList, permissionList); rankQueue.add(rankTuple); } groupHandler.close(); bake(); } public Traverse getPlugin() { return plugin; } public void insert(Rank rank, List playerList, List args) { rankQueue.add(new Tuple<>(rank, playerList, args)); } public void eject(Rank rank, List playerList, List args) { rankQueue.remove(new Tuple<>(rank, playerList, args)); } public Rank getRank(CommandSender player) { if (player instanceof ConsoleCommandSender) return Rank.CONSOLE; Player c = (Player) player; return rankQueue.stream() .filter(tuple -> tuple.getSecond().contains(c.getUniqueId())) .findFirst() .map(Tuple::getFirst) .orElse(Rank.NON_OP); } public void insertPermission(Rank rank, String permission) { rankQueue.stream() .filter(tuple -> tuple.getFirst().equals(rank)) .forEach(tuple -> tuple.getThird().add(permission)); } public void ejectPermission(Rank rank, String permission) { rankQueue.stream() .filter(tuple -> tuple.getFirst().equals(rank)) .forEach(tuple -> tuple.getThird().remove(permission)); } public void insertPlayer(Rank rank, OfflinePlayer player) { rankQueue.stream() .filter(tuple -> tuple.getFirst().equals(rank)) .forEach(tuple -> tuple.getSecond().add(player.getUniqueId())); } public void ejectPlayer(Rank rank, OfflinePlayer player) { rankQueue.stream() .filter(tuple -> tuple.getFirst().equals(rank)) .forEach(tuple -> tuple.getSecond().remove(player.getUniqueId())); } public void save() { if (!baked) throw new IllegalStateException("You cannot save a rank manager that has not been baked!"); DBGroup groupHandler = new DBGroup(plugin.getSQLManager().establish()); bakedGroups.forEach(group -> { for (OfflinePlayer p : group.getPlayers()) { groupHandler.addPlayer(group.getRank(), p); } for (String arg : group.getPermissions()) { groupHandler.addPermission(group.getRank(), arg); } }); groupHandler.close(); } @Override public void bake() { if (baked) return; rankQueue.forEach(tuple -> { Rank rank = tuple.getFirst(); List players = tuple.getSecond(); List permissions = tuple.getThird(); Group group = new Group(rank); for (UUID p : players) { group.insert(Bukkit.getOfflinePlayer(p)); } for (String arg : permissions) { group.insert(arg); } bakedGroups.add(group); }); baked = true; } @Override public void unbake() { if (!baked) return; bakedGroups.clear(); baked = false; } }