Compare commits

...

9 Commits

Author SHA1 Message Date
Colbster937
c4dbe81de0 test dependabot 2026-01-29 16:52:03 -06:00
Colbster937
2883adc928 configure dependabot 2026-01-29 16:49:04 -06:00
Colbster937
00b1c99dc4 add more motd customization 2026-01-24 23:01:12 -06:00
Colbster937
1cd60a4dba update bstats for platform types 2026-01-24 21:47:30 -06:00
Colbster937
ebcae682aa . 2026-01-21 19:32:30 -06:00
Colbster937
f22e800439 share plugin commit in http api 2026-01-21 10:43:47 -06:00
Colbster937
f0274ff4d4 only unregister routes fi enabled 2026-01-21 10:21:05 -06:00
Colbster937
12f9d669b4 make it register an eaglerxserver route 2026-01-20 22:03:34 -06:00
Colbster937
c43de8a1c9 accept eula 2026-01-19 15:40:40 -06:00
15 changed files with 413 additions and 190 deletions

12
.github/dependabot.yml vendored Normal file
View File

@@ -0,0 +1,12 @@
version: 2
updates:
- package-ecosystem: "gradle"
directory: "/"
schedule:
interval: "weekly"
open-pull-requests-limit: 10
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
open-pull-requests-limit: 10

19
.github/workflows/dependabot.yml vendored Normal file
View File

@@ -0,0 +1,19 @@
name: Dependabot Auto Merge
on:
pull_request_target:
permissions:
contents: write
pull-requests: write
jobs:
dependabot:
if: github.actor == 'dependabot[bot]'
runs-on: ubuntu-latest
steps:
- uses: fastify/github-action-merge-dependabot@v3
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
merge-method: squash
target: minor

View File

@@ -15,6 +15,7 @@
- [x] Plugin update checker - [x] Plugin update checker
- [x] Send blacklist logs to a webhook - [x] Send blacklist logs to a webhook
- [x] Ingame blacklist management commands - [x] Ingame blacklist management commands
- [x] Blacklist sharing via EaglerXServer routes
- [x] Reverse blacklist (whitelist) - [x] Reverse blacklist (whitelist)
- [ ] Subscribe to an auto-updating blacklist - [ ] Subscribe to an auto-updating blacklist

View File

@@ -14,7 +14,7 @@ val PLUGIN_NAME = "OriginBlacklist"
val PLUGIN_IDEN = "originblacklist" val PLUGIN_IDEN = "originblacklist"
val PLUGIN_DOMN = "xyz.webmc.$PLUGIN_IDEN" val PLUGIN_DOMN = "xyz.webmc.$PLUGIN_IDEN"
val PLUGIN_DESC = "An eaglercraft client blacklist plugin." val PLUGIN_DESC = "An eaglercraft client blacklist plugin."
val PLUGIN_VERS = "2.0.6" val PLUGIN_VERS = "2.0.8"
val PLUGIN_SITE = "https://github.com/WebMCDevelopment/$PLUGIN_IDEN" val PLUGIN_SITE = "https://github.com/WebMCDevelopment/$PLUGIN_IDEN"
val PLUGIN_DEPA = listOf("EaglercraftXServer") val PLUGIN_DEPA = listOf("EaglercraftXServer")
val PLUGIN_DEPB = listOf("EaglercraftXServer") val PLUGIN_DEPB = listOf("EaglercraftXServer")
@@ -42,7 +42,7 @@ val EAGXS_VER = "1.0.8"
plugins { plugins {
id("java") id("java")
id("com.gradleup.shadow") version "9.3.1" id("com.gradleup.shadow") version "9.3.0"
id("com.palantir.git-version") version "4.2.0" id("com.palantir.git-version") version "4.2.0"
id("xyz.jpenilla.run-paper") version "3.0.2" id("xyz.jpenilla.run-paper") version "3.0.2"
id("xyz.jpenilla.run-waterfall") version "3.0.2" id("xyz.jpenilla.run-waterfall") version "3.0.2"
@@ -171,6 +171,7 @@ tasks.register("printVars") {
tasks.withType<RunServer>().configureEach { tasks.withType<RunServer>().configureEach {
minecraftVersion("1.12.2") minecraftVersion("1.12.2")
runDirectory.set(layout.projectDirectory.dir("run/paper")) runDirectory.set(layout.projectDirectory.dir("run/paper"))
jvmArgs("-Dcom.mojang.eula.agree=true")
downloadPlugins { downloadPlugins {
github("lax1dude", "eaglerxserver", "v" + EAGXS_VER, "EaglerXServer.jar") github("lax1dude", "eaglerxserver", "v" + EAGXS_VER, "EaglerXServer.jar")
modrinth("placeholderapi", "2.11.7") modrinth("placeholderapi", "2.11.7")

View File

@@ -6,7 +6,7 @@ import xyz.webmc.originblacklist.base.enums.EnumConnectionType;
import xyz.webmc.originblacklist.base.enums.EnumLogLevel; import xyz.webmc.originblacklist.base.enums.EnumLogLevel;
import xyz.webmc.originblacklist.base.events.OriginBlacklistLoginEvent; import xyz.webmc.originblacklist.base.events.OriginBlacklistLoginEvent;
import xyz.webmc.originblacklist.base.events.OriginBlacklistMOTDEvent; import xyz.webmc.originblacklist.base.events.OriginBlacklistMOTDEvent;
import xyz.webmc.originblacklist.base.http.OriginBlacklistHTTPServer; import xyz.webmc.originblacklist.base.http.OriginBlacklistRequestHandler;
import xyz.webmc.originblacklist.base.util.BuildInfo; import xyz.webmc.originblacklist.base.util.BuildInfo;
import xyz.webmc.originblacklist.base.util.IOriginBlacklistPlugin; import xyz.webmc.originblacklist.base.util.IOriginBlacklistPlugin;
import xyz.webmc.originblacklist.base.util.OPlayer; import xyz.webmc.originblacklist.base.util.OPlayer;
@@ -38,9 +38,11 @@ import inet.ipaddr.IPAddressString;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.minimessage.MiniMessage;
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
import net.lax1dude.eaglercraft.backend.server.api.IEaglerXServerAPI;
import net.lax1dude.eaglercraft.backend.server.api.query.IMOTDConnection; import net.lax1dude.eaglercraft.backend.server.api.query.IMOTDConnection;
import org.semver4j.Semver; import org.semver4j.Semver;
@SuppressWarnings({ "rawtypes" })
public final class OriginBlacklist { public final class OriginBlacklist {
private static final String COMMIT_L = BuildInfo.get("git_cm_hash"); private static final String COMMIT_L = BuildInfo.get("git_cm_hash");
private static final String COMMIT_S = COMMIT_L.substring(0, 8); private static final String COMMIT_S = COMMIT_L.substring(0, 8);
@@ -50,11 +52,9 @@ public final class OriginBlacklist {
public static final String UNKNOWN_STR = "UNKNOWN"; public static final String UNKNOWN_STR = "UNKNOWN";
public static final String CENSORED_STR = "CENSORED"; public static final String CENSORED_STR = "CENSORED";
public static final String PLUGIN_REPO = "WebMCDevelopment/originblacklist"; public static final String PLUGIN_REPO = "WebMCDevelopment/originblacklist";
public static final int BSTATS_ID = 28776;
private final IOriginBlacklistPlugin plugin; private final IOriginBlacklistPlugin plugin;
private final OriginBlacklistConfig config; private final OriginBlacklistConfig config;
private final OriginBlacklistHTTPServer http;
private final Json5 json5; private final Json5 json5;
private String updateURL; private String updateURL;
private Path jarFile; private Path jarFile;
@@ -62,7 +62,6 @@ public final class OriginBlacklist {
public OriginBlacklist(final IOriginBlacklistPlugin plugin) { public OriginBlacklist(final IOriginBlacklistPlugin plugin) {
this.plugin = plugin; this.plugin = plugin;
this.config = new OriginBlacklistConfig(this); this.config = new OriginBlacklistConfig(this);
this.http = new OriginBlacklistHTTPServer(this);
this.json5 = Json5.builder(builder -> builder.prettyPrinting().indentFactor(0).build()); this.json5 = Json5.builder(builder -> builder.prettyPrinting().indentFactor(0).build());
} }
@@ -71,8 +70,8 @@ public final class OriginBlacklist {
this.plugin.scheduleRepeat(() -> { this.plugin.scheduleRepeat(() -> {
this.checkForUpdates(); this.checkForUpdates();
}, this.config.getInteger("update_checker.check_timer"), TimeUnit.SECONDS); }, this.config.getInteger("update_checker.check_timer"), TimeUnit.SECONDS);
if (this.isHTTPServerEnabled()) { if (this.isBlacklistAPIEnabled()) {
this.http.start(); OriginBlacklistRequestHandler.register(this);
} }
this.plugin.log(EnumLogLevel.INFO, "Initialized Plugin"); this.plugin.log(EnumLogLevel.INFO, "Initialized Plugin");
this.plugin.log(EnumLogLevel.DEBUG, "Commit " + COMMIT_L); this.plugin.log(EnumLogLevel.DEBUG, "Commit " + COMMIT_L);
@@ -80,15 +79,20 @@ public final class OriginBlacklist {
public final void shutdown() { public final void shutdown() {
this.plugin.log(EnumLogLevel.INFO, "Shutting down..."); this.plugin.log(EnumLogLevel.INFO, "Shutting down...");
this.http.stop(); if (this.isBlacklistAPIEnabled()) {
OriginBlacklistRequestHandler.unRegister(this);
}
this.plugin.shutdown(); this.plugin.shutdown();
} }
public final void handleReload() { public final void handleReload() {
if (this.isHTTPServerEnabled()) { try {
this.http.start(); if (this.isBlacklistAPIEnabled()) {
} else { OriginBlacklistRequestHandler.register(this);
this.http.stop(); } else {
OriginBlacklistRequestHandler.unRegister(this);
}
} catch (final Throwable t) {
} }
} }
@@ -110,7 +114,7 @@ public final class OriginBlacklist {
} }
this.plugin.kickPlayer(this.getBlacklistedComponent("kick", blacklisted.getArrayString(), this.plugin.kickPlayer(this.getBlacklistedComponent("kick", blacklisted.getArrayString(),
blacklisted.getAltString(), blacklisted.getString(), "not allowed", "not allowed on the server", blacklisted.getAltString(), blacklisted.getString(), "not allowed", "not allowed on the server",
blacklisted_value, blacklisted.getActionString()), event); blacklisted_value, blacklisted.getActionString(), false), event);
this.sendWebhooks(event, blacklisted); this.sendWebhooks(event, blacklisted);
final String name = player.getName(); final String name = player.getName();
if (isNonNull(name)) { if (isNonNull(name)) {
@@ -132,9 +136,12 @@ public final class OriginBlacklist {
} else { } else {
blacklisted_value = UNKNOWN_STR; blacklisted_value = UNKNOWN_STR;
} }
this.plugin.setMOTD(this.getBlacklistedComponent("motd", blacklisted.getArrayString(), blacklisted.getAltString(), if (this.isMOTDEnabled()) {
blacklisted.getString(), "blacklisted", "blacklisted from the server", blacklisted_value, this.plugin
blacklisted.getActionString()), event); .setMOTD(this.getBlacklistedComponent("motd", blacklisted.getArrayString(), blacklisted.getAltString(),
blacklisted.getString(), "blacklisted", "blacklisted from the server", blacklisted_value,
blacklisted.getActionString(), true), event);
}
} }
} }
@@ -146,12 +153,20 @@ public final class OriginBlacklist {
return this.config.getBoolean("bStats"); return this.config.getBoolean("bStats");
} }
public final boolean isMOTDEnabled() {
return this.config.getBoolean("motd.enabled");
}
public final boolean isWebhooksEnabled() {
return this.config.getBoolean("discord.webhook.enabled");
}
public final boolean isLogFileEnabled() { public final boolean isLogFileEnabled() {
return this.config.getBoolean("logFile"); return this.config.getBoolean("logFile");
} }
public final boolean isHTTPServerEnabled() { public final boolean isBlacklistAPIEnabled() {
return this.config.getBoolean("blacklist_http_share.enabled"); return this.config.getBoolean("blacklist_http_api");
} }
public final OriginBlacklistConfig getConfig() { public final OriginBlacklistConfig getConfig() {
@@ -161,13 +176,17 @@ public final class OriginBlacklist {
public final void setEaglerMOTD(final Component comp, final OriginBlacklistMOTDEvent event) { public final void setEaglerMOTD(final Component comp, final OriginBlacklistMOTDEvent event) {
final IMOTDConnection conn = event.getEaglerEvent().getMOTDConnection(); final IMOTDConnection conn = event.getEaglerEvent().getMOTDConnection();
final List<String> lst = new ArrayList<>(); final List<String> lst = new ArrayList<>();
for (String ln : getComponentString(comp).split("\n")) { for (final String ln : getComponentString(comp).split("\n")) {
lst.add(ln); lst.add(ln);
} }
final List<String> pLst = new ArrayList<>();
for (final Json5Element ln : this.config.getArray("motd.players.hover").getAsJson5Array()) {
pLst.add(getLegacyFromMiniMessage(ln.getAsString().replaceAll("%discord_invite%", this.config.getString("discord.invite"))));
}
conn.setServerMOTD(lst); conn.setServerMOTD(lst);
conn.setPlayerTotal(0); conn.setPlayerTotal(this.config.getInteger("motd.players.online"));
conn.setPlayerUnlimited(); conn.setPlayerMax(this.config.getInteger("motd.players.max"));
conn.setPlayerList(List.of()); conn.setPlayerList(pLst);
conn.setServerIcon(this.config.getIconBytes()); conn.setServerIcon(this.config.getIconBytes());
conn.sendToUser(); conn.sendToUser();
conn.disconnect(); conn.disconnect();
@@ -316,6 +335,7 @@ public final class OriginBlacklist {
try { try {
final Json5Object obj = new Json5Object(); final Json5Object obj = new Json5Object();
obj.addProperty("plugin_version", this.plugin.getPluginVersion().getVersion()); obj.addProperty("plugin_version", this.plugin.getPluginVersion().getVersion());
obj.addProperty("git_commit", COMMIT_L);
obj.addProperty("blacklist_to_whitelist", this.config.getBoolean("blacklist_to_whitelist")); obj.addProperty("blacklist_to_whitelist", this.config.getBoolean("blacklist_to_whitelist"));
obj.addProperty("block_undefined_origin", this.config.getBoolean("block_undefined_origin")); obj.addProperty("block_undefined_origin", this.config.getBoolean("block_undefined_origin"));
final Json5Object bObj = new Json5Object(); final Json5Object bObj = new Json5Object();
@@ -334,10 +354,14 @@ public final class OriginBlacklist {
return "plugins/" + plugin.getPluginId(); return "plugins/" + plugin.getPluginId();
} }
public final IEaglerXServerAPI getEaglerAPI() {
return this.plugin.getEaglerAPI();
}
private final Component getBlacklistedComponent(final String type, final String id, final String blockType, private final Component getBlacklistedComponent(final String type, final String id, final String blockType,
final String blockTypeAlt, final String notAllowed, final String notAllowedAlt, final String blockValue, final String blockTypeAlt, final String notAllowed, final String notAllowedAlt, final String blockValue,
final String action) { final String action, final boolean isMOTD) {
final Json5Array arr = this.config.getArray("messages." + type); final Json5Array arr = this.config.getArray(isMOTD ? (type + ".text") : ("messages." + type));
final StringBuilder sb = new StringBuilder(); final StringBuilder sb = new StringBuilder();
for (int i = 0; i < arr.size(); i++) { for (int i = 0; i < arr.size(); i++) {
if (i > 0) if (i > 0)
@@ -350,21 +374,26 @@ public final class OriginBlacklist {
.replaceAll("%block_type%", blockType) .replaceAll("%block_type%", blockType)
.replaceAll("%not_allowed%", notAllowed) .replaceAll("%not_allowed%", notAllowed)
.replaceAll("%not_allowed_alt%", notAllowedAlt) .replaceAll("%not_allowed_alt%", notAllowedAlt)
.replaceAll("%blocked_value%", blockValue); .replaceAll("%blocked_value%", blockValue)
.replaceAll("%discord_invite%", this.config.getString("discord.invite"));
return MiniMessage.miniMessage().deserialize(str); return MiniMessage.miniMessage().deserialize(str);
} }
private final void sendWebhooks(final OriginBlacklistLoginEvent event, final EnumBlacklistType type) { private final void sendWebhooks(final OriginBlacklistLoginEvent event, final EnumBlacklistType type) {
if (this.config.getBoolean("discord.enabled")) { if (this.isWebhooksEnabled()) {
final OPlayer player = event.getPlayer(); final OPlayer player = event.getPlayer();
final EnumConnectionType connType = event.getConnectionType(); final EnumConnectionType connType = event.getConnectionType();
/* final String userAgent; /*
if (connType == EnumConnectionType.EAGLER) { * final String userAgent;
final IEaglerLoginConnection loginConn = event.getEaglerEvent().getLoginConnection(); * if (connType == EnumConnectionType.EAGLER) {
userAgent = loginConn.getWebSocketHeader(EnumWebSocketHeader.HEADER_USER_AGENT); * final IEaglerLoginConnection loginConn =
} else { * event.getEaglerEvent().getLoginConnection();
userAgent = UNKNOWN_STR; * userAgent =
} */ * loginConn.getWebSocketHeader(EnumWebSocketHeader.HEADER_USER_AGENT);
* } else {
* userAgent = UNKNOWN_STR;
* }
*/
final byte[] payload = String.format( final byte[] payload = String.format(
""" """
{ {
@@ -457,17 +486,17 @@ public final class OriginBlacklist {
private final void updateLogFile(final OriginBlacklistLoginEvent event, final EnumBlacklistType type) { private final void updateLogFile(final OriginBlacklistLoginEvent event, final EnumBlacklistType type) {
if (this.isLogFileEnabled()) { if (this.isLogFileEnabled()) {
final OPlayer player = event.getPlayer(); final OPlayer player = event.getPlayer();
final String txt = Instant.now() + " - [player=" + player.getName() + "," + "blacklist_reason=" + type.toString() + "]"; final String txt = Instant.now() + " - [player=" + player.getName() + "," + "blacklist_reason=" + type.toString()
+ "]";
final Path dir = Paths.get(this.getDataDir()); final Path dir = Paths.get(this.getDataDir());
try { try {
Files.createDirectories(dir); Files.createDirectories(dir);
Files.writeString( Files.writeString(
dir.resolve("blacklist.log"), dir.resolve("blacklist.log"),
txt + "\n", txt + "\n",
StandardOpenOption.CREATE, StandardOpenOption.CREATE,
StandardOpenOption.WRITE, StandardOpenOption.WRITE,
StandardOpenOption.APPEND StandardOpenOption.APPEND);
);
} catch (final Throwable t) { } catch (final Throwable t) {
t.printStackTrace(); t.printStackTrace();
} }
@@ -493,4 +522,10 @@ public final class OriginBlacklist {
public static final boolean isNonNull(final String str) { public static final boolean isNonNull(final String str) {
return str != null && !str.isEmpty() && !str.isBlank() && !str.equals("null"); return str != null && !str.isEmpty() && !str.isBlank() && !str.equals("null");
} }
public static final class BSTATS {
public static final int VELOCITY = 29033;
public static final int BUNGEE = 29034;
public static final int BUKKIT = 29035;
}
} }

View File

@@ -11,6 +11,7 @@ import java.nio.charset.StandardCharsets;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.StandardCopyOption; import java.nio.file.StandardCopyOption;
import java.util.ArrayList;
import javax.imageio.ImageIO; import javax.imageio.ImageIO;
@@ -21,6 +22,9 @@ import de.marhali.json5.Json5Object;
import de.marhali.json5.Json5Primitive; import de.marhali.json5.Json5Primitive;
public final class OriginBlacklistConfig { public final class OriginBlacklistConfig {
public static final Json5Object DEFAULT_CONFIG = getDefaultConfig();
public static final int LATEST_CONFIG_VERSION = 2;
private final Json5 json5; private final Json5 json5;
private final File file; private final File file;
private final Path filePath; private final Path filePath;
@@ -70,16 +74,15 @@ public final class OriginBlacklistConfig {
Json5Element parsed = this.json5.parse(text); Json5Element parsed = this.json5.parse(text);
if (parsed instanceof Json5Object) { if (parsed instanceof Json5Object) {
this.config = (Json5Object) parsed; this.config = (Json5Object) parsed;
if (merge(this.config, getDefaultConfig())) { this.config = OriginBlacklistConfigTransformer.transformConfig(this.config);
this.saveConfig(); merge(this.config, DEFAULT_CONFIG);
}
} else { } else {
throw new IOException("Config must be an object!"); throw new IOException("Config must be an object!");
} }
} else { } else {
this.config = getDefaultConfig(); this.config = DEFAULT_CONFIG;
this.saveConfig();
} }
this.saveConfig();
} }
private final void reloadIconImage() { private final void reloadIconImage() {
@@ -206,7 +209,6 @@ public final class OriginBlacklistConfig {
} else { } else {
element = null; element = null;
} }
if (element == null) { if (element == null) {
break; break;
} }
@@ -262,18 +264,29 @@ public final class OriginBlacklistConfig {
kick.add("%action%"); kick.add("%action%");
kick.add(""); kick.add("");
kick.add("<aqua>Think this is a mistake? Join our discord:</aqua>"); kick.add("<aqua>Think this is a mistake? Join our discord:</aqua>");
kick.add("<blue>discord.gg/changethisintheconfig</blue>"); kick.add("<blue>%discord_invite%</blue>");
addJSONObj(mObj, "kick", kick, null); addJSONObj(mObj, "kick", kick, null);
final Json5Array motd = new Json5Array();
motd.add("<red>This %block_type% is %not_allowed%!</red>");
motd.add("<dark_gray>»</dark_gray> <gray>%blocked_value%</gray>");
addJSONObj(mObj, "motd", motd, null);
final Json5Object actions = new Json5Object(); final Json5Object actions = new Json5Object();
actions.add("generic", Json5Primitive.fromString("<gold>Please switch to a different %block_type%.</gold>")); actions.add("generic", Json5Primitive.fromString("<gold>Please switch to a different %block_type%.</gold>"));
actions.add("player_name", Json5Primitive.fromString("<gold>Please change your %block_type%.</gold>")); actions.add("player_name", Json5Primitive.fromString("<gold>Please change your %block_type%.</gold>"));
actions.add("ip_address", Json5Primitive.fromString("<gold>Please contact staff for assistance.</gold>")); actions.add("ip_address", Json5Primitive.fromString("<gold>Please contact staff for assistance.</gold>"));
addJSONObj(mObj, "actions", actions, null); addJSONObj(mObj, "actions", actions, null);
addJSONObj(obj, "messages", mObj, null); addJSONObj(obj, "messages", mObj, null);
final Json5Object nObj = new Json5Object();
addJSONObj(nObj, "enabled", Json5Primitive.fromBoolean(true), null);
final Json5Array mArr = new Json5Array();
mArr.add("<red>This %block_type% is %not_allowed%!</red>");
mArr.add("<dark_gray>»</dark_gray> <gray>%blocked_value%</gray>");
addJSONObj(nObj, "text", mArr, null);
final Json5Object mPlayers = new Json5Object();
addJSONObj(mPlayers, "online", Json5Primitive.fromNumber(0), null);
addJSONObj(mPlayers, "max", Json5Primitive.fromNumber(0), null);
final Json5Array hArr = new Json5Array();
hArr.add("<blue>Join our discord</blue>");
hArr.add("<blue>%discord_invite%</blue>");
addJSONObj(mPlayers, "hover", hArr, null);
addJSONObj(nObj, "players", mPlayers, null);
addJSONObj(obj, "motd", nObj, null);
final Json5Object bObj = new Json5Object(); final Json5Object bObj = new Json5Object();
final Json5Array origins = new Json5Array(); final Json5Array origins = new Json5Array();
origins.add(".*eaglerhackedclients\\.vercel\\.app.*"); origins.add(".*eaglerhackedclients\\.vercel\\.app.*");
@@ -302,9 +315,12 @@ public final class OriginBlacklistConfig {
addJSONObj(bObj, "ip_addresses", ips, null); addJSONObj(bObj, "ip_addresses", ips, null);
addJSONObj(obj, "blacklist", bObj, null); addJSONObj(obj, "blacklist", bObj, null);
final Json5Object dObj = new Json5Object(); final Json5Object dObj = new Json5Object();
addJSONObj(dObj, "enabled", Json5Primitive.fromBoolean(false), null); addJSONObj(dObj, "invite", Json5Primitive.fromString("discord.gg/changeme"), null);
addJSONObj(dObj, "webhook_urls", new Json5Array(), null); final Json5Object webhook = new Json5Object();
addJSONObj(dObj, "send_ips", Json5Primitive.fromBoolean(true), null); addJSONObj(webhook, "enabled", Json5Primitive.fromBoolean(false), null);
addJSONObj(webhook, "webhook_urls", new Json5Array(), null);
addJSONObj(webhook, "send_ips", Json5Primitive.fromBoolean(true), null);
addJSONObj(dObj, "webhook", webhook, null);
addJSONObj(obj, "discord", dObj, null); addJSONObj(obj, "discord", dObj, null);
final Json5Object uObj = new Json5Object(); final Json5Object uObj = new Json5Object();
addJSONObj(uObj, "enabled", Json5Primitive.fromBoolean(true), null); addJSONObj(uObj, "enabled", Json5Primitive.fromBoolean(true), null);
@@ -312,37 +328,166 @@ public final class OriginBlacklistConfig {
addJSONObj(uObj, "check_timer", Json5Primitive.fromNumber(3600), null); addJSONObj(uObj, "check_timer", Json5Primitive.fromNumber(3600), null);
addJSONObj(uObj, "auto_update", Json5Primitive.fromBoolean(true), null); addJSONObj(uObj, "auto_update", Json5Primitive.fromBoolean(true), null);
addJSONObj(obj, "update_checker", uObj, null); addJSONObj(obj, "update_checker", uObj, null);
final Json5Object hObj = new Json5Object(); addJSONObj(obj, "blacklist_http_api", Json5Primitive.fromBoolean(false), null);
addJSONObj(hObj, "enabled", Json5Primitive.fromBoolean(false), null);
addJSONObj(hObj, "http_port", Json5Primitive.fromNumber(8080), null);
addJSONObj(hObj, "listen_addr", Json5Primitive.fromString("0.0.0.0"), null);
addJSONObj(obj, "blacklist_http_share", hObj, null);
addJSONObj(obj, "blacklist_to_whitelist", Json5Primitive.fromBoolean(false), null); addJSONObj(obj, "blacklist_to_whitelist", Json5Primitive.fromBoolean(false), null);
addJSONObj(obj, "block_undefined_origin", Json5Primitive.fromBoolean(false), null); addJSONObj(obj, "block_undefined_origin", Json5Primitive.fromBoolean(false), null);
addJSONObj(obj, "bStats", Json5Primitive.fromBoolean(true), null); addJSONObj(obj, "bStats", Json5Primitive.fromBoolean(true), null);
addJSONObj(obj, "logFile", Json5Primitive.fromBoolean(true), null); addJSONObj(obj, "logFile", Json5Primitive.fromBoolean(true), null);
addJSONObj(obj, "config_version", Json5Primitive.fromNumber(1), "DO NOT CHANGE"); addJSONObj(obj, "config_version", Json5Primitive.fromNumber(LATEST_CONFIG_VERSION), "DO NOT CHANGE");
return obj; return obj;
} }
private static final boolean merge(final Json5Object a, final Json5Object b) { private static final boolean merge(final Json5Object aObj, final Json5Object bObj) {
final Json5Object ret = new Json5Object();
boolean changed = false; boolean changed = false;
for (final String key : bObj.keySet()) {
for (String key : b.keySet()) { final Json5Element dv = bObj.get(key);
Json5Element element = b.get(key); if (aObj.has(key)) {
if (!a.has(key)) { final Json5Element v = aObj.get(key);
a.add(key, element.deepCopy()); if (dv instanceof Json5Object) {
changed = true; if (v instanceof Json5Object) {
} else { final boolean c = merge((Json5Object) v, (Json5Object) dv);
final Json5Element _element = a.get(key); ret.add(key, (Json5Object) v);
if (_element instanceof Json5Object objA && element instanceof Json5Object objB) { if (c) {
if (merge(objA, objB)) { changed = true;
}
} else {
ret.add(key, dv.deepCopy());
changed = true; changed = true;
} }
} else if (dv instanceof Json5Array) {
if (v instanceof Json5Array) {
final Json5Array vArr = (Json5Array) v;
final Json5Array dArr = (Json5Array) dv;
if (dArr.size() == 0) {
ret.add(key, vArr.deepCopy());
} else {
final Json5Element d0 = dArr.get(0);
if (d0 instanceof Json5Primitive && ((Json5Primitive) d0).isString()) {
final Json5Array out = new Json5Array();
for (final Json5Element e : vArr) {
if (e instanceof Json5Primitive && ((Json5Primitive) e).isString()) {
out.add(e.deepCopy());
}
}
if (out.size() > 0) {
if (out.size() != vArr.size()) {
changed = true;
}
ret.add(key, out);
} else {
ret.add(key, dArr.deepCopy());
changed = true;
}
} else {
boolean a = true;
for (final Json5Element e : vArr) {
if (e == null) {
a = false;
} else if (d0 instanceof Json5Object) {
if (!(e instanceof Json5Object)) {
a = false;
}
} else if (d0 instanceof Json5Array) {
if (!(e instanceof Json5Array)) {
a = false;
}
} else if (d0 instanceof Json5Primitive && e instanceof Json5Primitive) {
final Json5Primitive bp = (Json5Primitive) d0;
final Json5Primitive ap = (Json5Primitive) e;
if (bp.isBoolean()) {
if (!ap.isBoolean()) {
a = false;
}
} else if (bp.isNumber()) {
if (!ap.isNumber()) {
a = false;
}
} else if (bp.isString()) {
if (!ap.isString()) {
a = false;
}
}
} else {
a = false;
}
if (!a) {
break;
}
}
if (a) {
ret.add(key, vArr.deepCopy());
} else {
ret.add(key, dArr.deepCopy());
changed = true;
}
}
}
} else {
ret.add(key, dv.deepCopy());
changed = true;
}
} else if (dv instanceof Json5Primitive) {
if (v instanceof Json5Primitive) {
final Json5Primitive dp = (Json5Primitive) dv;
final Json5Primitive vp = (Json5Primitive) v;
if (dp.isBoolean()) {
if (vp.isBoolean()) {
ret.add(key, vp.deepCopy());
} else {
ret.add(key, dv.deepCopy());
changed = true;
}
} else if (dp.isNumber()) {
if (vp.isNumber()) {
ret.add(key, vp.deepCopy());
} else {
ret.add(key, dv.deepCopy());
changed = true;
}
} else if (dp.isString()) {
if (vp.isString()) {
ret.add(key, vp.deepCopy());
} else {
ret.add(key, dv.deepCopy());
changed = true;
}
} else {
ret.add(key, dv.deepCopy());
changed = true;
}
} else {
ret.add(key, dv.deepCopy());
changed = true;
}
} else {
ret.add(key, dv.deepCopy());
changed = true;
} }
} else {
ret.add(key, dv.deepCopy());
changed = true;
} }
} }
for (final String key : aObj.keySet()) {
if (!bObj.has(key)) {
ret.add(key, aObj.get(key).deepCopy());
}
}
for (final String key : aObj.keySet()) {
if (!bObj.has(key)) {
ret.add(key, aObj.get(key).deepCopy());
}
}
for (final String k : new ArrayList<>(aObj.keySet())) {
aObj.remove(k);
}
for (final String k : ret.keySet()) {
aObj.add(k, ret.get(k));
}
for (final String key : ret.keySet()) {
aObj.add(key, ret.get(key));
}
return changed; return changed;
} }

View File

@@ -0,0 +1,39 @@
package xyz.webmc.originblacklist.base.config;
import de.marhali.json5.Json5Array;
import de.marhali.json5.Json5Object;
import de.marhali.json5.Json5Primitive;
public final class OriginBlacklistConfigTransformer {
public static final Json5Object transformConfig(final Json5Object config) {
final Json5Object obj = config.deepCopy();
final int ver = obj.get("config_version").getAsInt();
if (ver <= 1) {
final Json5Object mObj = obj.get("messages").getAsJson5Object().deepCopy();
final Json5Array motd = mObj.get("motd").getAsJson5Array().deepCopy();
mObj.remove("motd");
final Json5Object nObj = new Json5Object();
nObj.add("text", motd);
obj.remove("messages");
obj.add("messages", mObj);
obj.add("motd", nObj);
final Json5Object dObj = obj.get("discord").getAsJson5Object().deepCopy();
final Json5Primitive wEnabled = dObj.get("enabled").getAsJson5Primitive();
final Json5Array wURLS = dObj.get("webhook_urls").getAsJson5Array().deepCopy();
final Json5Primitive wAddrs = dObj.get("send_ips").getAsJson5Primitive();
dObj.remove("enabled");
dObj.remove("webhook_urls");
dObj.remove("send_ips");
final Json5Object oObj = new Json5Object();
oObj.add("enabled", wEnabled);
oObj.add("webhook_urls", wURLS);
oObj.add("send_ips", wAddrs);
dObj.add("webhook", oObj);
obj.remove("discord");
obj.add("discord", dObj);
}
obj.remove("config_version");
obj.add("config_version", Json5Primitive.fromNumber(OriginBlacklistConfig.LATEST_CONFIG_VERSION));
return obj;
}
}

View File

@@ -1,39 +0,0 @@
package xyz.webmc.originblacklist.base.http;
import xyz.webmc.originblacklist.base.OriginBlacklist;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
public class OriginBlacklistHTTPHandler implements HttpHandler {
private final OriginBlacklist plugin;
public OriginBlacklistHTTPHandler(final OriginBlacklist plugin) {
this.plugin = plugin;
}
@Override
public final void handle(final HttpExchange exchange) throws IOException {
try {
final String path = exchange.getRequestURI().getPath();
if ("/".equals(path)) {
final byte[] bytes = this.plugin.getBlacklistShare().getBytes(StandardCharsets.UTF_8);
exchange.getResponseHeaders().set("Content-Type", "application/json; charset=utf-8");
exchange.sendResponseHeaders(200, bytes.length);
try (final OutputStream os = exchange.getResponseBody()) {
os.write(bytes);
}
} else {
exchange.sendResponseHeaders(404, -1);
}
} finally {
exchange.close();
}
}
}

View File

@@ -1,56 +0,0 @@
package xyz.webmc.originblacklist.base.http;
import xyz.webmc.originblacklist.base.OriginBlacklist;
import xyz.webmc.originblacklist.base.config.OriginBlacklistConfig;
import java.net.InetSocketAddress;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import com.sun.net.httpserver.HttpServer;
public class OriginBlacklistHTTPServer {
private final OriginBlacklist plugin;
private final ExecutorService executor;
private HttpServer server;
private boolean running;
public OriginBlacklistHTTPServer(final OriginBlacklist plugin) {
this.plugin = plugin;
this.executor = Executors.newFixedThreadPool(4);
this.running = false;
}
public final void start() {
if (!this.running) {
try {
this.server = this.createServer();
this.server.start();
this.running = true;
} catch (final Throwable t) {
}
}
}
public final void stop() {
if (this.running && this.server != null) {
this.server.stop(0);
this.running = false;
}
}
public final void shutdown() {
this.stop();
this.executor.shutdownNow();
}
private final HttpServer createServer() throws Throwable {
final OriginBlacklistConfig config = this.plugin.getConfig();
final HttpServer server = HttpServer
.create(new InetSocketAddress(config.getString("blacklist_http_share.listen_addr"),
config.getInteger("blacklist_http_share.http_port")), 0);
server.createContext("/", new OriginBlacklistHTTPHandler(this.plugin));
server.setExecutor(executor);
return server;
}
}

View File

@@ -0,0 +1,40 @@
package xyz.webmc.originblacklist.base.http;
import xyz.webmc.originblacklist.base.OriginBlacklist;
import java.nio.charset.StandardCharsets;
import net.lax1dude.eaglercraft.backend.server.api.webserver.IRequestContext;
import net.lax1dude.eaglercraft.backend.server.api.webserver.IRequestHandler;
import net.lax1dude.eaglercraft.backend.server.api.webserver.RouteDesc;
public class OriginBlacklistRequestHandler implements IRequestHandler {
private static final RouteDesc route = RouteDesc.create("/originblacklist/v2/");
private final OriginBlacklist plugin;
public OriginBlacklistRequestHandler(final OriginBlacklist plugin) {
this.plugin = plugin;
}
@Override
public final void handleRequest(final IRequestContext ctx) {
final String path = ctx.getPath();
if (route.getPattern().equals(path)) {
final byte[] bytes = this.plugin.getBlacklistShare().getBytes(StandardCharsets.UTF_8);
ctx.addResponseHeader("Content-Type", "application/json; charset=utf-8");
ctx.setResponseCode(200);
ctx.setResponseBody(bytes);
} else {
ctx.getServer().get404Handler().handleRequest(ctx);
}
}
public static final void register(final OriginBlacklist plugin) {
plugin.getEaglerAPI().getWebServer().registerRoute(plugin, route, new OriginBlacklistRequestHandler(plugin));
}
public static final void unRegister(final OriginBlacklist plugin) {
plugin.getEaglerAPI().getWebServer().unregisterRoute(plugin, route);
}
}

View File

@@ -0,0 +1,5 @@
package xyz.webmc.originblacklist.base.util;
public final class EaglerEventPriority {
public static final int EAGLER_MOTD_EVENT = 100;
}

View File

@@ -8,8 +8,10 @@ import java.nio.file.Path;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.lax1dude.eaglercraft.backend.server.api.IEaglerXServerAPI;
import org.semver4j.Semver; import org.semver4j.Semver;
@SuppressWarnings({ "rawtypes" })
public interface IOriginBlacklistPlugin { public interface IOriginBlacklistPlugin {
public String getPluginId(); public String getPluginId();
@@ -17,6 +19,8 @@ public interface IOriginBlacklistPlugin {
public Path getPluginJarPath(); public Path getPluginJarPath();
public IEaglerXServerAPI getEaglerAPI();
public void log(final EnumLogLevel level, final String txt); public void log(final EnumLogLevel level, final String txt);
public void kickPlayer(final Component txt, final OriginBlacklistLoginEvent event); public void kickPlayer(final Component txt, final OriginBlacklistLoginEvent event);

View File

@@ -45,7 +45,6 @@ public final class OriginBlacklistBukkit extends JavaPlugin implements Listener,
private boolean papiPlaceholdersEnabled; private boolean papiPlaceholdersEnabled;
private Object papi; private Object papi;
private OriginBlacklist blacklist; private OriginBlacklist blacklist;
private IEaglerXServerAPI eaglerAPI;
private Metrics metrics; private Metrics metrics;
private CachedServerIcon iconCache; private CachedServerIcon iconCache;
@@ -73,17 +72,16 @@ public final class OriginBlacklistBukkit extends JavaPlugin implements Listener,
this.papi = null; this.papi = null;
} }
this.blacklist = new OriginBlacklist(this); this.blacklist = new OriginBlacklist(this);
this.eaglerAPI = EaglerXServerAPI.instance();
this.getCommand("originblacklist").setExecutor(new OriginBlacklistCommandBukkit(this.blacklist)); this.getCommand("originblacklist").setExecutor(new OriginBlacklistCommandBukkit(this.blacklist));
this.getServer().getPluginManager().registerEvents(this, this); this.getServer().getPluginManager().registerEvents(this, this);
this.blacklist.init(); this.blacklist.init();
if (this.blacklist.isMetricsEnabled()) { if (this.blacklist.isMetricsEnabled()) {
this.metrics = new Metrics(this, OriginBlacklist.BSTATS_ID); this.metrics = new Metrics(this, OriginBlacklist.BSTATS.BUKKIT);
this.metrics.addCustomChart(new AdvancedPie("player_types", () -> { this.metrics.addCustomChart(new AdvancedPie("player_types", () -> {
final Map<String, Integer> playerMap = new HashMap<>(); final Map<String, Integer> playerMap = new HashMap<>();
for (final Player player : Bukkit.getOnlinePlayers()) { for (final Player player : Bukkit.getOnlinePlayers()) {
final boolean eagler = eaglerAPI.isEaglerPlayerByUUID(player.getUniqueId()); final boolean eagler = this.getEaglerAPI().isEaglerPlayerByUUID(player.getUniqueId());
final String key = eagler ? "Eagler" : "Java"; final String key = eagler ? "Eagler" : "Java";
playerMap.put(key, playerMap.getOrDefault(key, 0) + 1); playerMap.put(key, playerMap.getOrDefault(key, 0) + 1);
} }
@@ -112,13 +110,14 @@ public final class OriginBlacklistBukkit extends JavaPlugin implements Listener,
@EventHandler(priority = EventPriority.LOWEST) @EventHandler(priority = EventPriority.LOWEST)
public final void onJavaLogin(final AsyncPlayerPreLoginEvent event) { public final void onJavaLogin(final AsyncPlayerPreLoginEvent event) {
final OPlayer player = new OPlayer(null, event.getName(), event.getUniqueId(), event.getAddress().toString(), OriginBlacklist.UNKNOWN_STR, OriginBlacklist.UNKNOWN_STR, -1); final OPlayer player = new OPlayer(null, event.getName(), event.getUniqueId(), event.getAddress().toString(),
OriginBlacklist.UNKNOWN_STR, OriginBlacklist.UNKNOWN_STR, -1);
this.blacklist.handleLogin(new OriginBlacklistLoginEvent(null, event, EnumConnectionType.JAVA, player)); this.blacklist.handleLogin(new OriginBlacklistLoginEvent(null, event, EnumConnectionType.JAVA, player));
} }
@EventHandler(priority = EventPriority.HIGHEST) @EventHandler(priority = EventPriority.HIGHEST)
public final void onJavaMOTD(final ServerListPingEvent event) { public final void onJavaMOTD(final ServerListPingEvent event) {
final OPlayer player = new OPlayer(null, null, null, event.getAddress().toString(), null, null, -1); final OPlayer player = new OPlayer(null, null, null, event.getAddress().toString(), null, null, -1);
this.blacklist.handleMOTD(new OriginBlacklistMOTDEvent(null, event, EnumConnectionType.JAVA, player)); this.blacklist.handleMOTD(new OriginBlacklistMOTDEvent(null, event, EnumConnectionType.JAVA, player));
} }
@@ -137,6 +136,11 @@ public final class OriginBlacklistBukkit extends JavaPlugin implements Listener,
return Paths.get(this.getFile().getAbsolutePath()); return Paths.get(this.getFile().getAbsolutePath());
} }
@Override
public final IEaglerXServerAPI getEaglerAPI() {
return EaglerXServerAPI.instance();
}
@Override @Override
public final void log(final EnumLogLevel level, final String txt) { public final void log(final EnumLogLevel level, final String txt) {
if (level == EnumLogLevel.WARN) { if (level == EnumLogLevel.WARN) {

View File

@@ -5,6 +5,7 @@ import xyz.webmc.originblacklist.base.enums.EnumConnectionType;
import xyz.webmc.originblacklist.base.enums.EnumLogLevel; import xyz.webmc.originblacklist.base.enums.EnumLogLevel;
import xyz.webmc.originblacklist.base.events.OriginBlacklistLoginEvent; import xyz.webmc.originblacklist.base.events.OriginBlacklistLoginEvent;
import xyz.webmc.originblacklist.base.events.OriginBlacklistMOTDEvent; import xyz.webmc.originblacklist.base.events.OriginBlacklistMOTDEvent;
import xyz.webmc.originblacklist.base.util.EaglerEventPriority;
import xyz.webmc.originblacklist.base.util.IOriginBlacklistPlugin; import xyz.webmc.originblacklist.base.util.IOriginBlacklistPlugin;
import xyz.webmc.originblacklist.base.util.IncompatibleDependencyException; import xyz.webmc.originblacklist.base.util.IncompatibleDependencyException;
import xyz.webmc.originblacklist.base.util.OPlayer; import xyz.webmc.originblacklist.base.util.OPlayer;
@@ -43,7 +44,6 @@ public final class OriginBlacklistBungee extends Plugin implements Listener, IOr
private boolean papiPlaceholdersEnabled; private boolean papiPlaceholdersEnabled;
private Object papi; private Object papi;
private OriginBlacklist blacklist; private OriginBlacklist blacklist;
private IEaglerXServerAPI eaglerAPI;
private Metrics metrics; private Metrics metrics;
@Override @Override
@@ -71,17 +71,17 @@ public final class OriginBlacklistBungee extends Plugin implements Listener, IOr
this.papi = null; this.papi = null;
} }
this.blacklist = new OriginBlacklist(this); this.blacklist = new OriginBlacklist(this);
this.eaglerAPI = EaglerXServerAPI.instance(); this.getProxy().getPluginManager().registerCommand(this,
this.getProxy().getPluginManager().registerCommand(this, new OriginBlacklistCommandBungee(this, this.blacklist, "originblacklist")); new OriginBlacklistCommandBungee(this, this.blacklist, "originblacklist"));
this.getProxy().getPluginManager().registerListener(this, this); this.getProxy().getPluginManager().registerListener(this, this);
this.blacklist.init(); this.blacklist.init();
if (this.blacklist.isMetricsEnabled()) { if (this.blacklist.isMetricsEnabled()) {
this.metrics = new Metrics(this, OriginBlacklist.BSTATS_ID); this.metrics = new Metrics(this, OriginBlacklist.BSTATS.BUNGEE);
this.metrics.addCustomChart(new AdvancedPie("player_types", () -> { this.metrics.addCustomChart(new AdvancedPie("player_types", () -> {
final Map<String, Integer> playerMap = new HashMap<>(); final Map<String, Integer> playerMap = new HashMap<>();
for (final ProxiedPlayer player : this.proxy.getPlayers()) { for (final ProxiedPlayer player : this.proxy.getPlayers()) {
final boolean eagler = eaglerAPI.isEaglerPlayerByUUID(player.getUniqueId()); final boolean eagler = this.getEaglerAPI().isEaglerPlayerByUUID(player.getUniqueId());
final String key = eagler ? "Eagler" : "Java"; final String key = eagler ? "Eagler" : "Java";
playerMap.put(key, playerMap.getOrDefault(key, 0) + 1); playerMap.put(key, playerMap.getOrDefault(key, 0) + 1);
} }
@@ -102,7 +102,7 @@ public final class OriginBlacklistBungee extends Plugin implements Listener, IOr
this.blacklist.handleLogin(new OriginBlacklistLoginEvent(event, null, EnumConnectionType.EAGLER, player)); this.blacklist.handleLogin(new OriginBlacklistLoginEvent(event, null, EnumConnectionType.EAGLER, player));
} }
@EventHandler(priority = EventPriority.LOWEST) @EventHandler(priority = EaglerEventPriority.EAGLER_MOTD_EVENT)
public final void onEaglerMOTD(final EaglercraftMOTDEvent event) { public final void onEaglerMOTD(final EaglercraftMOTDEvent event) {
final OPlayer player = new OPlayer(event.getMOTDConnection(), null, null); final OPlayer player = new OPlayer(event.getMOTDConnection(), null, null);
this.blacklist.handleMOTD(new OriginBlacklistMOTDEvent(event, null, EnumConnectionType.EAGLER, player)); this.blacklist.handleMOTD(new OriginBlacklistMOTDEvent(event, null, EnumConnectionType.EAGLER, player));
@@ -114,7 +114,8 @@ public final class OriginBlacklistBungee extends Plugin implements Listener, IOr
final InetSocketAddress vhost = conn.getVirtualHost(); final InetSocketAddress vhost = conn.getVirtualHost();
final ProxiedPlayer aPlayer = event.getPlayer(); final ProxiedPlayer aPlayer = event.getPlayer();
final OPlayer bPlayer = new OPlayer(null, aPlayer.getName(), aPlayer.getUniqueId(), final OPlayer bPlayer = new OPlayer(null, aPlayer.getName(), aPlayer.getUniqueId(),
aPlayer.getAddress().toString(), aPlayer.getClientBrand(), vhost.getHostString() + vhost.getPort(), conn.getVersion()); aPlayer.getAddress().toString(), aPlayer.getClientBrand(), vhost.getHostString() + vhost.getPort(),
conn.getVersion());
this.blacklist.handleLogin(new OriginBlacklistLoginEvent(null, event, EnumConnectionType.JAVA, bPlayer)); this.blacklist.handleLogin(new OriginBlacklistLoginEvent(null, event, EnumConnectionType.JAVA, bPlayer));
} }
@@ -122,7 +123,8 @@ public final class OriginBlacklistBungee extends Plugin implements Listener, IOr
public final void onJavaHandshake(final PreLoginEvent event) { public final void onJavaHandshake(final PreLoginEvent event) {
final PendingConnection conn = event.getConnection(); final PendingConnection conn = event.getConnection();
final InetSocketAddress vhost = conn.getVirtualHost(); final InetSocketAddress vhost = conn.getVirtualHost();
final OPlayer player = new OPlayer(null, null, null, conn.getAddress().toString(), OriginBlacklist.UNKNOWN_STR, vhost.getHostString() + vhost.getPort(), conn.getVersion()); final OPlayer player = new OPlayer(null, null, null, conn.getAddress().toString(), OriginBlacklist.UNKNOWN_STR,
vhost.getHostString() + vhost.getPort(), conn.getVersion());
this.blacklist.handleLogin(new OriginBlacklistLoginEvent(null, event, EnumConnectionType.JAVA, player)); this.blacklist.handleLogin(new OriginBlacklistLoginEvent(null, event, EnumConnectionType.JAVA, player));
} }
@@ -130,7 +132,8 @@ public final class OriginBlacklistBungee extends Plugin implements Listener, IOr
public final void onJavaMOTD(final ProxyPingEvent event) { public final void onJavaMOTD(final ProxyPingEvent event) {
final PendingConnection conn = event.getConnection(); final PendingConnection conn = event.getConnection();
final InetSocketAddress vhost = conn.getVirtualHost(); final InetSocketAddress vhost = conn.getVirtualHost();
final OPlayer player = new OPlayer(null, null, null, conn.getAddress().toString(), null, vhost.getHostString() + vhost.getPort(), -1); final OPlayer player = new OPlayer(null, null, null, conn.getAddress().toString(), null,
vhost.getHostString() + vhost.getPort(), -1);
this.blacklist.handleMOTD(new OriginBlacklistMOTDEvent(null, event, EnumConnectionType.JAVA, player)); this.blacklist.handleMOTD(new OriginBlacklistMOTDEvent(null, event, EnumConnectionType.JAVA, player));
} }
@@ -149,6 +152,11 @@ public final class OriginBlacklistBungee extends Plugin implements Listener, IOr
return Paths.get(this.getFile().getAbsolutePath()); return Paths.get(this.getFile().getAbsolutePath());
} }
@Override
public final IEaglerXServerAPI getEaglerAPI() {
return EaglerXServerAPI.instance();
}
@Override @Override
public final void log(final EnumLogLevel level, final String txt) { public final void log(final EnumLogLevel level, final String txt) {
if (level == EnumLogLevel.WARN) { if (level == EnumLogLevel.WARN) {

View File

@@ -5,6 +5,7 @@ import xyz.webmc.originblacklist.base.enums.EnumConnectionType;
import xyz.webmc.originblacklist.base.enums.EnumLogLevel; import xyz.webmc.originblacklist.base.enums.EnumLogLevel;
import xyz.webmc.originblacklist.base.events.OriginBlacklistLoginEvent; import xyz.webmc.originblacklist.base.events.OriginBlacklistLoginEvent;
import xyz.webmc.originblacklist.base.events.OriginBlacklistMOTDEvent; import xyz.webmc.originblacklist.base.events.OriginBlacklistMOTDEvent;
import xyz.webmc.originblacklist.base.util.EaglerEventPriority;
import xyz.webmc.originblacklist.base.util.IOriginBlacklistPlugin; import xyz.webmc.originblacklist.base.util.IOriginBlacklistPlugin;
import xyz.webmc.originblacklist.base.util.IncompatibleDependencyException; import xyz.webmc.originblacklist.base.util.IncompatibleDependencyException;
import xyz.webmc.originblacklist.base.util.OPlayer; import xyz.webmc.originblacklist.base.util.OPlayer;
@@ -54,7 +55,6 @@ public final class OriginBlacklistVelocity implements IOriginBlacklistPlugin {
private boolean papiPlaceholdersEnabled; private boolean papiPlaceholdersEnabled;
private Object papi; private Object papi;
private OriginBlacklist blacklist; private OriginBlacklist blacklist;
private IEaglerXServerAPI eaglerAPI;
private Metrics metrics; private Metrics metrics;
@Inject @Inject
@@ -89,16 +89,15 @@ public final class OriginBlacklistVelocity implements IOriginBlacklistPlugin {
this.papi = null; this.papi = null;
} }
this.blacklist = new OriginBlacklist(this); this.blacklist = new OriginBlacklist(this);
this.eaglerAPI = EaglerXServerAPI.instance();
this.proxy.getCommandManager().register("originblacklist", new OriginBlacklistCommandVelocity(this.blacklist)); this.proxy.getCommandManager().register("originblacklist", new OriginBlacklistCommandVelocity(this.blacklist));
this.blacklist.init(); this.blacklist.init();
if (this.blacklist.isMetricsEnabled()) { if (this.blacklist.isMetricsEnabled()) {
this.metrics = this.metricsFactory.make(this, OriginBlacklist.BSTATS_ID); this.metrics = this.metricsFactory.make(this, OriginBlacklist.BSTATS.VELOCITY);
this.metrics.addCustomChart(new AdvancedPie("player_types", () -> { this.metrics.addCustomChart(new AdvancedPie("player_types", () -> {
final Map<String, Integer> playerMap = new HashMap<>(); final Map<String, Integer> playerMap = new HashMap<>();
for (final Player player : this.proxy.getAllPlayers()) { for (final Player player : this.proxy.getAllPlayers()) {
final boolean eagler = eaglerAPI.isEaglerPlayerByUUID(player.getUniqueId()); final boolean eagler = this.getEaglerAPI().isEaglerPlayerByUUID(player.getUniqueId());
final String key = eagler ? "Eagler" : "Java"; final String key = eagler ? "Eagler" : "Java";
playerMap.put(key, playerMap.getOrDefault(key, 0) + 1); playerMap.put(key, playerMap.getOrDefault(key, 0) + 1);
} }
@@ -119,7 +118,7 @@ public final class OriginBlacklistVelocity implements IOriginBlacklistPlugin {
this.blacklist.handleLogin(new OriginBlacklistLoginEvent(event, null, EnumConnectionType.EAGLER, player)); this.blacklist.handleLogin(new OriginBlacklistLoginEvent(event, null, EnumConnectionType.EAGLER, player));
} }
@Subscribe(order = PostOrder.LAST) @Subscribe(priority = EaglerEventPriority.EAGLER_MOTD_EVENT, order = PostOrder.LAST)
public final void onEaglerMOTD(final EaglercraftMOTDEvent event) { public final void onEaglerMOTD(final EaglercraftMOTDEvent event) {
final OPlayer player = new OPlayer(event.getMOTDConnection(), null, null); final OPlayer player = new OPlayer(event.getMOTDConnection(), null, null);
this.blacklist.handleMOTD(new OriginBlacklistMOTDEvent(event, null, EnumConnectionType.EAGLER, player)); this.blacklist.handleMOTD(new OriginBlacklistMOTDEvent(event, null, EnumConnectionType.EAGLER, player));
@@ -149,7 +148,8 @@ public final class OriginBlacklistVelocity implements IOriginBlacklistPlugin {
public final void onJavaMOTD(final ProxyPingEvent event) { public final void onJavaMOTD(final ProxyPingEvent event) {
final InboundConnection conn = event.getConnection(); final InboundConnection conn = event.getConnection();
final InetSocketAddress vhost = conn.getVirtualHost().orElseThrow(); final InetSocketAddress vhost = conn.getVirtualHost().orElseThrow();
final OPlayer player = new OPlayer(null, null, null, conn.getRemoteAddress().getHostString(), vhost.getHostString() + vhost.getPort(), final OPlayer player = new OPlayer(null, null, null, conn.getRemoteAddress().getHostString(),
vhost.getHostString() + vhost.getPort(),
null, -1); null, -1);
this.blacklist.handleMOTD(new OriginBlacklistMOTDEvent(null, event, EnumConnectionType.JAVA, player)); this.blacklist.handleMOTD(new OriginBlacklistMOTDEvent(null, event, EnumConnectionType.JAVA, player));
} }
@@ -173,6 +173,11 @@ public final class OriginBlacklistVelocity implements IOriginBlacklistPlugin {
} }
} }
@Override
public final IEaglerXServerAPI getEaglerAPI() {
return EaglerXServerAPI.instance();
}
@Override @Override
public final void log(final EnumLogLevel level, final String txt) { public final void log(final EnumLogLevel level, final String txt) {
if (level == EnumLogLevel.WARN) { if (level == EnumLogLevel.WARN) {