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
.idea
.gradle
gradle
build
run
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>_
- [x] Send blacklists to a discord webhook
- [ ] Blacklist subscription URLs
- [ ] Simple blacklist command
- [ ] Blacklist -> Whitelist
- [ ] IP blacklisting
@ -26,5 +27,5 @@ basically just a reimplementation of originblacklist but for eaglerxserver
$ git clone https://github.com/colbster937/originblacklist.git
$ cd originblacklist
$ gradle wrapper
$ ./gradle.<bat|sh> shadowJar
$ ./gradlew shadowJar
```

View File

@ -8,7 +8,9 @@ plugins {
group = 'dev.colbster937'
version = '1.0.1'
version = '1.0.2'
description = 'A reimplementation of OriginBlacklist for EaglerXServer'
def targetJavaVersion = 17
repositories {
mavenCentral()
@ -47,47 +49,36 @@ dependencies {
compileOnly("net.lax1dude.eaglercraft.backend:api-bungee:1.0.0")
compileOnly("net.lax1dude.eaglercraft.backend:api-bukkit:1.0.0")
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-minimessage:4.20.0")
}
tasks {
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")
}
}
def targetJavaVersion = 17
java {
toolchain.languageVersion = JavaLanguageVersion.of(targetJavaVersion)
}
processResources {
filesMatching(['plugin.yml', 'bungee.yml', 'velocity-plugin.json']) {
expand(
version: project.version,
description: project.description
)
}
}
shadowJar {
relocate 'org.yaml.snakeyaml', 'dev.colbster937.shaded.snakeyaml'
archiveClassifier.set('all')
archiveVersion.set('')
archiveClassifier.set('')
}
tasks.withType(JavaCompile).configureEach {
options.encoding = 'UTF-8'
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;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.MiniMessage;
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
import net.lax1dude.eaglercraft.backend.server.api.IEaglerXServerAPI;
import net.lax1dude.eaglercraft.backend.server.api.IEaglerPlayer;
import net.lax1dude.eaglercraft.backend.server.api.EnumWebSocketHeader;
import net.lax1dude.eaglercraft.backend.server.api.event.IEaglercraftInitializePlayerEvent;
import net.lax1dude.eaglercraft.backend.server.api.*;
import net.lax1dude.eaglercraft.backend.server.api.event.IEaglercraftLoginEvent;
import net.lax1dude.eaglercraft.backend.server.api.event.IEaglercraftMOTDEvent;
import net.lax1dude.eaglercraft.backend.server.api.query.IMOTDConnection;
@ -46,27 +45,30 @@ public class Base {
void error(String msg);
}
public static void handleConnection(IEaglercraftInitializePlayerEvent e) {
IEaglerPlayer plr = e.getPlayer();
String origin = plr.getWebSocketHeader(EnumWebSocketHeader.HEADER_ORIGIN);
String brand = plr.getEaglerBrandString();
public static void handleConnection(IEaglercraftLoginEvent e) {
IEaglerLoginConnection conn = e.getLoginConnection();
String origin = conn.getWebSocketHeader(EnumWebSocketHeader.HEADER_ORIGIN);
String brand = conn.getEaglerBrandString();
if ((origin != "null" || origin != null) && !config.blacklist.missing_origin) {
for (String origin1 : config.blacklist.origins) {
if (matches(origin, origin1)) {
plr.disconnect(kick("origin", "website", origin));
webhook(plr, origin, brand, "origin");
e.setKickMessage(kick("origin", "website", origin));
webhook(conn, origin, brand, "origin");
return;
}
}
} else {
plr.disconnect(kick("origin", "website", origin));
webhook(plr, "null", brand, "origin");
if (origin != "null" || origin != null) {
e.setKickMessage(kick("origin", "website", origin));
webhook(conn, "null", brand, "origin");
return;
}
}
if (brand != "null" && brand != null) {
for (String brand1 : config.blacklist.brands) {
if (matches(brand, brand1)) {
plr.disconnect(kick("brand", "client", brand));
webhook(plr, origin, brand, "brand");
e.setKickMessage(kick("brand", "client", brand));
webhook(conn, origin, brand, "brand");
return;
}
}
@ -82,9 +84,11 @@ public class Base {
.replace("%blocktype%", "origin")
.replace("%easyblocktype%", "website")
.replace("%blocked%", origin))
.map(line -> LegacyComponentSerializer.legacySection()
.serialize(MiniMessage.miniMessage().deserialize(line)))
.collect(Collectors.toList());
.map(line -> LegacyComponentSerializer.legacySection().serialize(
MiniMessage.miniMessage().deserialize(
line
)
)).collect(Collectors.toList());
if ((origin != "null" || origin != null) && !config.blacklist.missing_origin) {
for (String origin1 : config.blacklist.origins) {
if (matches(origin, origin1)) {
@ -93,10 +97,12 @@ public class Base {
}
}
} else {
if (origin != "null" || origin != null) {
setMOTD(conn, m);
}
}
}
}
public static void setMOTD(IMOTDConnection conn, List<String> m) {
conn.setServerMOTD(m);
@ -131,19 +137,16 @@ public class Base {
return text1.toLowerCase().matches(text2.replace(".", "\\.").replaceAll("\\*", ".*").toLowerCase());
}
public static String kick(String type, String easytype, String value) {
return LegacyComponentSerializer.legacySection().serialize(
MiniMessage.miniMessage().deserialize(
public static Component kick(String type, String easytype, String value) {
return MiniMessage.miniMessage().deserialize(
config.messages.kick
.replace("%blocktype%", type)
.replace("%easyblocktype%", easytype)
.replace("%blocked%", value)
)
);
}
public static void webhook(IEaglerPlayer plr, String origin, String brand, String type) {
public static void webhook(IEaglerPendingConnection plr, String origin, String brand, String type) {
String webhook = config.discord.webhook;
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 {
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 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 org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
@ -29,7 +29,7 @@ public class OriginBlacklistBukkit extends JavaPlugin implements Listener {
}
@EventHandler
public void onLogin(EaglercraftInitializePlayerEvent event) {
public void onLogin(EaglercraftLoginEvent event) {
Base.handleConnection(event);
}

View File

@ -2,7 +2,7 @@ package dev.colbster937.originblacklist.bungee;
import dev.colbster937.originblacklist.base.Base;
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.md_5.bungee.api.plugin.Plugin;
import net.md_5.bungee.api.plugin.Listener;
@ -29,7 +29,7 @@ public class OriginBlacklistBungee extends Plugin implements Listener {
}
@EventHandler
public void onLogin(EaglercraftInitializePlayerEvent event) {
public void onLogin(EaglercraftLoginEvent event) {
Base.handleConnection(event);
}

View File

@ -3,24 +3,13 @@ package dev.colbster937.originblacklist.velocity;
import com.google.inject.Inject;
import com.velocitypowered.api.event.proxy.ProxyInitializeEvent;
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 dev.colbster937.originblacklist.base.Base;
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.event.IEaglercraftMOTDEvent;
import net.lax1dude.eaglercraft.backend.server.api.velocity.event.EaglercraftLoginEvent;
import net.lax1dude.eaglercraft.backend.server.api.velocity.event.EaglercraftMOTDEvent;
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 {
private final ProxyServer proxy;
@ -47,12 +36,12 @@ public class OriginBlacklistVelocity {
}
@Subscribe
public void onLogin(EaglercraftInitializePlayerEvent event) {
public void onLogin(EaglercraftLoginEvent event) {
Base.handleConnection(event);
}
@Subscribe
public void onMOTD(IEaglercraftMOTDEvent event) {
public void onMOTD(EaglercraftMOTDEvent event) {
Base.handleMOTD(event);
}
}

View File

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

View File

@ -1,7 +1,7 @@
name: OriginBlacklist
version: 1.0.1
version: ${version}
main: dev.colbster937.originblacklist.bukkit.OriginBlacklistBukkit
description: A reimplementation of OriginBlacklist for EaglerXServer
description: ${description}
author: Colbster937
depend:
- 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
}
]
}