Skip to content

Commit a43944d

Browse files
author
Pikachu920
committed
implement send back file effect, add errors to fix potential crashes
1 parent fc2d13d commit a43944d

File tree

5 files changed

+76
-10
lines changed

5 files changed

+76
-10
lines changed

src/main/java/com/pikachu/webaddon/skript/effects/EffSendBack.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,4 +44,5 @@ protected void execute(Event e) {
4444
public String toString(Event e, boolean debug) {
4545
return "send back " + response.toString(e, debug);
4646
}
47+
4748
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package com.pikachu.webaddon.skript.effects;
2+
3+
import ch.njol.skript.ScriptLoader;
4+
import ch.njol.skript.Skript;
5+
import ch.njol.skript.lang.Effect;
6+
import ch.njol.skript.lang.Expression;
7+
import ch.njol.skript.lang.SkriptParser;
8+
import ch.njol.skript.registrations.EventValues;
9+
import ch.njol.util.Kleenean;
10+
import org.bukkit.event.Event;
11+
import spark.Response;
12+
13+
import javax.servlet.http.HttpServletResponse;
14+
import java.io.IOException;
15+
import java.nio.file.Files;
16+
import java.nio.file.Paths;
17+
import java.util.Arrays;
18+
19+
public class EffSendBackFile extends Effect {
20+
21+
static {
22+
Skript.registerEffect(EffSendBackFile.class, "send back file %string%");
23+
}
24+
25+
private Expression<String> file;
26+
27+
@Override
28+
public boolean init(Expression<?>[] exprs, int i, Kleenean kleenean, SkriptParser.ParseResult parseResult) {
29+
if (ScriptLoader.getCurrentEvents() != null && Arrays.stream(ScriptLoader.getCurrentEvents())
30+
.anyMatch(event -> EventValues.getEventValueGetter(event, Response.class, 0) != null)) {
31+
file = (Expression<String>) exprs[0];
32+
return true;
33+
}
34+
Skript.error("You may only use 'send back' in events with a response");
35+
return false;
36+
}
37+
38+
@Override
39+
protected void execute(Event e) {
40+
Response response = EventValues.getEventValue(e, Response.class, 0);
41+
String file = this.file.getSingle(e);
42+
if (response != null && file != null) {
43+
try {
44+
byte[] fileData = Files.readAllBytes(Paths.get(file));
45+
HttpServletResponse raw = response.raw();
46+
raw.getOutputStream().write(fileData);
47+
raw.getOutputStream().flush();
48+
raw.getOutputStream().close();
49+
} catch (IOException ignored) {
50+
}
51+
}
52+
}
53+
54+
@Override
55+
public String toString(Event e, boolean debug) {
56+
return "send back file" + file.toString(e, debug);
57+
}
58+
59+
}

src/main/java/com/pikachu/webaddon/skript/scopes/http/ScopeHTTPServer.java

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,15 @@
2323
import spark.Service;
2424

2525
import java.util.ArrayList;
26+
import java.util.HashSet;
2627
import java.util.List;
28+
import java.util.Set;
2729
import java.util.UUID;
2830

2931
public class ScopeHTTPServer extends EventScope {
3032

3133
private static boolean parsing;
34+
private static Set<Integer> usedPorts = new HashSet<>();
3235

3336
static {
3437
Skript.registerEvent("web server", ScopeHTTPServer.class, StubBukkitEvent.class,
@@ -56,44 +59,47 @@ public Response get(HTTPRequestEvent arg) {
5659

5760
@Override
5861
public boolean init(Literal<?>[] args, int matchedPattern, SkriptParser.ParseResult parseResult) {
59-
parsing = true;
6062
SectionNode sectionNode = (SectionNode) SkriptLogger.getNode();
6163
stringRep = sectionNode.getKey();
6264
String stringPort = parseResult.regexes.get(0).group();
6365
if (stringPort.matches("\\d{1,5}")) {
6466
port = Integer.parseInt(stringPort);
67+
if (usedPorts.contains(port)) {
68+
Skript.error("There is already a web server running on port " + port);
69+
return false;
70+
}
6571
} else {
6672
Skript.error("'" + stringPort + "' is not a valid port");
67-
parsing = false;
6873
return false;
6974
}
7075
if (stringRep.startsWith("on")) {
7176
Skript.error("You may not use 'on' with a web server!");
72-
parsing = false;
7377
return false;
7478
}
7579

7680
for (Node node : sectionNode) {
7781
Util.setKey(node, ScriptLoader.replaceOptions(node.getKey()));
7882
if (!(node instanceof SectionNode)) {
7983
Skript.error("A web server may only contain request scopes");
80-
parsing = false;
8184
return false;
8285
}
8386
if (RequestScope.getPatterns().stream().noneMatch(p -> node.getKey().matches(p))) {
8487
Skript.error("'" + node.getKey() + "' is not a request scope (e.g. 'get /index:')");
85-
parsing = false;
8688
return false;
8789
}
8890
rawNodes.add((SectionNode) node);
8991
}
92+
if (rawNodes.isEmpty()) {
93+
Skript.error("A web server without any routes is useless");
94+
return false;
95+
}
9096
Util.clearSectionNode(sectionNode);
91-
parsing = false;
9297
return true;
9398
}
9499

95100
@Override
96101
public void load() {
102+
usedPorts.add(port);
97103
server = Service.ignite().port(port);
98104
for (SectionNode node : rawNodes) {
99105
RequestScope scope = (RequestScope) Condition.parse(node.getKey(), "Can't understand this scope: '" + node.getKey() + "'");
@@ -112,6 +118,7 @@ public void unregister(Trigger t) {
112118
// workaround for spark npe
113119
server.options("workaroundForSparkNpe" + UUID.randomUUID().toString(), (req, resp) -> "you shouldn't be seeing this");
114120
server.stop();
121+
usedPorts.remove(port);
115122
}
116123

117124
@Override

src/main/java/com/pikachu/webaddon/skript/scopes/http/requests/SimpleRequestScope.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,6 @@ public static void register(Class<? extends SimpleRequestScope> clazz, String ty
1717

1818
@Override
1919
public final boolean init(Expression<?>[] exprs, int matchedPattern, Kleenean isDelayed, SkriptParser.ParseResult parseResult) {
20-
if (!hasSection()) {
21-
return false;
22-
}
2320
if (parseResult.regexes.size() != 1) {
2421
throw new UnsupportedOperationException("A " + getClass().getSimpleName() + " must have only one regex!");
2522
}

src/main/java/com/pikachu/webaddon/util/scope/EffectSection.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ public abstract class EffectSection extends Condition {
3737
private TriggerSection trigger = null;
3838
private boolean hasIfOrElseIf = false;
3939
private boolean executeNext = true;
40+
private boolean hasSection;
4041
private String asInScript;
4142

4243
public EffectSection() {
@@ -45,6 +46,7 @@ public EffectSection() {
4546
Node n = SkriptLogger.getNode(); //Skript sets the node before parsing this 'effect'
4647
if (n == null || !(n instanceof SectionNode)) //Check in case it wasn't loaded as inline condition
4748
return;
49+
hasSection = true;
4850
asInScript = n.getKey();
4951
//True if it was used as condition
5052
hasIfOrElseIf = StringUtils.startsWithIgnoreCase(n.getKey(), "if ") || StringUtils.startsWithIgnoreCase(n.getKey(), "else if ");
@@ -176,7 +178,7 @@ public void loadSection(String name, boolean setNext, Class<? extends Event>...
176178
* @return True if it has
177179
*/
178180
public boolean hasSection() {
179-
return section != null || trigger != null;
181+
return hasSection;
180182
}
181183

182184
/**

0 commit comments

Comments
 (0)