Compare commits

...
31 Commits
Author SHA1 Message Date
Jason Penilla bcfe67fc6f release: Version 2.0.5 2021-12-02 01:39:21 -08:00
Jason Penilla 10775836cb Update gradle wrapper 2021-12-01 21:33:45 -08:00
Jason Penilla 3a07128bd0 Update adventure-platform 2021-12-01 21:10:22 -08:00
Jason Penilla 336d613274 velocity: Use new event api 2021-12-01 02:16:34 -08:00
Jason Penilla a742fd9b62 fabric: Use release adventure-platform 2021-12-01 01:38:51 -08:00
Jason Penilla 577a77951a fabric: Bump java target 2021-12-01 01:34:06 -08:00
Jason Penilla f8456bec5c fabric: Build against 1.18 release 2021-12-01 01:30:50 -08:00
Jason Penilla b086550eae bukkit: Test on 1.18 2021-12-01 01:30:19 -08:00
Jason Penilla f512ca6174 Update loom 2021-11-14 00:27:08 -08:00
Jason Penilla 82b3a35a9e Update gradle wrapper and dependencies 2021-11-09 15:46:08 -08:00
Jason Penilla 5f4e8efa45 Enable build cache 2021-10-13 23:51:52 -07:00
Jason Penilla 22a47511a2 Use minimotd instead of minimotd-sponge7 and minimotd-sponge8 for Sponge platform plugin ids. 2021-10-13 23:51:24 -07:00
Jason Penilla 972ac8fcc5 Update shadow, adventure, junit 2021-10-09 15:01:34 -07:00
Jason Penilla c7f2d5f33b Improve Sponge 8 legacy check 2021-09-26 12:45:23 -07:00
Jason Penilla 2bc4a4caac Update for MiniMessage changes 2021-09-26 12:10:48 -07:00
Jason Penilla 3577d67820 fabric: Require >=1.17 2021-09-26 11:26:45 -07:00
Jason Penilla 9392601232 Simplify Components#ofChildren 2021-09-26 11:04:56 -07:00
Jason Penilla e4071d390c Update dependencies 2021-09-17 21:55:27 -07:00
Jason Penilla c4ca735e8b build: Update Gradle wrapper to 7.2 2021-08-27 09:33:36 -07:00
Jason Penilla 42ccd182b0 build: Update plugin-yml and run-paper 2021-08-27 09:33:13 -07:00
Jason Penilla 99e7954612 Improve handling of malformed config files 2021-08-12 03:38:42 -07:00
Jason Penilla bcf2589eb0 2.0.5-SNAPSHOT 2021-08-10 15:46:53 -07:00
Jason Penilla fe41b21d9b release: Version 2.0.4 2021-08-10 15:40:03 -07:00
Jason Penilla cbbe201710 Minor clean up 2021-08-10 15:14:12 -07:00
Jason Penilla 30d58fc0f9 2.0.4-SNAPSHOT 2021-07-30 14:45:43 -07:00
Jason Penilla 067ec4ea65 Build and test against 1.17.1 2021-07-23 23:51:06 -07:00
Jason Penilla 22f805f4ab build: Update Gradle & Indra 2021-07-23 23:50:36 -07:00
Jason Penilla ed21f45573 fabric: Use quiet-fabric-loom 2021-07-23 23:50:36 -07:00
Jason Penilla 41b1fdffe3 sponge 8: Update for Sponge API changes 2021-07-23 23:50:36 -07:00
Jason Penilla 142f7a34f7 Remove final from virtualHostTestMode field
This was not meant to be final in the first place, however this also was causing the config to silently fail to deserialize.
2021-07-13 22:53:59 -07:00
Jason Penilla ed7fe3591b Update Velocity API dependency to 3.0.0 2021-07-06 02:34:09 -07:00
34 changed files with 350 additions and 214 deletions

No files matched your search

+1 -1
View File
@@ -9,7 +9,7 @@ repositories {
dependencies {
implementation(libs.indraCommon)
implementation(libs.shadow)
implementation(libs.testLoggerPlugin)
implementation(libs.testLogger)
// https://github.com/gradle/gradle/issues/15383#issuecomment-779893192
implementation(files(libs.javaClass.superclass.protectionDomain.codeSource.location))
+6 -5
View File
@@ -1,17 +1,18 @@
import org.gradle.api.DefaultTask
import org.gradle.api.file.RegularFileProperty
import org.gradle.api.tasks.InputFile
import org.gradle.api.tasks.OutputFile
import org.gradle.api.tasks.TaskAction
abstract class FileCopyTask : DefaultTask() {
@InputFile
val fileToCopy = project.objects.fileProperty()
@get:InputFile
abstract val fileToCopy: RegularFileProperty
@OutputFile
val destination = project.objects.fileProperty()
@get:OutputFile
abstract val destination: RegularFileProperty
@TaskAction
private fun copyFile() {
fun copyFile() {
destination.get().asFile.parentFile.mkdirs()
fileToCopy.get().asFile.copyTo(destination.get().asFile, overwrite = true)
}
@@ -3,6 +3,6 @@ import org.gradle.api.provider.Property
import org.gradle.api.tasks.bundling.AbstractArchiveTask
import org.gradle.kotlin.dsl.property
open class MiniMOTDPlatformExtension(private val project: Project) {
abstract class MiniMOTDPlatformExtension(project: Project) {
val jarTask: Property<AbstractArchiveTask> = project.objects.property()
}
@@ -1,3 +1,3 @@
plugins {
id("base")
base
}
@@ -14,5 +14,5 @@ tasks {
}
extensions.configure<MiniMOTDPlatformExtension> {
jarTask.set(tasks.named<AbstractArchiveTask>("shadowJar"))
jarTask.set(tasks.shadowJar)
}
+1 -1
View File
@@ -3,5 +3,5 @@ plugins {
}
group = "xyz.jpenilla"
version = "2.0.3"
version = "2.0.5"
description = "Use MiniMessage text formatting in the server list MOTD."
+1 -4
View File
@@ -14,10 +14,7 @@ dependencies {
tasks {
runServer {
minecraftVersion("1.17")
}
generateBukkitPluginDescription {
mustRunAfter(clean)
minecraftVersion("1.18")
}
shadowJar {
commonRelocation("org.slf4j")
@@ -34,7 +34,7 @@ import xyz.jpenilla.minimotd.common.MiniMOTD;
import xyz.jpenilla.minimotd.common.PingResponse;
import xyz.jpenilla.minimotd.common.config.MiniMOTDConfig;
final class PaperPingListener implements Listener {
public final class PaperPingListener implements Listener {
private final MiniMOTDPlugin plugin;
private final LegacyComponentSerializer unusualHexSerializer = LegacyComponentSerializer.builder().hexColors().useUnusualXRepeatedCharacterHexFormat().build();
private final MiniMOTD<CachedServerIcon> miniMOTD;
@@ -33,7 +33,7 @@ import xyz.jpenilla.minimotd.common.MiniMOTD;
import xyz.jpenilla.minimotd.common.PingResponse;
import xyz.jpenilla.minimotd.common.config.MiniMOTDConfig;
final class PingListener implements Listener {
public final class PingListener implements Listener {
private final MiniMOTD<CachedServerIcon> miniMOTD;
private final LegacyComponentSerializer unusualHexSerializer = LegacyComponentSerializer.builder().hexColors().useUnusualXRepeatedCharacterHexFormat().build();
private final MiniMOTDPlugin plugin;
-3
View File
@@ -12,9 +12,6 @@ dependencies {
}
tasks {
generateBungeePluginDescription {
mustRunAfter(clean)
}
shadowJar {
commonRelocation("org.slf4j")
commonRelocation("io.leangen.geantyref")
@@ -26,10 +26,10 @@ package xyz.jpenilla.minimotd.common;
import java.util.stream.Stream;
import net.kyori.adventure.audience.Audience;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.TextComponent;
import net.kyori.adventure.text.minimessage.MiniMessage;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.framework.qual.DefaultQualifier;
import xyz.jpenilla.minimotd.common.util.Components;
import static net.kyori.adventure.text.Component.space;
import static net.kyori.adventure.text.Component.text;
@@ -38,6 +38,7 @@ import static net.kyori.adventure.text.event.ClickEvent.openUrl;
import static net.kyori.adventure.text.event.ClickEvent.runCommand;
import static net.kyori.adventure.text.format.NamedTextColor.GRAY;
import static net.kyori.adventure.text.format.NamedTextColor.GREEN;
import static net.kyori.adventure.text.format.NamedTextColor.RED;
import static net.kyori.adventure.text.format.NamedTextColor.WHITE;
import static net.kyori.adventure.text.format.TextColor.color;
import static net.kyori.adventure.text.format.TextDecoration.STRIKETHROUGH;
@@ -72,8 +73,19 @@ public final class CommandHandler {
}
public void reload(final Audience audience) {
this.miniMOTD.reload();
audience.sendMessage(TextComponent.ofChildren(
try {
this.miniMOTD.reload();
} catch (final Exception ex) {
this.miniMOTD.logger().warn("Failed to reload MiniMOTD. Ensure there are no errors in your config files.", ex);
audience.sendMessage(Components.ofChildren(
Constants.COMMAND_PREFIX,
space(),
text("Failed to reload MiniMOTD. Ensure there are no errors in your config files. See console for more details.", RED)
));
return;
}
audience.sendMessage(Components.ofChildren(
Constants.COMMAND_PREFIX,
space(),
text("Done reloading configuration.", GREEN)
@@ -109,7 +121,7 @@ public final class CommandHandler {
}
private static Component miniMessage(final String message) {
return MiniMessage.get().parse(message);
return MiniMessage.miniMessage().parse(message);
}
@FunctionalInterface
@@ -44,5 +44,5 @@ public final class Constants {
public static final int MINECRAFT_1_16_PROTOCOL_VERSION = 735;
public static final Component COMMAND_PREFIX = MiniMessage.get().parse("<white>[</white><gradient:#0047AB:#ADD8E6>" + PluginMetadata.NAME + "<white>]</white>");
public static final Component COMMAND_PREFIX = MiniMessage.miniMessage().parse("<white>[</white><gradient:#0047AB:#ADD8E6>" + PluginMetadata.NAME + "</gradient><white>]</white>");
}
@@ -26,7 +26,6 @@ package xyz.jpenilla.minimotd.common;
import java.nio.file.Path;
import java.util.concurrent.ThreadLocalRandom;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.TextComponent;
import net.kyori.adventure.text.minimessage.MiniMessage;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable;
@@ -34,8 +33,11 @@ import org.checkerframework.framework.qual.DefaultQualifier;
import org.slf4j.Logger;
import xyz.jpenilla.minimotd.common.config.ConfigManager;
import xyz.jpenilla.minimotd.common.config.MiniMOTDConfig;
import xyz.jpenilla.minimotd.common.util.Components;
import static net.kyori.adventure.text.Component.newline;
import static net.kyori.adventure.text.minimessage.Template.template;
import static net.kyori.adventure.text.minimessage.template.TemplateResolver.templates;
@DefaultQualifier(NonNull.class)
public final class MiniMOTD<I> {
@@ -45,32 +47,37 @@ public final class MiniMOTD<I> {
public MiniMOTD(final MiniMOTDPlatform<I> platform) {
this.platform = platform;
this.iconManager = new IconManager<>(this);
this.configManager = new ConfigManager(this);
this.configManager.loadConfigs();
try {
this.iconManager = new IconManager<>(this);
this.configManager = new ConfigManager(this);
this.configManager.loadConfigs();
} catch (final Exception ex) {
throw new IllegalStateException("Failed to load MiniMOTD. Ensure your config files are without errors.", ex);
}
}
public MiniMOTDPlatform<I> platform() {
return this.platform;
}
public final Path dataDirectory() {
public Path dataDirectory() {
return this.platform.dataDirectory();
}
public final IconManager<I> iconManager() {
public IconManager<I> iconManager() {
return this.iconManager;
}
public final Logger logger() {
public Logger logger() {
return this.platform.logger();
}
public final ConfigManager configManager() {
public ConfigManager configManager() {
return this.configManager;
}
public final PingResponse<I> createMOTD(final MiniMOTDConfig config, final int onlinePlayers, final int maxPlayers) {
public PingResponse<I> createMOTD(final MiniMOTDConfig config, final int onlinePlayers, final int maxPlayers) {
final PingResponse.PlayerCount count = config.modifyPlayerCount(onlinePlayers, maxPlayers);
final PingResponse.Builder<I> response = PingResponse.<I>builder()
.playerCount(count)
@@ -84,7 +91,7 @@ public final class MiniMOTD<I> {
}
final int index = config.motds().size() == 1 ? 0 : ThreadLocalRandom.current().nextInt(config.motds().size());
final MiniMOTDConfig.MOTD motdConfig = config.motds().get(index);
final Component motd = TextComponent.ofChildren(
final Component motd = Components.ofChildren(
parse(motdConfig.line1(), count),
newline(),
parse(motdConfig.line2(), count)
@@ -103,10 +110,9 @@ public final class MiniMOTD<I> {
private static Component parse(final String input, final PingResponse.PlayerCount count) {
final String online = Integer.toString(count.onlinePlayers());
final String max = Integer.toString(count.maxPlayers());
return MiniMessage.get().parse(
return MiniMessage.miniMessage().deserialize(
replacePlayerCount(input, online, max),
"online_players", online,
"max_players", max
templates(template("online_players", online), template("max_players", max))
);
}
@@ -60,7 +60,7 @@ public final class PingResponse<I> {
/**
* If {@link #icon()} is non-null, the provided {@link Consumer} will be called using
* it's return value. If {@link #icon()} is {@code null}, do nothing.
* its return value. If {@link #icon()} is {@code null}, do nothing.
*
* @param iconConsumer icon consumer
*/
@@ -76,7 +76,7 @@ public final class PingResponse<I> {
/**
* If {@link #motd()} is non-null, the provided {@link Consumer} will be called using
* it's return value. If {@link #motd()} is {@code null}, do nothing.
* its return value. If {@link #motd()} is {@code null}, do nothing.
*
* @param motdConsumer motd consumer
*/
@@ -38,8 +38,7 @@ public final class ConfigLoader<C> {
private static final TypeSerializerCollection SERIALIZERS;
static {
SERIALIZERS = TypeSerializerCollection.defaults()
.childBuilder()
SERIALIZERS = TypeSerializerCollection.builder()
.register(PlayerCountModifier.serializer())
.build();
}
@@ -50,11 +49,13 @@ public final class ConfigLoader<C> {
public ConfigLoader(
final @NonNull Class<C> configClass,
final @NonNull Path configPath,
final @NonNull ConfigurationOptions options
final @NonNull UnaryOperator<ConfigurationOptions> optionsModifier
) {
this.loader = HoconConfigurationLoader.builder()
.path(configPath)
.defaultOptions(options.serializers(SERIALIZERS))
.defaultOptions(options ->
optionsModifier.apply(options)
.serializers(builder -> builder.registerAll(SERIALIZERS)))
.build();
try {
this.mapper = ObjectMapper.factory().get(configClass);
@@ -66,19 +67,11 @@ public final class ConfigLoader<C> {
}
}
public ConfigLoader(
final @NonNull Class<C> configClass,
final @NonNull Path configPath,
final @NonNull UnaryOperator<ConfigurationOptions> options
) {
this(configClass, configPath, options.apply(ConfigurationOptions.defaults()));
}
public ConfigLoader(
final @NonNull Class<C> configClass,
final @NonNull Path configPath
) {
this(configClass, configPath, ConfigurationOptions.defaults());
this(configClass, configPath, options -> options);
}
public @NonNull C load() throws ConfigurateException {
@@ -57,7 +57,7 @@ public final class PluginSettings {
@Comment("Set whether to enable virtual host testing mode.\n"
+ "When enabled, MiniMOTD will print virtual host debug info to the console on each server ping.")
private final boolean virtualHostTestMode = false;
private boolean virtualHostTestMode = false;
public boolean virtualHostTestMode() {
return this.virtualHostTestMode;
@@ -0,0 +1,47 @@
/*
* This file is part of MiniMOTD, licensed under the MIT License.
*
* Copyright (c) 2021 Jason Penilla
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package xyz.jpenilla.minimotd.common.util;
import net.kyori.adventure.text.ComponentLike;
import net.kyori.adventure.text.TextComponent;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.framework.qual.DefaultQualifier;
import static net.kyori.adventure.text.Component.empty;
import static net.kyori.adventure.text.Component.text;
@DefaultQualifier(NonNull.class)
public final class Components {
private Components() {
throw new IllegalStateException();
}
public static TextComponent ofChildren(final ComponentLike... children) {
if (children.length == 0) {
return empty();
}
return text().append(children).build();
}
}
@@ -24,7 +24,6 @@
package xyz.jpenilla.minimotd.common.util;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.TextComponent;
import net.kyori.adventure.text.format.TextColor;
import org.junit.jupiter.api.Test;
@@ -42,14 +41,14 @@ class ComponentColorDownsamplerTest {
@Test
void testColorDownsampling() {
final Component fullColor = TextComponent.ofChildren(
final Component fullColor = Components.ofChildren(
text("Green ", GREEN),
text("Orange Yellow ", ORANGE_YELLOW),
text("Pink ", PINK),
text("Blue ", BLUE),
text("Lime Green", LIME_GREEN)
);
final Component expectedDownsample = TextComponent.ofChildren(
final Component expectedDownsample = Components.ofChildren(
text("Green ", nearestTo(GREEN)),
text("Orange Yellow ", nearestTo(ORANGE_YELLOW)),
text("Pink ", nearestTo(PINK)),
+3 -3
View File
@@ -1,7 +1,7 @@
plugins {
id("minimotd.platform-conventions")
id("com.github.johnrengelman.shadow")
id("fabric-loom")
id("quiet-fabric-loom")
}
val shade: Configuration by configurations.creating
@@ -10,7 +10,7 @@ val minecraftVersion = libs.versions.fabricMinecraft.get()
dependencies {
minecraft(libs.fabricMinecraft)
mappings(minecraft.officialMojangMappings())
mappings(loom.officialMojangMappings())
modImplementation(libs.fabricLoader)
modImplementation(libs.fabricApi)
@@ -31,7 +31,7 @@ miniMOTDPlatform {
indra {
javaVersions {
target(16)
target(17)
}
}
+2 -2
View File
@@ -23,8 +23,8 @@
"minimotd-fabric.mixins.json"
],
"depends": {
"fabricloader": ">=0.11.1",
"fabricloader": ">=0.12.8",
"fabric": ">=0.31.0",
"minecraft": "1.17.x"
"minecraft": ">=1.18"
}
}
@@ -1,8 +1,8 @@
{
"required": true,
"minVersion": "0.8",
"minVersion": "0.8.4",
"package": "xyz.jpenilla.minimotd.fabric.mixin",
"compatibilityLevel": "JAVA_8",
"compatibilityLevel": "JAVA_16",
"mixins": [
"ConnectionMixin",
"ServerHandshakePacketListenerImplMixin",
+1
View File
@@ -1,3 +1,4 @@
org.gradle.caching=true
org.gradle.configureondemand=true
org.gradle.jvmargs=-Xmx2G
org.gradle.parallel=true
+18 -18
View File
@@ -5,34 +5,34 @@ metadata:
plugins:
net.kyori.blossom: 1.3.0
org.spongepowered.gradle.plugin: 1.1.1
net.minecrell.plugin-yml.bungee: &plugin-yml 0.4.0
org.spongepowered.gradle.plugin: 2.0.0
net.minecrell.plugin-yml.bungee: &plugin-yml 0.5.0
net.minecrell.plugin-yml.bukkit: *plugin-yml
xyz.jpenilla.run-paper: 1.0.3
xyz.jpenilla.run-paper: 1.0.4
versions:
indra: 2.0.5
shadow: 7.0.0
indra: 2.0.6
shadow: 7.1.0
testLoggerPlugin: 3.0.0
adventure: 4.8.1
adventurePlatform: 4.0.0-SNAPSHOT
adventurePlatformFabric: 4.1.0-SNAPSHOT
adventure: 4.9.3
adventurePlatform: 4.0.1
adventurePlatformFabric: 5.0.0
minimessage: 4.2.0-SNAPSHOT
configurate: 4.1.1
checkerQual: 3.14.0
slf4j: 1.7.30
configurate: 4.1.2
checkerQual: 3.19.0
slf4j: 1.7.32
log4jSlf4jImpl: 2.8.1
gson: 2.8.0
guava: 21.0
bstats: 2.2.1
paperApi: 1.16.5-R0.1-SNAPSHOT
waterfallApi: 1.16-R0.4-SNAPSHOT
fabricApi: 0.34.9+1.17
fabricLoader: 0.11.3
fabricMinecraft: 1.17
fabricApi: 0.43.1+1.18
fabricLoader: 0.12.8
fabricMinecraft: 1.18
spongeApi7: 7.2.0
velocityApi: 1.1.7
jupiterEngine: 5.7.0
velocityApi: 3.1.0
jupiterEngine: 5.8.1
dependencies:
adventureBom:
@@ -162,10 +162,10 @@ dependencies:
name: indra-common
version: { ref: indra }
shadow:
group: gradle.plugin.com.github.jengelman.gradle.plugins
group: gradle.plugin.com.github.johnrengelman
name: shadow
version: { ref: shadow }
testLoggerPlugin:
testLogger:
group: com.adarshr
name: gradle-test-logger-plugin
version: { ref: testLoggerPlugin }
Binary file not shown.
+1 -1
View File
@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.1-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
Vendored
+159 -110
View File
@@ -1,7 +1,7 @@
#!/usr/bin/env sh
#!/bin/sh
#
# Copyright 2015 the original author or authors.
# Copyright © 2015-2021 the original authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -17,67 +17,101 @@
#
##############################################################################
##
## Gradle start up script for UN*X
##
#
# Gradle start up script for POSIX generated by Gradle.
#
# Important for running:
#
# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
# noncompliant, but you have some other compliant shell such as ksh or
# bash, then to run this script, type that shell name before the whole
# command line, like:
#
# ksh Gradle
#
# Busybox and similar reduced shells will NOT work, because this script
# requires all of these POSIX shell features:
# * functions;
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
# * compound commands having a testable exit status, especially «case»;
# * various built-in commands including «command», «set», and «ulimit».
#
# Important for patching:
#
# (2) This script targets any POSIX shell, so it avoids extensions provided
# by Bash, Ksh, etc; in particular arrays are avoided.
#
# The "traditional" practice of packing multiple parameters into a
# space-separated string is a well documented source of bugs and security
# problems, so this is (mostly) avoided, by progressively accumulating
# options in "$@", and eventually passing that to Java.
#
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
# see the in-line comments for details.
#
# There are tweaks for specific operating systems such as AIX, CygWin,
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.
#
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
app_path=$0
# Need this for daisy-chained symlinks.
while
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
[ -h "$app_path" ]
do
ls=$( ls -ld "$app_path" )
link=${ls#*' -> '}
case $link in #(
/*) app_path=$link ;; #(
*) app_path=$APP_HOME$link ;;
esac
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
APP_BASE_NAME=${0##*/}
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
MAX_FD=maximum
warn () {
echo "$*"
}
} >&2
die () {
echo
echo "$*"
echo
exit 1
}
} >&2
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
case "$( uname )" in #(
CYGWIN* ) cygwin=true ;; #(
Darwin* ) darwin=true ;; #(
MSYS* | MINGW* ) msys=true ;; #(
NONSTOP* ) nonstop=true ;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
@@ -87,9 +121,9 @@ CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
JAVACMD=$JAVA_HOME/jre/sh/java
else
JAVACMD="$JAVA_HOME/bin/java"
JAVACMD=$JAVA_HOME/bin/java
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
@@ -98,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
JAVACMD=java
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
@@ -106,80 +140,95 @@ location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin or MSYS, switch paths to Windows format before running java
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=`expr $i + 1`
done
case $i in
0) set -- ;;
1) set -- "$args0" ;;
2) set -- "$args0" "$args1" ;;
3) set -- "$args0" "$args1" "$args2" ;;
4) set -- "$args0" "$args1" "$args2" "$args3" ;;
5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #(
max*)
MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit"
esac
case $MAX_FD in #(
'' | soft) :;; #(
*)
ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
fi
# Escape application args
save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
APP_ARGS=`save "$@"`
# Collect all arguments for the java command, stacking in reverse order:
# * args from the command line
# * the main class name
# * -classpath
# * -D...appname settings
# * --module-path (only if needed)
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
# For Cygwin or MSYS, switch paths to Windows format before running java
if "$cygwin" || "$msys" ; then
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
JAVACMD=$( cygpath --unix "$JAVACMD" )
# Now convert the arguments - kludge to limit ourselves to /bin/sh
for arg do
if
case $arg in #(
-*) false ;; # don't mess with options #(
/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
[ -e "$t" ] ;; #(
*) false ;;
esac
then
arg=$( cygpath --path --ignore --mixed "$arg" )
fi
# Roll the args list around exactly as many times as the number of
# args, so each arg winds up back in the position where it started, but
# possibly modified.
#
# NB: a `for` loop captures its iteration list before it begins, so
# changing the positional parameters here affects neither the number of
# iterations, nor the values presented in `arg`.
shift # remove old arg
set -- "$@" "$arg" # push replacement arg
done
fi
# Collect all arguments for the java command;
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
# shell script including quotes and variable substitutions, so put them in
# double quotes to make sure that they get re-expanded; and
# * put everything else in single quotes, so that it's not re-expanded.
set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \
-classpath "$CLASSPATH" \
org.gradle.wrapper.GradleWrapperMain \
"$@"
# Use "xargs" to parse quoted args.
#
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
#
# In Bash we could simply go:
#
# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
# set -- "${ARGS[@]}" "$@"
#
# but POSIX shell has neither arrays nor command substitution, so instead we
# post-process each arg (as a line of input to sed) to backslash-escape any
# character that might be a shell metacharacter, then use eval to reverse
# that process (while maintaining the separation between arguments), and wrap
# the whole thing up as a single "set" statement.
#
# This will of course break if any of these variables contains a newline or
# an unmatched quote.
#
eval "set -- $(
printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
xargs -n1 |
sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
tr '\n' ' '
)" '"$@"'
exec "$JAVACMD" "$@"
+4 -2
View File
@@ -3,7 +3,7 @@ enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS")
dependencyResolutionManagement {
repositories {
//mavenLocal()
// mavenLocal()
mavenCentral()
maven("https://oss.sonatype.org/content/repositories/snapshots/")
maven("https://papermc.io/repo/repository/maven-public/")
@@ -18,13 +18,15 @@ pluginManagement {
repositories {
gradlePluginPortal()
maven("https://maven.fabricmc.net/")
maven("https://maven.quiltmc.org/repository/release/")
maven("https://repo.jpenilla.xyz/snapshots/")
}
includeBuild("build-logic")
}
plugins {
id("ca.stellardrift.polyglot-version-catalogs") version "5.0.0"
id("fabric-loom") version "0.8-SNAPSHOT"
id("quiet-fabric-loom") version "0.10-SNAPSHOT"
}
rootProject.name = "MiniMOTD"
+3 -1
View File
@@ -1,3 +1,5 @@
import java.util.Locale
plugins {
id("minimotd.shadow-platform")
}
@@ -14,7 +16,7 @@ dependencies {
tasks {
processResources {
val replacements = mapOf(
"modid" to project.name,
"modid" to rootProject.name.toLowerCase(Locale.ENGLISH),
"name" to rootProject.name,
"version" to project.version.toString(),
"description" to project.description.toString(),
@@ -101,7 +101,11 @@ public final class MiniMOTDPlugin implements MiniMOTDPlatform<Favicon> {
@Listener
public void reloaded(final @NonNull GameReloadEvent event) {
this.miniMOTD.reload();
try {
this.miniMOTD.reload();
} catch (final Exception ex) {
this.miniMOTD.logger().warn("Failed to reload MiniMOTD.", ex);
}
}
private void registerCommands() {
+10 -5
View File
@@ -1,5 +1,6 @@
import org.spongepowered.gradle.plugin.config.PluginLoaders
import org.spongepowered.plugin.metadata.PluginDependency
import org.spongepowered.plugin.metadata.model.PluginDependency
import java.util.Locale
plugins {
id("minimotd.shadow-platform")
@@ -15,11 +16,15 @@ dependencies {
sponge {
injectRepositories(false)
apiVersion("8.0.0")
plugin(project.name) {
loader(PluginLoaders.JAVA_PLAIN)
apiVersion("8.0.0-SNAPSHOT")
plugin(rootProject.name.toLowerCase(Locale.ENGLISH)) {
loader {
name(PluginLoaders.JAVA_PLAIN)
version("1.0")
}
license("MIT")
displayName(rootProject.name)
mainClass("xyz.jpenilla.minimotd.sponge8.MiniMOTDPlugin")
entrypoint("xyz.jpenilla.minimotd.sponge8.MiniMOTDPlugin")
description(project.description)
links {
homepage(Constants.GITHUB_URL)
@@ -25,7 +25,6 @@ package xyz.jpenilla.minimotd.sponge8;
import com.google.inject.Inject;
import java.lang.reflect.Method;
import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.spongepowered.api.MinecraftVersion;
import org.spongepowered.api.event.EventListener;
@@ -38,8 +37,18 @@ import xyz.jpenilla.minimotd.common.config.MiniMOTDConfig;
import xyz.jpenilla.minimotd.common.util.ComponentColorDownsampler;
final class ClientPingServerEventListener implements EventListener<ClientPingServerEvent> {
private static final Method GET_PROTOCOL;
static {
try {
final Class<?> protocolMinecraftVersion = Class.forName("org.spongepowered.common.ProtocolMinecraftVersion");
GET_PROTOCOL = protocolMinecraftVersion.getMethod("getProtocol");
} catch (final ReflectiveOperationException ex) {
throw new RuntimeException(ex);
}
}
private final MiniMOTD<Favicon> miniMOTD;
private @MonotonicNonNull Method SpongeMinecraftVersion_getProtocol;
@Inject
private ClientPingServerEventListener(final @NonNull MiniMOTD<Favicon> miniMOTD) {
@@ -86,11 +95,8 @@ final class ClientPingServerEventListener implements EventListener<ClientPingSer
private boolean legacy(final @NonNull MinecraftVersion version) {
try {
if (!version.isLegacy() && this.SpongeMinecraftVersion_getProtocol == null) {
this.SpongeMinecraftVersion_getProtocol = version.getClass().getMethod("getProtocol");
}
return version.isLegacy()
|| (int) this.SpongeMinecraftVersion_getProtocol.invoke(version) < Constants.MINECRAFT_1_16_PROTOCOL_VERSION;
|| (int) GET_PROTOCOL.invoke(version) < Constants.MINECRAFT_1_16_PROTOCOL_VERSION;
} catch (final ReflectiveOperationException e) {
throw new IllegalStateException("Failed to get protocol version", e);
}
@@ -38,7 +38,9 @@ import org.spongepowered.api.command.CommandExecutor;
import org.spongepowered.api.command.CommandResult;
import org.spongepowered.api.command.parameter.CommandContext;
import org.spongepowered.api.config.ConfigDir;
import org.spongepowered.api.event.EventListenerRegistration;
import org.spongepowered.api.event.Listener;
import org.spongepowered.api.event.Order;
import org.spongepowered.api.event.lifecycle.LoadedGameEvent;
import org.spongepowered.api.event.lifecycle.RefreshGameEvent;
import org.spongepowered.api.event.lifecycle.RegisterCommandEvent;
@@ -46,7 +48,7 @@ import org.spongepowered.api.event.server.ClientPingServerEvent;
import org.spongepowered.api.network.status.Favicon;
import org.spongepowered.api.scheduler.Task;
import org.spongepowered.plugin.PluginContainer;
import org.spongepowered.plugin.jvm.Plugin;
import org.spongepowered.plugin.builtin.jvm.Plugin;
import org.spongepowered.plugin.metadata.PluginMetadata;
import xyz.jpenilla.minimotd.common.CommandHandler;
import xyz.jpenilla.minimotd.common.MiniMOTD;
@@ -81,9 +83,11 @@ public final class MiniMOTDPlugin implements MiniMOTDPlatform<Favicon> {
}
});
Sponge.eventManager().registerListener(
pluginContainer,
ClientPingServerEvent.class,
this.injector.getInstance(ClientPingServerEventListener.class)
EventListenerRegistration.builder(ClientPingServerEvent.class)
.plugin(pluginContainer)
.listener(this.injector.getInstance(ClientPingServerEventListener.class))
.order(Order.DEFAULT)
.build()
);
}
@@ -137,7 +141,11 @@ public final class MiniMOTDPlugin implements MiniMOTDPlatform<Favicon> {
@Listener
public void onRefresh(final @NonNull RefreshGameEvent event) {
this.miniMOTD.reload();
try {
this.miniMOTD.reload();
} catch (final Exception ex) {
this.miniMOTD.logger().warn("Failed to reload MiniMOTD.", ex);
}
}
@Override
@@ -24,25 +24,32 @@
package xyz.jpenilla.minimotd.velocity;
import com.google.inject.Inject;
import com.velocitypowered.api.event.EventTask;
import com.velocitypowered.api.event.Subscribe;
import com.velocitypowered.api.event.proxy.ProxyPingEvent;
import com.velocitypowered.api.proxy.server.ServerPing;
import com.velocitypowered.api.util.Favicon;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.framework.qual.DefaultQualifier;
import xyz.jpenilla.minimotd.common.MiniMOTD;
import xyz.jpenilla.minimotd.common.PingResponse;
import xyz.jpenilla.minimotd.common.config.MiniMOTDConfig;
@DefaultQualifier(NonNull.class)
public final class PingListener {
private final MiniMOTD<Favicon> miniMOTD;
@Inject
private PingListener(final @NonNull MiniMOTD<Favicon> miniMOTD) {
private PingListener(final MiniMOTD<Favicon> miniMOTD) {
this.miniMOTD = miniMOTD;
}
@Subscribe
public void handlePing(final @NonNull ProxyPingEvent event) {
public EventTask onProxyPingEvent(final ProxyPingEvent event) {
return EventTask.async(() -> this.handle(event));
}
private void handle(final ProxyPingEvent event) {
final MiniMOTDConfig config = this.miniMOTD.configManager().resolveConfig(event.getConnection().getVirtualHost().orElse(null));
final ServerPing.Builder pong = event.getPing().asBuilder();