2012-12-09 03:42:29 +00:00
|
|
|
package me.StevenLawson.TotalFreedomMod;
|
|
|
|
|
2014-04-11 15:24:44 +00:00
|
|
|
import me.StevenLawson.TotalFreedomMod.Config.TFM_ConfigEntry;
|
2012-12-09 03:42:29 +00:00
|
|
|
import java.text.SimpleDateFormat;
|
2014-04-14 19:11:41 +00:00
|
|
|
import java.util.Arrays;
|
2013-08-24 19:35:09 +00:00
|
|
|
import java.util.List;
|
2014-04-14 19:11:41 +00:00
|
|
|
import java.util.UUID;
|
2012-12-09 03:42:29 +00:00
|
|
|
import java.util.regex.Pattern;
|
2014-04-14 19:11:41 +00:00
|
|
|
import net.minecraft.server.v1_7_R3.MinecraftServer;
|
|
|
|
import net.minecraft.server.v1_7_R3.PropertyManager;
|
2012-12-09 03:42:29 +00:00
|
|
|
import org.bukkit.ChatColor;
|
|
|
|
import org.bukkit.Server;
|
|
|
|
import org.bukkit.entity.Player;
|
|
|
|
import org.bukkit.event.player.PlayerLoginEvent;
|
2013-12-01 12:33:39 +00:00
|
|
|
import org.bukkit.event.player.PlayerLoginEvent.Result;
|
2012-12-09 03:42:29 +00:00
|
|
|
|
|
|
|
public class TFM_ServerInterface
|
|
|
|
{
|
2013-08-25 16:32:01 +00:00
|
|
|
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd \'at\' HH:mm:ss z");
|
2014-04-14 19:11:41 +00:00
|
|
|
public static final Pattern INVALID_CHARS_REGEX = Pattern.compile("[^a-zA-Z0-9\\-\\.\\_]");
|
2012-12-09 03:42:29 +00:00
|
|
|
|
|
|
|
public static void setOnlineMode(boolean mode)
|
|
|
|
{
|
2014-04-14 19:11:41 +00:00
|
|
|
final PropertyManager manager = MinecraftServer.getServer().getPropertyManager();
|
|
|
|
manager.a("online-mode", mode);
|
|
|
|
manager.savePropertiesFile();
|
2012-12-09 03:42:29 +00:00
|
|
|
}
|
|
|
|
|
2014-04-14 19:11:41 +00:00
|
|
|
public static int purgeWhitelist()
|
2012-12-09 03:42:29 +00:00
|
|
|
{
|
2014-04-14 19:11:41 +00:00
|
|
|
String[] whitelisted = MinecraftServer.getServer().getPlayerList().getWhitelisted();
|
|
|
|
int size = whitelisted.length;
|
|
|
|
for (String player : MinecraftServer.getServer().getPlayerList().getWhitelist().getEntries())
|
2012-12-09 03:42:29 +00:00
|
|
|
{
|
2014-04-14 19:11:41 +00:00
|
|
|
MinecraftServer.getServer().getPlayerList().getWhitelist().remove(player);
|
2012-12-09 03:42:29 +00:00
|
|
|
}
|
2014-04-17 16:29:08 +00:00
|
|
|
|
|
|
|
try
|
|
|
|
{
|
|
|
|
MinecraftServer.getServer().getPlayerList().getWhitelist().save();
|
|
|
|
}
|
|
|
|
catch (Exception ex)
|
|
|
|
{
|
|
|
|
TFM_Log.warning("Could not purge the whitelist!");
|
|
|
|
TFM_Log.warning(ex);
|
|
|
|
}
|
2014-04-14 19:11:41 +00:00
|
|
|
return size;
|
2012-12-09 03:42:29 +00:00
|
|
|
}
|
|
|
|
|
2014-04-14 19:11:41 +00:00
|
|
|
public static boolean isWhitelisted()
|
2012-12-09 03:42:29 +00:00
|
|
|
{
|
2014-04-14 19:11:41 +00:00
|
|
|
return MinecraftServer.getServer().getPlayerList().hasWhitelist;
|
2012-12-09 03:42:29 +00:00
|
|
|
}
|
|
|
|
|
2014-04-14 19:11:41 +00:00
|
|
|
public static List<?> getWhitelisted()
|
2012-12-09 03:42:29 +00:00
|
|
|
{
|
2014-04-14 19:11:41 +00:00
|
|
|
return Arrays.asList(MinecraftServer.getServer().getPlayerList().getWhitelisted());
|
2012-12-09 03:42:29 +00:00
|
|
|
}
|
|
|
|
|
2014-04-14 19:11:41 +00:00
|
|
|
public static String getVersion()
|
2012-12-09 03:42:29 +00:00
|
|
|
{
|
2014-04-14 19:11:41 +00:00
|
|
|
return MinecraftServer.getServer().getVersion();
|
2012-12-09 03:42:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
public static void handlePlayerLogin(PlayerLoginEvent event)
|
|
|
|
{
|
2013-12-01 12:33:39 +00:00
|
|
|
final Server server = TotalFreedomMod.server;
|
2014-04-14 19:11:41 +00:00
|
|
|
final TFM_BanManager banManager = TFM_BanManager.getInstance();
|
2012-12-09 03:42:29 +00:00
|
|
|
|
2013-08-14 14:01:42 +00:00
|
|
|
final Player player = event.getPlayer();
|
2012-12-09 03:42:29 +00:00
|
|
|
|
2013-08-25 16:32:01 +00:00
|
|
|
final String username = player.getName();
|
2014-04-14 19:11:41 +00:00
|
|
|
final UUID uuid = player.getUniqueId();
|
2013-12-01 12:33:39 +00:00
|
|
|
final String ip = event.getAddress().getHostAddress().trim();
|
2012-12-09 03:42:29 +00:00
|
|
|
|
2014-04-14 19:11:41 +00:00
|
|
|
if (INVALID_CHARS_REGEX.matcher(username).find())
|
2012-12-09 03:42:29 +00:00
|
|
|
{
|
2014-04-14 19:11:41 +00:00
|
|
|
event.disallow(PlayerLoginEvent.Result.KICK_OTHER, "Your username contains invalid characters.");
|
2012-12-09 03:42:29 +00:00
|
|
|
return;
|
|
|
|
}
|
2014-04-14 19:11:41 +00:00
|
|
|
|
|
|
|
if (username.length() <= 2)
|
2012-12-09 03:42:29 +00:00
|
|
|
{
|
2014-04-14 19:11:41 +00:00
|
|
|
event.disallow(Result.KICK_OTHER, "Your username is too short (must be at least 3 characters long).");
|
2012-12-09 03:42:29 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2014-04-08 18:31:04 +00:00
|
|
|
// not safe to use TFM_Util.isSuperAdmin for player logging in because player.getAddress() will return a null until after player login.
|
2014-04-14 19:11:41 +00:00
|
|
|
boolean isAdmin;
|
2012-12-09 03:42:29 +00:00
|
|
|
if (server.getOnlineMode())
|
|
|
|
{
|
2014-04-21 15:45:32 +00:00
|
|
|
isAdmin = TFM_AdminList.getSuperUUIDs().contains(uuid);
|
2012-12-09 03:42:29 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2014-04-14 19:11:41 +00:00
|
|
|
isAdmin = TFM_AdminList.getEntryByIp(ip) != null;
|
2012-12-09 03:42:29 +00:00
|
|
|
}
|
|
|
|
|
2013-12-01 12:33:39 +00:00
|
|
|
// Validation below this point
|
2014-04-14 19:11:41 +00:00
|
|
|
if (!isAdmin) // If the player is not an admin
|
2013-12-01 12:33:39 +00:00
|
|
|
{
|
2014-04-14 19:11:41 +00:00
|
|
|
// UUID bans
|
|
|
|
if (banManager.isUuidBanned(uuid))
|
2012-12-09 03:42:29 +00:00
|
|
|
{
|
2014-04-14 19:11:41 +00:00
|
|
|
final TFM_Ban ban = banManager.getByUuid(uuid);
|
2012-12-09 03:42:29 +00:00
|
|
|
|
2013-12-03 15:41:43 +00:00
|
|
|
String kickMessage = ChatColor.RED + "You are temporarily banned from this server.\nAppeal at http://totalfreedom.boards.net/.";
|
2014-04-14 19:11:41 +00:00
|
|
|
|
|
|
|
if (!ban.getReason().equals("none"))
|
2012-12-09 03:42:29 +00:00
|
|
|
{
|
2014-04-14 19:11:41 +00:00
|
|
|
kickMessage = kickMessage + "\nReason: " + ban.getReason();
|
|
|
|
}
|
|
|
|
|
|
|
|
if (ban.getExpireUnix() != 0)
|
|
|
|
{
|
|
|
|
kickMessage = kickMessage + "\nYour ban will be removed on " + dateFormat.format(TFM_Util.getUnixDate(ban.getExpireUnix()));
|
2012-12-09 03:42:29 +00:00
|
|
|
}
|
|
|
|
|
2013-12-01 12:33:39 +00:00
|
|
|
event.disallow(Result.KICK_OTHER, kickMessage);
|
2012-12-09 03:42:29 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2014-04-14 19:11:41 +00:00
|
|
|
if (banManager.isIpBanned(ip))
|
2012-12-09 03:42:29 +00:00
|
|
|
{
|
2014-04-14 19:11:41 +00:00
|
|
|
final TFM_Ban ban = banManager.getByIp(ip);
|
2012-12-09 03:42:29 +00:00
|
|
|
|
2014-04-14 19:11:41 +00:00
|
|
|
String kickMessage = ChatColor.RED + "Your IP address is temporarily banned from this server.\nAppeal at http://totalfreedom.boards.net/.";
|
2012-12-09 03:42:29 +00:00
|
|
|
|
2014-04-14 19:11:41 +00:00
|
|
|
if (!ban.getReason().equals("none"))
|
2012-12-09 03:42:29 +00:00
|
|
|
{
|
2014-04-14 19:11:41 +00:00
|
|
|
kickMessage = kickMessage + "\nReason: " + ban.getReason();
|
2012-12-09 03:42:29 +00:00
|
|
|
}
|
|
|
|
|
2014-04-14 19:11:41 +00:00
|
|
|
if (ban.getExpireUnix() != 0)
|
2012-12-09 03:42:29 +00:00
|
|
|
{
|
2014-04-14 19:11:41 +00:00
|
|
|
kickMessage = kickMessage + "\nYour ban will be removed on " + dateFormat.format(TFM_Util.getUnixDate(ban.getExpireUnix()));
|
2012-12-09 03:42:29 +00:00
|
|
|
}
|
|
|
|
|
2013-12-01 12:33:39 +00:00
|
|
|
event.disallow(Result.KICK_OTHER, kickMessage);
|
2012-12-09 03:42:29 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2014-04-14 19:11:41 +00:00
|
|
|
// Permbanned Ips
|
2013-12-01 12:33:39 +00:00
|
|
|
for (String testIp : TotalFreedomMod.permbannedIps)
|
2012-12-09 03:42:29 +00:00
|
|
|
{
|
2013-12-01 12:33:39 +00:00
|
|
|
if (TFM_Util.fuzzyIpMatch(testIp, ip, 4))
|
2012-12-09 03:42:29 +00:00
|
|
|
{
|
2014-04-14 19:11:41 +00:00
|
|
|
event.disallow(Result.KICK_OTHER,
|
|
|
|
ChatColor.RED + "Your IP address is permanently banned from this server.\nRelease procedures are available at http://bit.ly/TF_PermBan");
|
2012-12-09 03:42:29 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-04-14 19:11:41 +00:00
|
|
|
// Permbanned names
|
2013-12-01 12:33:39 +00:00
|
|
|
for (String testPlayer : TotalFreedomMod.permbannedPlayers)
|
2012-12-09 03:42:29 +00:00
|
|
|
{
|
2013-12-01 12:33:39 +00:00
|
|
|
if (testPlayer.equalsIgnoreCase(username))
|
2012-12-09 03:42:29 +00:00
|
|
|
{
|
2014-04-14 19:11:41 +00:00
|
|
|
event.disallow(Result.KICK_OTHER,
|
|
|
|
ChatColor.RED + "Your username is permanently banned from this server.\nRelease procedures are available at http://bit.ly/TF_PermBan");
|
2012-12-09 03:42:29 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-12-01 12:33:39 +00:00
|
|
|
// Server full check
|
2012-12-09 03:42:29 +00:00
|
|
|
if (server.getOnlinePlayers().length >= server.getMaxPlayers())
|
|
|
|
{
|
|
|
|
event.disallow(PlayerLoginEvent.Result.KICK_FULL, "Sorry, but this server is full.");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2013-12-01 12:33:39 +00:00
|
|
|
// Admin-only mode
|
2013-08-18 18:52:46 +00:00
|
|
|
if (TFM_ConfigEntry.ADMIN_ONLY_MODE.getBoolean())
|
2012-12-09 03:42:29 +00:00
|
|
|
{
|
|
|
|
event.disallow(PlayerLoginEvent.Result.KICK_OTHER, "Server is temporarily open to admins only.");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2013-12-01 12:33:39 +00:00
|
|
|
// Lockdown mode
|
2013-08-12 18:47:36 +00:00
|
|
|
if (TotalFreedomMod.lockdownEnabled)
|
|
|
|
{
|
|
|
|
event.disallow(PlayerLoginEvent.Result.KICK_OTHER, "Server is currently in lockdown mode.");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2013-12-01 12:33:39 +00:00
|
|
|
// Whitelist check
|
2014-04-14 19:11:41 +00:00
|
|
|
if (isWhitelisted())
|
2012-12-09 03:42:29 +00:00
|
|
|
{
|
2014-04-14 19:11:41 +00:00
|
|
|
if (!getWhitelisted().contains(username.toLowerCase()))
|
2012-12-09 03:42:29 +00:00
|
|
|
{
|
|
|
|
event.disallow(PlayerLoginEvent.Result.KICK_OTHER, "You are not whitelisted on this server.");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-12-01 12:33:39 +00:00
|
|
|
// Username already logged in check
|
2014-04-14 19:11:41 +00:00
|
|
|
for (Player onlinePlayer : server.getOnlinePlayers())
|
2012-12-09 03:42:29 +00:00
|
|
|
{
|
2014-04-14 19:11:41 +00:00
|
|
|
if (onlinePlayer.getName().equalsIgnoreCase(username))
|
2012-12-09 03:42:29 +00:00
|
|
|
{
|
|
|
|
event.disallow(PlayerLoginEvent.Result.KICK_OTHER, "Your username is already logged into this server.");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2013-12-01 12:33:39 +00:00
|
|
|
else // Player is superadmin
|
2013-07-02 18:31:22 +00:00
|
|
|
{
|
2013-12-01 12:33:39 +00:00
|
|
|
// force-allow superadmins to log in
|
|
|
|
event.allow();
|
|
|
|
|
2014-04-14 19:11:41 +00:00
|
|
|
for (Player onlinePlayer : server.getOnlinePlayers())
|
2012-12-09 03:42:29 +00:00
|
|
|
{
|
2014-04-14 19:11:41 +00:00
|
|
|
if (onlinePlayer.getName().equalsIgnoreCase(username))
|
2012-12-09 03:42:29 +00:00
|
|
|
{
|
2014-04-14 19:11:41 +00:00
|
|
|
onlinePlayer.kickPlayer("An admin just logged in with the username you are using.");
|
2012-12-09 03:42:29 +00:00
|
|
|
}
|
|
|
|
}
|
2013-07-02 18:31:22 +00:00
|
|
|
|
2013-12-01 17:21:43 +00:00
|
|
|
int count = server.getOnlinePlayers().length;
|
|
|
|
if (count >= server.getMaxPlayers())
|
2012-12-09 03:42:29 +00:00
|
|
|
{
|
2014-04-14 19:11:41 +00:00
|
|
|
for (Player onlinePlayer : server.getOnlinePlayers())
|
2012-12-09 03:42:29 +00:00
|
|
|
{
|
2014-04-14 19:11:41 +00:00
|
|
|
if (!TFM_AdminList.isSuperAdmin(onlinePlayer))
|
2013-12-01 12:33:39 +00:00
|
|
|
{
|
2014-04-14 19:11:41 +00:00
|
|
|
onlinePlayer.kickPlayer("You have been kicked to free up room for an admin.");
|
2013-12-01 17:21:43 +00:00
|
|
|
count--;
|
2013-12-01 12:33:39 +00:00
|
|
|
}
|
|
|
|
|
2013-12-01 17:21:43 +00:00
|
|
|
if (count < server.getMaxPlayers())
|
2012-12-09 03:42:29 +00:00
|
|
|
{
|
2013-07-11 22:21:23 +00:00
|
|
|
break;
|
2012-12-09 03:42:29 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2013-08-12 18:47:36 +00:00
|
|
|
|
2013-12-01 17:21:43 +00:00
|
|
|
if (count >= server.getMaxPlayers())
|
2013-08-12 18:47:36 +00:00
|
|
|
{
|
2013-12-01 12:33:39 +00:00
|
|
|
event.disallow(PlayerLoginEvent.Result.KICK_OTHER, "The server is full and a player could not be kicked, sorry!");
|
|
|
|
return;
|
2013-08-12 18:47:36 +00:00
|
|
|
}
|
2013-12-01 12:33:39 +00:00
|
|
|
|
|
|
|
}
|
2013-07-04 16:22:02 +00:00
|
|
|
}
|
2012-12-09 03:42:29 +00:00
|
|
|
}
|