From 763089ddf66e73597d4131a4d8612de5538cc71b Mon Sep 17 00:00:00 2001 From: VarLong <173472493+OptimisticDeving@users.noreply.github.com> Date: Sat, 8 Mar 2025 20:15:01 +0000 Subject: [PATCH] Re-add CPU model detection and add GPU model detection via OSHI (#372) * Re-add CPU model detection and add GPU model detection via OSHI * Catch exceptions in getHardware --- pom.xml | 8 +++ .../extras/commands/CommandServerInfo.java | 55 +++++++++++++++++++ .../java/pw/kaboom/extras/util/Utility.java | 13 +++++ 3 files changed, 76 insertions(+) diff --git a/pom.xml b/pom.xml index 0a302c8..7e5a728 100644 --- a/pom.xml +++ b/pom.xml @@ -18,6 +18,14 @@ 1.20.4-R0.1-SNAPSHOT provided + + + com.github.oshi + oshi-core + 6.4.5 + + provided + diff --git a/src/main/java/pw/kaboom/extras/commands/CommandServerInfo.java b/src/main/java/pw/kaboom/extras/commands/CommandServerInfo.java index 3befce4..780ddf1 100644 --- a/src/main/java/pw/kaboom/extras/commands/CommandServerInfo.java +++ b/src/main/java/pw/kaboom/extras/commands/CommandServerInfo.java @@ -1,16 +1,61 @@ package pw.kaboom.extras.commands; +import it.unimi.dsi.fastutil.Pair; +import it.unimi.dsi.fastutil.objects.ObjectObjectImmutablePair; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.Nullable; +import oshi.SystemInfo; +import oshi.hardware.GraphicsCard; +import pw.kaboom.extras.util.Utility; import javax.annotation.Nonnull; import java.lang.management.ManagementFactory; import java.net.InetAddress; public final class CommandServerInfo implements CommandExecutor { + private static final @Nullable String[] GPU_DEVICES; + private static final @Nullable String PROCESSOR_NAME; + + static { + // No need to store this in a static variable as it would + // just waste memory & won't be accessed outside construction + // anyway. + + final SystemInfo systemInfo = new SystemInfo(); + + // Unfortunately, we need to do something like this + // because calls to getHardware may fail if the + // server is running on an unrecognized platform, + // and we're unable to use guard clauses due to + // returns not being supported in static blocks. + + final @Nullable Pair hardwareInfo = Utility.composeCallable( + systemInfo::getHardware, + hardware -> + new ObjectObjectImmutablePair<>( + hardware.getGraphicsCards() + .stream() + .map(GraphicsCard::getName) + .toArray(String[]::new), + hardware.getProcessor() + .getProcessorIdentifier() + .getName() + ) + ); + + if (hardwareInfo == null) { + GPU_DEVICES = null; + PROCESSOR_NAME = null; + } else { + GPU_DEVICES = hardwareInfo.first(); + PROCESSOR_NAME = hardwareInfo.second(); + } + } + private void sendInfoMessage(final CommandSender target, final String description, final String value) { target.sendMessage( @@ -50,6 +95,8 @@ public final class CommandServerInfo implements CommandExecutor { + ManagementFactory.getRuntimeMXBean().getVmVersion() ); + sendInfoMessage(sender, "CPU model", PROCESSOR_NAME); + sendInfoMessage(sender, "CPU cores", String.valueOf(Runtime.getRuntime().availableProcessors()) ); @@ -57,6 +104,14 @@ public final class CommandServerInfo implements CommandExecutor { String.valueOf(ManagementFactory.getOperatingSystemMXBean().getSystemLoadAverage()) ); + for (int i = 0; i < GPU_DEVICES.length; i++) { + sendInfoMessage( + sender, + "GPU device (" + i + ")", + GPU_DEVICES[i] + ); + } + final long heapUsage = ManagementFactory.getMemoryMXBean().getHeapMemoryUsage().getUsed(); final long nonHeapUsage = ManagementFactory.getMemoryMXBean() .getNonHeapMemoryUsage().getUsed(); diff --git a/src/main/java/pw/kaboom/extras/util/Utility.java b/src/main/java/pw/kaboom/extras/util/Utility.java index ec56487..216f070 100644 --- a/src/main/java/pw/kaboom/extras/util/Utility.java +++ b/src/main/java/pw/kaboom/extras/util/Utility.java @@ -7,6 +7,8 @@ import org.bukkit.entity.Player; import javax.annotation.Nonnull; import javax.annotation.Nullable; +import java.util.concurrent.Callable; +import java.util.function.Function; public final class Utility { public static @Nullable Player getPlayerExactIgnoreCase(final String username) { @@ -36,4 +38,15 @@ public final class Utility { } return new String(b); } + + public static @Nullable R composeCallable( + Callable callable, + Function composer + ) { + try { + return composer.apply(callable.call()); + } catch (Exception e) { + return null; + } + } }