diff --git a/src/main/java/net/programmer/igoodie/twitchspawn/util/EventQueue.java b/src/main/java/net/programmer/igoodie/twitchspawn/util/EventQueue.java index 6a2d0e9..25bcd99 100644 --- a/src/main/java/net/programmer/igoodie/twitchspawn/util/EventQueue.java +++ b/src/main/java/net/programmer/igoodie/twitchspawn/util/EventQueue.java @@ -30,11 +30,17 @@ public void queue(Runnable task) { tasks.add(new TimerTask() { @Override public void run() { - long now = System.currentTimeMillis(); + try { + long now = System.currentTimeMillis(); + + task.run(); - task.run(); + frozenUntil = now + cooldown; - frozenUntil = now + cooldown; + } catch(Throwable e) { + discardedEvents++; + // TODO: "Event failed HUD" + } } }); updateTimer(); @@ -49,16 +55,22 @@ public void queue(TSLEvent eventNode, EventArguments args, CooldownBucket cooldo @Override public void run() { TwitchSpawn.SERVER.execute(() -> { - long now = System.currentTimeMillis(); - boolean performed = eventNode.process(args); + try { + long now = System.currentTimeMillis(); + boolean performed = eventNode.process(args); - if (!performed) { + if (!performed) { + discardedEvents++; + return; + } + + frozenUntil = now + cooldown; + succeededEvents++; + + } catch (Throwable e) { discardedEvents++; - return; + // TODO: "Event failed HUD" } - - frozenUntil = now + cooldown; - succeededEvents++; }); } }); @@ -112,6 +124,7 @@ public boolean proceed() { public void reset() { timer.cancel(); timer.purge(); + timer = new Timer(); timerTicking = false; tasks.clear(); this.frozenUntil = -1; diff --git a/src/main/java/net/programmer/igoodie/twitchspawn/util/ExpressionEvaluator.java b/src/main/java/net/programmer/igoodie/twitchspawn/util/ExpressionEvaluator.java index 1875867..ab26e39 100644 --- a/src/main/java/net/programmer/igoodie/twitchspawn/util/ExpressionEvaluator.java +++ b/src/main/java/net/programmer/igoodie/twitchspawn/util/ExpressionEvaluator.java @@ -42,7 +42,7 @@ public static String fromArgs(String expression, EventArguments args) { return args.eventName; if (expression.equals("message")) - return args.message; + return JSONUtils.escape(args.message); if (expression.equals("title")) return args.rewardTitle; diff --git a/src/main/java/net/programmer/igoodie/twitchspawn/util/JSONUtils.java b/src/main/java/net/programmer/igoodie/twitchspawn/util/JSONUtils.java index db00c63..b8a4227 100644 --- a/src/main/java/net/programmer/igoodie/twitchspawn/util/JSONUtils.java +++ b/src/main/java/net/programmer/igoodie/twitchspawn/util/JSONUtils.java @@ -46,4 +46,28 @@ public static void forEach(JSONArray array, Consumer consumer) { } } + public static String escape(String jsonString) { + StringBuilder escapedString = new StringBuilder(); + + boolean isEscaping = false; + + for (char character : jsonString.toCharArray()) { + if (character == '\\' && !isEscaping) { + isEscaping = true; + escapedString.append(character); + continue; + } + + if (character == '\'' || character == '\"' || character == '\\') { + if (!isEscaping) + escapedString.append("\\"); + } + + escapedString.append(character); + isEscaping = false; + } + + return escapedString.toString(); + } + } diff --git a/src/test/java/net/programmer/igoodie/twitchspawn/UtilsTests.java b/src/test/java/net/programmer/igoodie/twitchspawn/UtilsTests.java index 804601e..f335e37 100644 --- a/src/test/java/net/programmer/igoodie/twitchspawn/UtilsTests.java +++ b/src/test/java/net/programmer/igoodie/twitchspawn/UtilsTests.java @@ -1,7 +1,10 @@ package net.programmer.igoodie.twitchspawn; import net.programmer.igoodie.twitchspawn.tslanguage.parser.TSLParser; +import net.programmer.igoodie.twitchspawn.util.JSONUtils; import net.programmer.igoodie.twitchspawn.util.PercentageRandomizer; +import org.json.JSONException; +import org.json.JSONObject; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -80,4 +83,16 @@ public void pencentageBelow100Test() { }); } + @Test + @DisplayName("should escape JSON strings successfully.") + public void jsonStringEscapistTest() throws JSONException { + String original = "!drop \"\"\"\"\"\"''''\\\\\\\\'\\\\\\\"\\"; + String escaped = JSONUtils.escape(original); + + String jsonString = String.format("{text:\'%s\'}", escaped); + + JSONObject json = new JSONObject(jsonString); + System.out.println("Parsed: " + json); + } + }