aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0139-Profile-Lookup-Events.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/server/0139-Profile-Lookup-Events.patch')
-rw-r--r--patches/server/0139-Profile-Lookup-Events.patch73
1 files changed, 73 insertions, 0 deletions
diff --git a/patches/server/0139-Profile-Lookup-Events.patch b/patches/server/0139-Profile-Lookup-Events.patch
new file mode 100644
index 0000000000..8a3c9a944e
--- /dev/null
+++ b/patches/server/0139-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);
++ }
+ }
+ }