Initial commit
This commit is contained in:
commit
a18f9bdbb5
51
.gitignore
vendored
Normal file
51
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
#
|
||||
.idea
|
||||
run
|
||||
|
||||
.gradle/
|
||||
build/
|
||||
|
||||
# Eclipse stuff
|
||||
.classpath
|
||||
.project
|
||||
.settings/
|
||||
|
||||
# VSCode stuff
|
||||
.vscode/
|
||||
|
||||
# netbeans
|
||||
nbproject/
|
||||
nbactions.xml
|
||||
|
||||
# we use maven!
|
||||
build.xml
|
||||
|
||||
# maven
|
||||
target/
|
||||
dependency-reduced-pom.xml
|
||||
|
||||
# vim
|
||||
.*.sw[a-p]
|
||||
|
||||
# various other potential build files
|
||||
build/
|
||||
bin/
|
||||
dist/
|
||||
manifest.mf
|
||||
|
||||
# Mac filesystem dust
|
||||
.DS_Store/
|
||||
.DS_Store
|
||||
|
||||
# intellij
|
||||
*.iml
|
||||
*.ipr
|
||||
*.iws
|
||||
.idea/
|
||||
out/
|
||||
|
||||
# Linux temp files
|
||||
*~
|
||||
|
||||
!gradle/wrapper/gradle-wrapper.jar
|
||||
build.bat
|
||||
43
pom.xml
Normal file
43
pom.xml
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
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>
|
||||
|
||||
<groupId>org.example</groupId>
|
||||
<artifactId>ShutdownInfo</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
|
||||
<properties>
|
||||
<maven.compiler.source>16</maven.compiler.source>
|
||||
<maven.compiler.target>16</maven.compiler.target>
|
||||
</properties>
|
||||
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>velocity</id>
|
||||
<url>https://repo.velocitypowered.com/snapshots/</url>
|
||||
</repository>
|
||||
</repositories>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.velocitypowered</groupId>
|
||||
<artifactId>velocity-api</artifactId>
|
||||
<version>1.1.5</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.google.inject</groupId>
|
||||
<artifactId>guice</artifactId>
|
||||
<version>4.1.0</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.kyori</groupId>
|
||||
<artifactId>adventure-text-minimessage</artifactId>
|
||||
<version>4.1.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
</project>
|
||||
75
src/main/java/com/alttd/shutdowninfo/ShutdownInfo.java
Normal file
75
src/main/java/com/alttd/shutdowninfo/ShutdownInfo.java
Normal file
|
|
@ -0,0 +1,75 @@
|
|||
package com.alttd.shutdowninfo;
|
||||
|
||||
import com.alttd.shutdowninfo.commands.Reload;
|
||||
import com.alttd.shutdowninfo.commands.ShutDown;
|
||||
import com.alttd.shutdowninfo.config.Config;
|
||||
import com.alttd.shutdowninfo.listeners.PingListener;
|
||||
import com.alttd.shutdowninfo.listeners.ProxyPlayerListener;
|
||||
import com.alttd.shutdowninfo.util.ALogger;
|
||||
import com.google.inject.Inject;
|
||||
import com.velocitypowered.api.event.Subscribe;
|
||||
import com.velocitypowered.api.event.proxy.ProxyInitializeEvent;
|
||||
import com.velocitypowered.api.plugin.Plugin;
|
||||
import com.velocitypowered.api.plugin.annotation.DataDirectory;
|
||||
import com.velocitypowered.api.proxy.ProxyServer;
|
||||
|
||||
import java.io.File;
|
||||
import java.nio.file.Path;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
@Plugin(id = "shutdowninfo", name = "ShutdownInfo", version = "1.0.0",
|
||||
description = "A plugin to show shutdown information.",
|
||||
authors = {"teri"}
|
||||
)
|
||||
public class ShutdownInfo {
|
||||
|
||||
private static ShutdownInfo plugin;
|
||||
private final ProxyServer server;
|
||||
private final Logger logger;
|
||||
private final Path dataDirectory;
|
||||
|
||||
@Inject
|
||||
public ShutdownInfo(ProxyServer proxyServer, Logger proxyLogger, @DataDirectory Path proxydataDirectory)
|
||||
{
|
||||
plugin = this;
|
||||
server = proxyServer;
|
||||
logger = proxyLogger;
|
||||
dataDirectory = proxydataDirectory;
|
||||
}
|
||||
|
||||
@Subscribe
|
||||
public void onProxyInitialization(ProxyInitializeEvent event) {
|
||||
ALogger.init(logger);
|
||||
ReloadConfig();
|
||||
server.getEventManager().register(this, new ProxyPlayerListener());
|
||||
server.getEventManager().register(this, new PingListener());
|
||||
loadCommands();
|
||||
}
|
||||
|
||||
public void ReloadConfig() {
|
||||
Config.init();
|
||||
ALogger.info("Reloaded ShutdownInfo config.");
|
||||
}
|
||||
|
||||
public void loadCommands() {// all (proxy)commands go here
|
||||
new Reload(server);
|
||||
new ShutDown(server);
|
||||
}
|
||||
|
||||
public File getDataDirectory() {
|
||||
return dataDirectory.toFile();
|
||||
}
|
||||
|
||||
public static ShutdownInfo getPlugin() {
|
||||
return plugin;
|
||||
}
|
||||
|
||||
public Logger getLogger() {
|
||||
return logger;
|
||||
}
|
||||
|
||||
public ProxyServer getProxy() {
|
||||
return server;
|
||||
}
|
||||
}
|
||||
|
||||
31
src/main/java/com/alttd/shutdowninfo/commands/Reload.java
Normal file
31
src/main/java/com/alttd/shutdowninfo/commands/Reload.java
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
package com.alttd.shutdowninfo.commands;
|
||||
|
||||
import com.alttd.shutdowninfo.ShutdownInfo;
|
||||
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
|
||||
import com.mojang.brigadier.tree.LiteralCommandNode;
|
||||
import com.velocitypowered.api.command.BrigadierCommand;
|
||||
import com.velocitypowered.api.command.CommandMeta;
|
||||
import com.velocitypowered.api.command.CommandSource;
|
||||
import com.velocitypowered.api.proxy.ProxyServer;
|
||||
|
||||
public class Reload {
|
||||
|
||||
public Reload(ProxyServer proxyServer) {
|
||||
LiteralCommandNode<CommandSource> command = LiteralArgumentBuilder
|
||||
.<CommandSource>literal("shutdowninforeload")
|
||||
.requires(ctx -> ctx.hasPermission("command.proxy.shutdowninforeload"))
|
||||
.executes(context -> {
|
||||
ShutdownInfo.getPlugin().ReloadConfig();
|
||||
return 1;
|
||||
})
|
||||
.build();
|
||||
|
||||
BrigadierCommand brigadierCommand = new BrigadierCommand(command);
|
||||
|
||||
CommandMeta.Builder metaBuilder = proxyServer.getCommandManager().metaBuilder(brigadierCommand);
|
||||
|
||||
CommandMeta meta = metaBuilder.build();
|
||||
|
||||
proxyServer.getCommandManager().register(meta, brigadierCommand);
|
||||
}
|
||||
}
|
||||
59
src/main/java/com/alttd/shutdowninfo/commands/ShutDown.java
Normal file
59
src/main/java/com/alttd/shutdowninfo/commands/ShutDown.java
Normal file
|
|
@ -0,0 +1,59 @@
|
|||
package com.alttd.shutdowninfo.commands;
|
||||
|
||||
import com.alttd.shutdowninfo.ShutdownInfo;
|
||||
import com.alttd.shutdowninfo.config.Config;
|
||||
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
|
||||
import com.mojang.brigadier.tree.LiteralCommandNode;
|
||||
import com.velocitypowered.api.command.BrigadierCommand;
|
||||
import com.velocitypowered.api.command.CommandMeta;
|
||||
import com.velocitypowered.api.command.CommandSource;
|
||||
import com.velocitypowered.api.proxy.ProxyServer;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.minimessage.MiniMessage;
|
||||
|
||||
public class ShutDown {
|
||||
|
||||
public ShutDown(ProxyServer proxyServer) {
|
||||
Component ShutDownStart = MiniMessage.get().parse("<red>You have started the shutdown.</red>");
|
||||
Component ShutDownEnd = MiniMessage.get().parse("<green>You have ended the shutdown.</green>");
|
||||
|
||||
LiteralCommandNode<CommandSource> commandStart = LiteralArgumentBuilder
|
||||
.<CommandSource>literal("shutdownstart")
|
||||
.requires(ctx -> ctx.hasPermission("command.proxy.shutdown"))
|
||||
.executes(context -> {
|
||||
Config.setWhitelist(true);
|
||||
context.getSource().sendMessage(ShutDownStart);
|
||||
|
||||
Component message = MiniMessage.get().parse(Config.KICK_MESSAGE);
|
||||
|
||||
ShutdownInfo.getPlugin().getProxy().getAllPlayers().stream()
|
||||
.filter(player -> !player.hasPermission("shutdown.bypass"))
|
||||
.forEach(player -> player.disconnect(message));
|
||||
|
||||
return 1;
|
||||
})
|
||||
.build();
|
||||
|
||||
LiteralCommandNode<CommandSource> commandEnd = LiteralArgumentBuilder
|
||||
.<CommandSource>literal("shutdownend")
|
||||
.requires(ctx -> ctx.hasPermission("command.proxy.shutdown"))
|
||||
.executes(context -> {
|
||||
Config.setWhitelist(false);
|
||||
context.getSource().sendMessage(ShutDownEnd);
|
||||
return 1;
|
||||
})
|
||||
.build();
|
||||
|
||||
BrigadierCommand brigadierCommandStart = new BrigadierCommand(commandStart);
|
||||
BrigadierCommand brigadierCommandEnd = new BrigadierCommand(commandEnd);
|
||||
|
||||
CommandMeta.Builder metaBuilderStart = proxyServer.getCommandManager().metaBuilder(brigadierCommandStart);
|
||||
CommandMeta.Builder metaBuilderEnd = proxyServer.getCommandManager().metaBuilder(brigadierCommandEnd);
|
||||
|
||||
CommandMeta metaStart = metaBuilderStart.build();
|
||||
CommandMeta metaEnd = metaBuilderEnd.build();
|
||||
|
||||
proxyServer.getCommandManager().register(metaStart, brigadierCommandStart);
|
||||
proxyServer.getCommandManager().register(metaEnd, brigadierCommandEnd);
|
||||
}
|
||||
}
|
||||
182
src/main/java/com/alttd/shutdowninfo/config/Config.java
Normal file
182
src/main/java/com/alttd/shutdowninfo/config/Config.java
Normal file
|
|
@ -0,0 +1,182 @@
|
|||
package com.alttd.shutdowninfo.config;
|
||||
|
||||
import com.google.common.base.Throwables;
|
||||
import com.google.common.reflect.TypeToken;
|
||||
import ninja.leaping.configurate.ConfigurationNode;
|
||||
import ninja.leaping.configurate.ConfigurationOptions;
|
||||
import ninja.leaping.configurate.objectmapping.ObjectMappingException;
|
||||
import ninja.leaping.configurate.yaml.YAMLConfigurationLoader;
|
||||
import org.yaml.snakeyaml.DumperOptions;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
import java.lang.reflect.Modifier;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
public final class Config {
|
||||
private static final Pattern PATH_PATTERN = Pattern.compile("\\.");
|
||||
private static final String HEADER = "";
|
||||
|
||||
private static File CONFIG_FILE;
|
||||
public static ConfigurationNode config;
|
||||
public static YAMLConfigurationLoader configLoader;
|
||||
|
||||
static int version;
|
||||
static boolean verbose;
|
||||
|
||||
public static File CONFIGPATH;
|
||||
|
||||
public static void init() { // todo setup share for the config
|
||||
CONFIGPATH = new File(System.getProperty("user.home") + File.separator + "share" + File.separator + "configs" + File.separator + "ShutdownInfo");
|
||||
CONFIG_FILE = new File(CONFIGPATH, "config.yml");
|
||||
|
||||
configLoader = YAMLConfigurationLoader.builder()
|
||||
.setFile(CONFIG_FILE)
|
||||
.setFlowStyle(DumperOptions.FlowStyle.BLOCK)
|
||||
.build();
|
||||
if (!CONFIG_FILE.getParentFile().exists()) {
|
||||
if (!CONFIG_FILE.getParentFile().mkdirs()) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (!CONFIG_FILE.exists()) {
|
||||
try {
|
||||
if (!CONFIG_FILE.createNewFile()) {
|
||||
return;
|
||||
}
|
||||
} catch (IOException error) {
|
||||
error.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
config = configLoader.load(ConfigurationOptions.defaults().setHeader(HEADER));
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
verbose = getBoolean("verbose", true);
|
||||
version = getInt("config-version", 1);
|
||||
|
||||
readConfig(Config.class, null);
|
||||
try {
|
||||
configLoader.save(config);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public static void readConfig(Class<?> clazz, Object instance) {
|
||||
for (Method method : clazz.getDeclaredMethods()) {
|
||||
if (Modifier.isPrivate(method.getModifiers())) {
|
||||
if (method.getParameterTypes().length == 0 && method.getReturnType() == Void.TYPE) {
|
||||
try {
|
||||
method.setAccessible(true);
|
||||
method.invoke(instance);
|
||||
} catch (InvocationTargetException | IllegalAccessException ex) {
|
||||
throw Throwables.propagate(ex.getCause());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
try {
|
||||
configLoader.save(config);
|
||||
} catch (IOException ex) {
|
||||
throw Throwables.propagate(ex.getCause());
|
||||
}
|
||||
}
|
||||
|
||||
public static void saveConfig() {
|
||||
try {
|
||||
configLoader.save(config);
|
||||
} catch (IOException ex) {
|
||||
throw Throwables.propagate(ex.getCause());
|
||||
}
|
||||
}
|
||||
|
||||
private static Object[] splitPath(String key) {
|
||||
return PATH_PATTERN.split(key);
|
||||
}
|
||||
|
||||
private static void set(String path, Object def) {
|
||||
if (config.getNode(splitPath(path)).isVirtual())
|
||||
config.getNode(splitPath(path)).setValue(def);
|
||||
}
|
||||
|
||||
private static void setString(String path, String def) {
|
||||
try {
|
||||
if (config.getNode(splitPath(path)).isVirtual())
|
||||
config.getNode(splitPath(path)).setValue(TypeToken.of(String.class), def);
|
||||
} catch (ObjectMappingException ex) {
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean getBoolean(String path, boolean def) {
|
||||
set(path, def);
|
||||
return config.getNode(splitPath(path)).getBoolean(def);
|
||||
}
|
||||
|
||||
private static double getDouble(String path, double def) {
|
||||
set(path, def);
|
||||
return config.getNode(splitPath(path)).getDouble(def);
|
||||
}
|
||||
|
||||
private static int getInt(String path, int def) {
|
||||
set(path, def);
|
||||
return config.getNode(splitPath(path)).getInt(def);
|
||||
}
|
||||
|
||||
private static String getString(String path, String def) {
|
||||
setString(path, def);
|
||||
return config.getNode(splitPath(path)).getString(def);
|
||||
}
|
||||
|
||||
private static Long getLong(String path, Long def) {
|
||||
set(path, def);
|
||||
return config.getNode(splitPath(path)).getLong(def);
|
||||
}
|
||||
|
||||
private static <T> List<String> getList(String path, T def) {
|
||||
try {
|
||||
set(path, def);
|
||||
return config.getNode(splitPath(path)).getList(TypeToken.of(String.class));
|
||||
} catch (ObjectMappingException ex) {
|
||||
}
|
||||
return new ArrayList<>();
|
||||
}
|
||||
|
||||
private static ConfigurationNode getNode(String path) {
|
||||
if (config.getNode(splitPath(path)).isVirtual()) {
|
||||
//new RegexConfig("Dummy");
|
||||
}
|
||||
config.getChildrenMap();
|
||||
return config.getNode(splitPath(path));
|
||||
}
|
||||
|
||||
|
||||
/** ONLY EDIT ANYTHING BELOW THIS LINE **/
|
||||
public static String KICK_MESSAGE = "<red>The server has been whitelisted</red>";
|
||||
public static String WHITELIST_MESSAGE = "<red>This server is currently whitelisted.</red>";
|
||||
public static String PING_MESSAGE = "<red>This server is currently whitelisted.</red>";
|
||||
private static void messages() {
|
||||
KICK_MESSAGE = getString("messages.kick", KICK_MESSAGE);
|
||||
WHITELIST_MESSAGE = getString("messages.whitelist", WHITELIST_MESSAGE);
|
||||
PING_MESSAGE = getString("messages.ping", PING_MESSAGE);
|
||||
}
|
||||
|
||||
public static boolean WHITELIST = false;
|
||||
private static void settings() {
|
||||
WHITELIST = getBoolean("settings.whitelist", false);
|
||||
}
|
||||
|
||||
public static void setWhitelist(boolean state)
|
||||
{
|
||||
config.getNode(splitPath("settings.whitelist")).setValue(state);
|
||||
saveConfig();
|
||||
WHITELIST = state;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
package com.alttd.shutdowninfo.events;
|
||||
|
||||
import com.velocitypowered.api.proxy.Player;
|
||||
import net.kyori.adventure.text.minimessage.Template;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
public class WhitelistKickEvent {
|
||||
private final Player player;
|
||||
private String message;
|
||||
List<Template> templates;
|
||||
|
||||
public WhitelistKickEvent(Player player, String message, List<Template> templates) {
|
||||
this.player = player;
|
||||
this.message = message;
|
||||
this.templates = templates;
|
||||
}
|
||||
|
||||
public Player getPlayer() {return player;}
|
||||
|
||||
public String getMessage() {return message;}
|
||||
|
||||
public void appendMessage(String append) {message += append;}
|
||||
|
||||
public List<Template> getTemplates()
|
||||
{
|
||||
return Collections.unmodifiableList(templates);
|
||||
}
|
||||
|
||||
public void appendTemplates(Template... templates) {this.templates.addAll(List.of(templates));}
|
||||
}
|
||||
|
|
@ -0,0 +1,33 @@
|
|||
package com.alttd.shutdowninfo.listeners;
|
||||
|
||||
import com.alttd.shutdowninfo.config.Config;
|
||||
import com.velocitypowered.api.event.Subscribe;
|
||||
import com.velocitypowered.api.event.proxy.ProxyPingEvent;
|
||||
import com.velocitypowered.api.proxy.server.ServerPing;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.minimessage.MiniMessage;
|
||||
|
||||
public class PingListener {
|
||||
|
||||
MiniMessage miniMessage;
|
||||
|
||||
public PingListener() {
|
||||
miniMessage = MiniMessage.get();
|
||||
}
|
||||
|
||||
@Subscribe
|
||||
public void onPing(ProxyPingEvent event) {
|
||||
if (!Config.WHITELIST)
|
||||
return;
|
||||
|
||||
ServerPing.Builder builder = event.getPing().asBuilder();
|
||||
Component component = miniMessage.parse(Config.PING_MESSAGE);
|
||||
|
||||
builder.onlinePlayers(-1);
|
||||
builder.maximumPlayers(0);
|
||||
builder.clearSamplePlayers();
|
||||
builder.description(component);
|
||||
|
||||
event.setPing(builder.build());
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,55 @@
|
|||
package com.alttd.shutdowninfo.listeners;
|
||||
|
||||
import com.alttd.shutdowninfo.ShutdownInfo;
|
||||
import com.alttd.shutdowninfo.config.Config;
|
||||
import com.alttd.shutdowninfo.events.WhitelistKickEvent;
|
||||
import com.velocitypowered.api.event.ResultedEvent;
|
||||
import com.velocitypowered.api.event.Subscribe;
|
||||
import com.velocitypowered.api.event.connection.LoginEvent;
|
||||
import com.velocitypowered.api.proxy.Player;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.minimessage.MiniMessage;
|
||||
import net.kyori.adventure.text.minimessage.Template;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
|
||||
public class ProxyPlayerListener {
|
||||
|
||||
MiniMessage miniMessage;
|
||||
|
||||
public ProxyPlayerListener()
|
||||
{
|
||||
miniMessage = MiniMessage.get();
|
||||
}
|
||||
|
||||
@Subscribe
|
||||
public void playerLogin(LoginEvent event)
|
||||
{
|
||||
if (!Config.WHITELIST)
|
||||
return;
|
||||
|
||||
Player player = event.getPlayer();
|
||||
|
||||
if (event.getPlayer().hasPermission("shutdown.bypass"))
|
||||
return;
|
||||
|
||||
List<Template> templates = new ArrayList<>(List.of(
|
||||
Template.of("player", player.getUsername())
|
||||
));
|
||||
|
||||
CompletableFuture<WhitelistKickEvent> whitelistKickEvent = ShutdownInfo.getPlugin().getProxy().getEventManager()
|
||||
.fire(new WhitelistKickEvent(player, Config.WHITELIST_MESSAGE, templates));
|
||||
|
||||
try {
|
||||
WhitelistKickEvent result = whitelistKickEvent.get();
|
||||
Component component = miniMessage.parse(result.getMessage(), result.getTemplates());
|
||||
|
||||
event.setResult(ResultedEvent.ComponentResult.denied(component));
|
||||
} catch (InterruptedException | ExecutionException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
29
src/main/java/com/alttd/shutdowninfo/util/ALogger.java
Normal file
29
src/main/java/com/alttd/shutdowninfo/util/ALogger.java
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
package com.alttd.shutdowninfo.util;
|
||||
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
public class ALogger {
|
||||
|
||||
private static Logger logger;
|
||||
|
||||
public static void init(Logger log) {
|
||||
logger = log;
|
||||
}
|
||||
|
||||
private void log(String message) {
|
||||
logger.info(message);
|
||||
}
|
||||
|
||||
public static void warn(String message) {
|
||||
logger.warning(message);
|
||||
}
|
||||
|
||||
public static void info(String message) {
|
||||
logger.info(message);
|
||||
}
|
||||
|
||||
public static void error(String message) {
|
||||
logger.log(Level.SEVERE, message);
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user