@@ -1,72 +1,83 @@
package me.totalfreedom.totalfreedommod.httpd.module;

import com.google.common.collect.Lists;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import me.totalfreedom.totalfreedommod.TotalFreedomMod;
import me.totalfreedom.totalfreedommod.command.FreedomCommand;
import me.totalfreedom.totalfreedommod.httpd.NanoHTTPD;
import me.totalfreedom.totalfreedommod.rank.Displayable;
import me.totalfreedom.totalfreedommod.rank.Rank;
import org.apache.commons.lang.StringUtils;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandMap;
import org.bukkit.command.PluginIdentifiableCommand;
import org.bukkit.command.SimpleCommandMap;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import static me.totalfreedom.totalfreedommod.httpd.HTMLGenerationTools.heading;
import static me.totalfreedom.totalfreedommod.httpd.HTMLGenerationTools.paragraph;
import static org.apache.commons.lang3.StringEscapeUtils.escapeHtml4;

public class Module_help extends HTTPDModule
{

public Module_help(NanoHTTPD.HTTPSession session)
{
super(session);
}

private static String buildDescription(Command command)
private static String buildDescription(@NotNull Command command)
{
return buildDescription(command.getName(), command.getDescription(), command.getUsage(), StringUtils.join(command.getAliases(), ", "));
}

private static String buildDescription(@NotNull FreedomCommand command)
{
return buildDescription(command.getName(), command.getDescription(), command.getUsage(), command.getAliases());
}

private static String buildDescription(@NotNull String name, @Nullable String description, @NotNull String usage, @NotNull String aliases)
{
StringBuilder sb = new StringBuilder();

sb.append(
"<li><span class=\"commandName\">{$CMD_NAME}</span> - Usage: <span class=\"commandUsage\">{$CMD_USAGE}</span>"
.replace("{$CMD_NAME}", escapeHtml4(command.getName().trim()))
.replace("{$CMD_USAGE}", escapeHtml4(command.getUsage().trim())));
.replace("{$CMD_NAME}", escapeHtml4(name.trim()))
.replace("{$CMD_USAGE}", escapeHtml4(usage.trim())));

if (!command.getAliases().isEmpty())
if (!aliases.isEmpty())
{
sb.append(
" - Aliases: <span class=\"commandAliases\">{$CMD_ALIASES}</span>"
.replace("{$CMD_ALIASES}", escapeHtml4(StringUtils.join(command.getAliases(), ", "))));
.replace("{$CMD_ALIASES}", escapeHtml4(aliases.trim())));
}

sb.append(
"<br><span class=\"commandDescription\">{$CMD_DESC}</span></li>\r\n"
.replace("{$CMD_DESC}", escapeHtml4(command.getDescription().trim())));
if (description != null)
{
sb.append(
"<br><span class=\"commandDescription\">{$CMD_DESC}</span></li>\r\n"
.replace("{$CMD_DESC}", escapeHtml4(description.trim())));
}

return sb.toString();
}

@Override
public String getBody()
{
final CommandMap map = FreedomCommand.getCommandMap();
if (!(map instanceof SimpleCommandMap))
{
return paragraph("Error loading commands.");
}
final CommandMap map = Bukkit.getCommandMap();

final StringBuilder responseBody = new StringBuilder()
.append(heading("Command Help", 1))
.append(paragraph(
"This page is an automatically generated listing of all plugin commands that are currently live on the server. "
+ "Please note that it does not include vanilla server commands."));

final Collection<Command> knownCommands = ((SimpleCommandMap)map).getCommands();
final Collection<Command> knownCommands = map.getKnownCommands().values();
final Map<String, List<Command>> commandsByPlugin = new HashMap<>();

for (Command command : knownCommands)
Expand All @@ -79,34 +90,47 @@ public String getBody()

List<Command> pluginCommands = commandsByPlugin.computeIfAbsent(pluginName, k -> Lists.newArrayList());

pluginCommands.add(command);
if (!pluginCommands.contains(command))
{
pluginCommands.add(command);
}
}

final CommandComparator comparator = new CommandComparator();

// For every plugin...
for (Map.Entry<String, List<Command>> entry : commandsByPlugin.entrySet())
{
final String pluginName = entry.getKey();
final List<Command> commands = entry.getValue();

commands.sort(new CommandComparator());
// Sort them alphabetically
commands.sort(comparator);

responseBody.append(heading(pluginName, 2)).append("<ul>\r\n");
responseBody.append(heading(pluginName, pluginName, 2)).append("<ul>\r\n");

Displayable lastTfmCommandLevel = null;
for (Command command : commands)
if (!plugin.getName().equals(pluginName))
{
if (!TotalFreedomMod.pluginName.equals(pluginName))
{
responseBody.append(buildDescription(command));
continue;
}

Displayable tfmCommandLevel = Objects.requireNonNull(FreedomCommand.getFrom(command)).getPerms().level();
if (lastTfmCommandLevel == null || lastTfmCommandLevel != tfmCommandLevel)
{
responseBody.append("</ul>\r\n").append(heading(tfmCommandLevel.getName(), 3)).append("<ul>\r\n");
}
lastTfmCommandLevel = tfmCommandLevel;
responseBody.append(buildDescription(command));
commands.forEach((command) -> responseBody.append(buildDescription(command)));
}
else
{
Map<Rank, List<FreedomCommand>> freedomCommands = new HashMap<>();

// Filters out non-TFM commands
commands.stream().filter((cmd) -> cmd instanceof FreedomCommand.FCommand).forEach((tfmCmd) -> {
Rank rank = FreedomCommand.getFrom(tfmCmd).getLevel();
if (!freedomCommands.containsKey(rank))
freedomCommands.put(rank, new ArrayList<>());
freedomCommands.get(rank).add(FreedomCommand.getFrom(tfmCmd));
});

// Finally dumps them to HTML
Arrays.stream(Rank.values()).filter(freedomCommands::containsKey)
.sorted(comparator::compare).forEach((rank -> {
responseBody.append("</ul>\r\n").append(heading(rank.getName(), 3)).append("<ul>\r\n");
freedomCommands.get(rank).stream().sorted(comparator::compare).forEach((command) -> responseBody.append(buildDescription(command)));
}));
}

responseBody.append("</ul>\r\n");
Expand All @@ -118,7 +142,7 @@ public String getBody()
@Override
public String getTitle()
{
return "TotalFreedomMod :: Command Help";
return plugin.getName() + " :: Command Help";
}

@Override
Expand All @@ -129,23 +153,23 @@ public String getStyle()

public static class CommandComparator implements Comparator<Command>
{

@Override
public int compare(Command a, Command b)
{
FreedomCommand ca = FreedomCommand.getFrom(a);
FreedomCommand cb = FreedomCommand.getFrom(b);
return a.getName().compareTo(b.getName());
}

public int compare(FreedomCommand a, FreedomCommand b)
{
return a.getName().compareTo(b.getName());
}

if (ca == null
|| cb == null
|| ca.getPerms() == null
|| cb.getPerms() == null)
{
return a.getName().compareTo(b.getName());
}
public int compare(Rank a, Rank b)
{
Integer levelA = a.getLevel();
Integer levelB = b.getLevel();

return ca.getPerms().level().getName().compareTo(cb.getPerms().level().getName());
return levelB.compareTo(levelA);
}
}

}
Expand Up @@ -34,7 +34,6 @@ public NanoHTTPD.Response getResponse()
final JSONArray admins = new JSONArray();
final JSONArray masterbuilders = new JSONArray();
final JSONArray operators = new JSONArray();
final JSONArray imposters = new JSONArray();

for (Player player : Bukkit.getOnlinePlayers())
{
Expand All @@ -43,11 +42,6 @@ public NanoHTTPD.Response getResponse()
continue;
}

if (isImposter(player))
{
imposters.add(player.getName());
}

if (plugin.pl.getData(player).isMasterBuilder())
{
masterbuilders.add(player.getName());
Expand Down Expand Up @@ -105,7 +99,6 @@ public NanoHTTPD.Response getResponse()
responseObject.put("admins", admins);
responseObject.put("master_builders", masterbuilders);
responseObject.put("operators", operators);
responseObject.put("imposters", imposters);
responseObject.put("online", FUtil.getFakePlayerCount());
responseObject.put("max", server.getMaxPlayers());

Expand Down Expand Up @@ -141,11 +134,6 @@ public NanoHTTPD.Response getResponse()
}
}

public boolean isImposter(Player player)
{
return plugin.al.isAdminImpostor(player) || plugin.pl.isPlayerImpostor(player);
}

public boolean hasSpecialTitle(Player player)
{
return !FUtil.DEVELOPERS.contains(player.getUniqueId().toString()) && !ConfigEntry.SERVER_EXECUTIVES.getList().contains(player.getName()) && !ConfigEntry.SERVER_OWNERS.getList().contains(player.getName());
Expand Down
Expand Up @@ -37,7 +37,7 @@ public NanoHTTPD.Response getResponse()
if (!plugin.al.isVanished(player.getName()))
{
players.add(player.getName());
if (plugin.al.isAdmin(player) && !plugin.al.isAdminImpostor(player))
if (plugin.al.isAdmin(player))
{
onlineadmins.add(player.getName());
}
Expand Down
38 changes: 14 additions & 24 deletions src/main/java/me/totalfreedom/totalfreedommod/player/FPlayer.java
Expand Up @@ -16,6 +16,7 @@

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

public class FPlayer
{
Expand All @@ -26,7 +27,7 @@ public class FPlayer
private final TotalFreedomMod plugin;

private final String name;

private final UUID uuid;
private final String ip;
//
private final FreezeData freezeData = new FreezeData(this);
Expand Down Expand Up @@ -54,9 +55,6 @@ public class FPlayer
private String lastMessage = "";
private boolean inAdminchat = false;
private boolean allCommandsBlocked = false;


private boolean superadminIdVerified = false;
private String lastCommand = "";
private boolean cmdspyEnabled = false;
private String tag = null;
Expand All @@ -73,12 +71,13 @@ public class FPlayer

public FPlayer(TotalFreedomMod plugin, Player player)
{
this(plugin, player.getName(), FUtil.getIp(player));
this(plugin, player.getUniqueId(), player.getName(), FUtil.getIp(player));
}

private FPlayer(TotalFreedomMod plugin, String name, String ip)
private FPlayer(TotalFreedomMod plugin, UUID uuid, String name, String ip)
{
this.plugin = plugin;
this.uuid = uuid;
this.name = name;
this.ip = ip;
}
Expand All @@ -97,14 +96,7 @@ public Player getPlayer()

if (player == null)
{
for (Player onlinePlayer : Bukkit.getOnlinePlayers())
{
if (FUtil.getIp(onlinePlayer).equals(ip))
{
player = onlinePlayer;
break;
}
}
player = Bukkit.getPlayer(uuid);
}

return player;
Expand All @@ -115,6 +107,14 @@ public void setPlayer(Player player)
this.player = player;
}

// Ensure admins don't have admin functionality when removed (FS-222)
public void removeAdminFunctionality()
{
this.setCommandSpy(false);
this.setAdminChat(false);
this.setFuckoffRadius(0);
}

public boolean isOrbiting()
{
return isOrbiting;
Expand Down Expand Up @@ -648,16 +648,6 @@ public void setAllCommandsBlocked(boolean allCommandsBlocked)
this.allCommandsBlocked = allCommandsBlocked;
}

public boolean isSuperadminIdVerified()
{
return superadminIdVerified;
}

public void setSuperadminIdVerified(boolean superadminIdVerified)
{
this.superadminIdVerified = superadminIdVerified;
}

public boolean isCmdspyEnabled()
{
return cmdspyEnabled;
Expand Down
Expand Up @@ -3,30 +3,25 @@
import com.google.common.collect.Lists;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import me.totalfreedom.totalfreedommod.TotalFreedomMod;
import java.util.*;

import me.totalfreedom.totalfreedommod.shop.ShopItem;
import me.totalfreedom.totalfreedommod.util.FLog;
import me.totalfreedom.totalfreedommod.util.FUtil;
import org.apache.commons.lang.StringUtils;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;

public class PlayerData
{
private UUID uuid;
private final List<String> ips = Lists.newArrayList();
private final List<String> notes = Lists.newArrayList();
private final List<String> backupCodes = Lists.newArrayList();
private String name;
private String tag = null;
private String discordID = null;
private Boolean masterBuilder = false;

private Boolean verification = false;


private String rideMode = "ask";

Expand All @@ -48,17 +43,14 @@ public PlayerData(ResultSet resultSet)
{
try
{
name = resultSet.getString("username");
uuid = UUID.fromString(resultSet.getString("uuid"));
ips.clear();
ips.addAll(FUtil.stringToList(resultSet.getString("ips")));
notes.clear();
notes.addAll(FUtil.stringToList(resultSet.getString("notes")));
tag = resultSet.getString("tag");
discordID = resultSet.getString("discord_id");
backupCodes.clear();
backupCodes.addAll(FUtil.stringToList(resultSet.getString("backup_codes")));
masterBuilder = resultSet.getBoolean("master_builder");
verification = resultSet.getBoolean("verification");
rideMode = resultSet.getString("ride_mode");
coins = resultSet.getInt("coins");
items.clear();
Expand All @@ -72,40 +64,25 @@ public PlayerData(ResultSet resultSet)
{
FLog.severe("Failed to load player: " + e.getMessage());
}

// Force verification for Master Builders
if (masterBuilder && !verification)
{
verification = true;
TotalFreedomMod.getPlugin().pl.save(this);
}
else if (!masterBuilder && discordID == null && verification)
{
this.verification = false;
TotalFreedomMod.getPlugin().pl.save(this);
}
}

public PlayerData(Player player)
{
this.name = player.getName();
this.uuid = player.getUniqueId();
}

@Override
public String toString()
{

return "Player: " + name + "\n" +
return "Player: " + getName() + "\n" +
"- IPs: " + StringUtils.join(ips, ", ") + "\n" +
"- Discord ID: " + discordID + "\n" +
"- Master Builder: " + masterBuilder + "\n" +
"- Has Verification: " + verification + "\n" +
"- Coins: " + coins + "\n" +
"- Total Votes: " + totalVotes + "\n" +
"- Display Discord: " + displayDiscord + "\n" +
"- Tag: " + FUtil.colorize(tag) + ChatColor.GRAY + "\n" +
"- Ride Mode: " + rideMode + "\n" +
"- Backup Codes: " + backupCodes.size() + "/10" + "\n" +
"- Login Message: " + loginMessage;
}

Expand Down Expand Up @@ -154,22 +131,6 @@ public void clearNotes()
notes.clear();
}

public List<String> getBackupCodes()
{
return Collections.unmodifiableList(backupCodes);
}

public void setBackupCodes(List<String> codes)
{
backupCodes.clear();
backupCodes.addAll(codes);
}

public void removeBackupCode(String code)
{
backupCodes.remove(code);
}

public void addNote(String note)
{
notes.add(note);
Expand Down Expand Up @@ -213,11 +174,6 @@ public void removeItem(ShopItem item)
items.remove(item.getDataName());
}

public boolean hasVerification()
{
return verification;
}

public boolean isMasterBuilder()
{
return masterBuilder;
Expand All @@ -232,14 +188,12 @@ public Map<String, Object> toSQLStorable()
{
return new HashMap<String, Object>()
{{
put("username", name);
put("uuid", uuid.toString());
put("ips", FUtil.listToString(ips));
put("notes", FUtil.listToString(notes));
put("tag", tag);
put("discord_id", discordID);
put("backup_codes", FUtil.listToString(backupCodes));
put("master_builder", masterBuilder);
put("verification", verification);
put("ride_mode", rideMode);
put("coins", coins);
put("items", FUtil.listToString(items));
Expand All @@ -255,14 +209,14 @@ public boolean doesDisplayDiscord()
return displayDiscord;
}

public String getName()
public UUID getUuid()
{
return name;
return uuid;
}

public void setName(String name)
public String getName()
{
this.name = name;
return Bukkit.getOfflinePlayer(uuid).getName();
}

public String getTag()
Expand Down Expand Up @@ -295,16 +249,6 @@ public void setMasterBuilder(Boolean masterBuilder)
this.masterBuilder = masterBuilder;
}

public Boolean getVerification()
{
return verification;
}

public void setVerification(Boolean verification)
{
this.verification = verification;
}

public String getRideMode()
{
return rideMode;
Expand Down
147 changes: 40 additions & 107 deletions src/main/java/me/totalfreedom/totalfreedommod/player/PlayerList.java
Expand Up @@ -3,11 +3,8 @@
import com.google.common.collect.Maps;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.*;

import me.totalfreedom.totalfreedommod.FreedomService;
import me.totalfreedom.totalfreedommod.admin.Admin;
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
Expand All @@ -20,8 +17,8 @@
public class PlayerList extends FreedomService
{

public final Map<String, FPlayer> playerMap = Maps.newHashMap(); // ip,dataMap
public final Map<String, PlayerData> dataMap = Maps.newHashMap(); // username, data
public final Map<UUID, FPlayer> playerMap = Maps.newHashMap(); // uuid, dataMap
public final Map<UUID, PlayerData> dataMap = Maps.newHashMap(); // uuid, data

@Override
public void onStart()
Expand Down Expand Up @@ -57,7 +54,7 @@ public void loadMasterBuilders()
while (resultSet.next())
{
PlayerData playerData = load(resultSet);
dataMap.put(playerData.getName(), playerData);
dataMap.put(playerData.getUuid(), playerData);
}
}
catch (SQLException e)
Expand Down Expand Up @@ -103,28 +100,28 @@ public boolean canManageMasterBuilders(String name)

public boolean isTelnetMasterBuilder(PlayerData playerData)
{
Admin admin = plugin.al.getEntryByName(playerData.getName());
Admin admin = plugin.al.getEntryByUuid(playerData.getUuid());
return admin != null && admin.getRank().isAtLeast(Rank.ADMIN) && playerData.isMasterBuilder();
}

// May not return null
public FPlayer getPlayer(Player player)
{
FPlayer tPlayer = playerMap.get(FUtil.getIp(player));
FPlayer tPlayer = playerMap.get(player.getUniqueId());
if (tPlayer != null)
{
return tPlayer;
}

tPlayer = new FPlayer(plugin, player);
playerMap.put(FUtil.getIp(player), tPlayer);
playerMap.put(player.getUniqueId(), tPlayer);

return tPlayer;
}

public PlayerData loadByName(String name)
public PlayerData loadByUuid(UUID uuid)
{
return load(plugin.sql.getPlayerByName(name));
return load(plugin.sql.getPlayerByUuid(uuid));
}

public PlayerData loadByIp(String ip)
Expand All @@ -141,43 +138,6 @@ public PlayerData load(ResultSet resultSet)
return new PlayerData(resultSet);
}

public Boolean isPlayerImpostor(Player player)
{
PlayerData playerData = getData(player);
return plugin.dc.enabled
&& !plugin.al.isAdmin(player)
&& (playerData.hasVerification())
&& !playerData.getIps().contains(FUtil.getIp(player));
}

public boolean IsImpostor(Player player)
{
return isPlayerImpostor(player) || plugin.al.isAdminImpostor(player);
}

public void verify(Player player, String backupCode)
{
PlayerData playerData = getData(player);
if (backupCode != null)
{
playerData.removeBackupCode(backupCode);
}

playerData.addIp(FUtil.getIp(player));
save(playerData);

if (plugin.al.isAdminImpostor(player))
{
Admin admin = plugin.al.getEntryByName(player.getName());
admin.setLastLogin(new Date());
admin.addIp(FUtil.getIp(player));
plugin.al.updateTables();
plugin.al.save(admin);
}

plugin.rm.updateDisplay(player);
}

public void syncIps(Admin admin)
{
PlayerData playerData = getData(admin.getName());
Expand All @@ -186,25 +146,11 @@ public void syncIps(Admin admin)
plugin.pl.save(playerData);
}

public void syncIps(PlayerData playerData)
{
Admin admin = plugin.al.getEntryByName(playerData.getName());

if (admin != null && admin.isActive())
{
admin.clearIPs();
admin.addIps(playerData.getIps());
plugin.al.updateTables();
plugin.al.save(admin);
}
}


public void save(PlayerData player)
{
try
{
ResultSet currentSave = plugin.sql.getPlayerByName(player.getName());
ResultSet currentSave = plugin.sql.getPlayerByUuid(player.getUuid());
for (Map.Entry<String, Object> entry : player.toSQLStorable().entrySet())
{
Object storedValue = plugin.sql.getValue(currentSave, entry.getKey(), entry.getValue());
Expand All @@ -223,69 +169,56 @@ public void save(PlayerData player)
public PlayerData getData(Player player)
{
// Check for existing data
PlayerData playerData = dataMap.get(player.getName());
PlayerData playerData = dataMap.get(player.getUniqueId());
if (playerData != null)
{
return playerData;
}

// Load data
playerData = loadByName(player.getName());
playerData = loadByUuid(player.getUniqueId());

// Oh you don't have any data? Well now you do
if (playerData == null)
{
playerData = loadByIp(FUtil.getIp(player));
if (playerData != null)
{
plugin.sql.updatePlayerName(playerData.getName(), player.getName());
playerData.setName(player.getName());
dataMap.put(player.getName(), playerData);
return playerData;
}
}
else
{
dataMap.put(player.getName(), playerData);
return playerData;
}
FLog.info("Creating new player data entry for " + player.getName());

// Create new data if nonexistent
FLog.info("Creating new player verification entry for " + player.getName());

// Create new player
playerData = new PlayerData(player);
playerData.addIp(FUtil.getIp(player));
playerData = new PlayerData(player);
playerData.addIp(FUtil.getIp(player));
}

// Store player
dataMap.put(player.getName(), playerData);
// Store it in memory.
dataMap.put(player.getUniqueId(), playerData);

// Save player
// Send it to the SQL database.
plugin.sql.addPlayer(playerData);
return playerData;

// Returns it
return playerData;
}

public PlayerData getData(String username)
public PlayerData getData(UUID uuid)
{
// Check for existing data
PlayerData playerData = dataMap.get(username);
if (playerData != null)
PlayerData data = dataMap.get(uuid);

if (data == null)
{
return playerData;
data = loadByUuid(uuid);
}

playerData = loadByName(username);
return data;
}

if (playerData != null)
{
dataMap.put(username, playerData);
}
else
public PlayerData getData(String username)
{
OfflinePlayer player = server.getPlayer(username);

if (player == null)
{
return null;
player = server.getOfflinePlayer(username);
}

return playerData;
return getData(player.getUniqueId());
}

public PlayerData getDataByIp(String ip)
Expand All @@ -294,18 +227,18 @@ public PlayerData getDataByIp(String ip)

if (player != null)
{
dataMap.put(player.getName(), player);
dataMap.put(player.getUuid(), player);
}

return player;
}

public Map<String, FPlayer> getPlayerMap()
public Map<UUID, FPlayer> getPlayerMap()
{
return playerMap;
}

public Map<String, PlayerData> getDataMap()
public Map<UUID, PlayerData> getDataMap()
{
return dataMap;
}
Expand Down
Expand Up @@ -13,6 +13,8 @@ public interface Displayable

String getAbbr();

String getPlural();

ChatColor getColor();

org.bukkit.ChatColor getTeamColor();
Expand Down
23 changes: 14 additions & 9 deletions src/main/java/me/totalfreedom/totalfreedommod/rank/Rank.java
Expand Up @@ -4,20 +4,19 @@

public enum Rank implements Displayable
{
IMPOSTOR("an", "Impostor", Type.PLAYER, "Imp", ChatColor.YELLOW, null, false, false),
NON_OP("a", "Non-Op", Type.PLAYER, "", ChatColor.WHITE, null, false, false),
OP("an", "Operator", Type.PLAYER, "OP", ChatColor.GREEN, null, false, false),
ADMIN("an", "Admin", Type.ADMIN, "Admin", ChatColor.DARK_GREEN, org.bukkit.ChatColor.DARK_GREEN, true, true),
SENIOR_ADMIN("a", "Senior Admin", Type.ADMIN, "SrA", ChatColor.GOLD, org.bukkit.ChatColor.GOLD, true, true),
ADMIN_CONSOLE("the", "Console", Type.ADMIN_CONSOLE, "Console", ChatColor.DARK_PURPLE, null, false, false),
SENIOR_CONSOLE("the", "Console", Type.ADMIN_CONSOLE, "Console", ChatColor.DARK_PURPLE, null, false, false);
NON_OP("a", "Non-Op", Type.PLAYER, "", "Non-Ops", ChatColor.WHITE, null, false, false),
OP("an", "Operator", Type.PLAYER, "OP", "Operators", ChatColor.GREEN, null, false, false),
ADMIN("an", "Admin", Type.ADMIN, "Admin", "Administrators", ChatColor.DARK_GREEN, org.bukkit.ChatColor.DARK_GREEN, true, true),
SENIOR_ADMIN("a", "Senior Admin", Type.ADMIN, "SrA", "Senior Administrators", ChatColor.GOLD, org.bukkit.ChatColor.GOLD, true, true),
ADMIN_CONSOLE("the", "Console", Type.ADMIN_CONSOLE, "Console", "Administrator Consoles", ChatColor.DARK_PURPLE, null, false, false),
SENIOR_CONSOLE("the", "Console", Type.ADMIN_CONSOLE, "Console", "Senior Consoles", ChatColor.DARK_PURPLE, null, false, false);

private final Type type;

private final String name;

private final String abbr;

private final String plural;
private final String article;

private final String tag;
Expand All @@ -32,11 +31,12 @@ public enum Rank implements Displayable

private final boolean hasDefaultLoginMessage;

Rank(String article, String name, Type type, String abbr, ChatColor color, org.bukkit.ChatColor teamColor, Boolean hasTeam, Boolean hasDefaultLoginMessage)
Rank(String article, String name, Type type, String abbr, String plural, ChatColor color, org.bukkit.ChatColor teamColor, Boolean hasTeam, Boolean hasDefaultLoginMessage)
{
this.type = type;
this.name = name;
this.abbr = abbr;
this.plural = plural;
this.article = article;
this.tag = abbr.isEmpty() ? "" : "[" + abbr + "]";
this.coloredTag = abbr.isEmpty() ? "" : ChatColor.DARK_GRAY + "[" + color + abbr + ChatColor.DARK_GRAY + "]" + color;
Expand Down Expand Up @@ -89,6 +89,11 @@ public String getAbbr()
return abbr;
}

public String getPlural()
{
return plural;
}

public boolean isConsole()
{
return getType() == Type.ADMIN_CONSOLE;
Expand Down
Expand Up @@ -9,7 +9,6 @@
import me.totalfreedom.totalfreedommod.util.FUtil;
import org.apache.commons.lang.StringUtils;
import org.bukkit.ChatColor;
import org.bukkit.GameMode;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
Expand Down Expand Up @@ -39,12 +38,6 @@ public Displayable getDisplay(CommandSender sender)

final Player player = (Player)sender;

// Display impostors
if (plugin.al.isAdminImpostor(player))
{
return Rank.IMPOSTOR;
}

// If the player's an owner, display that
if (ConfigEntry.SERVER_OWNERS.getList().contains(player.getName()))
{
Expand All @@ -67,11 +60,6 @@ public Displayable getDisplay(CommandSender sender)
return Title.ASSTEXEC;
}

if (plugin.al.isVerifiedAdmin(player))
{
return Title.VERIFIED_ADMIN;
}

// Master builders show up if they are not an admin
if (plugin.pl.getData(player).isMasterBuilder() && !plugin.al.isAdmin(player))
{
Expand Down Expand Up @@ -137,11 +125,6 @@ public Rank getRank(CommandSender sender)

public Rank getRank(Player player)
{
if (plugin.al.isAdminImpostor(player) || plugin.pl.isPlayerImpostor(player))
{
return Rank.IMPOSTOR;
}

final Admin entry = plugin.al.getAdmin(player);
if (entry != null)
{
Expand Down Expand Up @@ -193,52 +176,20 @@ public void updateDisplay(Player player)
public void onPlayerJoin(PlayerJoinEvent event)
{
final Player player = event.getPlayer();
final FPlayer fPlayer = plugin.pl.getPlayer(player);
PlayerData target = plugin.pl.getData(player);

// Unban admins
boolean isAdmin = plugin.al.isAdmin(player);

// Updates last login time
if (isAdmin)
{
// Verify strict IP match
if (!plugin.al.isIdentityMatched(player))
{
FUtil.bcastMsg("Warning: " + player.getName() + " is an admin, but is using an account not registered to one of their ip-list.", ChatColor.RED);
fPlayer.setSuperadminIdVerified(false);
}
else
{
fPlayer.setSuperadminIdVerified(true);
plugin.al.updateLastLogin(player);
}
}

if (plugin.al.isVerifiedAdmin(player))
plugin.al.updateLastLogin(player);
} else
{
FUtil.bcastMsg("Warning: " + player.getName() + " is an admin, but does not have any admin permissions.", ChatColor.RED);
}
// Ensure admins don't have admin functionality when removed (FS-222)
FPlayer freedomPlayer = plugin.pl.getPlayer(player);

// Handle impostors
boolean isImpostor = plugin.al.isAdminImpostor(player) || plugin.pl.isPlayerImpostor(player);
if (isImpostor)
{
FUtil.bcastMsg(ChatColor.AQUA + player.getName() + " is " + Rank.IMPOSTOR.getColoredLoginMessage());
if (plugin.al.isAdminImpostor(player))
{
FUtil.bcastMsg("Warning: " + player.getName() + " has been flagged as an admin impostor and has been frozen!", ChatColor.RED);
}
else if (plugin.pl.isPlayerImpostor(player))
{
FUtil.bcastMsg("Warning: " + player.getName() + " has been flagged as a player impostor and has been frozen!", ChatColor.RED);
}
String displayName = Rank.IMPOSTOR.getColor() + player.getName();
player.setPlayerListName(StringUtils.substring(displayName, 0, 16));
player.getInventory().clear();
player.setOp(false);
player.setGameMode(GameMode.SURVIVAL);
plugin.pl.getPlayer(player).getFreezeData().setFrozen(true);
player.sendMessage(ChatColor.RED + "You are marked as an impostor, please verify yourself!");
return;
freedomPlayer.removeAdminFunctionality();
}

// Broadcast login message
Expand All @@ -253,12 +204,9 @@ else if (plugin.pl.isPlayerImpostor(player))
// Set display
updateDisplay(player);

if (!plugin.pl.isPlayerImpostor(player) && target.hasVerification())
if (target.getTag() != null)
{
if (target.getTag() != null)
{
plugin.pl.getData(player).setTag(FUtil.colorize(target.getTag()));
}
plugin.pl.getData(player).setTag(FUtil.colorize(target.getTag()));
}
}

Expand Down
21 changes: 14 additions & 7 deletions src/main/java/me/totalfreedom/totalfreedommod/rank/Title.java
Expand Up @@ -5,19 +5,19 @@
public enum Title implements Displayable
{

MASTER_BUILDER("a", "Master Builder", ChatColor.DARK_AQUA, org.bukkit.ChatColor.DARK_AQUA, "MB", true, true),
VERIFIED_ADMIN("a", "Verified Admin", ChatColor.LIGHT_PURPLE, org.bukkit.ChatColor.LIGHT_PURPLE, "VA", false, true),
EXECUTIVE("an", "Executive", ChatColor.RED, org.bukkit.ChatColor.RED, "Exec", true, true),
ASSTEXEC("an", "Assistant Executive", ChatColor.RED, org.bukkit.ChatColor.RED, "Asst Exec", true, true),
DEVELOPER("a", "Developer", ChatColor.DARK_PURPLE, org.bukkit.ChatColor.DARK_PURPLE, "Dev", true, true),
OWNER("the", "Owner", ChatColor.DARK_RED, org.bukkit.ChatColor.DARK_RED, "Owner", true, true);
MASTER_BUILDER("a", "Master Builder", "Master Builders", ChatColor.DARK_AQUA, org.bukkit.ChatColor.DARK_AQUA, "MB", true, true),
EXECUTIVE("an", "Executive", "Executives", ChatColor.RED, org.bukkit.ChatColor.RED, "Exec", true, true),
ASSTEXEC("an", "Assistant Executive", "Assistant Executives", ChatColor.RED, org.bukkit.ChatColor.RED, "Asst Exec", true, true),
DEVELOPER("a", "Developer", "Developers", ChatColor.DARK_PURPLE, org.bukkit.ChatColor.DARK_PURPLE, "Dev", true, true),
OWNER("the", "Owner", "Owners", ChatColor.DARK_RED, org.bukkit.ChatColor.DARK_RED, "Owner", true, true);


private final String article;

private final String name;

private final String abbr;
private final String plural;

private final String tag;

Expand All @@ -30,10 +30,11 @@ public enum Title implements Displayable
private final boolean hasTeam;
private final boolean hasDefaultLoginMessage;

Title(String article, String name, ChatColor color, org.bukkit.ChatColor teamColor, String tag, Boolean hasTeam, Boolean hasDefaultLoginMessage)
Title(String article, String name, String plural, ChatColor color, org.bukkit.ChatColor teamColor, String tag, Boolean hasTeam, Boolean hasDefaultLoginMessage)
{
this.article = article;
this.name = name;
this.plural = plural;
this.coloredTag = ChatColor.DARK_GRAY + "[" + color + tag + ChatColor.DARK_GRAY + "]" + color;
this.abbr = tag;
this.tag = "[" + tag + "]";
Expand Down Expand Up @@ -85,6 +86,12 @@ public String getAbbr()
return abbr;
}

@Override
public String getPlural()
{
return plural;
}

@Override
public String getTag()
{
Expand Down
78 changes: 24 additions & 54 deletions src/main/java/me/totalfreedom/totalfreedommod/sql/SQLite.java
Expand Up @@ -7,6 +7,8 @@
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.MessageFormat;
import java.util.UUID;

import me.totalfreedom.totalfreedommod.FreedomService;
import me.totalfreedom.totalfreedommod.admin.Admin;
import me.totalfreedom.totalfreedommod.banning.Ban;
Expand Down Expand Up @@ -82,7 +84,7 @@ public void checkTables()
{
try
{
connection.createStatement().execute("CREATE TABLE `admins` (`username` VARCHAR NOT NULL, `ips` VARCHAR NOT NULL, `rank` VARCHAR NOT NULL, `active` BOOLEAN NOT NULL, `last_login` LONG NOT NULL, `command_spy` BOOLEAN NOT NULL, `potion_spy` BOOLEAN NOT NULL, `ac_format` VARCHAR, `ptero_id` VARCHAR);");
connection.createStatement().execute("CREATE TABLE `admins` (`uuid` VARCHAR NOT NULL, `ips` VARCHAR NOT NULL, `rank` VARCHAR NOT NULL, `active` BOOLEAN NOT NULL, `last_login` LONG NOT NULL, `command_spy` BOOLEAN NOT NULL, `potion_spy` BOOLEAN NOT NULL, `ac_format` VARCHAR, `ptero_id` VARCHAR);");
}
catch (SQLException e)
{
Expand All @@ -93,7 +95,7 @@ public void checkTables()
{
try
{
connection.createStatement().execute("CREATE TABLE `players` (`username` VARCHAR NOT NULL, `ips` VARCHAR NOT NULL, `notes` VARCHAR, `tag` VARCHAR, `discord_id` VARCHAR, `backup_codes` VARCHAR, `master_builder` BOOLEAN NOT NULL,`verification` BOOLEAN NOT NULL, `ride_mode` VARCHAR NOT NULL, `coins` INT, `items` VARCHAR, `total_votes` INT NOT NULL, `display_discord` BOOLEAN NOT NULL, `login_message` VARCHAR, `inspect` BOOLEAN NOT NULL);");
connection.createStatement().execute("CREATE TABLE `players` (`uuid` VARCHAR NOT NULL, `ips` VARCHAR NOT NULL, `notes` VARCHAR, `tag` VARCHAR, `discord_id` VARCHAR, `master_builder` BOOLEAN NOT NULL, `ride_mode` VARCHAR NOT NULL, `coins` INT, `items` VARCHAR, `total_votes` INT NOT NULL, `display_discord` BOOLEAN NOT NULL, `login_message` VARCHAR, `inspect` BOOLEAN NOT NULL);");
}
catch (SQLException e)
{
Expand Down Expand Up @@ -133,8 +135,8 @@ public void setAdminValue(Admin admin, String key, Object value)
{
try
{
Object[] data = {key, admin.getName()};
PreparedStatement statement = connection.prepareStatement(MessageFormat.format("UPDATE admins SET {0}=? WHERE username=''{1}''", data));
Object[] data = {key, admin.getUuid()};
PreparedStatement statement = connection.prepareStatement(MessageFormat.format("UPDATE admins SET {0}=? WHERE uuid=''{1}''", data));
statement = setUnknownType(statement, 1, value);
statement.executeUpdate();

Expand All @@ -150,8 +152,8 @@ public void setPlayerValue(PlayerData player, String key, Object value)
{
try
{
Object[] data = {key, player.getName()};
PreparedStatement statement = connection.prepareStatement(MessageFormat.format("UPDATE players SET {0}=? WHERE username=''{1}''", data));
Object[] data = {key, player.getUuid()};
PreparedStatement statement = connection.prepareStatement(MessageFormat.format("UPDATE players SET {0}=? WHERE uuid=''{1}''", data));
statement = setUnknownType(statement, 1, value);
statement.executeUpdate();

Expand All @@ -162,36 +164,6 @@ public void setPlayerValue(PlayerData player, String key, Object value)
}
}

public void updateAdminName(String oldName, String newName)
{
try
{
PreparedStatement statement = connection.prepareStatement(MessageFormat.format("UPDATE admins SET username=? WHERE username=''{0}''", oldName));
statement = setUnknownType(statement, 1, newName);
statement.executeUpdate();

}
catch (SQLException e)
{
FLog.severe("Failed to update admin name: " + e.getMessage());
}
}

public void updatePlayerName(String oldName, String newName)
{
try
{
PreparedStatement statement = connection.prepareStatement(MessageFormat.format("UPDATE players SET username=? WHERE username=''{0}''", oldName));
statement = setUnknownType(statement, 1, newName);
statement.executeUpdate();

}
catch (SQLException e)
{
FLog.severe("Failed to update player name: " + e.getMessage());
}
}

public PreparedStatement setUnknownType(PreparedStatement statement, int index, Object value) throws SQLException
{
if (value == null)
Expand Down Expand Up @@ -248,7 +220,7 @@ public void addAdmin(Admin admin)
try
{
PreparedStatement statement = connection.prepareStatement("INSERT INTO admins VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)");
statement.setString(1, admin.getName());
statement.setString(1, admin.getUuid().toString());
statement.setString(2, FUtil.listToString(admin.getIps()));
statement.setString(3, admin.getRank().toString());
statement.setBoolean(4, admin.isActive());
Expand All @@ -270,22 +242,20 @@ public void addPlayer(PlayerData player)
{
try
{
PreparedStatement statement = connection.prepareStatement("INSERT INTO players VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
statement.setString(1, player.getName());
PreparedStatement statement = connection.prepareStatement("INSERT INTO players VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
statement.setString(1, player.getUuid().toString());
statement.setString(2, FUtil.listToString(player.getIps()));
statement.setString(3, FUtil.listToString(player.getNotes()));
statement.setString(4, player.getTag());
statement.setString(5, player.getDiscordID());
statement.setString(6, FUtil.listToString(player.getBackupCodes()));
statement.setBoolean(7, player.isMasterBuilder());
statement.setBoolean(8, player.hasVerification());
statement.setString(9, player.getRideMode());
statement.setInt(10, player.getCoins());
statement.setString(11, FUtil.listToString(player.getItems()));
statement.setInt(12, player.getTotalVotes());
statement.setBoolean(13, player.doesDisplayDiscord());
statement.setString(14, player.getLoginMessage());
statement.setBoolean(15, player.hasInspection());
statement.setBoolean(6, player.isMasterBuilder());
statement.setString(7, player.getRideMode());
statement.setInt(8, player.getCoins());
statement.setString(9, FUtil.listToString(player.getItems()));
statement.setInt(10, player.getTotalVotes());
statement.setBoolean(11, player.doesDisplayDiscord());
statement.setString(12, player.getLoginMessage());
statement.setBoolean(13, player.hasInspection());
statement.executeUpdate();
}
catch (SQLException e)
Expand All @@ -295,11 +265,11 @@ public void addPlayer(PlayerData player)
}
}

public ResultSet getAdminByName(String name)
public ResultSet getAdminByUuid(UUID uuid)
{
try
{
ResultSet resultSet = connection.createStatement().executeQuery(MessageFormat.format("SELECT * FROM admins WHERE username=''{0}''", name));
ResultSet resultSet = connection.createStatement().executeQuery(MessageFormat.format("SELECT * FROM admins WHERE uuid=''{0}''", uuid.toString()));
if (resultSet.next())
{
return resultSet;
Expand All @@ -314,19 +284,19 @@ public ResultSet getAdminByName(String name)
return null;
}

public ResultSet getPlayerByName(String name)
public ResultSet getPlayerByUuid(UUID uuid)
{
try
{
ResultSet resultSet = connection.createStatement().executeQuery(MessageFormat.format("SELECT * FROM players WHERE username=''{0}''", name));
ResultSet resultSet = connection.createStatement().executeQuery(MessageFormat.format("SELECT * FROM players WHERE uuid=''{0}''", uuid.toString()));
if (resultSet.next())
{
return resultSet;
}
}
catch (SQLException e)
{
FLog.severe("Failed to get player by name:");
FLog.severe("Failed to get player by UUID:");
FLog.severe(e);
}

Expand Down

This file was deleted.

150 changes: 89 additions & 61 deletions src/main/java/me/totalfreedom/totalfreedommod/util/FUtil.java
@@ -1,16 +1,12 @@
package me.totalfreedom.totalfreedommod.util;

import com.earth2me.essentials.utils.DateUtil;
import me.totalfreedom.totalfreedommod.TotalFreedomMod;
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.WordUtils;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Color;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.OfflinePlayer;
import org.bukkit.*;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
Expand All @@ -19,10 +15,9 @@
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.scheduler.BukkitTask;
import org.json.simple.JSONArray;

import java.io.*;
import java.lang.reflect.Field;
import java.lang.management.ManagementFactory;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.ParseException;
Expand Down Expand Up @@ -55,9 +50,32 @@ public class FUtil
"ba5aafba-9012-418f-9819-a7020d591068", // TFTWPhoenix
"d6dd9740-40db-45f5-ab16-4ee16a633009", // Abhi
"2e06e049-24c8-42e4-8bcf-d35372af31e6", // NotInSync
"f97c0d7b-6413-4558-a409-88f09a8f9adb" // videogamesm12
"f97c0d7b-6413-4558-a409-88f09a8f9adb", // videogamesm12
"78408086-1991-4c33-a571-d8fa325465b2", // Telesphoreo
"f5cd54c4-3a24-4213-9a56-c06c49594dff", // Taahh
"a52f1f08-a398-400a-bca4-2b74b81feae6", // G6_
"ca83b658-c03b-4106-9edc-72f70a80656d" // ayunami2000
);
public static final List<String> DEVELOPER_NAMES = Arrays.asList("Madgeek1450", "Prozza", "WickedGamingUK", "Wild1145", "aggelosQQ", "scripthead", "CoolJWB", "elmon_", "speednt", "SupItsDillon", "Paldiu", "TFTWPhoenix", "abhithedev", "NotInSync", "videogamesm12");
public static final List<String> DEVELOPER_NAMES = Arrays.asList(
"Madgeek1450",
"Prozza",
"WickedGamingUK",
"Wild1145",
"aggelosQQ",
"scripthead",
"Telesphoreo",
"CoolJWB",
"elmon_",
"speednt",
"SupItsDillon",
"Paldiu",
"TFTWPhoenix",
"abhithedev",
"NotInSync",
"videogamesm12",
"Taahh",
"G6_",
"ayunami2000");
public static final Map<String, ChatColor> CHAT_COLOR_NAMES = new HashMap<>();
public static final List<ChatColor> CHAT_COLOR_POOL = Arrays.asList(
ChatColor.DARK_RED,
Expand Down Expand Up @@ -225,33 +243,6 @@ public static List<String> getAllMaterialNames()
return names;
}

@SuppressWarnings("unchecked")
public static UUID nameToUUID(String name)
{
try
{
JSONArray json = new JSONArray();
json.add(name);
List<String> headers = new ArrayList<>();
headers.add("Accept:application/json");
headers.add("Content-Type:application/json");
Response response = sendRequest("https://api.mojang.com/profiles/minecraft", "POST", headers, json.toString());
// Don't care how stupid this looks, couldn't find anything to parse a json string to something readable in java with something not horrendously huge, maybe im just retarded
Pattern pattern = Pattern.compile("(?<=\"id\":\")[a-f0-9].{31}");
Matcher matcher = pattern.matcher(response.getMessage());
if (matcher.find())
{
String rawUUID = matcher.group(0).replaceFirst("([a-f0-9]{8})([a-f0-9]{4})([a-f0-9]{4})([a-f0-9]{4})([a-f0-9]+)", "$1-$2-$3-$4-$5");
return UUID.fromString(rawUUID);
}
}
catch (Exception e)
{
FLog.severe("Failed to convert name to UUID:\n" + e.toString());
}
return null;
}

public static Response sendRequest(String endpoint, String method, List<String> headers, String body) throws IOException
{
URL url = new URL(endpoint);
Expand Down Expand Up @@ -537,30 +528,6 @@ public static String getFuzzyIp(String ip)
return ip;
}

//getField: Borrowed from WorldEdit
@SuppressWarnings("unchecked")
public static <T> T getField(Object from, String name)
{
Class<?> checkClass = from.getClass();
do
{
try
{
Field field = checkClass.getDeclaredField(name);
field.setAccessible(true);
return (T) field.get(from);

}
catch (NoSuchFieldException | IllegalAccessException ignored)
{
}
}
while (checkClass.getSuperclass() != Object.class
&& ((checkClass = checkClass.getSuperclass()) != null));

return null;
}

public static ChatColor randomChatColor()
{
return CHAT_COLOR_POOL.get(RANDOM.nextInt(CHAT_COLOR_POOL.size()));
Expand Down Expand Up @@ -601,6 +568,11 @@ public static String colorize(String string)
return string;
}

public static String stripColors(String string)
{
return string.replaceAll("§", "");
}

public static Date getUnixDate(long unix)
{
return new Date(unix);
Expand Down Expand Up @@ -846,6 +818,62 @@ public static int getFakePlayerCount()
return getServer().getOnlinePlayers().size() - i;
}

public static double getMeanAverageDouble(double[] doubles)
{
double total = 0;

for (double aDouble : doubles)
{
total += aDouble;
}

return total / doubles.length;
}

public static int getMeanAverageInt(int[] ints)
{
int total = 0;

for (int anInt : ints)
{
total += anInt;
}

return total / ints.length;
}

public static long getMeanAverageLong(long[] longs)
{
long total = 0;

for (long aLong : longs)
{
total += aLong;
}

return total / longs.length;
}

public static String getUptime()
{
return DateUtil.formatDateDiff(ManagementFactory.getRuntimeMXBean().getStartTime());
}

public static double getMaxMem()
{
return Runtime.getRuntime().maxMemory() / 1024f / 1024f;
}

public static double getTotalMem()
{
return Runtime.getRuntime().totalMemory() / 1024f / 1024f;
}

public static double getFreeMem()
{
return Runtime.getRuntime().freeMemory() / 1024f / 1024f;
}

public static class PaginationList<T> extends ArrayList<T>
{

Expand Down
76 changes: 3 additions & 73 deletions src/main/java/me/totalfreedom/totalfreedommod/util/Groups.java
Expand Up @@ -8,81 +8,11 @@

public class Groups
{
public static final List<Material> WOOL_COLORS = Arrays.asList(
Material.WHITE_WOOL,
Material.RED_WOOL,
Material.ORANGE_WOOL,
Material.YELLOW_WOOL,
Material.GREEN_WOOL,
Material.LIME_WOOL,
Material.LIGHT_BLUE_WOOL,
Material.CYAN_WOOL,
Material.BLUE_WOOL,
Material.PURPLE_WOOL,
Material.MAGENTA_WOOL,
Material.PINK_WOOL,
Material.BROWN_WOOL,
Material.GRAY_WOOL,
Material.LIGHT_GRAY_WOOL,
Material.BLACK_WOOL);

public static final List<Material> SHULKER_BOXES = Arrays.asList(
Material.SHULKER_BOX,
Material.WHITE_SHULKER_BOX,
Material.RED_SHULKER_BOX,
Material.ORANGE_SHULKER_BOX,
Material.YELLOW_SHULKER_BOX,
Material.GREEN_SHULKER_BOX,
Material.LIME_SHULKER_BOX,
Material.LIGHT_BLUE_SHULKER_BOX,
Material.CYAN_SHULKER_BOX,
Material.BLUE_SHULKER_BOX,
Material.PURPLE_SHULKER_BOX,
Material.MAGENTA_SHULKER_BOX,
Material.PINK_SHULKER_BOX,
Material.BROWN_SHULKER_BOX,
Material.GRAY_SHULKER_BOX,
Material.LIGHT_GRAY_SHULKER_BOX,
Material.BLACK_SHULKER_BOX);

public static final List<Material> WOOL_COLORS = Arrays.stream(Material.values()).filter((m) -> m.name().endsWith("_WOOL")).toList();
public static final List<Material> SHULKER_BOXES = Arrays.stream(Material.values()).filter((m) -> m.name().endsWith("SHULKER_BOX")).toList();
public static final List<EntityType> MOB_TYPES = Arrays.stream(EntityType.values()).filter(EntityType::isAlive).filter(EntityType::isSpawnable).toList();

public static final List<Material> SPAWN_EGGS = Arrays.stream(Material.values()).filter((mat) -> mat.name().endsWith("_SPAWN_EGG")).toList();

public static final List<Material> BANNERS = Arrays.asList(
Material.BLACK_BANNER,
Material.BLACK_WALL_BANNER,
Material.BLUE_BANNER,
Material.BLUE_WALL_BANNER,
Material.BROWN_BANNER,
Material.BROWN_WALL_BANNER,
Material.CYAN_BANNER,
Material.CYAN_WALL_BANNER,
Material.GRAY_BANNER,
Material.GRAY_WALL_BANNER,
Material.GREEN_BANNER,
Material.GREEN_WALL_BANNER,
Material.LIGHT_BLUE_BANNER,
Material.LIGHT_BLUE_WALL_BANNER,
Material.LIGHT_GRAY_BANNER,
Material.LIGHT_GRAY_WALL_BANNER,
Material.LIME_BANNER,
Material.LIME_WALL_BANNER,
Material.MAGENTA_BANNER,
Material.MAGENTA_WALL_BANNER,
Material.ORANGE_BANNER,
Material.ORANGE_WALL_BANNER,
Material.PINK_BANNER,
Material.PINK_WALL_BANNER,
Material.PURPLE_BANNER,
Material.PURPLE_WALL_BANNER,
Material.RED_BANNER,
Material.RED_WALL_BANNER,
Material.WHITE_BANNER,
Material.WHITE_WALL_BANNER,
Material.YELLOW_BANNER,
Material.YELLOW_WALL_BANNER);

public static final List<Material> BANNERS = Arrays.stream(Material.values()).filter((m) -> m.name().endsWith("_BANNER")).toList();
public static final List<Biome> EXPLOSIVE_BED_BIOMES = Arrays.asList(
Biome.NETHER_WASTES,
Biome.CRIMSON_FOREST,
Expand Down
Expand Up @@ -32,14 +32,6 @@ public class WorldRestrictions extends FreedomService
private final List<String> BLOCKED_ESSENTIALS_COMMANDS = Arrays.asList(
"bigtree", "ebigtree", "largetree", "elargetree");

private final Map<Flag<?>, Object> flags = new HashMap<Flag<?>, Object>()
{{
put(Flags.PLACE_VEHICLE, StateFlag.State.DENY);
put(Flags.DESTROY_VEHICLE, StateFlag.State.DENY);
put(Flags.ENTITY_ITEM_FRAME_DESTROY, StateFlag.State.DENY);
put(Flags.ENTITY_PAINTING_DESTROY, StateFlag.State.DENY);
}};

@Override
public void onStart()
{
Expand Down Expand Up @@ -155,20 +147,4 @@ public void onCommandPreprocess(PlayerCommandPreprocessEvent event)
}
}
}

public void protectWorld(World world)
{
if (!plugin.wgb.isEnabled())
{
return;
}

RegionManager regionManager = plugin.wgb.getRegionManager(world);

GlobalProtectedRegion region = new GlobalProtectedRegion("__global__");

region.setFlags(flags);

regionManager.addRegion(region);
}
}
6 changes: 4 additions & 2 deletions src/main/resources/config.yml
Expand Up @@ -56,14 +56,16 @@ server:

# Discord
discord:
# Do you want to enable the Discord verification system? (Disabled by default)
verification: false
# If you do not have a token, make a bot account and get one at https://discordapp.com/developers/applications/me
token: ''
# The prefix for the integrated bot commands
prefix: 'tf!'
# The official discord server's ID for this server
server_id: ''
# Channel to send /report messages to
report_channel_id: ''
# Channel to send archived reports to
report_archive_channel_id: ''
# Channel for Discord to Minecraft and vice-versa
chat_channel_id: ''
# Channel for Discord to AdminChat and vice-versa
Expand Down