From f4e77fb6fc0ff2d9187668f8912b5c863a0f14c7 Mon Sep 17 00:00:00 2001 From: Chaoscaot Date: Thu, 29 Apr 2021 12:28:55 +0200 Subject: [PATCH] Speedy UUID Lookup --- .../steamwar/authlib/AuthlibInjector_15.java | 33 ++++++++++ .../de/steamwar/authlib/AuthlibInjector.java | 46 ++++++++++++++ .../SteamwarGameProfileRepository.java | 61 +++++++++++++++++++ .../src/de/steamwar/core/Core.java | 2 + 4 files changed, 142 insertions(+) create mode 100644 SpigotCore_15/src/de/steamwar/authlib/AuthlibInjector_15.java create mode 100644 SpigotCore_Main/src/de/steamwar/authlib/AuthlibInjector.java create mode 100644 SpigotCore_Main/src/de/steamwar/authlib/SteamwarGameProfileRepository.java diff --git a/SpigotCore_15/src/de/steamwar/authlib/AuthlibInjector_15.java b/SpigotCore_15/src/de/steamwar/authlib/AuthlibInjector_15.java new file mode 100644 index 0000000..9864a31 --- /dev/null +++ b/SpigotCore_15/src/de/steamwar/authlib/AuthlibInjector_15.java @@ -0,0 +1,33 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2020 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.authlib; + +import net.minecraft.server.v1_15_R1.MinecraftServer; + +public class AuthlibInjector_15 { + + static Class getMinecraftClass() { + return MinecraftServer.class; + } + + static Object getMinecraftServerInstance() { + return MinecraftServer.getServer(); + } +} diff --git a/SpigotCore_Main/src/de/steamwar/authlib/AuthlibInjector.java b/SpigotCore_Main/src/de/steamwar/authlib/AuthlibInjector.java new file mode 100644 index 0000000..b96f71c --- /dev/null +++ b/SpigotCore_Main/src/de/steamwar/authlib/AuthlibInjector.java @@ -0,0 +1,46 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2020 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.authlib; + +import com.mojang.authlib.yggdrasil.YggdrasilGameProfileRepository; +import de.steamwar.core.Core; +import de.steamwar.core.VersionedCallable; + +import java.lang.reflect.Field; + +public class AuthlibInjector { + + public static void inject() { + if(Core.getVersion() < 15) { + return; + } + try { + Class minecraftServerClass = VersionedCallable.call(new VersionedCallable<>(() -> AuthlibInjector_15.getMinecraftClass(), 15)); + Field repo = minecraftServerClass.getDeclaredField("gameProfileRepository"); + repo.setAccessible(true); + Object instance = VersionedCallable.call(new VersionedCallable<>(() -> AuthlibInjector_15.getMinecraftServerInstance(), 15)); + repo.set(instance, new SteamwarGameProfileRepository((YggdrasilGameProfileRepository) repo.get(instance))); + } catch (NoSuchFieldException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } +} diff --git a/SpigotCore_Main/src/de/steamwar/authlib/SteamwarGameProfileRepository.java b/SpigotCore_Main/src/de/steamwar/authlib/SteamwarGameProfileRepository.java new file mode 100644 index 0000000..20bcc9c --- /dev/null +++ b/SpigotCore_Main/src/de/steamwar/authlib/SteamwarGameProfileRepository.java @@ -0,0 +1,61 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2020 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.authlib; + +import com.mojang.authlib.Agent; +import com.mojang.authlib.GameProfile; +import com.mojang.authlib.GameProfileRepository; +import com.mojang.authlib.ProfileLookupCallback; +import com.mojang.authlib.yggdrasil.YggdrasilGameProfileRepository; +import de.steamwar.sql.SteamwarUser; + +import java.util.ArrayList; +import java.util.List; + +public class SteamwarGameProfileRepository implements GameProfileRepository { + + private final YggdrasilGameProfileRepository fallback; + + public SteamwarGameProfileRepository(YggdrasilGameProfileRepository repository) { + fallback = repository; + } + + @Override + public void findProfilesByNames(String[] strings, Agent agent, ProfileLookupCallback profileLookupCallback) { + System.out.println("Call!!"); + if(agent == Agent.SCROLLS) { + fallback.findProfilesByNames(strings, agent, profileLookupCallback); + } else { + List unknownNames = new ArrayList<>(); + for (String name:strings) { + SteamwarUser user = SteamwarUser.get(name); + if(user == null) { + unknownNames.add(name); + continue; + } + + profileLookupCallback.onProfileLookupSucceeded(new GameProfile(user.getUUID(), user.getUserName())); + } + if(!unknownNames.isEmpty()) { + fallback.findProfilesByNames(unknownNames.toArray(new String[0]), agent, profileLookupCallback); + } + } + } +} diff --git a/SpigotCore_Main/src/de/steamwar/core/Core.java b/SpigotCore_Main/src/de/steamwar/core/Core.java index d9c59df..62f8849 100644 --- a/SpigotCore_Main/src/de/steamwar/core/Core.java +++ b/SpigotCore_Main/src/de/steamwar/core/Core.java @@ -19,6 +19,7 @@ package de.steamwar.core; +import de.steamwar.authlib.AuthlibInjector; import de.steamwar.comms.BungeeReceiver; import de.steamwar.core.events.ChattingEvent; import de.steamwar.core.events.ChunkListener; @@ -64,6 +65,7 @@ public class Core extends JavaPlugin{ ErrorLogger.init(); getServer().getMessenger().registerIncomingPluginChannel(this, "sw:bridge", new BungeeReceiver()); getServer().getMessenger().registerOutgoingPluginChannel(this, "sw:bridge"); + AuthlibInjector.inject(); } @Override