This commit is contained in:
Colbster937 2025-05-07 18:54:56 -05:00
parent 7de763e640
commit 1e55bc0ecd
13 changed files with 110 additions and 83 deletions

35
.github/workflows/build.yml vendored Normal file
View File

@ -0,0 +1,35 @@
name: Auto-update clients
on:
schedule:
- cron: '0 0 * * *'
workflow_dispatch:
jobs:
build:
if: ${{ github.ref == 'refs/heads/main' }}
concurrency:
group: ${{ github.workflow }}
cancel-in-progress: true
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Java
uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '17'
- name: Build Jar
run: |
gradle wrapper
./gradlew shadowJar
- name: Publish Jar
uses: actions/upload-artifact@v4
with:
name: OriginBlacklist
path: build/libs/OriginBlacklist.jar

1
.gitignore vendored
View File

@ -1,6 +1,7 @@
**/.DS_Store **/.DS_Store
.idea .idea
.gradle .gradle
gradle
build build
run run
gradlew gradlew

View File

@ -15,6 +15,7 @@ basically just a reimplementation of originblacklist but for eaglerxserver
<br>_<sub><span style="color:gray">Bungee and Bukkit are should work, but have bugs.</span></sub>_ <br>_<sub><span style="color:gray">Bungee and Bukkit are should work, but have bugs.</span></sub>_
- [x] Send blacklists to a discord webhook - [x] Send blacklists to a discord webhook
- [ ] Blacklist subscription URLs - [ ] Blacklist subscription URLs
- [ ] Simple blacklist command
- [ ] Blacklist -> Whitelist - [ ] Blacklist -> Whitelist
- [ ] IP blacklisting - [ ] IP blacklisting
@ -26,5 +27,5 @@ basically just a reimplementation of originblacklist but for eaglerxserver
$ git clone https://github.com/colbster937/originblacklist.git $ git clone https://github.com/colbster937/originblacklist.git
$ cd originblacklist $ cd originblacklist
$ gradle wrapper $ gradle wrapper
$ ./gradle.<bat|sh> shadowJar $ ./gradlew shadowJar
``` ```

View File

@ -8,7 +8,9 @@ plugins {
group = 'dev.colbster937' group = 'dev.colbster937'
version = '1.0.1' version = '1.0.2'
description = 'A reimplementation of OriginBlacklist for EaglerXServer'
def targetJavaVersion = 17
repositories { repositories {
mavenCentral() mavenCentral()
@ -47,47 +49,36 @@ dependencies {
compileOnly("net.lax1dude.eaglercraft.backend:api-bungee:1.0.0") compileOnly("net.lax1dude.eaglercraft.backend:api-bungee:1.0.0")
compileOnly("net.lax1dude.eaglercraft.backend:api-bukkit:1.0.0") compileOnly("net.lax1dude.eaglercraft.backend:api-bukkit:1.0.0")
implementation("org.yaml:snakeyaml:2.2") implementation("org.yaml:snakeyaml:2.2")
implementation("net.kyori:adventure-api:4.20.0")
implementation("net.kyori:adventure-text-serializer-legacy:4.20.0") implementation("net.kyori:adventure-text-serializer-legacy:4.20.0")
implementation("net.kyori:adventure-text-minimessage:4.20.0") implementation("net.kyori:adventure-text-minimessage:4.20.0")
} }
tasks { tasks {
runVelocity { runVelocity {
// Configure the Velocity version for our task.
// This is the only required configuration besides applying the plugin.
// Your plugin's jar (or shadowJar if present) will be used automatically.
velocityVersion("3.3.0-SNAPSHOT") velocityVersion("3.3.0-SNAPSHOT")
} }
} }
def targetJavaVersion = 17
java { java {
toolchain.languageVersion = JavaLanguageVersion.of(targetJavaVersion) toolchain.languageVersion = JavaLanguageVersion.of(targetJavaVersion)
} }
processResources {
filesMatching(['plugin.yml', 'bungee.yml', 'velocity-plugin.json']) {
expand(
version: project.version,
description: project.description
)
}
}
shadowJar { shadowJar {
relocate 'org.yaml.snakeyaml', 'dev.colbster937.shaded.snakeyaml' relocate 'org.yaml.snakeyaml', 'dev.colbster937.shaded.snakeyaml'
archiveClassifier.set('all') archiveVersion.set('')
archiveClassifier.set('')
} }
tasks.withType(JavaCompile).configureEach { tasks.withType(JavaCompile).configureEach {
options.encoding = 'UTF-8' options.encoding = 'UTF-8'
options.release.set(targetJavaVersion) options.release.set(targetJavaVersion)
} }
/*def templateSource = file('src/main/templates')
def templateDest = layout.buildDirectory.dir('generated/sources/templates')
def generateTemplates = tasks.register('generateTemplates', Copy) { task ->
def props = ['version': project.version]
task.inputs.properties props
task.from templateSource
task.into templateDest
task.expand props
}
sourceSets.main.java.srcDir(generateTemplates.map { it.outputs })
project.idea.project.settings.taskTriggers.afterSync generateTemplates
project.eclipse.synchronizationTasks(generateTemplates)*/

Binary file not shown.

View File

@ -1,7 +0,0 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

View File

@ -1,11 +1,10 @@
package dev.colbster937.originblacklist.base; package dev.colbster937.originblacklist.base;
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.*;
import net.lax1dude.eaglercraft.backend.server.api.IEaglerPlayer; import net.lax1dude.eaglercraft.backend.server.api.event.IEaglercraftLoginEvent;
import net.lax1dude.eaglercraft.backend.server.api.EnumWebSocketHeader;
import net.lax1dude.eaglercraft.backend.server.api.event.IEaglercraftInitializePlayerEvent;
import net.lax1dude.eaglercraft.backend.server.api.event.IEaglercraftMOTDEvent; import net.lax1dude.eaglercraft.backend.server.api.event.IEaglercraftMOTDEvent;
import net.lax1dude.eaglercraft.backend.server.api.query.IMOTDConnection; import net.lax1dude.eaglercraft.backend.server.api.query.IMOTDConnection;
@ -46,27 +45,30 @@ public class Base {
void error(String msg); void error(String msg);
} }
public static void handleConnection(IEaglercraftInitializePlayerEvent e) { public static void handleConnection(IEaglercraftLoginEvent e) {
IEaglerPlayer plr = e.getPlayer(); IEaglerLoginConnection conn = e.getLoginConnection();
String origin = plr.getWebSocketHeader(EnumWebSocketHeader.HEADER_ORIGIN); String origin = conn.getWebSocketHeader(EnumWebSocketHeader.HEADER_ORIGIN);
String brand = plr.getEaglerBrandString(); String brand = conn.getEaglerBrandString();
if ((origin != "null" || origin != null) && !config.blacklist.missing_origin) { if ((origin != "null" || origin != null) && !config.blacklist.missing_origin) {
for (String origin1 : config.blacklist.origins) { for (String origin1 : config.blacklist.origins) {
if (matches(origin, origin1)) { if (matches(origin, origin1)) {
plr.disconnect(kick("origin", "website", origin)); e.setKickMessage(kick("origin", "website", origin));
webhook(plr, origin, brand, "origin"); webhook(conn, origin, brand, "origin");
return; return;
} }
} }
} else { } else {
plr.disconnect(kick("origin", "website", origin)); if (origin != "null" || origin != null) {
webhook(plr, "null", brand, "origin"); e.setKickMessage(kick("origin", "website", origin));
webhook(conn, "null", brand, "origin");
return;
}
} }
if (brand != "null" && brand != null) { if (brand != "null" && brand != null) {
for (String brand1 : config.blacklist.brands) { for (String brand1 : config.blacklist.brands) {
if (matches(brand, brand1)) { if (matches(brand, brand1)) {
plr.disconnect(kick("brand", "client", brand)); e.setKickMessage(kick("brand", "client", brand));
webhook(plr, origin, brand, "brand"); webhook(conn, origin, brand, "brand");
return; return;
} }
} }
@ -82,9 +84,11 @@ public class Base {
.replace("%blocktype%", "origin") .replace("%blocktype%", "origin")
.replace("%easyblocktype%", "website") .replace("%easyblocktype%", "website")
.replace("%blocked%", origin)) .replace("%blocked%", origin))
.map(line -> LegacyComponentSerializer.legacySection() .map(line -> LegacyComponentSerializer.legacySection().serialize(
.serialize(MiniMessage.miniMessage().deserialize(line))) MiniMessage.miniMessage().deserialize(
.collect(Collectors.toList()); line
)
)).collect(Collectors.toList());
if ((origin != "null" || origin != null) && !config.blacklist.missing_origin) { if ((origin != "null" || origin != null) && !config.blacklist.missing_origin) {
for (String origin1 : config.blacklist.origins) { for (String origin1 : config.blacklist.origins) {
if (matches(origin, origin1)) { if (matches(origin, origin1)) {
@ -93,7 +97,9 @@ public class Base {
} }
} }
} else { } else {
setMOTD(conn, m); if (origin != "null" || origin != null) {
setMOTD(conn, m);
}
} }
} }
} }
@ -131,19 +137,16 @@ public class Base {
return text1.toLowerCase().matches(text2.replace(".", "\\.").replaceAll("\\*", ".*").toLowerCase()); return text1.toLowerCase().matches(text2.replace(".", "\\.").replaceAll("\\*", ".*").toLowerCase());
} }
public static String kick(String type, String easytype, String value) { public static Component kick(String type, String easytype, String value) {
return LegacyComponentSerializer.legacySection().serialize( return MiniMessage.miniMessage().deserialize(
MiniMessage.miniMessage().deserialize( config.messages.kick
config.messages.kick .replace("%blocktype%", type)
.replace("%blocktype%", type) .replace("%easyblocktype%", easytype)
.replace("%easyblocktype%", easytype) .replace("%blocked%", value)
.replace("%blocked%", value)
)
); );
} }
public static void webhook(IEaglerPendingConnection plr, String origin, String brand, String type) {
public static void webhook(IEaglerPlayer plr, String origin, String brand, String type) {
String webhook = config.discord.webhook; String webhook = config.discord.webhook;
if (webhook == null || webhook.isBlank()) return; if (webhook == null || webhook.isBlank()) return;
@ -165,7 +168,7 @@ public class Base {
} }
] ]
} }
""", type, plr.getUsername(), addr, protocol, origin, brand, userAgent, rewind); """, type, plr.getAuthUsername(), addr, protocol, origin, brand, userAgent, rewind);
try { try {
HttpURLConnection conn = (HttpURLConnection) new URL(webhook).openConnection(); HttpURLConnection conn = (HttpURLConnection) new URL(webhook).openConnection();

View File

@ -2,7 +2,7 @@ package dev.colbster937.originblacklist.bukkit;
import dev.colbster937.originblacklist.base.Base; import dev.colbster937.originblacklist.base.Base;
import net.lax1dude.eaglercraft.backend.server.api.bukkit.EaglerXServerAPI; import net.lax1dude.eaglercraft.backend.server.api.bukkit.EaglerXServerAPI;
import net.lax1dude.eaglercraft.backend.server.api.bukkit.event.EaglercraftInitializePlayerEvent; import net.lax1dude.eaglercraft.backend.server.api.bukkit.event.EaglercraftLoginEvent;
import net.lax1dude.eaglercraft.backend.server.api.bukkit.event.EaglercraftMOTDEvent; import net.lax1dude.eaglercraft.backend.server.api.bukkit.event.EaglercraftMOTDEvent;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
@ -29,7 +29,7 @@ public class OriginBlacklistBukkit extends JavaPlugin implements Listener {
} }
@EventHandler @EventHandler
public void onLogin(EaglercraftInitializePlayerEvent event) { public void onLogin(EaglercraftLoginEvent event) {
Base.handleConnection(event); Base.handleConnection(event);
} }

View File

@ -2,7 +2,7 @@ package dev.colbster937.originblacklist.bungee;
import dev.colbster937.originblacklist.base.Base; import dev.colbster937.originblacklist.base.Base;
import net.lax1dude.eaglercraft.backend.server.api.bungee.EaglerXServerAPI; import net.lax1dude.eaglercraft.backend.server.api.bungee.EaglerXServerAPI;
import net.lax1dude.eaglercraft.backend.server.api.bungee.event.EaglercraftInitializePlayerEvent; import net.lax1dude.eaglercraft.backend.server.api.bungee.event.EaglercraftLoginEvent;
import net.lax1dude.eaglercraft.backend.server.api.bungee.event.EaglercraftMOTDEvent; import net.lax1dude.eaglercraft.backend.server.api.bungee.event.EaglercraftMOTDEvent;
import net.md_5.bungee.api.plugin.Plugin; import net.md_5.bungee.api.plugin.Plugin;
import net.md_5.bungee.api.plugin.Listener; import net.md_5.bungee.api.plugin.Listener;
@ -29,7 +29,7 @@ public class OriginBlacklistBungee extends Plugin implements Listener {
} }
@EventHandler @EventHandler
public void onLogin(EaglercraftInitializePlayerEvent event) { public void onLogin(EaglercraftLoginEvent event) {
Base.handleConnection(event); Base.handleConnection(event);
} }

View File

@ -3,24 +3,13 @@ package dev.colbster937.originblacklist.velocity;
import com.google.inject.Inject; import com.google.inject.Inject;
import com.velocitypowered.api.event.proxy.ProxyInitializeEvent; import com.velocitypowered.api.event.proxy.ProxyInitializeEvent;
import com.velocitypowered.api.event.Subscribe; import com.velocitypowered.api.event.Subscribe;
import com.velocitypowered.api.plugin.Plugin;
import com.velocitypowered.api.plugin.Dependency;
import com.velocitypowered.api.proxy.ProxyServer; import com.velocitypowered.api.proxy.ProxyServer;
import dev.colbster937.originblacklist.base.Base; import dev.colbster937.originblacklist.base.Base;
import net.lax1dude.eaglercraft.backend.server.api.velocity.EaglerXServerAPI; import net.lax1dude.eaglercraft.backend.server.api.velocity.EaglerXServerAPI;
import net.lax1dude.eaglercraft.backend.server.api.velocity.event.EaglercraftInitializePlayerEvent; import net.lax1dude.eaglercraft.backend.server.api.velocity.event.EaglercraftLoginEvent;
import net.lax1dude.eaglercraft.backend.server.api.event.IEaglercraftMOTDEvent;
import net.lax1dude.eaglercraft.backend.server.api.velocity.event.EaglercraftMOTDEvent; import net.lax1dude.eaglercraft.backend.server.api.velocity.event.EaglercraftMOTDEvent;
import org.slf4j.Logger; import org.slf4j.Logger;
@Plugin(
id = "originblacklist",
name = "OriginBlacklist",
version = "1.0.1",
authors = {"Colbster937"},
description = "A reimplementation of OriginBlacklist for EaglerXServer",
dependencies = {@Dependency(id = "eaglerxserver")}
)
public class OriginBlacklistVelocity { public class OriginBlacklistVelocity {
private final ProxyServer proxy; private final ProxyServer proxy;
@ -47,12 +36,12 @@ public class OriginBlacklistVelocity {
} }
@Subscribe @Subscribe
public void onLogin(EaglercraftInitializePlayerEvent event) { public void onLogin(EaglercraftLoginEvent event) {
Base.handleConnection(event); Base.handleConnection(event);
} }
@Subscribe @Subscribe
public void onMOTD(IEaglercraftMOTDEvent event) { public void onMOTD(EaglercraftMOTDEvent event) {
Base.handleMOTD(event); Base.handleMOTD(event);
} }
} }

View File

@ -1,7 +1,7 @@
name: OriginBlacklist name: OriginBlacklist
version: 1.0.1 version: ${version}
main: dev.colbster937.originblacklist.bungee.OriginBlacklistBungee main: dev.colbster937.originblacklist.bungee.OriginBlacklistBungee
description: A reimplementation of OriginBlacklist for EaglerXServer description: ${description}
author: Colbster937 author: Colbster937
depends: depends:
- EaglercraftXServer - EaglercraftXServer

View File

@ -1,7 +1,7 @@
name: OriginBlacklist name: OriginBlacklist
version: 1.0.1 version: ${version}
main: dev.colbster937.originblacklist.bukkit.OriginBlacklistBukkit main: dev.colbster937.originblacklist.bukkit.OriginBlacklistBukkit
description: A reimplementation of OriginBlacklist for EaglerXServer description: ${description}
author: Colbster937 author: Colbster937
depend: depend:
- EaglercraftXServer - EaglercraftXServer

View File

@ -0,0 +1,14 @@
{
"id": "originblacklist",
"name": "OriginBlacklist",
"version": "${version}",
"description": "${description}",
"main": "dev.colbster937.originblacklist.velocity.OriginBlacklistVelocity",
"authors": ["Colbster937"],
"dependencies": [
{
"id": "eaglerxserver",
"optional": false
}
]
}