package tc.oc.api.minecraft.servers; import java.io.FileNotFoundException; import java.nio.file.Path; import java.util.Map; import java.util.Set; import java.util.logging.Logger; import javax.annotation.Nullable; import javax.inject.Inject; import javax.inject.Singleton; import com.google.common.base.Charsets; import com.google.common.collect.ImmutableMap; import com.google.common.io.Files; import com.google.gson.Gson; import tc.oc.api.docs.virtual.DeployInfo; import tc.oc.api.docs.virtual.ServerDoc; import tc.oc.commons.core.logging.Loggers; import tc.oc.commons.core.util.Lazy; import tc.oc.minecraft.api.plugin.PluginFinder; import tc.oc.minecraft.api.server.LocalServer; @Singleton public class StartupServerDocument implements ServerDoc.Startup { @Inject private Gson gson; @Inject private LocalServer minecraftServer; @Inject private PluginFinder pluginFinder; private Logger logger; @Inject void init(Loggers loggers) { logger = loggers.get(getClass()); } private final Lazy<Map<String, String>> pluginVersions = Lazy.from(() -> { final ImmutableMap.Builder<String, String> builder = ImmutableMap.builder(); builder.put(minecraftServer.getName(), minecraftServer.getVersion()); pluginFinder.getAllPlugins().forEach( plugin -> builder.put(plugin.getDescription().getName(), plugin.getDescription().getVersion()) ); return builder.build(); }); private final Lazy<DeployInfo> deployInfo = Lazy.from(() -> { final Path file = minecraftServer.getRootPath().resolve("deploy.json"); try { return gson.fromJson(Files.newReader(file.toFile(), Charsets.UTF_8), DeployInfo.class); } catch(FileNotFoundException e) { logger.warning("Missing " + file); return null; } }); @Override public boolean online() { return true; } @Override public Integer current_port() { return minecraftServer.getAddress().getPort(); } @Override public @Nullable DeployInfo deploy_info() { return deployInfo.get(); } @Override public Map<String, String> plugin_versions() { return pluginVersions.get(); } @Override public Set<Integer> protocol_versions() { return minecraftServer.getProtocolVersions(); } }