diff --git a/Spigot-API-Patches/0084-Fill-Profile-Property-Events.patch b/Spigot-API-Patches/0084-Fill-Profile-Property-Events.patch new file mode 100644 index 0000000000..268d84535a --- /dev/null +++ b/Spigot-API-Patches/0084-Fill-Profile-Property-Events.patch @@ -0,0 +1,171 @@ +From 4639e25b3f054fe8f9c01911b5d8be559a77a643 Mon Sep 17 00:00:00 2001 +From: Aikar +Date: Tue, 2 Jan 2018 00:31:08 -0500 +Subject: [PATCH] Fill Profile Property Events + +Allows plugins to populate profile properties from local sources to avoid calls out to Mojang API +to fill in textures for example. + +If Mojang API does need to be hit, event fire so you can get the results. + +This is useful for implementing a ProfileCache for Player Skulls + +diff --git a/src/main/java/com/destroystokyo/paper/event/profile/FillProfileEvent.java b/src/main/java/com/destroystokyo/paper/event/profile/FillProfileEvent.java +new file mode 100644 +index 00000000..a893dda1 +--- /dev/null ++++ b/src/main/java/com/destroystokyo/paper/event/profile/FillProfileEvent.java +@@ -0,0 +1,71 @@ ++/* ++ * Copyright (c) 2018 Daniel Ennis (Aikar) MIT License ++ * ++ * Permission is hereby granted, free of charge, to any person obtaining ++ * a copy of this software and associated documentation files (the ++ * "Software"), to deal in the Software without restriction, including ++ * without limitation the rights to use, copy, modify, merge, publish, ++ * distribute, sublicense, and/or sell copies of the Software, and to ++ * permit persons to whom the Software is furnished to do so, subject to ++ * the following conditions: ++ * ++ * The above copyright notice and this permission notice shall be ++ * included in all copies or substantial portions of the Software. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, ++ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ++ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE ++ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION ++ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION ++ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ++ */ ++ ++package com.destroystokyo.paper.event.profile; ++ ++import com.destroystokyo.paper.profile.PlayerProfile; ++import com.destroystokyo.paper.profile.ProfileProperty; ++import org.bukkit.event.Event; ++import org.bukkit.event.HandlerList; ++ ++import javax.annotation.Nonnull; ++import java.util.Set; ++ ++/** ++ * Fired once a profiles additional properties (such as textures) has been filled ++ */ ++public class FillProfileEvent extends Event { ++ private final PlayerProfile profile; ++ ++ public FillProfileEvent(@Nonnull PlayerProfile profile) { ++ this.profile = profile; ++ } ++ ++ /** ++ * @return The Profile that had properties filled ++ */ ++ @Nonnull ++ public PlayerProfile getPlayerProfile() { ++ return profile; ++ } ++ ++ /** ++ * Same as .getPlayerProfile().getProperties() ++ * ++ * @see PlayerProfile#getProperties() ++ * @return The new properties on the profile. ++ */ ++ public Set getProperties() { ++ return profile.getProperties(); ++ } ++ ++ private static final HandlerList handlers = new HandlerList(); ++ ++ public HandlerList getHandlers() { ++ return handlers; ++ } ++ ++ public static HandlerList getHandlerList() { ++ return handlers; ++ } ++} +diff --git a/src/main/java/com/destroystokyo/paper/event/profile/PreFillProfileEvent.java b/src/main/java/com/destroystokyo/paper/event/profile/PreFillProfileEvent.java +new file mode 100644 +index 00000000..e34312c1 +--- /dev/null ++++ b/src/main/java/com/destroystokyo/paper/event/profile/PreFillProfileEvent.java +@@ -0,0 +1,73 @@ ++/* ++ * Copyright (c) 2018 Daniel Ennis (Aikar) MIT License ++ * ++ * Permission is hereby granted, free of charge, to any person obtaining ++ * a copy of this software and associated documentation files (the ++ * "Software"), to deal in the Software without restriction, including ++ * without limitation the rights to use, copy, modify, merge, publish, ++ * distribute, sublicense, and/or sell copies of the Software, and to ++ * permit persons to whom the Software is furnished to do so, subject to ++ * the following conditions: ++ * ++ * The above copyright notice and this permission notice shall be ++ * included in all copies or substantial portions of the Software. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, ++ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ++ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE ++ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION ++ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION ++ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ++ */ ++ ++package com.destroystokyo.paper.event.profile; ++ ++import com.destroystokyo.paper.profile.PlayerProfile; ++import com.destroystokyo.paper.profile.ProfileProperty; ++import org.bukkit.event.Event; ++import org.bukkit.event.HandlerList; ++ ++import javax.annotation.Nonnull; ++import java.util.Collection; ++ ++/** ++ * Fired when the server is requesting to fill in properties of an incomplete profile, such as textures. ++ * ++ * Allows plugins to pre populate cached properties and avoid a call to the Mojang API ++ */ ++public class PreFillProfileEvent extends Event { ++ private final PlayerProfile profile; ++ ++ public PreFillProfileEvent(PlayerProfile profile) { ++ this.profile = profile; ++ } ++ ++ /** ++ * @return The profile that needs its properties filled ++ */ ++ public PlayerProfile getPlayerProfile() { ++ return profile; ++ } ++ ++ /** ++ * Sets the properties on the profile, avoiding the call to the Mojang API ++ * Same as .getPlayerProfile().setProperties(properties); ++ * ++ * @see PlayerProfile#setProperties(Collection) ++ * @param properties The properties to set/append ++ */ ++ public void setProperties(@Nonnull Collection properties) { ++ profile.setProperties(properties); ++ } ++ ++ private static final HandlerList handlers = new HandlerList(); ++ ++ public HandlerList getHandlers() { ++ return handlers; ++ } ++ ++ public static HandlerList getHandlerList() { ++ return handlers; ++ } ++} +-- +2.15.1 + diff --git a/Spigot-Server-Patches/0266-Fill-Profile-Property-Events.patch b/Spigot-Server-Patches/0266-Fill-Profile-Property-Events.patch new file mode 100644 index 0000000000..81e934ab4d --- /dev/null +++ b/Spigot-Server-Patches/0266-Fill-Profile-Property-Events.patch @@ -0,0 +1,105 @@ +From 97c93bfff69a27ca204861f28b76d848a495b340 Mon Sep 17 00:00:00 2001 +From: Aikar +Date: Tue, 2 Jan 2018 00:31:26 -0500 +Subject: [PATCH] Fill Profile Property Events + +Allows plugins to populate profile properties from local sources to avoid calls out to Mojang API +to fill in textures for example. + +If Mojang API does need to be hit, event fire so you can get the results. + +This is useful for implementing a ProfileCache for Player Skulls + +diff --git a/src/main/java/com/destroystokyo/paper/profile/WrappedMinecraftSessionService.java b/src/main/java/com/destroystokyo/paper/profile/WrappedMinecraftSessionService.java +new file mode 100644 +index 000000000..0901d9838 +--- /dev/null ++++ b/src/main/java/com/destroystokyo/paper/profile/WrappedMinecraftSessionService.java +@@ -0,0 +1,71 @@ ++/* ++ * Copyright (c) 2018 Daniel Ennis (Aikar) MIT License ++ * ++ * Permission is hereby granted, free of charge, to any person obtaining ++ * a copy of this software and associated documentation files (the ++ * "Software"), to deal in the Software without restriction, including ++ * without limitation the rights to use, copy, modify, merge, publish, ++ * distribute, sublicense, and/or sell copies of the Software, and to ++ * permit persons to whom the Software is furnished to do so, subject to ++ * the following conditions: ++ * ++ * The above copyright notice and this permission notice shall be ++ * included in all copies or substantial portions of the Software. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, ++ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ++ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE ++ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION ++ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION ++ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ++ */ ++ ++package com.destroystokyo.paper.profile; ++ ++import com.destroystokyo.paper.event.profile.FillProfileEvent; ++import com.destroystokyo.paper.event.profile.PreFillProfileEvent; ++import com.mojang.authlib.GameProfile; ++import com.mojang.authlib.exceptions.AuthenticationException; ++import com.mojang.authlib.exceptions.AuthenticationUnavailableException; ++import com.mojang.authlib.minecraft.MinecraftProfileTexture; ++import com.mojang.authlib.minecraft.MinecraftProfileTexture.Type; ++import com.mojang.authlib.minecraft.MinecraftSessionService; ++ ++import java.net.InetAddress; ++import java.util.Map; ++ ++public class WrappedMinecraftSessionService implements MinecraftSessionService { ++ ++ private final MinecraftSessionService orig; ++ ++ public WrappedMinecraftSessionService(MinecraftSessionService orig) { ++ this.orig = orig; ++ } ++ ++ @Override ++ public void joinServer(GameProfile profile, String authenticationToken, String serverId) throws AuthenticationException { ++ orig.joinServer(profile, authenticationToken, serverId); ++ } ++ ++ @Override ++ public GameProfile hasJoinedServer(GameProfile user, String serverId, InetAddress address) throws AuthenticationUnavailableException { ++ return orig.hasJoinedServer(user, serverId, address); ++ } ++ ++ @Override ++ public Map getTextures(GameProfile profile, boolean requireSecure) { ++ return orig.getTextures(profile, requireSecure); ++ } ++ ++ @Override ++ public GameProfile fillProfileProperties(GameProfile profile, boolean requireSecure) { ++ new PreFillProfileEvent(CraftPlayerProfile.asBukkitMirror(profile)).callEvent(); ++ if (!profile.getProperties().isEmpty()) { ++ return profile; ++ } ++ GameProfile gameProfile = orig.fillProfileProperties(profile, requireSecure); ++ new FillProfileEvent(CraftPlayerProfile.asBukkitMirror(gameProfile)).callEvent(); ++ return gameProfile; ++ } ++} +diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java +index 6159cf4c0..95d1ac442 100644 +--- a/src/main/java/net/minecraft/server/MinecraftServer.java ++++ b/src/main/java/net/minecraft/server/MinecraftServer.java +@@ -1019,7 +1019,7 @@ public abstract class MinecraftServer implements ICommandListener, Runnable, IAs + + String s1 = "."; // PAIL? + YggdrasilAuthenticationService yggdrasilauthenticationservice = new YggdrasilAuthenticationService(Proxy.NO_PROXY, UUID.randomUUID().toString()); +- MinecraftSessionService minecraftsessionservice = yggdrasilauthenticationservice.createMinecraftSessionService(); ++ MinecraftSessionService minecraftsessionservice = new com.destroystokyo.paper.profile.WrappedMinecraftSessionService(yggdrasilauthenticationservice.createMinecraftSessionService()); // Paper + GameProfileRepository gameprofilerepository = yggdrasilauthenticationservice.createProfileRepository(); + gameprofilerepository = new com.destroystokyo.paper.profile.WrappedGameProfileRepository(gameprofilerepository); // Paper + UserCache usercache = new UserCache(gameprofilerepository, new File(s1, MinecraftServer.a.getName())); +-- +2.15.1 +