Merge pull request #53 from TBMCPlugins/redesign
Start using components (PR to dev)
This commit is contained in:
commit
652cdfc131
24 changed files with 616 additions and 42 deletions
|
@ -0,0 +1,13 @@
|
||||||
|
<component name="libraryTable">
|
||||||
|
<library name="Maven: com.github.TBMCPlugins.ButtonCore:Towny:master-248b0d8d0a-1">
|
||||||
|
<CLASSES>
|
||||||
|
<root url="jar://$MAVEN_REPOSITORY$/com/github/TBMCPlugins/ButtonCore/Towny/master-248b0d8d0a-1/Towny-master-248b0d8d0a-1.jar!/" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC>
|
||||||
|
<root url="jar://$MAVEN_REPOSITORY$/com/github/TBMCPlugins/ButtonCore/Towny/master-248b0d8d0a-1/Towny-master-248b0d8d0a-1-javadoc.jar!/" />
|
||||||
|
</JAVADOC>
|
||||||
|
<SOURCES>
|
||||||
|
<root url="jar://$MAVEN_REPOSITORY$/com/github/TBMCPlugins/ButtonCore/Towny/master-248b0d8d0a-1/Towny-master-248b0d8d0a-1-sources.jar!/" />
|
||||||
|
</SOURCES>
|
||||||
|
</library>
|
||||||
|
</component>
|
|
@ -0,0 +1,13 @@
|
||||||
|
<component name="libraryTable">
|
||||||
|
<library name="Maven: com.github.milkbowl:VaultAPI:master-431c5273c2-1">
|
||||||
|
<CLASSES>
|
||||||
|
<root url="jar://$MAVEN_REPOSITORY$/com/github/milkbowl/VaultAPI/master-431c5273c2-1/VaultAPI-master-431c5273c2-1.jar!/" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC>
|
||||||
|
<root url="jar://$MAVEN_REPOSITORY$/com/github/milkbowl/VaultAPI/master-431c5273c2-1/VaultAPI-master-431c5273c2-1-javadoc.jar!/" />
|
||||||
|
</JAVADOC>
|
||||||
|
<SOURCES>
|
||||||
|
<root url="jar://$MAVEN_REPOSITORY$/com/github/milkbowl/VaultAPI/master-431c5273c2-1/VaultAPI-master-431c5273c2-1-sources.jar!/" />
|
||||||
|
</SOURCES>
|
||||||
|
</library>
|
||||||
|
</component>
|
124
.idea/uiDesigner.xml
Normal file
124
.idea/uiDesigner.xml
Normal file
|
@ -0,0 +1,124 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="Palette2">
|
||||||
|
<group name="Swing">
|
||||||
|
<item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||||
|
<default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
|
||||||
|
</item>
|
||||||
|
<item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||||
|
<default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.png" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||||
|
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.png" removable="false" auto-create-binding="false" can-attach-label="true">
|
||||||
|
<default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.png" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||||
|
<default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
|
||||||
|
<initial-values>
|
||||||
|
<property name="text" value="Button" />
|
||||||
|
</initial-values>
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.png" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||||
|
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
|
||||||
|
<initial-values>
|
||||||
|
<property name="text" value="RadioButton" />
|
||||||
|
</initial-values>
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.png" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||||
|
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
|
||||||
|
<initial-values>
|
||||||
|
<property name="text" value="CheckBox" />
|
||||||
|
</initial-values>
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.png" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||||
|
<default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
|
||||||
|
<initial-values>
|
||||||
|
<property name="text" value="Label" />
|
||||||
|
</initial-values>
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.png" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||||
|
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
|
||||||
|
<preferred-size width="150" height="-1" />
|
||||||
|
</default-constraints>
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.png" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||||
|
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
|
||||||
|
<preferred-size width="150" height="-1" />
|
||||||
|
</default-constraints>
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.png" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||||
|
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
|
||||||
|
<preferred-size width="150" height="-1" />
|
||||||
|
</default-constraints>
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.png" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||||
|
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
|
||||||
|
<preferred-size width="150" height="50" />
|
||||||
|
</default-constraints>
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||||
|
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
|
||||||
|
<preferred-size width="150" height="50" />
|
||||||
|
</default-constraints>
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||||
|
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
|
||||||
|
<preferred-size width="150" height="50" />
|
||||||
|
</default-constraints>
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.png" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||||
|
<default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.png" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||||
|
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
|
||||||
|
<preferred-size width="150" height="50" />
|
||||||
|
</default-constraints>
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.png" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||||
|
<default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
|
||||||
|
<preferred-size width="150" height="50" />
|
||||||
|
</default-constraints>
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.png" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||||
|
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
|
||||||
|
<preferred-size width="150" height="50" />
|
||||||
|
</default-constraints>
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.png" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||||
|
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
|
||||||
|
<preferred-size width="200" height="200" />
|
||||||
|
</default-constraints>
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.png" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||||
|
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
|
||||||
|
<preferred-size width="200" height="200" />
|
||||||
|
</default-constraints>
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.png" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||||
|
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.png" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||||
|
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.png" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||||
|
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||||
|
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.png" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||||
|
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
|
||||||
|
<preferred-size width="-1" height="20" />
|
||||||
|
</default-constraints>
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.png" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||||
|
<default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||||
|
<default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
|
||||||
|
</item>
|
||||||
|
</group>
|
||||||
|
</component>
|
||||||
|
</project>
|
|
@ -1,4 +1,4 @@
|
||||||
import buttondevteam.lib.PluginUpdater;
|
import buttondevteam.component.updater.PluginUpdater;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
1
ButtonCore/lombok.config
Normal file
1
ButtonCore/lombok.config
Normal file
|
@ -0,0 +1 @@
|
||||||
|
lombok.var.flagUsage = ALLOW
|
|
@ -72,6 +72,14 @@
|
||||||
</execution>
|
</execution>
|
||||||
</executions>
|
</executions>
|
||||||
</plugin>
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<useSystemClassLoader>false
|
||||||
|
</useSystemClassLoader> <!-- https://stackoverflow.com/a/53012553/2703239 -->
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
</plugins>
|
</plugins>
|
||||||
</build>
|
</build>
|
||||||
<repositories>
|
<repositories>
|
||||||
|
|
|
@ -0,0 +1,15 @@
|
||||||
|
package buttondevteam.component.commands;
|
||||||
|
|
||||||
|
import buttondevteam.lib.architecture.Component;
|
||||||
|
|
||||||
|
public class CommandComponent extends Component { //TODO: Do we just move everything here?
|
||||||
|
@Override
|
||||||
|
public void enable() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void disable() {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,20 @@
|
||||||
|
package buttondevteam.component.restart;
|
||||||
|
|
||||||
|
import buttondevteam.core.PrimeRestartCommand;
|
||||||
|
import buttondevteam.core.ScheduledRestartCommand;
|
||||||
|
import buttondevteam.lib.architecture.Component;
|
||||||
|
import buttondevteam.lib.chat.TBMCChatAPI;
|
||||||
|
|
||||||
|
public class RestartComponent extends Component {
|
||||||
|
@Override
|
||||||
|
public void enable() {
|
||||||
|
//TODO: Permissions for the commands
|
||||||
|
TBMCChatAPI.AddCommand(getPlugin(), ScheduledRestartCommand.class);
|
||||||
|
TBMCChatAPI.AddCommand(getPlugin(), PrimeRestartCommand.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void disable() {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,5 +1,6 @@
|
||||||
package buttondevteam.lib;
|
package buttondevteam.component.updater;
|
||||||
|
|
||||||
|
import buttondevteam.lib.TBMCCoreAPI;
|
||||||
import com.google.gson.JsonArray;
|
import com.google.gson.JsonArray;
|
||||||
import com.google.gson.JsonElement;
|
import com.google.gson.JsonElement;
|
||||||
import com.google.gson.JsonObject;
|
import com.google.gson.JsonObject;
|
||||||
|
@ -136,7 +137,7 @@ public class PluginUpdater {
|
||||||
public static List<String> GetPluginNames() {
|
public static List<String> GetPluginNames() {
|
||||||
List<String> ret = new ArrayList<>();
|
List<String> ret = new ArrayList<>();
|
||||||
try {
|
try {
|
||||||
String resp = TBMCCoreAPI.DownloadString("https://api.github.com/orgs/TBMCPlugins/repos");
|
String resp = TBMCCoreAPI.DownloadString("https://api.github.com/orgs/" + "TBMCPlugins" + "/repos"); //TODO: PluginUpdater
|
||||||
JsonArray arr = new JsonParser().parse(resp).getAsJsonArray();
|
JsonArray arr = new JsonParser().parse(resp).getAsJsonArray();
|
||||||
for (JsonElement obj : arr) {
|
for (JsonElement obj : arr) {
|
||||||
JsonObject jobj = obj.getAsJsonObject();
|
JsonObject jobj = obj.getAsJsonObject();
|
|
@ -0,0 +1,16 @@
|
||||||
|
package buttondevteam.component.updater;
|
||||||
|
|
||||||
|
import buttondevteam.lib.architecture.Component;
|
||||||
|
import buttondevteam.lib.chat.TBMCChatAPI;
|
||||||
|
|
||||||
|
public class PluginUpdaterComponent extends Component {
|
||||||
|
@Override
|
||||||
|
public void enable() {
|
||||||
|
TBMCChatAPI.AddCommand(getPlugin(), UpdatePluginCommand.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void disable() { //TODO: Unregister commands and such
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,6 +1,6 @@
|
||||||
package buttondevteam.core;
|
package buttondevteam.component.updater;
|
||||||
|
|
||||||
import buttondevteam.lib.PluginUpdater;
|
import buttondevteam.core.MainPlugin;
|
||||||
import buttondevteam.lib.TBMCCoreAPI;
|
import buttondevteam.lib.TBMCCoreAPI;
|
||||||
import buttondevteam.lib.chat.CommandClass;
|
import buttondevteam.lib.chat.CommandClass;
|
||||||
import buttondevteam.lib.chat.TBMCCommandBase;
|
import buttondevteam.lib.chat.TBMCCommandBase;
|
|
@ -0,0 +1,30 @@
|
||||||
|
package buttondevteam.core;
|
||||||
|
|
||||||
|
import buttondevteam.lib.chat.CommandClass;
|
||||||
|
import buttondevteam.lib.chat.TBMCCommandBase;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
|
||||||
|
@CommandClass(modOnly = true)
|
||||||
|
public class ComponentCommand extends TBMCCommandBase {
|
||||||
|
@Override
|
||||||
|
public boolean OnCommand(CommandSender sender, String alias, String[] args) {
|
||||||
|
if (args.length < 2)
|
||||||
|
return false;
|
||||||
|
switch (args[0]) {
|
||||||
|
case "enable":
|
||||||
|
break;
|
||||||
|
case "disable":
|
||||||
|
break;
|
||||||
|
case "list":
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String[] GetHelpText(String alias) {
|
||||||
|
return new String[0];
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,33 @@
|
||||||
|
package buttondevteam.core;
|
||||||
|
|
||||||
|
import buttondevteam.lib.architecture.Component;
|
||||||
|
import buttondevteam.lib.architecture.exceptions.UnregisteredComponentException;
|
||||||
|
|
||||||
|
public final class ComponentManager {
|
||||||
|
private ComponentManager() {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enables components based on a configuration
|
||||||
|
*/
|
||||||
|
public static void enableComponents() {
|
||||||
|
//Component.getComponents().values().stream().filter(c->cs.getConfigurationSection(c.getClass().getSimpleName()).getBoolean("enabled")).forEach(c-> {
|
||||||
|
Component.getComponents().values().stream().filter(c -> c.shouldBeEnabled().get()).forEach(c -> {
|
||||||
|
try {
|
||||||
|
Component.setComponentEnabled(c, true);
|
||||||
|
} catch (UnregisteredComponentException ignored) { //This *should* never happen
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Disables all components that are enabled
|
||||||
|
*/
|
||||||
|
public static void disableComponents() {
|
||||||
|
Component.getComponents().values().stream().filter(Component::isEnabled).forEach(c -> {
|
||||||
|
try {
|
||||||
|
Component.setComponentEnabled(c, false);
|
||||||
|
} catch (UnregisteredComponentException ignored) { //This *should* never happen
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,7 +1,10 @@
|
||||||
package buttondevteam.core;
|
package buttondevteam.core;
|
||||||
|
|
||||||
import buttondevteam.lib.PluginUpdater;
|
import buttondevteam.component.restart.RestartComponent;
|
||||||
|
import buttondevteam.component.updater.PluginUpdater;
|
||||||
|
import buttondevteam.component.updater.PluginUpdaterComponent;
|
||||||
import buttondevteam.lib.TBMCCoreAPI;
|
import buttondevteam.lib.TBMCCoreAPI;
|
||||||
|
import buttondevteam.lib.architecture.Component;
|
||||||
import buttondevteam.lib.chat.Channel;
|
import buttondevteam.lib.chat.Channel;
|
||||||
import buttondevteam.lib.chat.ChatRoom;
|
import buttondevteam.lib.chat.ChatRoom;
|
||||||
import buttondevteam.lib.chat.Color;
|
import buttondevteam.lib.chat.Color;
|
||||||
|
@ -47,9 +50,9 @@ public class MainPlugin extends JavaPlugin {
|
||||||
setupPermissions();
|
setupPermissions();
|
||||||
Test = getConfig().getBoolean("test", true);
|
Test = getConfig().getBoolean("test", true);
|
||||||
saveConfig();
|
saveConfig();
|
||||||
TBMCChatAPI.AddCommand(this, UpdatePluginCommand.class);
|
Component.registerComponent(this, new PluginUpdaterComponent());
|
||||||
TBMCChatAPI.AddCommand(this, ScheduledRestartCommand.class);
|
Component.registerComponent(this, new RestartComponent());
|
||||||
TBMCChatAPI.AddCommand(this, PrimeRestartCommand.class);
|
ComponentManager.enableComponents();
|
||||||
TBMCChatAPI.AddCommand(this, MemberCommand.class);
|
TBMCChatAPI.AddCommand(this, MemberCommand.class);
|
||||||
TBMCCoreAPI.RegisterEventsForExceptions(new PlayerListener(), this);
|
TBMCCoreAPI.RegisterEventsForExceptions(new PlayerListener(), this);
|
||||||
ChromaGamerBase.addConverter(commandSender -> Optional.ofNullable(commandSender instanceof ConsoleCommandSender || commandSender instanceof BlockCommandSender
|
ChromaGamerBase.addConverter(commandSender -> Optional.ofNullable(commandSender instanceof ConsoleCommandSender || commandSender instanceof BlockCommandSender
|
||||||
|
@ -82,6 +85,7 @@ public class MainPlugin extends JavaPlugin {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDisable() {
|
public void onDisable() {
|
||||||
|
ComponentManager.disableComponents();
|
||||||
logger.info("Saving player data...");
|
logger.info("Saving player data...");
|
||||||
TBMCPlayerBase.savePlayers();
|
TBMCPlayerBase.savePlayers();
|
||||||
logger.info("Player data saved.");
|
logger.info("Player data saved.");
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
package buttondevteam.core;
|
package buttondevteam.core;
|
||||||
|
|
||||||
import buttondevteam.lib.TBMCSystemChatEvent;
|
import buttondevteam.lib.TBMCSystemChatEvent;
|
||||||
import buttondevteam.lib.chat.IDiscordSender;
|
import buttondevteam.lib.chat.IFakePlayer;
|
||||||
import buttondevteam.lib.player.TBMCPlayerBase;
|
import buttondevteam.lib.player.TBMCPlayerBase;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.ChatColor;
|
import org.bukkit.ChatColor;
|
||||||
|
@ -43,7 +43,7 @@ public class PlayerListener implements Listener {
|
||||||
if (PrimeRestartCommand.isLoud())
|
if (PrimeRestartCommand.isLoud())
|
||||||
Bukkit.broadcastMessage("§cNobody is online anymore. Restarting.");
|
Bukkit.broadcastMessage("§cNobody is online anymore. Restarting.");
|
||||||
Bukkit.spigot().restart();
|
Bukkit.spigot().restart();
|
||||||
} else if (!(event.getPlayer() instanceof IDiscordSender) && System.nanoTime() - 10 * 1000000000L - lasttime > 0) { //Ten seconds passed since last reminder
|
} else if (!(event.getPlayer() instanceof IFakePlayer) && System.nanoTime() - 10 * 1000000000L - lasttime > 0) { //Ten seconds passed since last reminder
|
||||||
lasttime = System.nanoTime();
|
lasttime = System.nanoTime();
|
||||||
if (PrimeRestartCommand.isLoud())
|
if (PrimeRestartCommand.isLoud())
|
||||||
Bukkit.broadcastMessage(ChatColor.DARK_RED + "The server will restart as soon as nobody is online.");
|
Bukkit.broadcastMessage(ChatColor.DARK_RED + "The server will restart as soon as nobody is online.");
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package buttondevteam.lib;
|
package buttondevteam.lib;
|
||||||
|
|
||||||
|
import buttondevteam.component.updater.PluginUpdater;
|
||||||
import buttondevteam.core.MainPlugin;
|
import buttondevteam.core.MainPlugin;
|
||||||
import buttondevteam.lib.player.ChromaGamerBase;
|
import buttondevteam.lib.player.ChromaGamerBase;
|
||||||
import buttondevteam.lib.potato.DebugPotato;
|
import buttondevteam.lib.potato.DebugPotato;
|
||||||
|
|
|
@ -0,0 +1,219 @@
|
||||||
|
package buttondevteam.lib.architecture;
|
||||||
|
|
||||||
|
import buttondevteam.lib.TBMCCoreAPI;
|
||||||
|
import buttondevteam.lib.architecture.exceptions.UnregisteredComponentException;
|
||||||
|
import buttondevteam.lib.chat.TBMCChatAPI;
|
||||||
|
import buttondevteam.lib.chat.TBMCCommandBase;
|
||||||
|
import lombok.AccessLevel;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.NonNull;
|
||||||
|
import lombok.experimental.var;
|
||||||
|
import lombok.val;
|
||||||
|
import org.bukkit.configuration.ConfigurationSection;
|
||||||
|
import org.bukkit.configuration.file.FileConfiguration;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.function.Function;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configuration is based on class name
|
||||||
|
*/
|
||||||
|
public abstract class Component {
|
||||||
|
private static HashMap<Class<? extends Component>, Component> components = new HashMap<>();
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
private boolean enabled = false;
|
||||||
|
@Getter(value = AccessLevel.PROTECTED)
|
||||||
|
@NonNull
|
||||||
|
private JavaPlugin plugin;
|
||||||
|
@NonNull
|
||||||
|
private ConfigurationSection config;
|
||||||
|
|
||||||
|
public ConfigData<Boolean> shouldBeEnabled() {
|
||||||
|
return getData("enabled", true);
|
||||||
|
}
|
||||||
|
|
||||||
|
private HashMap<String, ConfigData<?>> datamap = new HashMap<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method overload should only be used with primitves or String.
|
||||||
|
*
|
||||||
|
* @param path The path in config to use
|
||||||
|
* @param def The value to use by default
|
||||||
|
* @param <T> The type of this variable (only use primitives or String)
|
||||||
|
* @return The data object that can be used to get or set the value
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
protected <T> ConfigData<T> getData(String path, T def) {
|
||||||
|
ConfigData<?> data = datamap.get(path);
|
||||||
|
if (data == null) datamap.put(path, data = new ConfigData<>(config, path, def));
|
||||||
|
return (ConfigData<T>) data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method overload may be used with any class.
|
||||||
|
*
|
||||||
|
* @param path The path in config to use
|
||||||
|
* @param def The value to use by default
|
||||||
|
* @param getter A function that converts a primitive representation to the correct value
|
||||||
|
* @param setter A function that converts a value to a primitive representation
|
||||||
|
* @param <T> The type of this variable (can be any class)
|
||||||
|
* @return The data object that can be used to get or set the value
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
protected <T> ConfigData<T> getData(String path, T def, Function<Object, T> getter, Function<T, Object> setter) {
|
||||||
|
ConfigData<?> data = datamap.get(path);
|
||||||
|
if (data == null) datamap.put(path, data = new ConfigData<>(config, path, def, getter, setter));
|
||||||
|
return (ConfigData<T>) data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers a component checking it's dependencies and calling {@link #register(JavaPlugin)}.<br>
|
||||||
|
* Make sure to register the dependencies first.
|
||||||
|
*
|
||||||
|
* @param component The component to register
|
||||||
|
*/
|
||||||
|
public static void registerComponent(JavaPlugin plugin, Component component) {
|
||||||
|
registerUnregisterComponent(plugin, component, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unregisters a component by calling {@link #unregister(JavaPlugin)}.<br>
|
||||||
|
* Make sure to unregister the dependencies last.
|
||||||
|
*
|
||||||
|
* @param componentClass The component class to unregister
|
||||||
|
*/
|
||||||
|
public static void unregisterComponent(JavaPlugin plugin, Class<? extends Component> componentClass) {
|
||||||
|
val component = components.get(componentClass);
|
||||||
|
if (component == null)
|
||||||
|
return; //Failed to load
|
||||||
|
registerUnregisterComponent(plugin, component, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void registerUnregisterComponent(JavaPlugin plugin, Component component, boolean register) {
|
||||||
|
val metaAnn = component.getClass().getAnnotation(ComponentMetadata.class);
|
||||||
|
if (metaAnn != null) {
|
||||||
|
Class<? extends Component>[] dependencies = metaAnn.depends();
|
||||||
|
for (val dep : dependencies) {
|
||||||
|
if (!components.containsKey(dep)) {
|
||||||
|
plugin.getLogger().warning("Failed to " + (register ? "" : "un") + "register component " + component.getClassName() + " as a required dependency is missing/disabled: " + dep.getSimpleName());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (register) {
|
||||||
|
component.plugin = plugin;
|
||||||
|
var compconf = plugin.getConfig().getConfigurationSection("components");
|
||||||
|
if (compconf == null) compconf = plugin.getConfig().createSection("components");
|
||||||
|
component.config = compconf.getConfigurationSection(component.getClassName());
|
||||||
|
if (component.config == null) component.config = compconf.createSection(component.getClassName());
|
||||||
|
component.register(plugin);
|
||||||
|
components.put(component.getClass(), component);
|
||||||
|
} else {
|
||||||
|
component.unregister(plugin);
|
||||||
|
components.remove(component.getClass());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers a component checking it's dependencies and calling {@link #register(JavaPlugin)}.<br>
|
||||||
|
* Make sure to register the dependencies first.
|
||||||
|
*
|
||||||
|
* @param component The component to register
|
||||||
|
*/
|
||||||
|
public static void setComponentEnabled(Component component, boolean enabled) throws UnregisteredComponentException {
|
||||||
|
if (!components.containsKey(component.getClass()))
|
||||||
|
throw new UnregisteredComponentException(component);
|
||||||
|
if (component.enabled = enabled)
|
||||||
|
component.enable();
|
||||||
|
else
|
||||||
|
component.disable();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the currently registered components<br>
|
||||||
|
*
|
||||||
|
* @return The currently registered components
|
||||||
|
*/
|
||||||
|
public static Map<Class<? extends Component>, Component> getComponents() {
|
||||||
|
return Collections.unmodifiableMap(components);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers the module, when called by the JavaPlugin class.
|
||||||
|
* This gets fired when the plugin is enabled. Use {@link #enable()} to register commands and such.
|
||||||
|
*
|
||||||
|
* @param plugin Plugin object
|
||||||
|
*/
|
||||||
|
protected void register(JavaPlugin plugin) {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unregisters the module, when called by the JavaPlugin class.
|
||||||
|
* This gets fired when the plugin is disabled.
|
||||||
|
* Do any cleanups needed within this method.
|
||||||
|
*
|
||||||
|
* @param plugin Plugin object
|
||||||
|
*/
|
||||||
|
protected void unregister(JavaPlugin plugin) {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enables the module, when called by the JavaPlugin class. Call
|
||||||
|
* registerCommand() and registerListener() within this method.<br>
|
||||||
|
* To access the plugin, use {@link #getPlugin()}.
|
||||||
|
*/
|
||||||
|
protected abstract void enable();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Disables the module, when called by the JavaPlugin class. Do
|
||||||
|
* any cleanups needed within this method.
|
||||||
|
* To access the plugin, use {@link #getPlugin()}.
|
||||||
|
*/
|
||||||
|
protected abstract void disable();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers a TBMCCommand to the plugin. Make sure to add it to plugin.yml and use {@link buttondevteam.lib.chat.CommandClass}.
|
||||||
|
*
|
||||||
|
* @param plugin Main plugin responsible for stuff
|
||||||
|
* @param commandBase Custom coded command class
|
||||||
|
*/
|
||||||
|
protected void registerCommand(JavaPlugin plugin, TBMCCommandBase commandBase) {
|
||||||
|
TBMCChatAPI.AddCommand(plugin, commandBase);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers a Listener to this plugin
|
||||||
|
*
|
||||||
|
* @param plugin Main plugin responsible for stuff
|
||||||
|
* @param listener The event listener to register
|
||||||
|
* @return The provided listener
|
||||||
|
*/
|
||||||
|
protected Listener registerListener(JavaPlugin plugin, Listener listener) {
|
||||||
|
TBMCCoreAPI.RegisterEventsForExceptions(listener, plugin);
|
||||||
|
return listener;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void saveData(FileConfiguration config, String pathToData, Object data) {
|
||||||
|
config.set("moduledata." + this.getClassName() + "." + pathToData, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object getData(FileConfiguration config, String pathToData, Object data) {
|
||||||
|
return config.get("moduledata." + this.getClassName() + "." + pathToData, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getClassName() {
|
||||||
|
Class<?> enclosingClass = getClass().getEnclosingClass();
|
||||||
|
String className;
|
||||||
|
if (enclosingClass != null) {
|
||||||
|
className = (enclosingClass.getName());
|
||||||
|
} else {
|
||||||
|
className = (getClass().getName());
|
||||||
|
}
|
||||||
|
return className;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
package buttondevteam.lib.architecture;
|
||||||
|
|
||||||
|
import java.lang.annotation.ElementType;
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
|
@Target(ElementType.TYPE)
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
public @interface ComponentMetadata {
|
||||||
|
Class<? extends Component>[] depends();
|
||||||
|
}
|
|
@ -0,0 +1,43 @@
|
||||||
|
package buttondevteam.lib.architecture;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.bukkit.configuration.ConfigurationSection;
|
||||||
|
import org.bukkit.configuration.file.YamlConfiguration;
|
||||||
|
|
||||||
|
import java.util.function.Function;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Use the getter/setter constructor if {@link T} isn't a primitive type or String.
|
||||||
|
*/
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class ConfigData<T> { //TODO: Save after a while
|
||||||
|
private final ConfigurationSection config;
|
||||||
|
private final String path;
|
||||||
|
private final T def;
|
||||||
|
/**
|
||||||
|
* The parameter is of a primitive type as returned by {@link YamlConfiguration#get(String)}
|
||||||
|
*/
|
||||||
|
private Function<Object, T> getter;
|
||||||
|
/**
|
||||||
|
* The result should be a primitive type or string that can be retrieved correctly later
|
||||||
|
*/
|
||||||
|
private Function<T, Object> setter;
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public T get() {
|
||||||
|
Object val = config.get(path, def);
|
||||||
|
if (getter != null)
|
||||||
|
return getter.apply(val);
|
||||||
|
return (T) val;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void set(T value) {
|
||||||
|
Object val;
|
||||||
|
if (setter != null)
|
||||||
|
val = setter.apply(value);
|
||||||
|
else val = value;
|
||||||
|
config.set(path, val);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
package buttondevteam.lib.architecture.exceptions;
|
||||||
|
|
||||||
|
import buttondevteam.lib.architecture.Component;
|
||||||
|
|
||||||
|
public class UnregisteredComponentException extends Throwable {
|
||||||
|
|
||||||
|
public UnregisteredComponentException(Component component) {
|
||||||
|
super("The component '" + component.getClass().getSimpleName() + "' isn't registered!");
|
||||||
|
}
|
||||||
|
}
|
|
@ -29,14 +29,17 @@ public class ChatMessage {
|
||||||
* The sender which we should check for permissions. Same as {@link #sender} by default.
|
* The sender which we should check for permissions. Same as {@link #sender} by default.
|
||||||
*/
|
*/
|
||||||
private CommandSender permCheck;
|
private CommandSender permCheck;
|
||||||
|
/**
|
||||||
|
* The origin of the message, "minecraft" or "discord" for example.
|
||||||
|
*/
|
||||||
|
private final String origin;
|
||||||
|
|
||||||
private static ChatMessageBuilder builder() {
|
private static ChatMessageBuilder builder() {
|
||||||
return new ChatMessageBuilder();
|
return new ChatMessageBuilder();
|
||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
public static ChatMessageBuilder builder(CommandSender sender, ChromaGamerBase user, String message) {
|
public static ChatMessageBuilder builder(Channel channel, CommandSender sender, ChromaGamerBase user, String message) {
|
||||||
return builder().sender(sender).user(user).message(message);
|
return builder().sender(sender).user(user).message(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,6 +7,6 @@ import org.bukkit.command.CommandSender;
|
||||||
* @author Norbi
|
* @author Norbi
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public interface IDiscordSender extends CommandSender {
|
public interface IFakePlayer extends CommandSender {
|
||||||
|
|
||||||
}
|
}
|
|
@ -23,6 +23,14 @@
|
||||||
<compilerArgument>-proc:none</compilerArgument>
|
<compilerArgument>-proc:none</compilerArgument>
|
||||||
</configuration>
|
</configuration>
|
||||||
</plugin>
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<useSystemClassLoader>false
|
||||||
|
</useSystemClassLoader> <!-- https://stackoverflow.com/a/53012553/2703239 -->
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
</plugins>
|
</plugins>
|
||||||
</build>
|
</build>
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue