Don't enable certain components by default, create ListConfigData
#87 Also some older code changes
This commit is contained in:
parent
5da07565b0
commit
1a4829e894
13 changed files with 170 additions and 37 deletions
|
@ -19,6 +19,11 @@
|
||||||
<orderEntry type="sourceFolder" forTests="false" />
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
<orderEntry type="module" module-name="ButtonCore (1) (com.github.TBMCPlugins.ButtonCore)" />
|
<orderEntry type="module" module-name="ButtonCore (1) (com.github.TBMCPlugins.ButtonCore)" />
|
||||||
<orderEntry type="module" module-name="ButtonCore (1) (com.github.TBMCPlugins.ButtonCore)" />
|
<orderEntry type="module" module-name="ButtonCore (1) (com.github.TBMCPlugins.ButtonCore)" />
|
||||||
|
<orderEntry type="module" module-name="ButtonCore (1) (com.github.TBMCPlugins.ButtonCore)" />
|
||||||
|
<orderEntry type="module" module-name="ButtonCore (1) (com.github.TBMCPlugins.ButtonCore)" />
|
||||||
|
<orderEntry type="module" module-name="ButtonCore (1) (com.github.TBMCPlugins.ButtonCore)" />
|
||||||
|
<orderEntry type="module" module-name="ButtonCore (1) (com.github.TBMCPlugins.ButtonCore)" />
|
||||||
|
<orderEntry type="module" module-name="ButtonCore (1) (com.github.TBMCPlugins.ButtonCore)" />
|
||||||
<orderEntry type="library" name="Maven: org.reflections:reflections:0.9.10" level="project" />
|
<orderEntry type="library" name="Maven: org.reflections:reflections:0.9.10" level="project" />
|
||||||
<orderEntry type="library" name="Maven: com.google.code.findbugs:annotations:2.0.1" level="project" />
|
<orderEntry type="library" name="Maven: com.google.code.findbugs:annotations:2.0.1" level="project" />
|
||||||
<orderEntry type="library" name="Maven: org.javassist:javassist:3.20.0-GA" level="project" />
|
<orderEntry type="library" name="Maven: org.javassist:javassist:3.20.0-GA" level="project" />
|
||||||
|
|
|
@ -101,6 +101,7 @@ public class MainPlugin extends ButtonPlugin {
|
||||||
Component.registerComponent(this, new ChannelComponent());
|
Component.registerComponent(this, new ChannelComponent());
|
||||||
Component.registerComponent(this, new RandomTPComponent());
|
Component.registerComponent(this, new RandomTPComponent());
|
||||||
Component.registerComponent(this, new MemberComponent());
|
Component.registerComponent(this, new MemberComponent());
|
||||||
|
if (Bukkit.getPluginManager().isPluginEnabled("Multiverse-Core"))
|
||||||
Component.registerComponent(this, new SpawnComponent());
|
Component.registerComponent(this, new SpawnComponent());
|
||||||
if (Bukkit.getPluginManager().isPluginEnabled("Towny")) //It fails to load the component class otherwise
|
if (Bukkit.getPluginManager().isPluginEnabled("Towny")) //It fails to load the component class otherwise
|
||||||
Component.registerComponent(this, new TownyComponent());
|
Component.registerComponent(this, new TownyComponent());
|
||||||
|
|
|
@ -2,6 +2,7 @@ package buttondevteam.core.component.members;
|
||||||
|
|
||||||
import buttondevteam.core.MainPlugin;
|
import buttondevteam.core.MainPlugin;
|
||||||
import buttondevteam.lib.architecture.Component;
|
import buttondevteam.lib.architecture.Component;
|
||||||
|
import buttondevteam.lib.architecture.ComponentMetadata;
|
||||||
import buttondevteam.lib.architecture.ConfigData;
|
import buttondevteam.lib.architecture.ConfigData;
|
||||||
import org.bukkit.Statistic;
|
import org.bukkit.Statistic;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
|
@ -18,6 +19,7 @@ import static buttondevteam.core.MainPlugin.permission;
|
||||||
/**
|
/**
|
||||||
* Allows giving a 'member' group over some time elapsed OR played.
|
* Allows giving a 'member' group over some time elapsed OR played.
|
||||||
*/
|
*/
|
||||||
|
@ComponentMetadata(enabledByDefault = false)
|
||||||
public class MemberComponent extends Component<MainPlugin> implements Listener {
|
public class MemberComponent extends Component<MainPlugin> implements Listener {
|
||||||
/**
|
/**
|
||||||
* The permission group to give to the player
|
* The permission group to give to the player
|
||||||
|
|
|
@ -2,12 +2,14 @@ package buttondevteam.core.component.randomtp;
|
||||||
|
|
||||||
import buttondevteam.core.MainPlugin;
|
import buttondevteam.core.MainPlugin;
|
||||||
import buttondevteam.lib.architecture.Component;
|
import buttondevteam.lib.architecture.Component;
|
||||||
|
import buttondevteam.lib.architecture.ComponentMetadata;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Teleport player to random location within world border.
|
* Teleport player to random location within world border.
|
||||||
* Every five players teleport to the same general area, and then a new general area is randomly selected for the next five players.
|
* Every five players teleport to the same general area, and then a new general area is randomly selected for the next five players.
|
||||||
* Author: github.com/iiegit
|
* Author: github.com/iiegit
|
||||||
*/
|
*/
|
||||||
|
@ComponentMetadata(enabledByDefault = false)
|
||||||
public class RandomTPComponent extends Component<MainPlugin> {
|
public class RandomTPComponent extends Component<MainPlugin> {
|
||||||
@Override
|
@Override
|
||||||
protected void enable() {
|
protected void enable() {
|
||||||
|
|
|
@ -31,7 +31,9 @@ public class TownyComponent extends Component<MainPlugin> {
|
||||||
*/
|
*/
|
||||||
public static void renameInTowny(String oldName, String newName) {
|
public static void renameInTowny(String oldName, String newName) {
|
||||||
if (!ComponentManager.isEnabled(TownyComponent.class))
|
if (!ComponentManager.isEnabled(TownyComponent.class))
|
||||||
return; TownyUniverse tu = Towny.getPlugin(Towny.class).getTownyUniverse();
|
return;
|
||||||
|
Bukkit.getLogger().info("Renaming" + oldName + " in Towny to " + newName);
|
||||||
|
TownyUniverse tu = Towny.getPlugin(Towny.class).getTownyUniverse();
|
||||||
Resident resident = tu.getResidentMap().get(oldName.toLowerCase()); //The map keys are lowercase
|
Resident resident = tu.getResidentMap().get(oldName.toLowerCase()); //The map keys are lowercase
|
||||||
if (resident == null) {
|
if (resident == null) {
|
||||||
Bukkit.getLogger().warning("Resident not found - couldn't rename in Towny.");
|
Bukkit.getLogger().warning("Resident not found - couldn't rename in Towny.");
|
||||||
|
@ -42,6 +44,7 @@ public class TownyComponent extends Component<MainPlugin> {
|
||||||
} else
|
} else
|
||||||
try {
|
try {
|
||||||
tu.getDataSource().renamePlayer(resident, newName); //Fixed in Towny 0.91.1.2
|
tu.getDataSource().renamePlayer(resident, newName); //Fixed in Towny 0.91.1.2
|
||||||
|
Bukkit.getLogger().info("Renaming done.");
|
||||||
} catch (AlreadyRegisteredException e) {
|
} catch (AlreadyRegisteredException e) {
|
||||||
TBMCCoreAPI.SendException("Failed to rename resident, there's already one with this name.", e);
|
TBMCCoreAPI.SendException("Failed to rename resident, there's already one with this name.", e);
|
||||||
} catch (NotRegisteredException e) {
|
} catch (NotRegisteredException e) {
|
||||||
|
|
|
@ -2,11 +2,13 @@ package buttondevteam.core.component.updater;
|
||||||
|
|
||||||
import buttondevteam.core.MainPlugin;
|
import buttondevteam.core.MainPlugin;
|
||||||
import buttondevteam.lib.architecture.Component;
|
import buttondevteam.lib.architecture.Component;
|
||||||
|
import buttondevteam.lib.architecture.ComponentMetadata;
|
||||||
import buttondevteam.lib.chat.TBMCChatAPI;
|
import buttondevteam.lib.chat.TBMCChatAPI;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Downloads plugin updates built from their source using JitPack - older code
|
* Downloads plugin updates built from their source using JitPack - older code
|
||||||
*/
|
*/
|
||||||
|
@ComponentMetadata(enabledByDefault = false)
|
||||||
public class PluginUpdaterComponent extends Component<MainPlugin> { //TODO: Config
|
public class PluginUpdaterComponent extends Component<MainPlugin> { //TODO: Config
|
||||||
@Override
|
@Override
|
||||||
public void enable() {
|
public void enable() {
|
||||||
|
|
|
@ -2,6 +2,7 @@ package buttondevteam.core.component.votifier;
|
||||||
|
|
||||||
import buttondevteam.core.MainPlugin;
|
import buttondevteam.core.MainPlugin;
|
||||||
import buttondevteam.lib.architecture.Component;
|
import buttondevteam.lib.architecture.Component;
|
||||||
|
import buttondevteam.lib.architecture.ComponentMetadata;
|
||||||
import buttondevteam.lib.architecture.ConfigData;
|
import buttondevteam.lib.architecture.ConfigData;
|
||||||
import com.vexsoftware.votifier.model.Vote;
|
import com.vexsoftware.votifier.model.Vote;
|
||||||
import com.vexsoftware.votifier.model.VotifierEvent;
|
import com.vexsoftware.votifier.model.VotifierEvent;
|
||||||
|
@ -15,6 +16,7 @@ import org.bukkit.event.EventHandler;
|
||||||
* Do not use (EULA)
|
* Do not use (EULA)
|
||||||
*/
|
*/
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
|
@ComponentMetadata(enabledByDefault = false)
|
||||||
public class VotifierComponent extends Component<MainPlugin> {
|
public class VotifierComponent extends Component<MainPlugin> {
|
||||||
private final Economy economy;
|
private final Economy economy;
|
||||||
|
|
||||||
|
|
|
@ -17,6 +17,7 @@ import org.bukkit.plugin.java.JavaPlugin;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Optional;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
@ -38,7 +39,7 @@ public abstract class Component<TP extends JavaPlugin> {
|
||||||
private @Getter IHaveConfig data; //TODO
|
private @Getter IHaveConfig data; //TODO
|
||||||
|
|
||||||
public final ConfigData<Boolean> shouldBeEnabled() {
|
public final ConfigData<Boolean> shouldBeEnabled() {
|
||||||
return config.getData("enabled", true);
|
return config.getData("enabled", Optional.ofNullable(getClass().getAnnotation(ComponentMetadata.class)).map(ComponentMetadata::enabledByDefault).orElse(true));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -9,4 +9,6 @@ import java.lang.annotation.Target;
|
||||||
@Retention(RetentionPolicy.RUNTIME)
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
public @interface ComponentMetadata {
|
public @interface ComponentMetadata {
|
||||||
Class<? extends Component>[] depends() default {};
|
Class<? extends Component>[] depends() default {};
|
||||||
|
|
||||||
|
boolean enabledByDefault() default true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,7 +32,7 @@ public class ConfigData<T> {
|
||||||
@Getter
|
@Getter
|
||||||
@Setter(AccessLevel.PACKAGE)
|
@Setter(AccessLevel.PACKAGE)
|
||||||
private String path;
|
private String path;
|
||||||
private final T def;
|
protected final T def;
|
||||||
private final Object primitiveDef;
|
private final Object primitiveDef;
|
||||||
private final Runnable saveAction;
|
private final Runnable saveAction;
|
||||||
/**
|
/**
|
||||||
|
@ -125,29 +125,17 @@ public class ConfigData<T> {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setInternal(Object val) {
|
private void setInternal(Object val) {
|
||||||
/*//if (path.contains("Channel")) {
|
|
||||||
System.out.println("Setting value: " + val);
|
|
||||||
System.out.println("For path: " + path);
|
|
||||||
if(path.contains("tc.enabled"))
|
|
||||||
new Exception("Why does this get set on a reload?").printStackTrace();*/
|
|
||||||
config.set(path, val);
|
config.set(path, val);
|
||||||
if (!saveTasks.containsKey(config.getRoot())) {
|
if (!saveTasks.containsKey(config.getRoot())) {
|
||||||
/*//if (path.contains("Channel"))
|
|
||||||
System.out.println("No save task found, adding new one");*/
|
|
||||||
synchronized (saveTasks) {
|
synchronized (saveTasks) {
|
||||||
saveTasks.put(config.getRoot(), new SaveTask(Bukkit.getScheduler().runTaskLaterAsynchronously(MainPlugin.Instance, () -> {
|
saveTasks.put(config.getRoot(), new SaveTask(Bukkit.getScheduler().runTaskLaterAsynchronously(MainPlugin.Instance, () -> {
|
||||||
/*//if (path.contains("Channel"))
|
|
||||||
System.out.println("Executing save task...");*/
|
|
||||||
synchronized (saveTasks) {
|
synchronized (saveTasks) {
|
||||||
saveTasks.remove(config.getRoot());
|
saveTasks.remove(config.getRoot());
|
||||||
saveAction.run();
|
saveAction.run();
|
||||||
}
|
}
|
||||||
/*//if (path.contains("Channel"))
|
|
||||||
System.out.println("Save task done");*/
|
|
||||||
}, 100), saveAction));
|
}, 100), saveAction));
|
||||||
}
|
}
|
||||||
} /*else //if (path.contains("Channel")) - The answer is... The chat plugin goes through the chat channels on command preprocess
|
}
|
||||||
System.out.println("Found a save task");*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
|
|
|
@ -139,6 +139,21 @@ public final class IHaveConfig {
|
||||||
return (ConfigData<T>) data;
|
return (ConfigData<T>) data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method overload should only be used with primitves or String.
|
||||||
|
*
|
||||||
|
* @param path The path in config to use
|
||||||
|
* @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")
|
||||||
|
public <T> ListConfigData<T> getListData(String path) {
|
||||||
|
ConfigData<?> data = datamap.get(path);
|
||||||
|
if (data == null)
|
||||||
|
datamap.put(path, data = new ListConfigData<>(config, path, new ListConfigData.List<T>(), saveAction));
|
||||||
|
return (ListConfigData<T>) data;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generates the config YAML.
|
* Generates the config YAML.
|
||||||
*
|
*
|
||||||
|
|
|
@ -0,0 +1,115 @@
|
||||||
|
package buttondevteam.lib.architecture;
|
||||||
|
|
||||||
|
import lombok.AccessLevel;
|
||||||
|
import lombok.Setter;
|
||||||
|
import lombok.val;
|
||||||
|
import org.bukkit.configuration.ConfigurationSection;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Comparator;
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
import java.util.function.UnaryOperator;
|
||||||
|
|
||||||
|
public class ListConfigData<T> extends ConfigData<ListConfigData.List<T>> {
|
||||||
|
ListConfigData(ConfigurationSection config, String path, List<T> def, Runnable saveAction) {
|
||||||
|
super(config, path, def, def, saveAction);
|
||||||
|
def.listConfig = this; //Can't make the List class non-static or pass this in the super() constructor
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class List<T> extends ArrayList<T> {
|
||||||
|
@Setter(AccessLevel.PACKAGE)
|
||||||
|
ListConfigData<T> listConfig;
|
||||||
|
|
||||||
|
private void update() {
|
||||||
|
listConfig.set(this); //Update the config model and start save task if needed
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public T set(int index, T element) {
|
||||||
|
T ret = super.set(index, element);
|
||||||
|
update();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean add(T t) {
|
||||||
|
val ret = super.add(t);
|
||||||
|
update();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void add(int index, T element) {
|
||||||
|
super.add(index, element);
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public T remove(int index) {
|
||||||
|
T ret = super.remove(index);
|
||||||
|
update();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean remove(Object o) {
|
||||||
|
val ret = super.remove(o);
|
||||||
|
update();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean addAll(Collection<? extends T> c) {
|
||||||
|
val ret = super.addAll(c);
|
||||||
|
update();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean addAll(int index, Collection<? extends T> c) {
|
||||||
|
val ret = super.addAll(index, c);
|
||||||
|
update();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void removeRange(int fromIndex, int toIndex) {
|
||||||
|
super.removeRange(fromIndex, toIndex);
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean removeAll(Collection<?> c) {
|
||||||
|
val ret = super.removeAll(c);
|
||||||
|
update();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean retainAll(Collection<?> c) {
|
||||||
|
val ret = super.retainAll(c);
|
||||||
|
update();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean removeIf(Predicate<? super T> filter) {
|
||||||
|
val ret = super.removeIf(filter);
|
||||||
|
update();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void replaceAll(UnaryOperator<T> operator) {
|
||||||
|
super.replaceAll(operator);
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void sort(Comparator<? super T> c) {
|
||||||
|
super.sort(c);
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -57,10 +57,8 @@ public abstract class TBMCPlayerBase extends ChromaGamerBase {
|
||||||
/**
|
/**
|
||||||
* Get player as a plugin player
|
* Get player as a plugin player
|
||||||
*
|
*
|
||||||
* @param uuid
|
* @param uuid The UUID of the player to get
|
||||||
* The UUID of the player to get
|
* @param cl The type of the player
|
||||||
* @param cl
|
|
||||||
* The type of the player
|
|
||||||
* @return The requested player object
|
* @return The requested player object
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
|
@ -93,8 +91,7 @@ public abstract class TBMCPlayerBase extends ChromaGamerBase {
|
||||||
* Gets the TBMCPlayer object as a specific plugin player, keeping it's data<br>
|
* Gets the TBMCPlayer object as a specific plugin player, keeping it's data<br>
|
||||||
* Make sure to use try-with-resources with this to save the data, as it may need to load the file
|
* Make sure to use try-with-resources with this to save the data, as it may need to load the file
|
||||||
*
|
*
|
||||||
* @param cl
|
* @param cl The TBMCPlayer subclass
|
||||||
* The TBMCPlayer subclass
|
|
||||||
*/
|
*/
|
||||||
public <T extends TBMCPlayerBase> T asPluginPlayer(Class<T> cl) {
|
public <T extends TBMCPlayerBase> T asPluginPlayer(Class<T> cl) {
|
||||||
return getPlayer(uuid, cl);
|
return getPlayer(uuid, cl);
|
||||||
|
@ -122,10 +119,9 @@ public abstract class TBMCPlayerBase extends ChromaGamerBase {
|
||||||
player.PlayerName().set(p.getName());
|
player.PlayerName().set(p.getName());
|
||||||
Bukkit.getLogger().info("Player name saved: " + player.PlayerName().get());
|
Bukkit.getLogger().info("Player name saved: " + player.PlayerName().get());
|
||||||
} else if (!p.getName().equals(player.PlayerName().get())) {
|
} else if (!p.getName().equals(player.PlayerName().get())) {
|
||||||
Bukkit.getLogger().info("Renaming " + player.PlayerName().get() + " to " + p.getName());
|
|
||||||
TownyComponent.renameInTowny(player.PlayerName().get(), p.getName());
|
TownyComponent.renameInTowny(player.PlayerName().get(), p.getName());
|
||||||
player.PlayerName().set(p.getName());
|
player.PlayerName().set(p.getName());
|
||||||
Bukkit.getLogger().info("Renaming done.");
|
Bukkit.getLogger().info("Renamed to " + p.getName());
|
||||||
}
|
}
|
||||||
playermap.put(p.getUniqueId() + "-" + TBMCPlayer.class.getSimpleName(), player);
|
playermap.put(p.getUniqueId() + "-" + TBMCPlayer.class.getSimpleName(), player);
|
||||||
|
|
||||||
|
@ -168,8 +164,7 @@ public abstract class TBMCPlayerBase extends ChromaGamerBase {
|
||||||
* }
|
* }
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* @param name
|
* @param name The player's name
|
||||||
* The player's name
|
|
||||||
* @return The {@link TBMCPlayer} object for the player
|
* @return The {@link TBMCPlayer} object for the player
|
||||||
*/
|
*/
|
||||||
public static <T extends TBMCPlayerBase> T getFromName(String name, Class<T> cl) {
|
public static <T extends TBMCPlayerBase> T getFromName(String name, Class<T> cl) {
|
||||||
|
|
Loading…
Reference in a new issue