Skip to content

Commit c9329d7

Browse files
committed
Plugins
1 parent a4ac854 commit c9329d7

18 files changed

Lines changed: 347 additions & 138 deletions

src/main/java/PluginTest.java

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import org.mcphackers.mcp.MCP;
2+
import org.mcphackers.mcp.plugin.MCPPlugin;
3+
import org.mcphackers.mcp.tasks.Task;
4+
import org.mcphackers.mcp.tasks.TaskDecompile;
5+
6+
public class PluginTest implements MCPPlugin {
7+
8+
@Override
9+
public String pluginId() {
10+
return "testPlugin";
11+
}
12+
13+
@Override
14+
public void init() {
15+
16+
}
17+
18+
@Override
19+
public void onTaskEvent(TaskEvent event, Task task) {
20+
if(task instanceof TaskDecompile) {
21+
if(event == TaskEvent.PRE_TASK) {
22+
task.log("PRE_TASK event triggered inside of decompile task");
23+
}
24+
if(event == TaskEvent.POST_TASK) {
25+
task.log("POST_TASK event triggered inside of decompile task");
26+
}
27+
}
28+
else {
29+
if(event == TaskEvent.PRE_TASK) {
30+
task.log("PRE_TASK event triggered");
31+
}
32+
if(event == TaskEvent.POST_TASK) {
33+
task.log("POST_TASK event triggered");
34+
}
35+
}
36+
}
37+
38+
@Override
39+
public void onMCPEvent(MCPEvent event, MCP mcp) {
40+
if(event == MCPEvent.STARTED_TASKS) {
41+
mcp.log("Running tasks");
42+
}
43+
}
44+
}

src/main/java/org/mcphackers/mcp/BasicMCP.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
import org.mcphackers.mcp.tasks.Task;
88

9-
public abstract class BasicMCP implements MCP {
9+
public abstract class BasicMCP extends MCP {
1010

1111
@Override
1212
public Path getWorkingDir() {

src/main/java/org/mcphackers/mcp/MCP.java

Lines changed: 70 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,43 @@
11
package org.mcphackers.mcp;
22

3+
import java.io.IOException;
4+
import java.nio.file.Files;
35
import java.nio.file.Path;
6+
import java.nio.file.Paths;
47
import java.util.ArrayList;
58
import java.util.HashMap;
69
import java.util.List;
710
import java.util.Map;
811
import java.util.concurrent.ExecutorService;
912
import java.util.concurrent.Executors;
1013
import java.util.concurrent.atomic.AtomicInteger;
14+
import java.util.stream.Collectors;
15+
import java.util.stream.Stream;
1116

17+
import org.mcphackers.mcp.plugin.MCPPlugin;
18+
import org.mcphackers.mcp.plugin.MCPPlugin.MCPEvent;
19+
import org.mcphackers.mcp.plugin.MCPPlugin.TaskEvent;
1220
import org.mcphackers.mcp.tasks.Task;
1321
import org.mcphackers.mcp.tasks.Task.Side;
22+
import org.mcphackers.mcp.tools.ClassUtils;
1423
import org.mcphackers.mcp.tools.VersionsParser;
1524

16-
public interface MCP {
25+
public abstract class MCP {
1726

18-
String VERSION = "v1.0-pre1";
27+
public static final String VERSION = "v1.0-pre1";
28+
private static final Map<String, MCPPlugin> plugins = new HashMap<>();
1929

20-
Map<String, TaskParameter> nameToParamMap = new HashMap<>();
30+
static {
31+
loadPlugins();
32+
}
2133

22-
default void performTask(TaskMode mode, Side side) {
34+
public void performTask(TaskMode mode, Side side) {
2335
performTask(mode, side, true, true);
2436
}
2537

26-
Path getWorkingDir();
38+
public abstract Path getWorkingDir();
2739

28-
default void performTask(TaskMode mode, Side side, boolean enableProgressBars, boolean enableCompletionMessage) {
40+
public final void performTask(TaskMode mode, Side side, boolean enableProgressBars, boolean enableCompletionMessage) {
2941
List<Task> tasks = mode.getTasks(this);
3042
if(tasks.size() == 0) {
3143
System.err.println("Performing 0 tasks");
@@ -52,6 +64,7 @@ default void performTask(TaskMode mode, Side side, boolean enableProgressBars, b
5264
if(enableProgressBars) setProgressBars(performedTasks, mode);
5365
ExecutorService pool = Executors.newFixedThreadPool(2);
5466
setActive(false);
67+
triggerEvent(MCPEvent.STARTED_TASKS);
5568

5669
AtomicInteger result1 = new AtomicInteger(Task.INFO);
5770

@@ -63,7 +76,7 @@ default void performTask(TaskMode mode, Side side, boolean enableProgressBars, b
6376
}
6477
pool.execute(() -> {
6578
try {
66-
task.doTask();
79+
task.performTask();
6780
} catch (Exception e) {
6881
result1.set(Task.ERROR);
6982
e.printStackTrace();
@@ -86,10 +99,12 @@ default void performTask(TaskMode mode, Side side, boolean enableProgressBars, b
8699
result = retresult;
87100
}
88101
}
102+
//TODO display this info in the pop up message
89103
if(msgs.size() > 0) log("");
90104
for(String msg : msgs) {
91105
log(msg);
92106
}
107+
triggerEvent(MCPEvent.FINISHED_TASKS);
93108
if(enableCompletionMessage) {
94109
String[] msgs2 = {"Finished successfully!", "Finished with warnings!", "Finished with errors!"};
95110
showMessage(mode.getFullName(), msgs2[result], result);
@@ -98,32 +113,67 @@ default void performTask(TaskMode mode, Side side, boolean enableProgressBars, b
98113
if(enableProgressBars) clearProgressBars();
99114
}
100115

101-
void setProgressBars(List<Task> tasks, TaskMode mode);
116+
public abstract void setProgressBars(List<Task> tasks, TaskMode mode);
102117

103-
void clearProgressBars();
118+
public abstract void clearProgressBars();
104119

105-
void log(String msg);
120+
public abstract void log(String msg);
106121

107-
Options getOptions();
122+
public abstract Options getOptions();
108123

109-
String getCurrentVersion();
124+
public abstract String getCurrentVersion();
110125

111-
void setCurrentVersion(String version);
126+
public abstract void setCurrentVersion(String version);
112127

113-
void setProgress(int barIndex, String progressMessage);
128+
public abstract void setProgress(int barIndex, String progressMessage);
114129

115-
void setProgress(int barIndex, int progress);
130+
public abstract void setProgress(int barIndex, int progress);
116131

117-
void setActive(boolean active);
132+
public abstract void setActive(boolean active);
118133

119-
boolean yesNoInput(String title, String msg);
134+
public abstract boolean yesNoInput(String title, String msg);
120135

121-
String inputString(String title, String msg);
136+
public abstract String inputString(String title, String msg);
122137

123-
void showMessage(String title, String msg, int type);
138+
public abstract void showMessage(String title, String msg, int type);
124139

125-
default void setProgress(int barIndex, String progressMessage, int progress) {
140+
public void setProgress(int barIndex, String progressMessage, int progress) {
126141
setProgress(barIndex, progress);
127142
setProgress(barIndex, progressMessage);
128143
}
144+
145+
private final static void loadPlugins() {
146+
if(Files.exists(Paths.get("plugins"))) {
147+
List<Path> jars = new ArrayList<>();
148+
try(Stream<Path> stream = Files.list(Paths.get("plugins")).filter(library -> !library.endsWith(".jar")).filter(library -> !Files.isDirectory(library))) {
149+
jars.addAll(stream.collect(Collectors.toList()));
150+
} catch (IOException e) {
151+
e.printStackTrace();
152+
}
153+
try {
154+
for(Path p : jars) {
155+
List<Class<MCPPlugin>> classes = ClassUtils.getClasses(p, MCPPlugin.class);
156+
for(Class<MCPPlugin> cls : classes) {
157+
MCPPlugin plugin = cls.newInstance();
158+
plugin.init();
159+
plugins.put(plugin.pluginId(), plugin);
160+
}
161+
}
162+
} catch (Exception e) {
163+
e.printStackTrace();
164+
}
165+
}
166+
}
167+
168+
public final void triggerEvent(MCPEvent event) {
169+
for(Map.Entry<String, MCPPlugin> entry : plugins.entrySet()) {
170+
entry.getValue().onMCPEvent(event, this);
171+
}
172+
}
173+
174+
public final void triggerTaskEvent(TaskEvent event, Task task) {
175+
for(Map.Entry<String, MCPPlugin> entry : plugins.entrySet()) {
176+
entry.getValue().onTaskEvent(event, task);
177+
}
178+
}
129179
}

src/main/java/org/mcphackers/mcp/TaskMode.java

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,20 @@
33
import java.lang.reflect.Constructor;
44
import java.lang.reflect.InvocationTargetException;
55
import java.util.ArrayList;
6+
import java.util.HashMap;
67
import java.util.List;
8+
import java.util.Map;
79

810
import org.mcphackers.mcp.tasks.*;
911
import org.mcphackers.mcp.tasks.Task.Side;
1012

1113
public class TaskMode {
1214
public static final List<TaskMode> registeredTasks = new ArrayList<>();
1315

14-
public static final TaskMode HELP = new TaskMode("help", "Help", "Displays command usage", null);
15-
public static final TaskMode DECOMPILE = new TaskMode("decompile", "Decompile", "Start decompiling Minecraft", TaskDecompile.class, new TaskParameter[]{
16+
public static final Map<String, TaskParameter> nameToParamMap = new HashMap<>();
17+
18+
public static TaskMode HELP = new TaskMode("help", "Help", "Displays command usage", null);
19+
public static TaskMode DECOMPILE = new TaskMode("decompile", "Decompile", "Start decompiling Minecraft", TaskDecompile.class, new TaskParameter[]{
1620
TaskParameter.DEBUG,
1721
TaskParameter.SOURCE_VERSION,
1822
TaskParameter.TARGET_VERSION,
@@ -22,49 +26,49 @@ public class TaskMode {
2226
TaskParameter.PATCHES,
2327
TaskParameter.SIDE
2428
});
25-
public static final TaskMode RECOMPILE = new TaskMode("recompile", "Recompile", "Recompile Minecraft sources", TaskRecompile.class, new TaskParameter[] {
29+
public static TaskMode RECOMPILE = new TaskMode("recompile", "Recompile", "Recompile Minecraft sources", TaskRecompile.class, new TaskParameter[] {
2630
TaskParameter.DEBUG,
2731
TaskParameter.SOURCE_VERSION,
2832
TaskParameter.TARGET_VERSION,
2933
TaskParameter.BOOT_CLASS_PATH,
3034
TaskParameter.SIDE
3135
});
32-
public static final TaskMode REOBFUSCATE = new TaskMode("reobfuscate", "Reobfuscate", "Reobfuscate Minecraft classes", TaskReobfuscate.class, new TaskParameter[] {
36+
public static TaskMode REOBFUSCATE = new TaskMode("reobfuscate", "Reobfuscate", "Reobfuscate Minecraft classes", TaskReobfuscate.class, new TaskParameter[] {
3337
TaskParameter.DEBUG,
3438
TaskParameter.SOURCE_VERSION,
3539
TaskParameter.TARGET_VERSION,
3640
TaskParameter.BOOT_CLASS_PATH,
3741
TaskParameter.SIDE
3842
});
39-
public static final TaskMode UPDATE_MD5 = new TaskMode("updatemd5", "Update MD5 Hashes", "Update md5 hash tables used for reobfuscation", TaskUpdateMD5.class, new TaskParameter[] {
43+
public static TaskMode UPDATE_MD5 = new TaskMode("updatemd5", "Update MD5 Hashes", "Update md5 hash tables used for reobfuscation", TaskUpdateMD5.class, new TaskParameter[] {
4044
TaskParameter.DEBUG,
4145
TaskParameter.SOURCE_VERSION,
4246
TaskParameter.TARGET_VERSION,
4347
TaskParameter.BOOT_CLASS_PATH,
4448
TaskParameter.SIDE
4549
});
46-
public static final TaskMode UPDATE_MCP = new TaskMode("updatemcp", "Update", "Download an update if available", TaskDownloadUpdate.class);
50+
public static TaskMode UPDATE_MCP = new TaskMode("updatemcp", "Update", "Download an update if available", TaskDownloadUpdate.class);
4751

48-
public static final TaskMode SETUP = new TaskMode("setup", "Setup", "Choose a version to setup", TaskSetup.class, new TaskParameter[] {
52+
public static TaskMode SETUP = new TaskMode("setup", "Setup", "Choose a version to setup", TaskSetup.class, new TaskParameter[] {
4953
TaskParameter.DEBUG,
5054
});
51-
public static final TaskMode CLEANUP = new TaskMode("cleanup", "Cleanup", "Delete all source and class folders", TaskCleanup.class, new TaskParameter[] {
55+
public static TaskMode CLEANUP = new TaskMode("cleanup", "Cleanup", "Delete all source and class folders", TaskCleanup.class, new TaskParameter[] {
5256
TaskParameter.DEBUG,
5357
TaskParameter.SRC_CLEANUP
5458
});
55-
public static final TaskMode START = new TaskMode("start", "Start", "Runs the client or the server from compiled classes", TaskRun.class, new TaskParameter[] {
59+
public static TaskMode START = new TaskMode("start", "Start", "Runs the client or the server from compiled classes", TaskRun.class, new TaskParameter[] {
5660
TaskParameter.RUN_BUILD
5761
});
58-
public static final TaskMode BUILD = new TaskMode("build", "Build", "Builds the final jar or zip", TaskBuild.class, new TaskParameter[] {
62+
public static TaskMode BUILD = new TaskMode("build", "Build", "Builds the final jar or zip", TaskBuild.class, new TaskParameter[] {
5963
TaskParameter.DEBUG,
6064
TaskParameter.SOURCE_VERSION,
6165
TaskParameter.TARGET_VERSION,
6266
TaskParameter.BOOT_CLASS_PATH,
6367
TaskParameter.FULL_BUILD,
6468
TaskParameter.SIDE
6569
});
66-
public static final TaskMode CREATE_PATCH = new TaskMode("createpatch", "Create patch", "Creates patch", TaskCreatePatch.class);
67-
public static final TaskMode EXIT = new TaskMode("exit", "Exit", "Exit the program", null);
70+
public static TaskMode CREATE_PATCH = new TaskMode("createpatch", "Create patch", "Creates patch", TaskCreatePatch.class);
71+
public static TaskMode EXIT = new TaskMode("exit", "Exit", "Exit the program", null);
6872

6973
private final String name;
7074
private final String fullName;
@@ -80,15 +84,19 @@ public TaskMode(String name, String fullName, String desc, Class<? extends Task>
8084
registeredTasks.add(this);
8185
}
8286

83-
public TaskMode(String name, String fullName, Class<? extends Task> taskClass, TaskParameter[] params) {
84-
this(name, fullName, "???", taskClass, params);
85-
}
86-
8787
public TaskMode(String name, String fullName, String desc, Class<? extends Task> taskClass, TaskParameter[] params) {
8888
this(name, fullName, desc, taskClass);
8989
this.params = params;
9090
}
9191

92+
public TaskMode(String name, String fullName, Class<? extends Task> taskClass, TaskParameter[] params) {
93+
this(name, fullName, "No description provided", taskClass, params);
94+
}
95+
96+
public TaskMode(String name, String fullName, Class<? extends Task> taskClass) {
97+
this(name, fullName, "No description provided", taskClass);
98+
}
99+
92100
public String getName() {
93101
return name;
94102
}

src/main/java/org/mcphackers/mcp/TaskModeImpl.java

Lines changed: 0 additions & 5 deletions
This file was deleted.

src/main/java/org/mcphackers/mcp/TaskParameter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public enum TaskParameter {
2626
}
2727

2828
TaskParameter(String name, String desc, Class c) {
29-
MCP.nameToParamMap.put(name, this);
29+
TaskMode.nameToParamMap.put(name, this);
3030
this.name = name;
3131
this.desc = desc;
3232
this.type = c;

0 commit comments

Comments
 (0)