LiveConfigService class

Пакет: com.hypixel.hytale.server.core.liveconfig

Файл: com/hypixel/hytale/server/core/liveconfig/LiveConfigService.java

Поля (21)

МодификаторыТипИмя
final HytaleLogger LOGGER
yield null
String var0
String var0
URI var10
String var11
String var11
Builder var12
HttpResponse var13
int var2
BsonDocument var2
BsonValue var2
String var3
Map var4
ServerAuthManager var6
String var7
BsonDocument var7
boolean var8
String var8
StringBuilder var9
Object var9

Методы (5)

МодификаторыВозвратСигнатура
abstract return new LiveConfigSnapshotreturn new LiveConfigSnapshot(var3, var11, var4)
static boolean hasUrlOverrideboolean hasUrlOverride()
if if(var5 != null)
if if(var2 == 304)
return switchreturn switch(var0)

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.server.core.liveconfig;

class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.server.core.auth.AuthConfig;
class="kw">import com.hypixel.hytale.server.core.auth.ServerAuthManager;
class="kw">import com.hypixel.hytale.server.core.util.ServiceHttpClientFactory;
class="kw">import java.net.URI;
class="kw">import java.net.URLEncoder;
class="kw">import java.net.http.HttpClient;
class="kw">import java.net.http.HttpRequest;
class="kw">import java.net.http.HttpResponse;
class="kw">import java.net.http.HttpRequest.Builder;
class="kw">import java.net.http.HttpResponse.BodyHandlers;
class="kw">import java.nio.charset.StandardCharsets;
class="kw">import java.util.HashMap;
class="kw">import java.util.Locale;
class="kw">import java.util.Map;
class="kw">import java.util.Map.Entry;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.bson.BsonDocument;
class="kw">import org.bson.BsonValue;

class="kw">public class LiveConfigService {
   class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
   class="kw">public class="kw">static class="kw">final String URL_OVERRIDE_PROPERTY = "liveconfig.url";
   class="kw">private class="kw">final HttpClient httpClient = ServiceHttpClientFactory.newBuilder(AuthConfig.HTTP_TIMEOUT).build();
   class="kw">private class="kw">final String baseUrl = System.getProperty("liveconfig.url", "https://liveconfig.hytale.com");

   class="kw">public LiveConfigService() {
   }

   class="kw">public class="kw">static boolean hasUrlOverride() {
      class="kw">return System.getProperty("liveconfig.url") != null;
   }

   @Nullable
   class="kw">public LiveConfigSnapshot fetchServerConfigs(@Nonnull String var1, @Nonnull String var2, @Nonnull String var3, @Nullable String var4, @Nullable String var5) {
      ServerAuthManager var6 = ServerAuthManager.getInstance();
      String var7 = var6.getSessionToken();
      boolean var8 = hasUrlOverride();
      if (var8 || var7 != null && !var7.isEmpty()) {
         try {
            StringBuilder var9 = new StringBuilder("?os=").append(encode(var2)).append("&arch=").append(encode(var3));
            if (var4 != null && !var4.isEmpty()) {
               var9.append("&version=").append(encode(var4));
            }

            URI var10 = URI.create(String.format("%s/server-configs/%s%s", this.baseUrl, var1, var9));
            String var11 = var7 != null && !var7.isEmpty() ? var7 : "dev-test-token";
            Builder var12 = HttpRequest.newBuilder()
               .uri(var10)
               .header("Authorization", "Bearer " + var11)
               .header("User-Agent", AuthConfig.USER_AGENT)
               .header("Accept", "application/json")
               .timeout(AuthConfig.HTTP_TIMEOUT)
               .GET();
            if (var5 != null) {
               var12.header("If-None-Match", var5);
            }

            HttpResponse var13 = this.httpClient.send(var12.build(), BodyHandlers.ofString());
            class="kw">return this.handleResponse(var13);
         } catch (InterruptedException var14) {
            Thread.currentThread().interrupt();
            LOGGER.at(Level.FINE).log("Live config fetch interrupted");
            class="kw">return null;
         } catch (Exception var15) {
            ((HytaleLogger.Api)LOGGER.at(Level.WARNING).withCause(var15)).log("Failed to fetch live config");
            class="kw">return null;
         }
      } else {
         LOGGER.at(Level.FINE).log("No session token available for live config fetch");
         class="kw">return null;
      }
   }

   @Nullable
   class="kw">private LiveConfigSnapshot handleResponse(@Nonnull HttpResponse<String> var1) {
      int var2 = var1.statusCode();
      if (var2 == 304) {
         LOGGER.at(Level.FINE).log("Live config not modified (304)");
         class="kw">return null;
      } else if (var2 != 200) {
         LOGGER.at(Level.WARNING).log("Live config fetch failed: HTTP %d", var2);
         class="kw">return null;
      } else {
         class="kw">return this.parseResponse(var1);
      }
   }

   @Nullable
   class="kw">private LiveConfigSnapshot parseResponse(@Nonnull HttpResponse<String> var1) {
      try {
         BsonDocument var2 = BsonDocument.parse(var1.body());
         String var3 = var2.getString("version").getValue();
         Map var4 = new HashMap<>();
         if (var2.containsKey("flags")) {
            for (Entry var6 : var2.getDocument("flags").entrySet()) {
               BsonDocument var7 = var6.getValue().asDocument();
               String var8 = var7.getString("type").getValue();
               Object var9 = parseValue(var8, var7);
               var4.put(var6.getKey(), new LiveConfigSnapshot.ResolvedFlag(var8, var9));
            }
         }

         String var11 = var1.headers().firstValue("ETag").orElse(var3);
         class="kw">return new LiveConfigSnapshot(var3, var11, var4);
      } catch (Exception var10) {
         ((HytaleLogger.Api)LOGGER.at(Level.WARNING).withCause(var10)).log("Failed to parse live config response");
         class="kw">return null;
      }
   }

   @Nullable
   class="kw">private class="kw">static Object parseValue(@Nonnull String var0, @Nonnull BsonDocument var1) {
      BsonValue var2 = var1.get("value");
      if (var2 != null && !var2.isNull()) {
         class="kw">return class="kw">switch (var0) {
            case "boolean" -> var2.asBoolean().getValue();
            case "integer" -> var2.asNumber().intValue();
            case "string" -> var2.asString().getValue();
            class="kw">default -> {
               LOGGER.at(Level.WARNING).log("Unknown flag type: %s", var0);
               yield null;
            }
         };
      } else {
         class="kw">return null;
      }
   }

   @Nonnull
   class="kw">private class="kw">static String encode(@Nonnull String var0) {
      class="kw">return URLEncoder.encode(var0, StandardCharsets.UTF_8);
   }

   @Nonnull
   class="kw">public class="kw">static String detectOS() {
      String var0 = System.getProperty("os.name", "").toLowerCase(Locale.ROOT);
      if (var0.contains("win")) {
         class="kw">return "windows";
      } else if (var0.contains("mac") || var0.contains("darwin")) {
         class="kw">return "darwin";
      } else {
         class="kw">return !var0.contains("linux") && !var0.contains("nux") ? "any" : "linux";
      }
   }

   @Nonnull
   class="kw">public class="kw">static String detectArch() {
      String var0 = System.getProperty("os.arch", "").toLowerCase(Locale.ROOT);
      if (var0.equals("amd64") || var0.equals("x86_64")) {
         class="kw">return "amd64";
      } else {
         class="kw">return !var0.equals("aarch64") && !var0.equals("arm64") ? "any" : "arm64";
      }
   }
}