@@ -20,7 +20,7 @@ You should have received a copy of the GNU General Public License
2020along with this program. If not, see <http://www.gnu.org/licenses/>.
2121
2222diff --git a/build.gradle.kts b/build.gradle.kts
23- index 7ba2b08b8c5eb405a64f9edfa72195dcf48f82bd..d351ae66db72208a78ee6c522201693f19f68ef5 100644
23+ index 9421e45653e68922a51cf0071792e6fa7999d0b8..181e9cd8623995f40e696ccfe49754dc340405d8 100644
2424--- a/build.gradle.kts
2525+++ b/build.gradle.kts
2626@@ -41,6 +41,7 @@ dependencies {
@@ -29,8 +29,8 @@ index 7ba2b08b8c5eb405a64f9edfa72195dcf48f82bd..d351ae66db72208a78ee6c522201693f
2929 api("org.slf4j:slf4j-api:1.8.0-beta4")
3030+ api("io.sentry:sentry:5.4.0") // Pufferfish
3131
32- implementation("org.ow2.asm:asm:9.2 ")
33- implementation("org.ow2.asm:asm-commons:9.2 ")
32+ implementation("org.ow2.asm:asm:9.4 ")
33+ implementation("org.ow2.asm:asm-commons:9.4 ")
3434@@ -84,6 +85,13 @@ val generateApiVersioningFile by tasks.registering {
3535 }
3636 }
@@ -47,7 +47,7 @@ index 7ba2b08b8c5eb405a64f9edfa72195dcf48f82bd..d351ae66db72208a78ee6c522201693f
4747 into("META-INF/maven/${project.group}/${project.name}")
4848diff --git a/src/main/java/gg/pufferfish/pufferfish/sentry/SentryContext.java b/src/main/java/gg/pufferfish/pufferfish/sentry/SentryContext.java
4949new file mode 100644
50- index 0000000000000000000000000000000000000000..10310fdd53de28efb8a8250f6d3b0c8eb08fb68a
50+ index 0000000000000000000000000000000000000000..cfbc75a4525b0596547db496eabe867975081642
5151--- /dev/null
5252+++ b/src/main/java/gg/pufferfish/pufferfish/sentry/SentryContext.java
5353@@ -0,0 +1,161 @@
@@ -69,21 +69,21 @@ index 0000000000000000000000000000000000000000..10310fdd53de28efb8a8250f6d3b0c8e
6969+ import org.jetbrains.annotations.Nullable;
7070+
7171+ public class SentryContext {
72- +
72+ +
7373+ private static final Gson GSON = new Gson();
74- +
74+ +
7575+ public static void setPluginContext(@Nullable Plugin plugin) {
7676+ if (plugin != null) {
7777+ ThreadContext.put("pufferfishsentry_pluginname", plugin.getName());
7878+ ThreadContext.put("pufferfishsentry_pluginversion", plugin.getDescription().getVersion());
7979+ }
8080+ }
81- +
81+ +
8282+ public static void removePluginContext() {
8383+ ThreadContext.remove("pufferfishsentry_pluginname");
8484+ ThreadContext.remove("pufferfishsentry_pluginversion");
8585+ }
86- +
86+ +
8787+ public static void setSenderContext(@Nullable CommandSender sender) {
8888+ if (sender != null) {
8989+ ThreadContext.put("pufferfishsentry_playername", sender.getName());
@@ -92,52 +92,52 @@ index 0000000000000000000000000000000000000000..10310fdd53de28efb8a8250f6d3b0c8e
9292+ }
9393+ }
9494+ }
95- +
95+ +
9696+ public static void removeSenderContext() {
9797+ ThreadContext.remove("pufferfishsentry_playername");
9898+ ThreadContext.remove("pufferfishsentry_playerid");
9999+ }
100- +
100+ +
101101+ public static void setEventContext(Event event, RegisteredListener registration) {
102102+ setPluginContext(registration.getPlugin());
103- +
103+ +
104104+ try {
105105+ // Find the player that was involved with this event
106106+ Player player = null;
107107+ if (event instanceof PlayerEvent) {
108108+ player = ((PlayerEvent) event).getPlayer();
109109+ } else {
110110+ Class<? extends Event> eventClass = event.getClass();
111- +
111+ +
112112+ Field playerField = null;
113- +
113+ +
114114+ for (Field field : eventClass.getDeclaredFields()) {
115115+ if (field.getType().equals(Player.class)) {
116116+ playerField = field;
117117+ break;
118118+ }
119119+ }
120- +
120+ +
121121+ if (playerField != null) {
122122+ playerField.setAccessible(true);
123123+ player = (Player) playerField.get(event);
124124+ }
125125+ }
126- +
126+ +
127127+ if (player != null) {
128128+ setSenderContext(player);
129129+ }
130130+ } catch (Exception e) {} // We can't really safely log exceptions.
131- +
131+ +
132132+ ThreadContext.put("pufferfishsentry_eventdata", GSON.toJson(serializeFields(event)));
133133+ }
134- +
134+ +
135135+ public static void removeEventContext() {
136136+ removePluginContext();
137137+ removeSenderContext();
138138+ ThreadContext.remove("pufferfishsentry_eventdata");
139139+ }
140- +
140+ +
141141+ private static Map<String, String> serializeFields(Object object) {
142142+ Map<String, String> fields = new TreeMap<>();
143143+ fields.put("_class", object.getClass().getName());
@@ -146,7 +146,7 @@ index 0000000000000000000000000000000000000000..10310fdd53de28efb8a8250f6d3b0c8e
146146+ if (Modifier.isStatic(declaredField.getModifiers())) {
147147+ continue;
148148+ }
149- +
149+ +
150150+ String fieldName = declaredField.getName();
151151+ if (fieldName.equals("handlers")) {
152152+ continue;
@@ -162,47 +162,47 @@ index 0000000000000000000000000000000000000000..10310fdd53de28efb8a8250f6d3b0c8e
162162+ }
163163+ return fields;
164164+ }
165- +
165+ +
166166+ public static class State {
167- +
167+ +
168168+ private Plugin plugin;
169169+ private Command command;
170170+ private String commandLine;
171171+ private Event event;
172172+ private RegisteredListener registeredListener;
173- +
173+ +
174174+ public Plugin getPlugin() {
175175+ return plugin;
176176+ }
177- +
177+ +
178178+ public void setPlugin(Plugin plugin) {
179179+ this.plugin = plugin;
180180+ }
181- +
181+ +
182182+ public Command getCommand() {
183183+ return command;
184184+ }
185- +
185+ +
186186+ public void setCommand(Command command) {
187187+ this.command = command;
188188+ }
189- +
189+ +
190190+ public String getCommandLine() {
191191+ return commandLine;
192192+ }
193- +
193+ +
194194+ public void setCommandLine(String commandLine) {
195195+ this.commandLine = commandLine;
196196+ }
197- +
197+ +
198198+ public Event getEvent() {
199199+ return event;
200200+ }
201- +
201+ +
202202+ public void setEvent(Event event) {
203203+ this.event = event;
204204+ }
205- +
205+ +
206206+ public RegisteredListener getRegisteredListener() {
207207+ return registeredListener;
208208+ }
@@ -452,20 +452,24 @@ index 2b8308989fce7f8a16907f8711b362e671fdbfb6..bd4d1a40f53784662174d426533ef4b5
452452 callEvent(new com.destroystokyo.paper.event.server.ServerExceptionEvent(new com.destroystokyo.paper.exception.ServerEventException(msg, ex, registration.getPlugin(), registration.getListener(), event)));
453453 }
454454diff --git a/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java b/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java
455- index eaefbb00e9993d54906cc8cf35cf753c0d6c7707..6efa6732e5559c3192d08b8631911be7cdaf15b4 100644
455+ index eaefbb00e9993d54906cc8cf35cf753c0d6c7707..301e82369603f3dd6e6c1bd380da4bacacd7ef6c 100644
456456--- a/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java
457457+++ b/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java
458- @@ -336,7 +336,9 @@ public final class JavaPluginLoader implements PluginLoader {
458+ @@ -336,7 +336,13 @@ public final class JavaPluginLoader implements PluginLoader {
459459 try {
460460 jPlugin.setEnabled(true);
461461 } catch (Throwable ex) {
462462+ gg.pufferfish.pufferfish.sentry.SentryContext.setPluginContext(plugin); // Pufferfish
463463 server.getLogger().log(Level.SEVERE, "Error occurred while enabling " + plugin.getDescription().getFullName() + " (Is it up to date?)", ex);
464464+ gg.pufferfish.pufferfish.sentry.SentryContext.removePluginContext(); // Pufferfish
465+ + // Paper start - Disable plugins that fail to load
466+ + this.server.getPluginManager().disablePlugin(jPlugin);
467+ + return;
468+ + // Paper end
465469 }
466470
467471 // Perhaps abort here, rather than continue going, but as it stands,
468- @@ -361,7 +363 ,9 @@ public final class JavaPluginLoader implements PluginLoader {
472+ @@ -361,7 +367 ,9 @@ public final class JavaPluginLoader implements PluginLoader {
469473 try {
470474 jPlugin.setEnabled(false);
471475 } catch (Throwable ex) {
0 commit comments