Skip to content

Commit 7fd9bd7

Browse files
committed
Script browser implementation
1 parent 75300a9 commit 7fd9bd7

File tree

13 files changed

+274
-33
lines changed

13 files changed

+274
-33
lines changed

src/main/java/io/github/techstreet/dfscript/DFScript.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ public void onClose() {
8989
LOGGER.error("Error");
9090
err.printStackTrace();
9191
}
92+
9293
LOGGER.info("Closed.");
9394
}
9495
}

src/main/java/io/github/techstreet/dfscript/commands/CommandManager.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@
99

1010
import io.github.techstreet.dfscript.util.hypercube.HypercubeRank;
1111
import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager;
12+
import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback;
1213
import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource;
14+
import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback;
1315

1416
public class CommandManager implements Loadable {
1517

@@ -34,8 +36,7 @@ public void load() {
3436

3537
// Example of registering commands with a required df rank
3638
// rankedCommands.put(new TestCommand(), DFRank.JRHELPER);
37-
38-
attachTo(ClientCommandManager.getActiveDispatcher());
39+
ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> attachTo(dispatcher));
3940
}
4041

4142
private void attachTo(CommandDispatcher<FabricClientCommandSource> cd) {

src/main/java/io/github/techstreet/dfscript/mixin/player/MLocalPlayer.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import io.github.techstreet.dfscript.event.system.EventManager;
55
import io.github.techstreet.dfscript.event.SendChatEvent;
66
import net.minecraft.client.network.ClientPlayerEntity;
7+
import net.minecraft.text.Text;
78
import org.spongepowered.asm.mixin.Mixin;
89
import org.spongepowered.asm.mixin.injection.At;
910
import org.spongepowered.asm.mixin.injection.Inject;
@@ -13,8 +14,8 @@
1314
public class MLocalPlayer {
1415

1516
@Inject(method = "sendChatMessage", at = @At("HEAD"), cancellable = true)
16-
private void chat(String string, CallbackInfo ci) {
17-
SendChatEvent event = new SendChatEvent(string);
17+
private void chat(String message, Text preview, CallbackInfo ci) {
18+
SendChatEvent event = new SendChatEvent(message);
1819
EventManager.getInstance().dispatch(event);
1920
if (event.isCancelled()) {
2021
ci.cancel();

src/main/java/io/github/techstreet/dfscript/screen/CScreen.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ public boolean keyPressed(int keyCode, int scanCode, int modifiers) {
6969
for (CWidget cWidget : widgets) {
7070
cWidget.keyPressed(keyCode, scanCode, modifiers);
7171
}
72+
7273
return super.keyPressed(keyCode, scanCode, modifiers);
7374
}
7475

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
package io.github.techstreet.dfscript.screen.script;
2+
3+
import com.google.gson.JsonElement;
4+
import com.google.gson.JsonObject;
5+
import com.google.gson.JsonParser;
6+
import com.google.gson.stream.JsonReader;
7+
import io.github.techstreet.dfscript.DFScript;
8+
import io.github.techstreet.dfscript.screen.CScreen;
9+
import io.github.techstreet.dfscript.screen.widget.*;
10+
import io.github.techstreet.dfscript.script.Script;
11+
import io.github.techstreet.dfscript.script.ScriptManager;
12+
import io.github.techstreet.dfscript.script.VirtualScript;
13+
import net.minecraft.item.ItemStack;
14+
import net.minecraft.sound.SoundCategory;
15+
import net.minecraft.sound.SoundEvents;
16+
import net.minecraft.text.Text;
17+
18+
import java.io.*;
19+
import java.net.URL;
20+
import java.nio.charset.Charset;
21+
import java.util.ArrayList;
22+
import java.util.List;
23+
import java.util.Objects;
24+
25+
public class ScriptAddScreen extends CScreen {
26+
public static ArrayList<VirtualScript> scripts = new ArrayList<>();
27+
CScrollPanel panel;
28+
CTextField searchBox;
29+
30+
public ScriptAddScreen() {
31+
super(110, 106);
32+
open();
33+
}
34+
35+
private void open() {
36+
CPlainPanel root = new CPlainPanel(0, 0, 110, 106);
37+
38+
panel = new CScrollPanel(0, 0, 110, 106);
39+
40+
root.add(panel);
41+
42+
searchBox = new CTextField("Search...", 5, 5, 100, 10, true);
43+
searchBox.setChangedListener(this::update);
44+
root.add(searchBox);
45+
46+
widgets.add(root);
47+
48+
update();
49+
}
50+
51+
private void update() {
52+
List<VirtualScript> filtered = new ArrayList<>();
53+
String query = searchBox.getText().toLowerCase();
54+
55+
for (VirtualScript script : scripts) {
56+
if (!searchBox.getText().equals("Search...")) {
57+
if (script.getName().toLowerCase().contains(query.toLowerCase()) || script.getOwner().toLowerCase().contains(query.toLowerCase())) {
58+
filtered.add(script);
59+
}
60+
} else {
61+
filtered.add(script);
62+
}
63+
}
64+
65+
panel.clear();
66+
fillPanel(filtered);
67+
}
68+
69+
public static void getScripts() {
70+
ArrayList<VirtualScript> scripts = new ArrayList<>();
71+
72+
try {
73+
InputStream is = new URL("https://dfscript-server.techstreetdev.repl.co/scripts/get").openStream();
74+
BufferedReader rd = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")));
75+
JsonObject obj = JsonParser.parseString(readAll(rd)).getAsJsonObject();
76+
77+
for (String key : obj.keySet()) {
78+
JsonObject scriptObject = obj.getAsJsonObject(key);
79+
scripts.add(new VirtualScript(scriptObject.get("name").getAsString(), scriptObject.get("owner").getAsString(), key));
80+
}
81+
82+
is.close();
83+
} catch (Exception e) {
84+
e.printStackTrace();
85+
}
86+
87+
ScriptAddScreen.scripts = scripts;
88+
}
89+
90+
public static String readAll(Reader rd) throws IOException {
91+
StringBuilder sb = new StringBuilder();
92+
int cp;
93+
94+
while ((cp = rd.read()) != -1) {
95+
sb.append((char) cp);
96+
}
97+
98+
return sb.toString();
99+
}
100+
101+
private void fillPanel(List<VirtualScript> scriptList) {
102+
int y = 35;
103+
CButton newButton = new CButton(7, 23, 96, 10, "New Script", () -> {
104+
DFScript.MC.setScreen(new ScriptCreationScreen());
105+
});
106+
107+
panel.add(newButton);
108+
109+
for (VirtualScript script : scriptList) {
110+
CButton button = new CButton(7, y, 96, 10, script.getName(), () -> {
111+
DFScript.MC.setScreen(new ScriptInstallScreen(script));
112+
});
113+
114+
panel.add(button);
115+
y += 12;
116+
}
117+
118+
long time = Math.abs((System.currentTimeMillis() / 1000) - ScriptManager.lastServerUpdate);
119+
long minutes = (time % 3600) / 60;
120+
long seconds = time % 60;
121+
122+
panel.add(new CText(8, 17, Text.literal("Last update: " + minutes + "m " + seconds + "s" + " ago!")));
123+
}
124+
}

src/main/java/io/github/techstreet/dfscript/screen/script/ScriptCreationScreen.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public class ScriptCreationScreen extends CScreen {
1616
Pattern ILLEGAL_CHARS = Pattern.compile("[\\\\/:*?\"<>|]");
1717

1818
protected ScriptCreationScreen() {
19-
super(100, 60);
19+
super(105, 60);
2020

2121
CTextField name = new CTextField("My Script", 2, 2, 96, 36, true);
2222

@@ -37,13 +37,14 @@ protected ScriptCreationScreen() {
3737
ScriptManager.getInstance().createScript(name.getText());
3838
io.github.techstreet.dfscript.DFScript.MC.setScreen(new ScriptListScreen());
3939
}));
40+
4041
widgets.add(new CButton(50, 42, 48, 15, "Cancel", () -> {
41-
DFScript.MC.setScreen(new ScriptListScreen());
42+
DFScript.MC.setScreen(new ScriptAddScreen());
4243
}));
4344
}
4445

4546
@Override
4647
public void close() {
47-
io.github.techstreet.dfscript.DFScript.MC.setScreen(new ScriptListScreen());
48+
DFScript.MC.setScreen(new ScriptAddScreen());
4849
}
4950
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package io.github.techstreet.dfscript.screen.script;
2+
3+
import io.github.techstreet.dfscript.DFScript;
4+
import io.github.techstreet.dfscript.screen.CScreen;
5+
import io.github.techstreet.dfscript.screen.widget.CButton;
6+
import io.github.techstreet.dfscript.screen.widget.CText;
7+
import io.github.techstreet.dfscript.screen.widget.CTextField;
8+
import io.github.techstreet.dfscript.script.ScriptManager;
9+
import io.github.techstreet.dfscript.script.VirtualScript;
10+
import net.minecraft.text.Text;
11+
12+
import java.util.regex.Matcher;
13+
import java.util.regex.Pattern;
14+
15+
public class ScriptInstallScreen extends CScreen {
16+
17+
protected ScriptInstallScreen(VirtualScript script) {
18+
super(125, 40);
19+
20+
CText name = new CText(5, 5, Text.literal("Name: " + script.getName()));
21+
CText owner = new CText(5, 12, Text.literal("Owner: " + script.getOwner()));
22+
CText id = new CText(5, 19, Text.literal("ID: " + script.getId()));
23+
24+
widgets.add(name);
25+
widgets.add(owner);
26+
widgets.add(id);
27+
28+
widgets.add(new CButton(80, 26, 40, 10, "Install", () -> {
29+
script.download();
30+
DFScript.MC.setScreen(new ScriptListScreen());
31+
}));
32+
}
33+
34+
@Override
35+
public void close() {
36+
DFScript.MC.setScreen(new ScriptAddScreen());
37+
}
38+
}

src/main/java/io/github/techstreet/dfscript/screen/script/ScriptListScreen.java

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package io.github.techstreet.dfscript.screen.script;
22

3-
import com.google.gson.JsonElement;
43
import io.github.techstreet.dfscript.DFScript;
54
import io.github.techstreet.dfscript.screen.CScreen;
65
import io.github.techstreet.dfscript.screen.widget.CButton;
@@ -19,8 +18,10 @@
1918
import java.nio.file.Files;
2019
import java.util.ArrayList;
2120
import java.util.List;
21+
import java.util.Objects;
2222
import java.util.zip.GZIPOutputStream;
2323

24+
import io.github.techstreet.dfscript.script.util.UploadResponse;
2425
import io.github.techstreet.dfscript.util.chat.ChatType;
2526
import io.github.techstreet.dfscript.util.chat.ChatUtil;
2627
import net.minecraft.client.gui.DrawableHelper;
@@ -88,12 +89,13 @@ public boolean mouseClicked(double x, double y, int button) {
8889
try {
8990
// Encode the script JSON to GZIP Base64
9091
byte[] bytes = Files.readAllBytes(s.getFile().toPath());
91-
ByteArrayOutputStream baos = new ByteArrayOutputStream();
92-
GZIPOutputStream gzip = new GZIPOutputStream(baos);
93-
gzip.write(Base64.encodeBase64(bytes));
94-
gzip.finish();
9592

96-
String scriptData = baos.toString();
93+
ByteArrayOutputStream rstBao = new ByteArrayOutputStream();
94+
GZIPOutputStream zos = new GZIPOutputStream(rstBao);
95+
zos.write(bytes);
96+
zos.close();
97+
98+
String scriptData = Base64.encodeBase64String(rstBao.toByteArray());
9799

98100
// Upload the script to the server
99101
URL url = new URL("https://DFScript-Server.techstreetdev.repl.co/scripts/upload");
@@ -103,6 +105,7 @@ public boolean mouseClicked(double x, double y, int button) {
103105
con.setRequestProperty("Accept", "application/json");
104106
con.setDoOutput(true);
105107

108+
System.out.println(scriptData);
106109
String jsonInputString = "{\"data\": \"" + scriptData + "\"}";
107110
try (OutputStream os = con.getOutputStream()) {
108111
byte[] input = jsonInputString.getBytes("utf-8");
@@ -118,9 +121,11 @@ public boolean mouseClicked(double x, double y, int button) {
118121
response.append(responseLine.trim());
119122
}
120123

121-
//JsonElement obj = DFScript.GSON.fromJson(response.toString());
122-
//System.out.println(obj.get("id"));
123-
//s.setServerId(obj.get("id").toString());
124+
UploadResponse uploadResponse = DFScript.GSON.fromJson(response.toString(), UploadResponse.class);
125+
System.out.println(uploadResponse.getId());
126+
s.setServer(uploadResponse.getId());
127+
128+
ScriptManager.getInstance().saveScript(s);
124129
}
125130
} catch (Exception e) {
126131
ChatUtil.sendMessage("Failed to upload script to the server, please report this to a DFScript developer!", ChatType.FAIL);
@@ -135,7 +140,7 @@ public boolean mouseClicked(double x, double y, int button) {
135140
contextMenu.add(enableDisable);
136141
});
137142

138-
if (s.getServerId() == null) {
143+
if (Objects.equals(s.getServer(), "None")) {
139144
DFScript.MC.send(() -> {
140145
widgets.add(upload);
141146
contextMenu.add(upload);
@@ -152,7 +157,7 @@ public boolean mouseClicked(double x, double y, int button) {
152157
}
153158

154159
CButton add = new CButton(25, y, 40, 8, "Add", () -> {
155-
io.github.techstreet.dfscript.DFScript.MC.setScreen(new ScriptCreationScreen());
160+
io.github.techstreet.dfscript.DFScript.MC.setScreen(new ScriptAddScreen());
156161
});
157162
panel.add(add);
158163
}

src/main/java/io/github/techstreet/dfscript/script/Script.java

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -29,17 +29,17 @@ public class Script {
2929
private final String name;
3030
private String owner;
3131
private int version = 0;
32-
private String serverId;
32+
private String server;
3333
private final List<ScriptPart> parts;
3434
private final Logger LOGGER;
3535
private final ScriptContext context = new ScriptContext();
3636
private File file;
3737
private boolean disabled;
3838

39-
public Script(String name, String owner, String serverId, List<ScriptPart> parts, boolean disabled, int version) {
39+
public Script(String name, String owner, String server, List<ScriptPart> parts, boolean disabled, int version) {
4040
this.name = name;
4141
this.owner = owner;
42-
this.serverId = serverId;
42+
this.server = server;
4343
this.parts = parts;
4444
this.disabled = disabled;
4545
this.version = version;
@@ -166,8 +166,7 @@ private boolean endScope(ScriptTask task) {
166166

167167
task.stack().peekElement().setVariable("LagslayerCounter", lagslayerCounter);
168168

169-
if(lagslayerCounter >= 100000)
170-
{
169+
if(lagslayerCounter >= 100000) {
171170
task.stack().peekElement().setVariable("LagslayerCounter", 0);
172171
task.stop();//Lagslayer be like:
173172
}
@@ -200,8 +199,8 @@ public int getVersion() {
200199
return version;
201200
}
202201

203-
public String getServerId() {
204-
return serverId;
202+
public String getServer() {
203+
return server;
205204
}
206205

207206
public boolean disabled() {
@@ -220,8 +219,8 @@ public void setVersion(int version) {
220219
this.version = version;
221220
}
222221

223-
public void setServerId(String serverId) {
224-
this.serverId = serverId;
222+
public void setServer(String server) {
223+
this.server = server;
225224
}
226225

227226
public ScriptContext getContext() {
@@ -233,8 +232,11 @@ public static class Serializer implements JsonSerializer<Script>, JsonDeserializ
233232
public Script deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
234233
JsonObject object = json.getAsJsonObject();
235234
String name = object.get("name").getAsString();
236-
String owner = object.get("owner").getAsString();
237-
String serverId = object.get("serverId").getAsString();
235+
236+
String owner = null;
237+
if (object.get("owner") != null) owner = object.get("owner").getAsString();
238+
239+
String serverId = object.get("server").getAsString();
238240

239241
List<ScriptPart> parts = new ArrayList<>();
240242
for (JsonElement element : object.get("actions").getAsJsonArray()) {
@@ -253,7 +255,7 @@ public JsonElement serialize(Script src, Type typeOfSrc, JsonSerializationContex
253255
JsonObject object = new JsonObject();
254256
object.addProperty("name", src.name);
255257
object.addProperty("owner", src.owner);
256-
object.addProperty("serverId", src.serverId);
258+
object.addProperty("server", src.server);
257259

258260
JsonArray array = new JsonArray();
259261
for (ScriptPart part : src.getParts()) {

0 commit comments

Comments
 (0)