diff options
Diffstat (limited to 'patches/server/0144-Profile-Lookup-Events.patch')
-rw-r--r-- | patches/server/0144-Profile-Lookup-Events.patch | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/patches/server/0144-Profile-Lookup-Events.patch b/patches/server/0144-Profile-Lookup-Events.patch new file mode 100644 index 0000000000..8a3c9a944e --- /dev/null +++ b/patches/server/0144-Profile-Lookup-Events.patch @@ -0,0 +1,73 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Aikar <[email protected]> +Date: Sat, 17 Jun 2017 17:00:32 -0400 +Subject: [PATCH] Profile Lookup Events + +Adds a Pre Lookup Event and a Post Lookup Event so that plugins may prefill in profile data, and cache the responses from +profiles that had to be looked up. + +diff --git a/src/main/java/com/destroystokyo/paper/profile/PaperGameProfileRepository.java b/src/main/java/com/destroystokyo/paper/profile/PaperGameProfileRepository.java +index 7b9e797b42c88b17d6a7c590a423f4e85d99a59d..b2ad0c4d92ed960190e3801fbc6a21dcc53bcb46 100644 +--- a/src/main/java/com/destroystokyo/paper/profile/PaperGameProfileRepository.java ++++ b/src/main/java/com/destroystokyo/paper/profile/PaperGameProfileRepository.java +@@ -1,9 +1,14 @@ + package com.destroystokyo.paper.profile; + ++import com.destroystokyo.paper.event.profile.LookupProfileEvent; ++import com.destroystokyo.paper.event.profile.PreLookupProfileEvent; ++import com.google.common.collect.Sets; + import com.mojang.authlib.Environment; ++import com.mojang.authlib.GameProfile; + import com.mojang.authlib.ProfileLookupCallback; + import com.mojang.authlib.yggdrasil.YggdrasilGameProfileRepository; + import java.net.Proxy; ++import java.util.Set; + + public class PaperGameProfileRepository extends YggdrasilGameProfileRepository { + public PaperGameProfileRepository(Proxy proxy, Environment environment) { +@@ -12,6 +17,44 @@ public class PaperGameProfileRepository extends YggdrasilGameProfileRepository { + + @Override + public void findProfilesByNames(String[] names, ProfileLookupCallback callback) { +- super.findProfilesByNames(names, callback); ++ Set<String> unfoundNames = Sets.newHashSet(); ++ for (String name : names) { ++ PreLookupProfileEvent event = new PreLookupProfileEvent(name); ++ event.callEvent(); ++ if (event.getUUID() != null) { ++ // Plugin provided UUID, we can skip network call. ++ GameProfile gameprofile = new GameProfile(event.getUUID(), name); ++ // We might even have properties! ++ Set<ProfileProperty> profileProperties = event.getProfileProperties(); ++ if (!profileProperties.isEmpty()) { ++ for (ProfileProperty property : profileProperties) { ++ gameprofile.getProperties().put(property.getName(), CraftPlayerProfile.asAuthlib(property)); ++ } ++ } ++ callback.onProfileLookupSucceeded(gameprofile); ++ } else { ++ unfoundNames.add(name); ++ } ++ } ++ ++ // Some things were not found.... Proceed to look up. ++ if (!unfoundNames.isEmpty()) { ++ String[] namesArr = unfoundNames.toArray(new String[unfoundNames.size()]); ++ super.findProfilesByNames(namesArr, new PreProfileLookupCallback(callback)); ++ } ++ } ++ ++ private record PreProfileLookupCallback(ProfileLookupCallback callback) implements ProfileLookupCallback { ++ @Override ++ public void onProfileLookupSucceeded(GameProfile gameProfile) { ++ PlayerProfile from = CraftPlayerProfile.asBukkitMirror(gameProfile); ++ new LookupProfileEvent(from).callEvent(); ++ this.callback.onProfileLookupSucceeded(gameProfile); ++ } ++ ++ @Override ++ public void onProfileLookupFailed(final String profileName, final Exception exception) { ++ this.callback.onProfileLookupFailed(profileName, exception); ++ } + } + } |