Compare commits

...
42 Commits
Author SHA1 Message Date
KennyTV b30476ae3f 2.2.2 Release 2018-06-17 11:24:35 +02:00
KennyTV 9d417a12f1 2.2.2 Release 2018-06-17 11:22:43 +02:00
KennyTV fd5406b95d 2.2.2 Release 2018-06-17 11:21:10 +02:00
KennyTV 0ef59e557d Maintenance icon fix and reload command message change 2018-06-14 12:35:10 +02:00
KennyTV 15ed1db347 Made the loading of the maintenance icon more structured 2018-06-14 12:10:33 +02:00
KennyTV 429d5b90d4 Api fix 2018-06-10 10:44:42 +02:00
KennyTV b3ab931aca Removed old config comment 2018-06-09 11:26:58 +02:00
KennyTV 21b42d0c72 Version increase to 2.2.2-SNAPSHOT
Some minor pom changes
2018-06-09 10:14:21 +02:00
KennyTV 7b1e1a27ba Merge remote-tracking branch 'origin/master' 2018-04-23 11:39:04 +02:00
KennyTV fb7b1e791f Some javadoc and comment changes 2018-04-23 11:38:51 +02:00
KennyTV eecd59b387 2.2.1 release 2018-04-17 04:46:22 +02:00
KennyTV ff7d8e0293 Project/pom changes 2018-04-16 20:54:21 +02:00
KennyTV 19c6d77a2c Updated API 2018-04-16 19:50:50 +02:00
KennyTV e002aa34e9 Comment line change 2018-04-16 16:35:13 +02:00
KennyTV 865e53a4a8 MySQL change 2018-04-16 15:31:50 +02:00
KennyTV b8c652b7fb MySQL fix 2018-04-16 14:39:40 +02:00
KennyTV c4080f82dc More cleanup 2018-04-16 14:18:19 +02:00
KennyTV 1a33497e8f Fixed doc typo 2018-04-15 15:07:19 +02:00
KennyTV f8353b8eda Various stuff 2018-04-15 13:53:42 +02:00
KennyTV 4980ad54ec Setmotd fixes 2018-04-15 13:38:21 +02:00
KennyTV 5363305411 Setmotd fixes 2018-04-15 13:37:07 +02:00
KennyTV 6ff47619ad Added setmotd command 2018-04-15 13:17:58 +02:00
KennyTV 69315a3f74 Create ISSUE_TEMPLATE.md 2018-04-14 19:09:34 +02:00
KennyTV 8b1ddba672 Added import 2018-04-14 18:46:24 +02:00
KennyTV bf63f0e209 MySQL improvements 2018-04-14 12:25:57 +02:00
KennyTV 450c923d24 Fixes 2018-04-14 12:06:29 +02:00
KennyTV 9a922a6df5 Small ServerListPlus integration and command fix 2018-04-14 12:00:46 +02:00
KennyTV 08a5a9a021 Fixes 2018-04-13 23:28:15 +02:00
KennyTV 61ad7d8533 Code cleanup 2018-04-13 22:56:41 +02:00
KennyTV 52d2b3c096 Automatically create sql table if non existing 2018-04-13 20:12:32 +02:00
KennyTV b0a69cc048 Moved resources 2018-04-13 19:26:45 +02:00
KennyTV 74e445a62e Added license and bumped version to 2.2.1-SNAPSHOT 2018-04-13 19:24:16 +02:00
KennyTV 91219202b2 Updated README 2018-04-05 23:50:36 +02:00
KennyTV a3545c83a0 Removed first commit errors 2018-04-05 23:45:39 +02:00
KennyTV 31baf91e8f Code commit 2018-04-05 23:43:25 +02:00
KennyTV 214cd53751 Update README.md 2018-03-17 11:43:36 +01:00
KennyTV 2be16882c7 Update README.md 2018-03-17 10:30:46 +01:00
KennyTV 75e2264b44 Update README.md 2018-03-06 21:53:08 +01:00
KennyTV fd7a0eb6a5 Update README.md 2018-03-06 21:52:14 +01:00
KennyTV 177115f144 Add files via upload 2018-03-06 21:39:49 +01:00
KennyTV edbe31dc9c Create README.md 2018-03-06 21:39:02 +01:00
KennyTV 21a2f9ef2f Init 2018-02-16 18:39:21 +01:00
49 changed files with 613 additions and 472 deletions

No files matched your search

+13
View File
@@ -0,0 +1,13 @@
## Issue
Include here how the problem occured and how it's reproduceable.
If present, also paste the entire error message from the console, preferably via a https://hastebin.com/ link.
## Necessary server information
**Running on**: <BungeeCord/Bukkit>
**Maintenance version**: <>
## Other information
**Other motd changing plugins**: <>
**ProtocolLib version**: <>
+2 -2
View File
@@ -1,4 +1,4 @@
GNU GENERAL PUBLIC LICENSE
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
@@ -671,4 +671,4 @@ into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
Binary file not shown.
+2 -2
View File
@@ -6,7 +6,7 @@
<parent>
<artifactId>maintenance-base</artifactId>
<groupId>eu.kennytv</groupId>
<version>2.2</version>
<version>2.2.2</version>
</parent>
<artifactId>maintenance-api</artifactId>
@@ -22,7 +22,7 @@
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>1.10.2-R0.1-SNAPSHOT</version>
<version>1.12.2-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
</dependencies>
@@ -1,9 +1,13 @@
package eu.kennytv.maintenance.api;
/**
* @author KennyTV
* @since 2.1
*/
public interface IMaintenance {
/**
* Enabled/disabled maintenance mode.
* Enables/disables maintenance mode.
* If enabled, all non-permitted players will be kicked.
* <p>
* If using the BungeeCord version and MySQL is enabled,
@@ -15,7 +19,7 @@ public interface IMaintenance {
void setMaintenance(boolean maintenance);
/**
* @return true if maintenance is enabled on the proxy
* @return true if maintenance is currently enabled
*/
boolean isMaintenance();
@@ -30,7 +34,7 @@ public interface IMaintenance {
String getVersion();
/**
* @return {@link ISettings} for more options
* @return {@link ISettings} for options regarding configuration files
*/
ISettings getSettings();
}
@@ -0,0 +1,15 @@
package eu.kennytv.maintenance.api;
/**
* @author KennyTV
* @since 2.2.2
*/
public interface IMaintenanceBase {
/**
* Returns API instance of IMaintenance.
*
* @return {@link IMaintenance} instance
*/
IMaintenance getApi();
}
@@ -3,10 +3,14 @@ package eu.kennytv.maintenance.api;
import java.util.Map;
import java.util.UUID;
/**
* @author KennyTV
* @since 2.1
*/
public interface ISettings {
/**
* @return true if maintenance is enabled on the proxy
* @return true if maintenance is currently enabled
*/
boolean isMaintenance();
@@ -21,9 +25,7 @@ public interface ISettings {
boolean hasCustomIcon();
/**
* The keyset of the map contains the uuids as a string, the values the names of the players.
*
* @return map of uuids of whitelisted players with their last seen names
* @return map of uuids of whitelisted players with their given names
*/
Map<UUID, String> getWhitelistedPlayers();
@@ -40,7 +42,10 @@ public interface ISettings {
*
* @param name name of the player to remove in lowercase letters
* @return true if removing the player was successful
* @see #removeWhitelistedPlayer(UUID)
* @deprecated if a player changes their name, the list will still contain the old one and thus this might not work
*/
@Deprecated
boolean removeWhitelistedPlayer(String name);
/**
@@ -51,4 +56,11 @@ public interface ISettings {
* @return true if adding the player was successful
*/
boolean addWhitelistedPlayer(UUID uuid, String name);
/**
* Reloads the maintenance-icon.png image from the server folder.
*
* @return true if loading the image was successful
*/
boolean reloadMaintenanceIcon();
}
@@ -10,7 +10,7 @@ import net.md_5.bungee.api.plugin.Plugin;
* </p>
*
* @author KennyTV
* @since 1.0
* @since 2.1
*/
public final class MaintenanceBungeeAPI {
@@ -24,6 +24,6 @@ public final class MaintenanceBungeeAPI {
if (maintenance == null)
ProxyServer.getInstance().getLogger().warning("Could not get instance of MaintenanceBungee!");
return (IMaintenance) maintenance;
return ((IMaintenanceBase) maintenance).getApi();
}
}
@@ -1,6 +1,7 @@
package eu.kennytv.maintenance.api;
import org.bukkit.Bukkit;
import org.bukkit.plugin.Plugin;
/**
* Utility class to get the {@link IMaintenance} instance for the Spigot/Bukkit version of the plugin.
@@ -9,7 +10,7 @@ import org.bukkit.Bukkit;
* </p>
*
* @author KennyTV
* @since 1.0
* @since 2.1
*/
public final class MaintenanceSpigotAPI {
@@ -19,10 +20,10 @@ public final class MaintenanceSpigotAPI {
* @return {@link IMaintenance} instance
*/
public static IMaintenance getAPI() {
final org.bukkit.plugin.Plugin maintenance = Bukkit.getPluginManager().getPlugin("MaintenanceSpigot");
final Plugin maintenance = Bukkit.getPluginManager().getPlugin("MaintenanceSpigot");
if (maintenance == null)
Bukkit.getLogger().warning("Could not get instance of MaintenanceSpigot!");
return (IMaintenance) maintenance;
return ((IMaintenanceBase) maintenance).getApi();
}
}
@@ -3,14 +3,13 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>eu.kennytv</groupId>
<artifactId>maintenance-base</artifactId>
<version>2.2</version>
<groupId>eu.kennytv</groupId>
<version>2.2.2</version>
</parent>
<artifactId>maintenancebungee</artifactId>
<artifactId>maintenance-bungee</artifactId>
<name>MaintenanceBungee</name>
<repositories>
@@ -24,7 +23,7 @@
<dependency>
<groupId>eu.kennytv</groupId>
<artifactId>maintenance-core</artifactId>
<version>2.2</version>
<version>${parent.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
@@ -42,7 +41,7 @@
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>2.7.8</version>
<version>3.1.0</version>
<scope>compile</scope>
</dependency>
</dependencies>
@@ -0,0 +1,25 @@
package eu.kennytv.maintenance.bungee;
import eu.kennytv.maintenance.api.IMaintenance;
import eu.kennytv.maintenance.api.IMaintenanceBase;
import net.md_5.bungee.api.plugin.Plugin;
import java.io.File;
public final class MaintenanceBungeeBase extends Plugin implements IMaintenanceBase {
private IMaintenance maintenance;
@Override
public void onEnable() {
maintenance = new MaintenanceBungeePlugin(this);
}
@Override
public IMaintenance getApi() {
return maintenance;
}
File getPluginFile() {
return getFile();
}
}
@@ -4,8 +4,8 @@ import eu.kennytv.maintenance.api.IMaintenance;
import eu.kennytv.maintenance.api.ISettings;
import eu.kennytv.maintenance.api.MaintenanceBungeeAPI;
import eu.kennytv.maintenance.bungee.command.MaintenanceBungeeCommand;
import eu.kennytv.maintenance.bungee.command.MaintenanceBungeeCommandBase;
import eu.kennytv.maintenance.bungee.listener.PostLoginListener;
import eu.kennytv.maintenance.bungee.listener.ProxyPingListener;
import eu.kennytv.maintenance.bungee.metrics.MetricsLite;
import eu.kennytv.maintenance.core.MaintenanceModePlugin;
import eu.kennytv.maintenance.core.hook.ServerListPlusHook;
@@ -21,7 +21,7 @@ import java.util.concurrent.TimeUnit;
* @author KennyTV
* @since 1.0
*/
public final class MaintenanceBungeePlugin extends MaintenanceModePlugin implements IMaintenance {
public final class MaintenanceBungeePlugin extends MaintenanceModePlugin {
private final MaintenanceBungeeBase plugin;
private final SettingsBungee settings;
@@ -35,8 +35,8 @@ public final class MaintenanceBungeePlugin extends MaintenanceModePlugin impleme
final PluginManager pm = getProxy().getPluginManager();
pm.registerListener(plugin, new PostLoginListener(this, settings));
pm.registerListener(plugin, new ProxyPingListener(plugin, settings));
pm.registerCommand(plugin, new MaintenanceBungeeCommand(this, settings));
final MaintenanceBungeeCommand maintenanceCommand = new MaintenanceBungeeCommand(this, settings);
pm.registerCommand(plugin, new MaintenanceBungeeCommandBase(maintenanceCommand));
new MetricsLite(plugin);
@@ -44,23 +44,18 @@ public final class MaintenanceBungeePlugin extends MaintenanceModePlugin impleme
final Plugin serverListPlus = pm.getPlugin("ServerListPlus");
if (serverListPlus != null) {
serverListPlusHook = new ServerListPlusHook(((ServerListPlusPlugin) serverListPlus).getCore());
serverListPlusHook.setEnabled(!settings.isMaintenance());
plugin.getLogger().info("Enabled ServerListPlus integration!");
}
}
@Override
public void onDisable() {
if (settings.getMySQL() != null)
settings.getMySQL().close();
}
@Override
public void setMaintenance(final boolean maintenance) {
if (settings.getMySQL() != null) {
settings.setMaintenanceToSQL(maintenance);
} else {
settings.setMaintenance(maintenance);
settings.setConfigBoolean("enable-maintenance-mode", maintenance);
settings.setToConfig("enable-maintenance-mode", maintenance);
settings.saveConfig();
settings.reloadConfigs();
}
@@ -80,11 +75,6 @@ public final class MaintenanceBungeePlugin extends MaintenanceModePlugin impleme
getProxy().broadcast(settings.getMaintenanceDeactivated());
}
@Override
public boolean isMaintenance() {
return settings.isMaintenance();
}
@Override
public int schedule(final Runnable runnable) {
return getProxy().getScheduler().schedule(plugin, runnable, 0, 1, TimeUnit.MINUTES).getId();
@@ -1,9 +1,11 @@
package eu.kennytv.maintenance.bungee;
import eu.kennytv.maintenance.api.ISettings;
import eu.kennytv.maintenance.bungee.listener.ProxyPingListener;
import eu.kennytv.maintenance.bungee.mysql.MySQL;
import eu.kennytv.maintenance.core.Settings;
import eu.kennytv.maintenance.core.listener.IPingListener;
import net.md_5.bungee.api.ChatColor;
import net.md_5.bungee.api.plugin.PluginManager;
import net.md_5.bungee.config.Configuration;
import net.md_5.bungee.config.YamlConfiguration;
@@ -13,34 +15,45 @@ import java.sql.SQLException;
import java.util.List;
import java.util.UUID;
public final class SettingsBungee extends Settings implements ISettings {
private static final String UPDATE = "INSERT INTO %s (setting, value) VALUES (?, ?) ON DUPLICATE KEY UPDATE value = ?";
private final MaintenanceBungeeBase plugin;
public final class SettingsBungee extends Settings {
private final String updateQuery;
private final String maintenanceQuery;
private final MySQL mySQL;
private final String mySQLTable;
private final MaintenanceBungeeBase plugin;
private final IPingListener pingListener;
private Configuration config;
private Configuration whitelist;
SettingsBungee(final MaintenanceBungeeBase plugin) {
this.plugin = plugin;
final PluginManager pm = plugin.getProxy().getPluginManager();
final ProxyPingListener listener = new ProxyPingListener(plugin, this);
pm.registerListener(plugin, listener);
pingListener = listener;
reloadConfigs(createFiles());
final Configuration mySQLSection = config.getSection("mysql");
if (mySQLSection.getBoolean("use-mysql", false)) {
// Needed: One column named "setting" (primary key), another named "value".
plugin.getLogger().info("Trying to open database connection...");
mySQL = new MySQL(mySQLSection.getString("host"),
mySQLSection.getInt("port"),
mySQLSection.getString("username"),
mySQLSection.getString("password"),
mySQLSection.getString("database"));
mySQLTable = mySQLSection.getString("table");
// Varchar as the value regarding the possibility of saving stuff like the motd as well in future updates
final String mySQLTable = mySQLSection.getString("table");
mySQL.executeUpdate("CREATE TABLE IF NOT EXISTS " + mySQLTable + " (setting VARCHAR(16) PRIMARY KEY, value VARCHAR(255))");
updateQuery = "INSERT INTO " + mySQLTable + " (setting, value) VALUES (?, ?) ON DUPLICATE KEY UPDATE value = ?";
maintenanceQuery = "SELECT * FROM " + mySQLTable + " WHERE setting = ?";
plugin.getLogger().info("Done!");
} else {
mySQL = null;
mySQLTable = null;
updateQuery = null;
maintenanceQuery = null;
}
}
@@ -141,16 +154,18 @@ public final class SettingsBungee extends Settings implements ISettings {
}
@Override
public void setConfigBoolean(final String path, final boolean var) {
public void setToConfig(final String path, final Object var) {
config.set(path, var);
}
@Override
public boolean isMaintenance() {
if (mySQL != null) {
mySQL.executeQuery("SELECT * FROM " + mySQLTable + " WHERE setting LIKE ?", rs -> {
mySQL.executeQuery(maintenanceQuery, rs -> {
try {
maintenance = rs.next() && Boolean.parseBoolean(rs.getString("value"));
if (rs.next())
maintenance = Boolean.parseBoolean(rs.getString("value"));
rs.close();
} catch (final SQLException e) {
e.printStackTrace();
}
@@ -160,10 +175,16 @@ public final class SettingsBungee extends Settings implements ISettings {
return maintenance;
}
@Override
public boolean reloadMaintenanceIcon() {
return pingListener.loadIcon();
}
public void setMaintenanceToSQL(final boolean maintenance) {
plugin.getProxy().getScheduler().runAsync(plugin, () ->
mySQL.executeUpdate(String.format(UPDATE, mySQLTable), res -> {
}, "maintenance", String.valueOf(maintenance), String.valueOf(maintenance)));
plugin.getProxy().getScheduler().runAsync(plugin, () -> {
final String s = String.valueOf(maintenance);
mySQL.executeUpdate(updateQuery, "maintenance", s, s);
});
this.maintenance = maintenance;
}
@@ -0,0 +1,72 @@
package eu.kennytv.maintenance.bungee.command;
import eu.kennytv.maintenance.bungee.MaintenanceBungeePlugin;
import eu.kennytv.maintenance.bungee.SettingsBungee;
import eu.kennytv.maintenance.bungee.util.ProxiedSenderInfo;
import eu.kennytv.maintenance.core.command.MaintenanceCommand;
import eu.kennytv.maintenance.core.util.SenderInfo;
import net.md_5.bungee.api.ChatColor;
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.chat.ClickEvent;
import net.md_5.bungee.api.chat.HoverEvent;
import net.md_5.bungee.api.chat.TextComponent;
import net.md_5.bungee.api.connection.ProxiedPlayer;
public final class MaintenanceBungeeCommand extends MaintenanceCommand {
public MaintenanceBungeeCommand(final MaintenanceBungeePlugin plugin, final SettingsBungee settings) {
super(plugin, settings, "MaintenanceBungee");
}
@Override
protected void addPlayerToWhitelist(final SenderInfo sender, final String name) {
final ProxiedPlayer selected = ProxyServer.getInstance().getPlayer(name);
if (selected == null) {
sender.sendMessage(plugin.getPrefix() + "§cThere's no player online with that name.");
return;
}
if (settings.addWhitelistedPlayer(selected.getUniqueId(), selected.getName()))
sender.sendMessage(plugin.getPrefix() + "§aAdded §b" + selected.getName() + " §ato the maintenance whitelist!");
else
sender.sendMessage(plugin.getPrefix() + "§b" + selected.getName() + " §calready is in the maintenance whitelist!");
}
@Override
protected void removePlayerFromWhitelist(final SenderInfo sender, final String name) {
final ProxiedPlayer selected = ProxyServer.getInstance().getPlayer(name);
if (selected == null) {
if (settings.removeWhitelistedPlayer(name.toLowerCase()))
sender.sendMessage(plugin.getPrefix() + "§aRemoved §b" + name.toLowerCase() + " §afrom the maintenance whitelist!");
else
sender.sendMessage(plugin.getPrefix() + "§cThere is no player with that name in the maintenance whitelist!");
return;
}
if (settings.removeWhitelistedPlayer(selected.getUniqueId()))
sender.sendMessage(plugin.getPrefix() + "§aRemoved §b" + selected.getName() + " §afrom the maintenance whitelist!");
else
sender.sendMessage(plugin.getPrefix() + "§cThis player is not in the maintenance whitelist!");
}
@Override
protected void checkForUpdate(final SenderInfo sender) {
if (plugin.updateAvailable()) {
sender.sendMessage(plugin.getPrefix() + "§cNewest version available: §aVersion " + plugin.getNewestVersion() + "§c, you're still on §a" + plugin.getVersion());
sender.sendMessage(plugin.getPrefix() + "§c§lWARNING: §cYou will have to restart the proxy to prevent further issues and to complete the update!" +
" If you can't do that, don't update!");
final TextComponent tc = new TextComponent("§6× §8[§aUpdate§8]");
tc.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/maintenance forceupdate"));
tc.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, TextComponent.fromLegacyText("§aClick here to update the plugin")));
tc.addExtra(" §8< §7Or use the command §c/maintenace forceupdate");
((ProxiedSenderInfo) sender).sendMessage(tc);
} else
sender.sendMessage(plugin.getPrefix() + "§aYou already have the latest version of the plugin!");
}
@Override
protected String getColoredString(final String message) {
return ChatColor.translateAlternateColorCodes('&', message);
}
}
@@ -0,0 +1,19 @@
package eu.kennytv.maintenance.bungee.command;
import eu.kennytv.maintenance.bungee.util.ProxiedSenderInfo;
import net.md_5.bungee.api.CommandSender;
import net.md_5.bungee.api.plugin.Command;
public final class MaintenanceBungeeCommandBase extends Command {
private final MaintenanceBungeeCommand command;
public MaintenanceBungeeCommandBase(final MaintenanceBungeeCommand command) {
super("maintenance", "", "maintenancebungee");
this.command = command;
}
@Override
public void execute(final CommandSender sender, final String[] args) {
command.execute(new ProxiedSenderInfo(sender), args);
}
}
@@ -2,6 +2,7 @@ package eu.kennytv.maintenance.bungee.listener;
import eu.kennytv.maintenance.bungee.MaintenanceBungeeBase;
import eu.kennytv.maintenance.bungee.SettingsBungee;
import eu.kennytv.maintenance.core.listener.IPingListener;
import net.md_5.bungee.api.Favicon;
import net.md_5.bungee.api.ServerPing;
import net.md_5.bungee.api.event.ProxyPingEvent;
@@ -13,16 +14,14 @@ import javax.imageio.ImageIO;
import java.io.File;
import java.io.IOException;
public final class ProxyPingListener implements Listener {
public final class ProxyPingListener implements Listener, IPingListener {
private final MaintenanceBungeeBase plugin;
private final SettingsBungee settings;
private final File icon;
private Favicon favicon;
public ProxyPingListener(final MaintenanceBungeeBase plugin, final SettingsBungee settings) {
this.plugin = plugin;
this.settings = settings;
icon = new File("maintenance-icon.png");
}
@EventHandler(priority = EventPriority.HIGHEST)
@@ -36,16 +35,18 @@ public final class ProxyPingListener implements Listener {
new ServerPing.PlayerInfo(settings.getPlayerCountHoverMessage().replace("%NEWLINE%", "\n"), "")
}));
if (settings.hasCustomIcon()) {
if (favicon != null)
ping.setFavicon(favicon);
else {
try {
favicon = Favicon.create(ImageIO.read(icon));
} catch (IOException | IllegalArgumentException e) {
plugin.getLogger().warning("§4Could not load 'maintenance-icon.png' - did you create one in your Bungee folder (not the plugins folder)?");
}
}
if (settings.hasCustomIcon() && favicon != null)
ping.setFavicon(favicon);
}
@Override
public boolean loadIcon() {
try {
favicon = Favicon.create(ImageIO.read(new File("maintenance-icon.png")));
} catch (final IOException | IllegalArgumentException e) {
plugin.getLogger().warning("§4Could not load 'maintenance-icon.png' - did you create one in your Bungee folder (not the plugins folder)?");
return false;
}
return true;
}
}
@@ -12,6 +12,7 @@ import java.util.function.Consumer;
public final class MySQL {
private final HikariDataSource hikariDataSource;
// Excuse me and everything to do with the MySQL stuff, I have little to no idea of how to use databases
public MySQL(final String hostname, final int port, final String username, final String password, final String database) {
final HikariConfig hikariConfig = new HikariConfig();
hikariConfig.setMaximumPoolSize(10);
@@ -60,6 +61,11 @@ public final class MySQL {
}
}
public void executeUpdate(final String query, final Object... objects) {
executeUpdate(query, res -> {
}, objects);
}
public void close() {
if (hikariDataSource != null && !hikariDataSource.isClosed())
hikariDataSource.close();
@@ -0,0 +1,40 @@
package eu.kennytv.maintenance.bungee.util;
import eu.kennytv.maintenance.core.util.SenderInfo;
import net.md_5.bungee.api.CommandSender;
import net.md_5.bungee.api.chat.TextComponent;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import java.util.UUID;
public final class ProxiedSenderInfo extends SenderInfo {
private final CommandSender sender;
public ProxiedSenderInfo(final CommandSender sender) {
this.sender = sender;
}
@Override
public UUID getUuid() {
return sender instanceof ProxiedPlayer ? ((ProxiedPlayer) sender).getUniqueId() : null;
}
@Override
public String getName() {
return sender.getName();
}
@Override
public boolean hasPermission(final String permission) {
return sender.hasPermission(permission);
}
@Override
public void sendMessage(final String message) {
sender.sendMessage(message);
}
public void sendMessage(final TextComponent textComponent) {
sender.sendMessage(textComponent);
}
}
@@ -38,12 +38,12 @@ join-notification: "&e%PLAYER% &ctried to join the server."
custom-maintenance-icon: false
# Only enable MySQL if you really know what you are doing.
# You need to have a table with the two following columns: 'setting' and 'value'.
mysql:
use-mysql: false
host: host
port: 3306
database: database
table: tablename
username: username
password: password
# A new table with this name will be created on first startup when 'use-mysql' is set to true.
table: maintenance_settings
+2 -2
View File
@@ -6,7 +6,7 @@
<parent>
<artifactId>maintenance-base</artifactId>
<groupId>eu.kennytv</groupId>
<version>2.2</version>
<version>2.2.2</version>
</parent>
<artifactId>maintenance-core</artifactId>
@@ -28,7 +28,7 @@
<dependency>
<groupId>eu.kennytv</groupId>
<artifactId>maintenance-api</artifactId>
<version>2.2</version>
<version>${parent.version}</version>
<scope>compile</scope>
</dependency>
</dependencies>
@@ -1,5 +1,6 @@
package eu.kennytv.maintenance.core;
import eu.kennytv.maintenance.api.IMaintenance;
import eu.kennytv.maintenance.core.hook.ServerListPlusHook;
import java.io.*;
@@ -8,26 +9,34 @@ import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
public abstract class MaintenanceModePlugin {
public abstract class MaintenanceModePlugin implements IMaintenance {
protected final String version;
protected int taskId;
protected ServerListPlusHook serverListPlusHook;
private final String prefix;
private String newestVersion;
// Changed the loading of the maintenance icon to be more predictable
// It will load directly on startup and can now reloaded by using the "/maintenance reload" command as well
// Changed the reload message to read the proper changes
// API fix
protected MaintenanceModePlugin(final String prefix, final String version) {
this.prefix = prefix;
this.version = version;
}
public abstract void onDisable();
public abstract void setMaintenance(boolean maintenance);
@Override
public boolean isMaintenance() {
return getSettings().isMaintenance();
}
@Override
public String getVersion() {
return version;
}
@Override
public boolean isTaskRunning() {
return taskId != 0;
}
@@ -57,7 +66,7 @@ public abstract class MaintenanceModePlugin {
public boolean updateAvailable() {
try {
final HttpURLConnection c = (HttpURLConnection) new URL("https://api.spigotmc.org/legacy/update.php?resource=40699").openConnection();
final String newVersion = new BufferedReader(new InputStreamReader(c.getInputStream())).readLine().replaceAll("[a-zA-Z ]", "");
final String newVersion = new BufferedReader(new InputStreamReader(c.getInputStream())).readLine().replaceAll("[a-zA-Z -]", "");
final boolean available = !newVersion.equals(version);
if (available)
@@ -2,13 +2,14 @@ package eu.kennytv.maintenance.core;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import eu.kennytv.maintenance.api.ISettings;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
public abstract class Settings {
public abstract class Settings implements ISettings {
protected final Map<UUID, String> whitelistedPlayers = Maps.newHashMap();
protected boolean maintenance;
private Set<Integer> broadcastIntervalls;
@@ -40,6 +41,8 @@ public abstract class Settings {
broadcastIntervalls = Sets.newHashSet(getBroadcastIntervallList());
playerCountMessage = getConfigString("playercountmessage");
playerCountHoverMessage = getConfigString("playercounthovermessage");
if (hasCustomIcon())
reloadMaintenanceIcon();
loadExtraSettings();
}
@@ -62,7 +65,7 @@ public abstract class Settings {
public abstract void reloadConfigs();
public abstract void setConfigBoolean(String path, boolean boo);
public abstract void setToConfig(String path, Object var);
public String getTimerBroadcastMessage() {
return timerBroadcastMessage;
@@ -108,14 +111,17 @@ public abstract class Settings {
this.maintenance = maintenance;
}
@Override
public boolean isMaintenance() {
return maintenance;
}
@Override
public boolean isJoinNotifications() {
return joinNotifications;
}
@Override
public boolean hasCustomIcon() {
return customMaintenanceIcon;
}
@@ -124,10 +130,12 @@ public abstract class Settings {
return broadcastIntervalls;
}
@Override
public Map<UUID, String> getWhitelistedPlayers() {
return whitelistedPlayers;
}
@Override
public boolean removeWhitelistedPlayer(final UUID uuid) {
if (!whitelistedPlayers.containsKey(uuid)) return false;
whitelistedPlayers.remove(uuid);
@@ -137,6 +145,7 @@ public abstract class Settings {
}
@Deprecated
@Override
public boolean removeWhitelistedPlayer(final String name) {
if (!whitelistedPlayers.containsValue(name)) return false;
final UUID uuid = whitelistedPlayers.entrySet().stream().filter(entry -> entry.getValue().equals(name)).findFirst().get().getKey();
@@ -146,6 +155,7 @@ public abstract class Settings {
return true;
}
@Override
public boolean addWhitelistedPlayer(final UUID uuid, final String name) {
final boolean contains = !whitelistedPlayers.containsKey(uuid);
whitelistedPlayers.put(uuid, name);
@@ -1,30 +1,27 @@
package eu.kennytv.maintenance.bungee.command;
package eu.kennytv.maintenance.core.command;
import eu.kennytv.maintenance.bungee.MaintenanceBungeePlugin;
import eu.kennytv.maintenance.bungee.SettingsBungee;
import eu.kennytv.maintenance.core.MaintenanceModePlugin;
import eu.kennytv.maintenance.core.Settings;
import eu.kennytv.maintenance.core.runnable.MaintenanceRunnable;
import eu.kennytv.maintenance.core.util.MessageUtil;
import net.md_5.bungee.api.CommandSender;
import net.md_5.bungee.api.chat.ClickEvent;
import net.md_5.bungee.api.chat.HoverEvent;
import net.md_5.bungee.api.chat.TextComponent;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.plugin.Command;
import eu.kennytv.maintenance.core.util.SenderInfo;
import java.util.Arrays;
import java.util.Map;
import java.util.UUID;
public final class MaintenanceBungeeCommand extends Command {
private final MaintenanceBungeePlugin plugin;
private final SettingsBungee settings;
public abstract class MaintenanceCommand {
protected final MaintenanceModePlugin plugin;
protected final Settings settings;
private final String name;
public MaintenanceBungeeCommand(final MaintenanceBungeePlugin plugin, final SettingsBungee settings) {
super("maintenance", "", "maintenancebungee");
protected MaintenanceCommand(final MaintenanceModePlugin plugin, final Settings settings, final String name) {
this.plugin = plugin;
this.settings = settings;
this.name = name;
}
public void execute(final CommandSender sender, final String[] args) {
public void execute(final SenderInfo sender, final String[] args) {
if (!sender.hasPermission("maintenance.admin")) {
sender.sendMessage(settings.getNoPermMessage());
return;
@@ -42,7 +39,7 @@ public final class MaintenanceBungeeCommand extends Command {
}
settings.reloadConfigs();
sender.sendMessage(plugin.getPrefix() + "§aReloaded config.yml");
sender.sendMessage(plugin.getPrefix() + "§aReloaded config, whitelistedplayers and the maintenance icon");
} else if (args[0].equalsIgnoreCase("update")) {
if (!sender.hasPermission("maintenance.admin")) {
sender.sendMessage(settings.getNoPermMessage());
@@ -115,7 +112,7 @@ public final class MaintenanceBungeeCommand extends Command {
return;
}
if (minutes < 1) {
sender.sendMessage(plugin.getPrefix() + "§cThink about running a timer for a negative amount of minutes. Doesn't work §othat §r§cwell.");
sender.sendMessage(plugin.getPrefix() + "§cThink about running a timer for a negative amount of minutes. Doesn't work §othat §cwell.");
return;
}
@@ -133,42 +130,51 @@ public final class MaintenanceBungeeCommand extends Command {
} else
sendUsage(sender);
} else if (args[0].equalsIgnoreCase("add")) {
final ProxiedPlayer player = plugin.getProxy().getPlayer(args[1]);
if (player == null) {
sender.sendMessage(plugin.getPrefix() + "§cThere's no player online with that name.");
return;
}
if (settings.addWhitelistedPlayer(player.getUniqueId(), player.getName()))
sender.sendMessage(plugin.getPrefix() + "§aAdded §b" + player.getName() + " §ato the maintenance whitelist!");
else
sender.sendMessage(plugin.getPrefix() + "§b" + player.getName() + " §calready is in the maintenance whitelist!");
addPlayerToWhitelist(sender, args[1]);
} else if (args[0].equalsIgnoreCase("remove")) {
final ProxiedPlayer player = plugin.getProxy().getPlayer(args[1]);
if (player == null) {
if (settings.removeWhitelistedPlayer(args[1].toLowerCase()))
sender.sendMessage(plugin.getPrefix() + "§aRemoved §b" + args[1].toLowerCase() + " §afrom the maintenance whitelist!");
else
sender.sendMessage(plugin.getPrefix() + "§cThere is no player with that name in the maintenance whitelist!");
removePlayerFromWhitelist(sender, args[1]);
} else
sendUsage(sender);
} else if (args.length == 3) {
if (args[0].equalsIgnoreCase("setmotd")) {
if (!MessageUtil.isNumeric(args[1])) {
sender.sendMessage(plugin.getPrefix() + "§cThe first argument has to be numeric!");
return;
}
if (settings.removeWhitelistedPlayer(player.getUniqueId()))
sender.sendMessage(plugin.getPrefix() + "§aRemoved §b" + player.getName() + " §afrom the maintenance whitelist!");
final int line = Integer.parseInt(args[1]);
if (line < 1 || line > 2) {
sender.sendMessage(plugin.getPrefix() + "§cThe first argument has to be a 1 or a 2!");
return;
}
final String message = getColoredString(String.join(" ", Arrays.copyOfRange(args, 2, args.length)));
final String oldMessage = settings.getConfigString("pingmessage");
final String newMessage;
if (line == 1)
newMessage = oldMessage.contains("%NEWLINE%") ?
message + "%NEWLINE%" + oldMessage.split("%NEWLINE%", 2)[1] : message;
else
sender.sendMessage(plugin.getPrefix() + "§cThis player is not in the maintenance whitelist!");
newMessage = oldMessage.contains("%NEWLINE%") ?
oldMessage.split("%NEWLINE%", 2)[0] + "%NEWLINE%" + message : oldMessage + "%NEWLINE%" + message;
settings.setToConfig("pingmessage", newMessage);
settings.saveConfig();
settings.reloadConfigs();
sender.sendMessage(plugin.getPrefix() + "§aSet line " + line + " of the maintenance motd to §f" + message);
} else
sendUsage(sender);
} else
sendUsage(sender);
}
private void sendUsage(final CommandSender sender) {
private void sendUsage(final SenderInfo sender) {
sender.sendMessage("");
sender.sendMessage("§8===========[ §eMaintenanceBungee §8| §eVersion: §e" + plugin.getVersion() + " §8]===========");
sender.sendMessage("§8===========[ §e" + name + " §8| §eVersion: §e" + plugin.getVersion() + " §8]===========");
sender.sendMessage("§6/maintenance reload §7(Reloads the config file)");
sender.sendMessage("§6/maintenance on §7(Enables maintenance mode");
sender.sendMessage("§6/maintenance off §7(Disables maintenance mode)");
sender.sendMessage("§6/maintenance setmotd <1/2> <message> §7(Sets the motd for maintenance mode)");
sender.sendMessage("§6/maintenance starttimer <minutes> §7(After the given time in minutes, maintenance mode will be enabled. Broadcast settings for the timer can be found in the config)");
sender.sendMessage("§6/maintenance endtimer <minutes> §7(Enables maintenance mode. After the given time in minutes, maintenance mode will be disabled)");
sender.sendMessage("§6/maintenance timer abort §7(If running, the current timer will be aborted)");
@@ -177,22 +183,15 @@ public final class MaintenanceBungeeCommand extends Command {
sender.sendMessage("§6/maintenance whitelist §7(Shows all whitelisted players for the maintenance mode)");
sender.sendMessage("§6/maintenance update §7(Remotely downloads the newest version of the plugin onto your server)");
sender.sendMessage("§9Created by: KennyTV");
sender.sendMessage("§8===========[ §eMaintenanceBungee §8| §eVersion: §e" + plugin.getVersion() + " §8]===========");
sender.sendMessage("§8===========[ §e" + name + " §8| §eVersion: §e" + plugin.getVersion() + " §8]===========");
sender.sendMessage("");
}
private void checkForUpdate(final CommandSender sender) {
if (plugin.updateAvailable()) {
sender.sendMessage(plugin.getPrefix() + "§cNewest version available: §aVersion " + plugin.getNewestVersion() + "§c, you're still on §a" + plugin.getVersion());
sender.sendMessage(plugin.getPrefix() + "§c§lWARNING: §cYou will have to restart the proxy to prevent further issues and to complete the update!" +
" If you can't do that, don't update!");
final TextComponent tc = new TextComponent("§6× §8[§aUpdate§8]");
tc.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/maintenance forceupdate"));
tc.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, TextComponent.fromLegacyText("§aClick here to update the plugin")));
tc.addExtra(" §8< §7Or use the command §c/maintenace forceupdate");
protected abstract void addPlayerToWhitelist(SenderInfo sender, String name);
sender.sendMessage(tc);
} else
sender.sendMessage(plugin.getPrefix() + "§aYou already have the latest version of the plugin!");
}
protected abstract void removePlayerFromWhitelist(SenderInfo sender, String name);
protected abstract void checkForUpdate(SenderInfo sender);
protected abstract String getColoredString(String message);
}
@@ -0,0 +1,6 @@
package eu.kennytv.maintenance.core.listener;
public interface IPingListener {
boolean loadIcon();
}
@@ -20,8 +20,8 @@ public final class MaintenanceRunnable implements Runnable {
public void run() {
if (minutes <= 0) {
plugin.setMaintenance(enable);
plugin.cancelTask();
if (plugin.isTaskRunning())
plugin.cancelTask();
} else if (settings.getBroadcastIntervalls().contains(minutes)) {
if (enable)
plugin.broadcast(settings.getTimerBroadcastMessage().replaceAll("%MINUTES%", String.valueOf(minutes)));
@@ -0,0 +1,14 @@
package eu.kennytv.maintenance.core.util;
import java.util.UUID;
public abstract class SenderInfo {
public abstract UUID getUuid();
public abstract String getName();
public abstract boolean hasPermission(String permission);
public abstract void sendMessage(String message);
}
@@ -6,29 +6,29 @@
<parent>
<artifactId>maintenance-base</artifactId>
<groupId>eu.kennytv</groupId>
<version>2.2</version>
<version>2.2.2</version>
</parent>
<artifactId>maintenance</artifactId>
<artifactId>maintenance-parent</artifactId>
<name>Maintenance</name>
<dependencies>
<dependency>
<groupId>eu.kennytv</groupId>
<artifactId>maintenance-core</artifactId>
<version>2.2</version>
<version>${parent.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>eu.kennytv</groupId>
<artifactId>maintenancebungee</artifactId>
<version>2.2</version>
<artifactId>maintenance-bungee</artifactId>
<version>${parent.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>eu.kennytv</groupId>
<artifactId>maintenancespigot</artifactId>
<version>2.2</version>
<artifactId>maintenance-spigot</artifactId>
<version>${parent.version}</version>
<scope>compile</scope>
</dependency>
</dependencies>
@@ -3,14 +3,13 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>eu.kennytv</groupId>
<artifactId>maintenance-base</artifactId>
<version>2.2</version>
<groupId>eu.kennytv</groupId>
<version>2.2.2</version>
</parent>
<artifactId>maintenancespigot</artifactId>
<artifactId>maintenance-spigot</artifactId>
<name>MaintenanceSpigot</name>
<repositories>
@@ -28,7 +27,7 @@
<dependency>
<groupId>eu.kennytv</groupId>
<artifactId>maintenance-core</artifactId>
<version>2.2</version>
<version>${parent.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
@@ -0,0 +1,25 @@
package eu.kennytv.maintenance.spigot;
import eu.kennytv.maintenance.api.IMaintenance;
import eu.kennytv.maintenance.api.IMaintenanceBase;
import org.bukkit.plugin.java.JavaPlugin;
import java.io.File;
public final class MaintenanceSpigotBase extends JavaPlugin implements IMaintenanceBase {
private IMaintenance maintenance;
@Override
public void onEnable() {
maintenance = new MaintenanceSpigotPlugin(this);
}
File getPluginFile() {
return getFile();
}
@Override
public IMaintenance getApi() {
return maintenance;
}
}
@@ -6,9 +6,7 @@ import eu.kennytv.maintenance.api.MaintenanceSpigotAPI;
import eu.kennytv.maintenance.core.MaintenanceModePlugin;
import eu.kennytv.maintenance.core.hook.ServerListPlusHook;
import eu.kennytv.maintenance.spigot.command.MaintenanceSpigotCommand;
import eu.kennytv.maintenance.spigot.listener.PacketListener;
import eu.kennytv.maintenance.spigot.listener.PlayerLoginListener;
import eu.kennytv.maintenance.spigot.listener.ServerListPingListener;
import eu.kennytv.maintenance.spigot.metrics.MetricsLite;
import net.minecrell.serverlistplus.core.plugin.ServerListPlusPlugin;
import org.bukkit.Server;
@@ -19,20 +17,12 @@ import java.io.File;
/**
* @author KennyTV
* @since 1.0
* @since 2.0
*/
public final class MaintenanceSpigotPlugin extends MaintenanceModePlugin implements IMaintenance {
public final class MaintenanceSpigotPlugin extends MaintenanceModePlugin {
private final MaintenanceSpigotBase plugin;
private final SettingsSpigot settings;
// Great update for the Spigot version of the plugin as well as performance improvements and bugfixes in both versions!
// If you have ProtocolLib installed, you can set a custom server icon while maintenance is enabled, also the playercount-message and the playercount-hover-message are now available (as it has already been in the Bungee version)!
// The Spigot version is now much more compatible with other motd-changing plugins, such as SexyMotd!
// In the BungeeCord version of the plugin, the "/maintenance remove <player>" command now also works for offline players
// Fixed some other issues with the ProtocolLib integration
// Minor textfix for the updatemessage in the Spigot version
// General performance improvements
MaintenanceSpigotPlugin(final MaintenanceSpigotBase plugin) {
super("§8[§eMaintenanceSpigot§8] ", plugin.getDescription().getVersion());
@@ -47,29 +37,19 @@ public final class MaintenanceSpigotPlugin extends MaintenanceModePlugin impleme
new MetricsLite(plugin);
if (pm.getPlugin("ProtocolLib") != null)
new PacketListener(this, plugin, settings);
else
pm.registerEvents(new ServerListPingListener(plugin, settings), plugin);
// ServerListPlus integration
final Plugin serverListPlus = pm.getPlugin("ServerListPlus");
if (serverListPlus != null) {
serverListPlusHook = new ServerListPlusHook(((ServerListPlusPlugin) serverListPlus).getCore());
serverListPlusHook.setEnabled(!settings.isMaintenance());
plugin.getLogger().info("Enabled ServerListPlus integration!");
}
}
@Override
public void onDisable() {
if (!getServer().getOnlinePlayers().isEmpty())
plugin.getLogger().warning("This plugin does not fully support reloads, consider restarting the server as soon as possible.");
}
@Override
public void setMaintenance(final boolean maintenance) {
settings.setMaintenance(maintenance);
settings.setConfigBoolean("enable-maintenance-mode", maintenance);
settings.setToConfig("enable-maintenance-mode", maintenance);
settings.saveConfig();
settings.reloadConfigs();
@@ -88,11 +68,6 @@ public final class MaintenanceSpigotPlugin extends MaintenanceModePlugin impleme
getServer().broadcastMessage(settings.getMaintenanceDeactivated());
}
@Override
public boolean isMaintenance() {
return settings.isMaintenance();
}
@Override
public int schedule(final Runnable runnable) {
return getServer().getScheduler().scheduleSyncRepeatingTask(plugin, runnable, 0, 1200);
@@ -129,6 +104,10 @@ public final class MaintenanceSpigotPlugin extends MaintenanceModePlugin impleme
return MaintenanceSpigotAPI.getAPI();
}
public MaintenanceSpigotBase getBase() {
return plugin;
}
public Server getServer() {
return plugin.getServer();
}
@@ -1,23 +1,37 @@
package eu.kennytv.maintenance.spigot;
import eu.kennytv.maintenance.api.ISettings;
import eu.kennytv.maintenance.core.Settings;
import eu.kennytv.maintenance.core.listener.IPingListener;
import eu.kennytv.maintenance.spigot.listener.PacketListener;
import eu.kennytv.maintenance.spigot.listener.ServerListPingListener;
import org.bukkit.ChatColor;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.plugin.PluginManager;
import java.io.*;
import java.nio.file.Files;
import java.util.List;
import java.util.UUID;
public final class SettingsSpigot extends Settings implements ISettings {
public final class SettingsSpigot extends Settings {
private final MaintenanceSpigotBase plugin;
private final IPingListener pingListener;
private FileConfiguration config;
private FileConfiguration whitelist;
SettingsSpigot(final MaintenanceSpigotBase plugin) {
this.plugin = plugin;
final PluginManager pm = plugin.getServer().getPluginManager();
if (pm.getPlugin("ProtocolLib") != null) {
pingListener = new PacketListener(plugin, this);
} else {
final ServerListPingListener listener = new ServerListPingListener(plugin, this);
pm.registerEvents(listener, plugin);
pingListener = listener;
}
createFiles();
reloadConfigs();
}
@@ -105,7 +119,12 @@ public final class SettingsSpigot extends Settings implements ISettings {
}
@Override
public void setConfigBoolean(final String path, final boolean var) {
public void setToConfig(final String path, final Object var) {
config.set(path, var);
}
@Override
public boolean reloadMaintenanceIcon() {
return pingListener.loadIcon();
}
}
@@ -0,0 +1,85 @@
package eu.kennytv.maintenance.spigot.command;
import eu.kennytv.maintenance.core.command.MaintenanceCommand;
import eu.kennytv.maintenance.core.util.SenderInfo;
import eu.kennytv.maintenance.spigot.MaintenanceSpigotPlugin;
import eu.kennytv.maintenance.spigot.SettingsSpigot;
import eu.kennytv.maintenance.spigot.util.BukkitSenderInfo;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
public final class MaintenanceSpigotCommand extends MaintenanceCommand implements CommandExecutor {
public MaintenanceSpigotCommand(final MaintenanceSpigotPlugin plugin, final SettingsSpigot settings) {
super(plugin, settings, "MaintenanceSpigot");
}
@Override
public boolean onCommand(final CommandSender sender, final Command cmd, final String s, final String[] args) {
execute(new BukkitSenderInfo(sender), args);
return true;
}
@Override
protected void addPlayerToWhitelist(final SenderInfo sender, final String name) {
final Player selected = Bukkit.getPlayer(name);
if (selected != null) {
settings.addWhitelistedPlayer(selected.getUniqueId(), selected.getName());
sender.sendMessage(plugin.getPrefix() + "§aAdded §b" + selected.getName() + " §ato the maintenance whitelist!");
return;
}
final OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(name);
if (!offlinePlayer.hasPlayedBefore()) {
sender.sendMessage(plugin.getPrefix() + "§cNo player with this name has played on this server before.");
return;
}
if (settings.addWhitelistedPlayer(offlinePlayer.getUniqueId(), offlinePlayer.getName()))
sender.sendMessage(plugin.getPrefix() + "§aAdded §b" + offlinePlayer.getName() + " §ato the maintenance whitelist!");
else
sender.sendMessage(plugin.getPrefix() + "§b" + offlinePlayer.getName() + " §calready is in the maintenance whitelist!");
}
@Override
protected void removePlayerFromWhitelist(final SenderInfo sender, final String name) {
final Player selected = Bukkit.getPlayer(name);
if (selected != null) {
settings.removeWhitelistedPlayer(selected.getUniqueId());
sender.sendMessage(plugin.getPrefix() + "§aRemoved §b" + selected.getName() + " §afrom the maintenance whitelist!");
return;
}
final OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(name);
if (!offlinePlayer.hasPlayedBefore()) {
sender.sendMessage(plugin.getPrefix() + "§cNo player with this name has played on this server before.");
return;
}
if (settings.removeWhitelistedPlayer(offlinePlayer.getUniqueId()))
sender.sendMessage(plugin.getPrefix() + "§aRemoved §b" + offlinePlayer.getName() + " §afrom the maintenance whitelist!");
else
sender.sendMessage(plugin.getPrefix() + "§cThis player is not in the maintenance whitelist!");
}
@Override
protected void checkForUpdate(final SenderInfo sender) {
if (plugin.updateAvailable()) {
sender.sendMessage(plugin.getPrefix() + "§cNewest version available: §aVersion " + plugin.getNewestVersion() + "§c, you're still on §a" + plugin.getVersion());
sender.sendMessage(plugin.getPrefix() + "§c§lWARNING: §cYou will have to restart the server to prevent further issues and to complete the update!" +
" If you can't do that, don't update!");
sender.sendMessage(plugin.getPrefix() + "§eUse §c§l/maintenance forceupdate §eto update!");
} else
sender.sendMessage(plugin.getPrefix() + "§aYou already have the latest version of the plugin!");
}
@Override
protected String getColoredString(final String message) {
return ChatColor.translateAlternateColorCodes('&', message);
}
}
@@ -8,8 +8,8 @@ import com.comphenix.protocol.events.PacketEvent;
import com.comphenix.protocol.wrappers.WrappedGameProfile;
import com.comphenix.protocol.wrappers.WrappedServerPing;
import com.google.common.collect.Lists;
import eu.kennytv.maintenance.core.listener.IPingListener;
import eu.kennytv.maintenance.spigot.MaintenanceSpigotBase;
import eu.kennytv.maintenance.spigot.MaintenanceSpigotPlugin;
import eu.kennytv.maintenance.spigot.SettingsSpigot;
import javax.imageio.ImageIO;
@@ -17,17 +17,17 @@ import java.io.File;
import java.util.List;
import java.util.UUID;
public final class PacketListener {
private final File icon;
public final class PacketListener implements IPingListener {
private final MaintenanceSpigotBase pl;
private WrappedServerPing.CompressedImage image;
public PacketListener(final MaintenanceSpigotPlugin pl, final MaintenanceSpigotBase base, final SettingsSpigot settings) {
icon = new File("maintenance-icon.png");
public PacketListener(final MaintenanceSpigotBase base, final SettingsSpigot settings) {
this.pl = base;
ProtocolLibrary.getProtocolManager().addPacketListener(new PacketAdapter(base, ListenerPriority.HIGHEST,
PacketType.Status.Server.OUT_SERVER_INFO) {
@Override
public void onPacketSending(final PacketEvent event) {
if (!pl.isMaintenance()) return;
if (!settings.isMaintenance()) return;
final WrappedServerPing ping = event.getPacket().getServerPings().read(0);
ping.setVersionProtocol(0);
@@ -39,18 +39,20 @@ public final class PacketListener {
players.add(new WrappedGameProfile(UUID.randomUUID(), string));
ping.setPlayers(players);
if (settings.hasCustomIcon()) {
if (image != null)
ping.setFavicon(image);
else {
try {
image = WrappedServerPing.CompressedImage.fromPng(ImageIO.read(icon));
} catch (final Exception e) {
pl.getServer().getLogger().warning("§4Could not load 'maintenance-icon.png' - did you create one in your Spigot/Bukkit folder (not the plugins folder)?");
}
}
}
if (settings.hasCustomIcon() && image != null)
ping.setFavicon(image);
}
});
}
@Override
public boolean loadIcon() {
try {
image = WrappedServerPing.CompressedImage.fromPng(ImageIO.read(new File("maintenance-icon.png")));
} catch (final Exception e) {
pl.getLogger().warning("§4Could not load 'maintenance-icon.png' - did you create one in your Spigot folder (not the plugins folder)?");
return false;
}
return true;
}
}
@@ -1,5 +1,6 @@
package eu.kennytv.maintenance.spigot.listener;
import eu.kennytv.maintenance.core.listener.IPingListener;
import eu.kennytv.maintenance.spigot.MaintenanceSpigotBase;
import eu.kennytv.maintenance.spigot.SettingsSpigot;
import org.bukkit.Bukkit;
@@ -12,16 +13,14 @@ import org.bukkit.util.CachedServerIcon;
import javax.imageio.ImageIO;
import java.io.File;
public final class ServerListPingListener implements Listener {
public final class ServerListPingListener implements Listener, IPingListener {
private final MaintenanceSpigotBase plugin;
private final SettingsSpigot settings;
private final File icon;
private CachedServerIcon serverIcon;
public ServerListPingListener(final MaintenanceSpigotBase plugin, final SettingsSpigot settings) {
this.plugin = plugin;
this.settings = settings;
icon = new File("maintenance-icon.png");
}
@EventHandler(priority = EventPriority.HIGHEST)
@@ -31,16 +30,18 @@ public final class ServerListPingListener implements Listener {
event.setMaxPlayers(0);
event.setMotd(settings.getPingMessage().replace("%NEWLINE%", "\n"));
if (settings.hasCustomIcon()) {
if (serverIcon != null)
event.setServerIcon(serverIcon);
else {
try {
serverIcon = Bukkit.loadServerIcon(ImageIO.read(icon));
} catch (final Exception e) {
plugin.getLogger().warning("§4Could not load 'maintenance-icon.png' - did you create one in your Spigot/Bukkit folder (not the plugins folder)?");
}
}
if (settings.hasCustomIcon() && serverIcon != null)
event.setServerIcon(serverIcon);
}
@Override
public boolean loadIcon() {
try {
serverIcon = Bukkit.loadServerIcon(ImageIO.read(new File("maintenance-icon.png")));
} catch (final Exception e) {
plugin.getLogger().warning("§4Could not load 'maintenance-icon.png' - did you create one in your Spigot folder (not the plugins folder)?");
return false;
}
return true;
}
}
@@ -0,0 +1,35 @@
package eu.kennytv.maintenance.spigot.util;
import eu.kennytv.maintenance.core.util.SenderInfo;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.UUID;
public final class BukkitSenderInfo extends SenderInfo {
private final CommandSender sender;
public BukkitSenderInfo(final CommandSender sender) {
this.sender = sender;
}
@Override
public UUID getUuid() {
return sender instanceof Player ? ((Player) sender).getUniqueId() : null;
}
@Override
public String getName() {
return sender.getName();
}
@Override
public boolean hasPermission(final String permission) {
return sender.hasPermission(permission);
}
@Override
public void sendMessage(final String message) {
sender.sendMessage(message);
}
}
@@ -1,27 +0,0 @@
package eu.kennytv.maintenance.bungee;
import net.md_5.bungee.api.plugin.Plugin;
import java.io.File;
/**
* @author KennyTV
* @since 2.1
*/
public final class MaintenanceBungeeBase extends Plugin {
private MaintenanceBungeePlugin plugin;
@Override
public void onEnable() {
plugin = new MaintenanceBungeePlugin(this);
}
@Override
public void onDisable() {
plugin.onDisable();
}
File getPluginFile() {
return getFile();
}
}
@@ -1,27 +0,0 @@
package eu.kennytv.maintenance.spigot;
import org.bukkit.plugin.java.JavaPlugin;
import java.io.File;
/**
* @author KennyTV
* @since 2.1
*/
public final class MaintenanceSpigotBase extends JavaPlugin {
private MaintenanceSpigotPlugin plugin;
@Override
public void onEnable() {
plugin = new MaintenanceSpigotPlugin(this);
}
@Override
public void onDisable() {
plugin.onDisable();
}
File getPluginFile() {
return getFile();
}
}
@@ -1,206 +0,0 @@
package eu.kennytv.maintenance.spigot.command;
import eu.kennytv.maintenance.core.runnable.MaintenanceRunnable;
import eu.kennytv.maintenance.core.util.MessageUtil;
import eu.kennytv.maintenance.spigot.MaintenanceSpigotPlugin;
import eu.kennytv.maintenance.spigot.SettingsSpigot;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.Map;
import java.util.UUID;
public final class MaintenanceSpigotCommand implements CommandExecutor {
private final MaintenanceSpigotPlugin plugin;
private final SettingsSpigot settings;
public MaintenanceSpigotCommand(final MaintenanceSpigotPlugin plugin, final SettingsSpigot settings) {
this.plugin = plugin;
this.settings = settings;
}
@Override
public boolean onCommand(final CommandSender sender, final Command cmd, final String s, final String[] args) {
if (!sender.hasPermission("maintenance.admin")) {
sender.sendMessage(settings.getNoPermMessage());
return true;
}
if (args.length == 1) {
if (args[0].equalsIgnoreCase("on")) {
plugin.setMaintenance(true);
} else if (args[0].equalsIgnoreCase("off")) {
plugin.setMaintenance(false);
} else if (args[0].equalsIgnoreCase("reload")) {
if (!sender.hasPermission("maintenance.reload")) {
sender.sendMessage(settings.getNoPermMessage());
return true;
}
settings.reloadConfigs();
sender.sendMessage(plugin.getPrefix() + "§aReloaded spigot-config.yml");
} else if (args[0].equalsIgnoreCase("update")) {
if (!sender.hasPermission("maintenance.admin")) {
sender.sendMessage(settings.getNoPermMessage());
return true;
}
checkForUpdate(sender);
} else if (args[0].equals("forceupdate")) {
if (!sender.hasPermission("maintenance.admin")) {
sender.sendMessage(settings.getNoPermMessage());
return true;
}
sender.sendMessage(plugin.getPrefix() + "§c§lDownloading update...");
if (plugin.installUpdate())
sender.sendMessage(plugin.getPrefix() + "§a§lThe update was successful! To prevent issues with tasks and to complete the update, you have to restart the server!");
else
sender.sendMessage(plugin.getPrefix() + "§4Failed!");
} else if (args[0].equalsIgnoreCase("whitelist")) {
final Map<UUID, String> players = settings.getWhitelistedPlayers();
if (players.isEmpty()) {
sender.sendMessage(plugin.getPrefix() + "§cThe maintenance whitelist is empty! Use \"/maintenance add <player>\" to add someone!");
} else if (players.size() == 1 && players.containsKey(UUID.fromString("a8179ff3-c201-4a75-bdaa-9d14aca6f83f"))) {
sender.sendMessage(plugin.getPrefix() + "§cUse \"/maintenance add <player>\" to add someone. Alternatively, you can add the uuid of a player to the WhitelistedPlayers.yml as seen in the example in the file!");
} else {
sender.sendMessage("§6Whitelisted players for maintenance:");
players.forEach((key, value) -> sender.sendMessage("§8- §e" + value));
sender.sendMessage("");
}
} else
sendUsage(sender);
} else if (args.length == 2) {
if (args[0].equalsIgnoreCase("endtimer")) {
if (!MessageUtil.isNumeric(args[1])) {
sender.sendMessage(plugin.getPrefix() + "§6/maintenance timer endtimer <minutes>");
return true;
}
if (plugin.isTaskRunning()) {
sender.sendMessage(plugin.getPrefix() + "§cThere's already a starttimer scheduled!");
return true;
}
final int minutes = Integer.parseInt(args[1]);
if (minutes > 40320) {
sender.sendMessage(plugin.getPrefix() + "§cThe number has to be less than 40320 (28 days)!");
return true;
}
if (minutes < 1) {
sender.sendMessage(plugin.getPrefix() + "§cThink about running a timer for a negative amount of minutes. Doesn't work §othat §r§cwell.");
return true;
}
plugin.setMaintenance(true);
sender.sendMessage(plugin.getPrefix() + "§aStarted timer: §7Maintenance mode will be deactivated in §6" + minutes + " minutes§7.");
plugin.setTaskId(plugin.schedule(new MaintenanceRunnable(plugin, settings, minutes, false)));
} else if (args[0].equalsIgnoreCase("starttimer")) {
if (!MessageUtil.isNumeric(args[1])) {
sender.sendMessage(plugin.getPrefix() + "§6/maintenance timer starttimer <minutes>");
return true;
}
if (plugin.isTaskRunning()) {
sender.sendMessage(plugin.getPrefix() + "§cThere's already running a timer!");
return true;
}
final int minutes = Integer.parseInt(args[1]);
if (minutes > 40320) {
sender.sendMessage(plugin.getPrefix() + "§cThe number has to be less than 40320 (28 days)!");
return true;
}
if (minutes < 1) {
sender.sendMessage(plugin.getPrefix() + "§cThink about running a timer for a negative amount of minutes. Doesn't work §othat §r§cwell.");
return true;
}
sender.sendMessage(plugin.getPrefix() + "§aStarted timer: §7Maintenance mode will be activated in §6" + minutes + " minutes§7.");
plugin.setTaskId(plugin.schedule(new MaintenanceRunnable(plugin, settings, minutes, true)));
} else if (args[0].equalsIgnoreCase("timer")) {
if (args[1].equalsIgnoreCase("abort") || args[1].equalsIgnoreCase("stop") || args[1].equalsIgnoreCase("cancel")) {
if (!plugin.isTaskRunning()) {
sender.sendMessage(plugin.getPrefix() + "§cThere's currently no running timer.");
return true;
}
plugin.cancelTask();
sender.sendMessage(plugin.getPrefix() + "§cThe timer has been disabled.");
} else
sendUsage(sender);
} else if (args[0].equalsIgnoreCase("add")) {
final Player player = Bukkit.getPlayer(args[1]);
if (player != null) {
settings.addWhitelistedPlayer(player.getUniqueId(), player.getName());
sender.sendMessage(plugin.getPrefix() + "§aAdded §b" + player.getName() + " §ato the maintenance whitelist!");
return true;
}
final OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(args[1]);
if (!offlinePlayer.hasPlayedBefore()) {
sender.sendMessage(plugin.getPrefix() + "§cNo player with this name has played on this server before.");
return true;
}
if (settings.addWhitelistedPlayer(offlinePlayer.getUniqueId(), offlinePlayer.getName()))
sender.sendMessage(plugin.getPrefix() + "§aAdded §b" + offlinePlayer.getName() + " §ato the maintenance whitelist!");
else
sender.sendMessage(plugin.getPrefix() + "§b" + player.getName() + " §calready is in the maintenance whitelist!");
} else if (args[0].equalsIgnoreCase("remove")) {
final Player player = Bukkit.getPlayer(args[1]);
if (player != null) {
settings.removeWhitelistedPlayer(player.getUniqueId());
sender.sendMessage(plugin.getPrefix() + "§aRemoved §b" + player.getName() + " §afrom the maintenance whitelist!");
return true;
}
final OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(args[1]);
if (!offlinePlayer.hasPlayedBefore()) {
sender.sendMessage(plugin.getPrefix() + "§cNo player with this name has played on this server before.");
return true;
}
if (settings.removeWhitelistedPlayer(offlinePlayer.getUniqueId()))
sender.sendMessage(plugin.getPrefix() + "§aRemoved §b" + offlinePlayer.getName() + " §afrom the maintenance whitelist!");
else
sender.sendMessage(plugin.getPrefix() + "§cThis player is not in the maintenance whitelist!");
} else
sendUsage(sender);
} else
sendUsage(sender);
return true;
}
private void sendUsage(final CommandSender sender) {
sender.sendMessage("");
sender.sendMessage("§8===========[ §eMaintenanceSpigot §8| §eVersion: §e" + plugin.getVersion() + " §8]===========");
sender.sendMessage("§6/maintenance reload §7(Reloads the config file)");
sender.sendMessage("§6/maintenance on §7(Enables maintenance mode");
sender.sendMessage("§6/maintenance off §7(Disables maintenance mode)");
sender.sendMessage("§6/maintenance starttimer <minutes> §7(After the given time in minutes, maintenance mode will be enabled. Broadcast settings for the timer can be found in the config)");
sender.sendMessage("§6/maintenance endtimer <minutes> §7(Enables maintenance mode. After the given time in minutes, maintenance mode will be disabled)");
sender.sendMessage("§6/maintenance timer abort §7(If running, the current timer will be aborted)");
sender.sendMessage("§6/maintenance add <player> §7(Adds the player to the maintenance whitelist, so they can join the server even though maintenance is enabled)");
sender.sendMessage("§6/maintenance remove <player> §7(Removes the player from the maintenance whitelist)");
sender.sendMessage("§6/maintenance whitelist §7(Shows all whitelisted players for the maintenance mode)");
sender.sendMessage("§6/maintenance update §7(Remotely downloads the newest version of the plugin onto your server)");
sender.sendMessage("§9Created by: KennyTV");
sender.sendMessage("§8===========[ §eMaintenanceSpigot §8| §eVersion: §e" + plugin.getVersion() + " §8]===========");
sender.sendMessage("");
}
private void checkForUpdate(final CommandSender sender) {
if (plugin.updateAvailable()) {
sender.sendMessage(plugin.getPrefix() + "§cNewest version available: §aVersion " + plugin.getNewestVersion() + "§c, you're still on §a" + plugin.getVersion());
sender.sendMessage(plugin.getPrefix() + "§c§lWARNING: §cYou will have to restart the server to prevent further issues and to complete the update!" +
" If you can't do that, don't update!");
sender.sendMessage(plugin.getPrefix() + "§eUse §c§l/maintenance forceupdate §eto update!");
} else
sender.sendMessage(plugin.getPrefix() + "§aYou already have the latest version of the plugin!");
}
}
+2 -2
View File
@@ -12,5 +12,5 @@ Issues can be created here: https://github.com/KennyTV/Maintenance/issues
### MaintenanceMode API
There's no official repo, yet, but you can manually add the Maintenance-API.jar file to your library (can be downloaded in the code section, https://github.com/KennyTV/Maintenance/raw/master/Maintenance-API.jar).
By using MaintenanceBungeeAPI#getAPI or MaintenanceSpigotAPI#getAPI (depending on what server you are using the plugin) you can get some base methods. Documentation and/or a repo might come, if a few people ask me to.
There's no official maven repo, yet, but you can manually add the Maintenance-API.jar file to your library (can be downloaded in the code section, https://github.com/KennyTV/Maintenance/raw/master/Maintenance-API.jar).
By using MaintenanceBungeeAPI#getAPI or MaintenanceSpigotAPI#getAPI (depending on what server you are using the plugin) you can get some base methods. A rough documentation can be found here https://github.com/KennyTV/Maintenance/tree/master/Maintenance-API/src/main/java/eu/kennytv/maintenance/api
+5 -5
View File
@@ -6,15 +6,15 @@
<groupId>eu.kennytv</groupId>
<artifactId>maintenance-base</artifactId>
<packaging>pom</packaging>
<version>2.2</version>
<version>2.2.2</version>
<name>Maintenance</name>
<packaging>pom</packaging>
<modules>
<module>maintenance</module>
<module>maintenance-parent</module>
<module>maintenance-core</module>
<module>maintenancespigot</module>
<module>maintenancebungee</module>
<module>maintenance-spigot</module>
<module>maintenance-bungee</module>
<module>maintenance-api</module>
</modules>