Chat handler improvements and config doc gen
Configuration documentation generation
This commit is contained in:
parent
9620ae44f6
commit
9c15d0ffff
15 changed files with 141 additions and 27 deletions
|
@ -20,6 +20,8 @@ import buttondevteam.lib.player.ChromaGamerBase;
|
||||||
import buttondevteam.lib.player.TBMCPlayer;
|
import buttondevteam.lib.player.TBMCPlayer;
|
||||||
import buttondevteam.lib.player.TBMCPlayerBase;
|
import buttondevteam.lib.player.TBMCPlayerBase;
|
||||||
import com.earth2me.essentials.Essentials;
|
import com.earth2me.essentials.Essentials;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
import net.milkbowl.vault.economy.Economy;
|
import net.milkbowl.vault.economy.Economy;
|
||||||
import net.milkbowl.vault.permission.Permission;
|
import net.milkbowl.vault.permission.Permission;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
|
@ -50,11 +52,23 @@ public class MainPlugin extends ButtonPlugin {
|
||||||
private Logger logger;
|
private Logger logger;
|
||||||
@Nullable
|
@Nullable
|
||||||
private Economy economy;
|
private Economy economy;
|
||||||
|
/**
|
||||||
|
* Whether the Core's chat handler should be enabled.
|
||||||
|
* Other chat plugins handling messages from other platforms should set this to false.
|
||||||
|
*/
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
private boolean chatHandlerEnabled = true;
|
||||||
|
|
||||||
private ConfigData<Boolean> writePluginList() {
|
private ConfigData<Boolean> writePluginList() {
|
||||||
return getIConfig().getData("writePluginList", false);
|
return getIConfig().getData("writePluginList", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ConfigData<String> chatFormat() {
|
||||||
|
return getIConfig().getData("chatFormat", "[{origin}|" +
|
||||||
|
"{channel}] <{name}> {message}");
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void pluginEnable() {
|
public void pluginEnable() {
|
||||||
// Logs "Plugin Enabled", registers commands
|
// Logs "Plugin Enabled", registers commands
|
||||||
|
|
|
@ -1,8 +1,6 @@
|
||||||
package buttondevteam.core;
|
package buttondevteam.core;
|
||||||
|
|
||||||
import buttondevteam.lib.TBMCCommandPreprocessEvent;
|
import buttondevteam.lib.*;
|
||||||
import buttondevteam.lib.TBMCCoreAPI;
|
|
||||||
import buttondevteam.lib.TBMCSystemChatEvent;
|
|
||||||
import buttondevteam.lib.architecture.ButtonPlugin;
|
import buttondevteam.lib.architecture.ButtonPlugin;
|
||||||
import buttondevteam.lib.chat.ChatMessage;
|
import buttondevteam.lib.chat.ChatMessage;
|
||||||
import buttondevteam.lib.chat.Command2MCSender;
|
import buttondevteam.lib.chat.Command2MCSender;
|
||||||
|
@ -12,6 +10,7 @@ import buttondevteam.lib.player.TBMCPlayerBase;
|
||||||
import lombok.val;
|
import lombok.val;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.Cancellable;
|
import org.bukkit.event.Cancellable;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.EventPriority;
|
import org.bukkit.event.EventPriority;
|
||||||
|
@ -84,4 +83,21 @@ public class PlayerListener implements Listener {
|
||||||
//Not cancelling the original event here, it's cancelled in the chat plugin
|
//Not cancelling the original event here, it's cancelled in the chat plugin
|
||||||
//This way other plugins can deal with the MC formatting if the chat plugin isn't present, but other platforms still get the message
|
//This way other plugins can deal with the MC formatting if the chat plugin isn't present, but other platforms still get the message
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.HIGH) //The one in the chat plugin is set to highest
|
||||||
|
public void onPlayerChat(TBMCChatEvent event) {
|
||||||
|
if (event.isCancelled())
|
||||||
|
return;
|
||||||
|
if (!MainPlugin.Instance.isChatHandlerEnabled()) return;
|
||||||
|
if (event.getOrigin().equals("Minecraft")) return; //Let other plugins handle MC messages
|
||||||
|
String msg = MainPlugin.Instance.chatFormat().get()
|
||||||
|
.replace("{channel}", event.getChannel().DisplayName().get())
|
||||||
|
.replace("{origin}", event.getOrigin().substring(0, 1))
|
||||||
|
.replace("{name}", ThorpeUtils.getDisplayName(event.getSender()))
|
||||||
|
.replace("{message}", event.getMessage());
|
||||||
|
for (Player player : Bukkit.getOnlinePlayers())
|
||||||
|
if (event.shouldSendTo(player))
|
||||||
|
player.sendMessage(msg);
|
||||||
|
Bukkit.getConsoleSender().sendMessage(msg);
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -4,8 +4,12 @@ import buttondevteam.lib.TBMCSystemChatEvent;
|
||||||
import buttondevteam.lib.architecture.Component;
|
import buttondevteam.lib.architecture.Component;
|
||||||
import org.bukkit.plugin.java.JavaPlugin;
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Manages chat channels. If disabled, only global channels will be registered.
|
||||||
|
*/
|
||||||
public class ChannelComponent extends Component {
|
public class ChannelComponent extends Component {
|
||||||
static TBMCSystemChatEvent.BroadcastTarget roomJoinLeave;
|
static TBMCSystemChatEvent.BroadcastTarget roomJoinLeave;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void register(JavaPlugin plugin) {
|
protected void register(JavaPlugin plugin) {
|
||||||
super.register(plugin);
|
super.register(plugin);
|
||||||
|
|
|
@ -14,11 +14,31 @@ import java.util.Date;
|
||||||
|
|
||||||
import static buttondevteam.core.MainPlugin.permission;
|
import static buttondevteam.core.MainPlugin.permission;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allows giving a 'member' group over some time elapsed OR played.
|
||||||
|
*/
|
||||||
public class MemberComponent extends Component<MainPlugin> implements Listener {
|
public class MemberComponent extends Component<MainPlugin> implements Listener {
|
||||||
|
/**
|
||||||
|
* The permission group to give to the player
|
||||||
|
*/
|
||||||
ConfigData<String> memberGroup() {
|
ConfigData<String> memberGroup() {
|
||||||
return getConfig().getData("memberGroup", "member");
|
return getConfig().getData("memberGroup", "member");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The amount of hours needed to play before promotion
|
||||||
|
*/
|
||||||
|
private ConfigData<Integer> playedHours() {
|
||||||
|
return getConfig().getData("playedHours", 12);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The amount of days passed since first login
|
||||||
|
*/
|
||||||
|
private ConfigData<Integer> registeredForDays() {
|
||||||
|
return getConfig().getData("registeredForDays", 7);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void enable() {
|
protected void enable() {
|
||||||
registerListener(this);
|
registerListener(this);
|
||||||
|
@ -32,8 +52,8 @@ public class MemberComponent extends Component<MainPlugin> implements Listener {
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onPlayerJoin(PlayerJoinEvent event) {
|
public void onPlayerJoin(PlayerJoinEvent event) {
|
||||||
if (permission != null && !permission.playerInGroup(event.getPlayer(), memberGroup().get())
|
if (permission != null && !permission.playerInGroup(event.getPlayer(), memberGroup().get())
|
||||||
&& (new Date(event.getPlayer().getFirstPlayed()).toInstant().plus(7, ChronoUnit.DAYS).isBefore(Instant.now())
|
&& (new Date(event.getPlayer().getFirstPlayed()).toInstant().plus(registeredForDays().get(), ChronoUnit.DAYS).isBefore(Instant.now())
|
||||||
|| event.getPlayer().getStatistic(Statistic.PLAY_ONE_TICK) > 20 * 3600 * 12)) {
|
|| event.getPlayer().getStatistic(Statistic.PLAY_ONE_TICK) > 20 * 3600 * playedHours().get())) {
|
||||||
permission.playerAddGroup(null, event.getPlayer(), memberGroup().get());
|
permission.playerAddGroup(null, event.getPlayer(), memberGroup().get());
|
||||||
event.getPlayer().sendMessage("§bYou are a member now. YEEHAW");
|
event.getPlayer().sendMessage("§bYou are a member now. YEEHAW");
|
||||||
MainPlugin.Instance.getLogger().info("Added " + event.getPlayer().getName() + " as a member.");
|
MainPlugin.Instance.getLogger().info("Added " + event.getPlayer().getName() + " as a member.");
|
||||||
|
|
|
@ -3,6 +3,10 @@ package buttondevteam.core.component.randomtp;
|
||||||
import buttondevteam.core.MainPlugin;
|
import buttondevteam.core.MainPlugin;
|
||||||
import buttondevteam.lib.architecture.Component;
|
import buttondevteam.lib.architecture.Component;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
public class RandomTPComponent extends Component<MainPlugin> {
|
public class RandomTPComponent extends Component<MainPlugin> {
|
||||||
@Override
|
@Override
|
||||||
protected void enable() {
|
protected void enable() {
|
||||||
|
|
|
@ -13,6 +13,9 @@ import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
import org.bukkit.event.player.PlayerQuitEvent;
|
import org.bukkit.event.player.PlayerQuitEvent;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides commands such as /schrestart (restart after a countdown) and /primerestart (restart when nobody is online)
|
||||||
|
*/
|
||||||
public class RestartComponent extends Component<MainPlugin> implements Listener {
|
public class RestartComponent extends Component<MainPlugin> implements Listener {
|
||||||
@Override
|
@Override
|
||||||
public void enable() {
|
public void enable() {
|
||||||
|
|
|
@ -11,6 +11,9 @@ import com.palmergames.bukkit.towny.object.Resident;
|
||||||
import com.palmergames.bukkit.towny.object.TownyUniverse;
|
import com.palmergames.bukkit.towny.object.TownyUniverse;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Automatically renames Towny players if they changed their Minecraft name
|
||||||
|
*/
|
||||||
public class TownyComponent extends Component<MainPlugin> {
|
public class TownyComponent extends Component<MainPlugin> {
|
||||||
@Override
|
@Override
|
||||||
protected void enable() {
|
protected void enable() {
|
||||||
|
|
|
@ -4,7 +4,10 @@ import buttondevteam.core.MainPlugin;
|
||||||
import buttondevteam.lib.architecture.Component;
|
import buttondevteam.lib.architecture.Component;
|
||||||
import buttondevteam.lib.chat.TBMCChatAPI;
|
import buttondevteam.lib.chat.TBMCChatAPI;
|
||||||
|
|
||||||
public class PluginUpdaterComponent extends Component<MainPlugin> {
|
/**
|
||||||
|
* Downloads plugin updates built from their source using JitPack - older code
|
||||||
|
*/
|
||||||
|
public class PluginUpdaterComponent extends Component<MainPlugin> { //TODO: Config
|
||||||
@Override
|
@Override
|
||||||
public void enable() {
|
public void enable() {
|
||||||
TBMCChatAPI.AddCommand(this, new UpdatePluginCommand());
|
TBMCChatAPI.AddCommand(this, new UpdatePluginCommand());
|
||||||
|
|
|
@ -11,12 +11,15 @@ import org.bukkit.Bukkit;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Do not use (EULA)
|
||||||
|
*/
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
public class VotifierComponent extends Component<MainPlugin> {
|
public class VotifierComponent extends Component<MainPlugin> {
|
||||||
private final Economy economy;
|
private final Economy economy;
|
||||||
|
|
||||||
private ConfigData<Double> rewardAmount() {
|
private ConfigData<Double> rewardAmount() {
|
||||||
return getConfig().getData("rewardAmount", 50.0);
|
return getConfig().getData("rewardAmount", 0.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -11,6 +11,7 @@ import org.bukkit.plugin.java.JavaPlugin;
|
||||||
|
|
||||||
import java.util.Stack;
|
import java.util.Stack;
|
||||||
|
|
||||||
|
@HasConfig
|
||||||
public abstract class ButtonPlugin extends JavaPlugin {
|
public abstract class ButtonPlugin extends JavaPlugin {
|
||||||
@Getter
|
@Getter
|
||||||
private static Command2MC command2MC = new Command2MC();
|
private static Command2MC command2MC = new Command2MC();
|
||||||
|
|
|
@ -23,6 +23,7 @@ import java.util.stream.Collectors;
|
||||||
/**
|
/**
|
||||||
* Configuration is based on class name
|
* Configuration is based on class name
|
||||||
*/
|
*/
|
||||||
|
@HasConfig //Used for obtaining javadoc
|
||||||
public abstract class Component<TP extends JavaPlugin> {
|
public abstract class Component<TP extends JavaPlugin> {
|
||||||
private static HashMap<Class<? extends Component>, Component<? extends JavaPlugin>> components = new HashMap<>();
|
private static HashMap<Class<? extends Component>, Component<? extends JavaPlugin>> components = new HashMap<>();
|
||||||
|
|
||||||
|
|
|
@ -8,5 +8,5 @@ import java.lang.annotation.Target;
|
||||||
@Target(ElementType.TYPE)
|
@Target(ElementType.TYPE)
|
||||||
@Retention(RetentionPolicy.RUNTIME)
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
public @interface ComponentMetadata {
|
public @interface ComponentMetadata {
|
||||||
Class<? extends Component>[] depends();
|
Class<? extends Component>[] depends() default {};
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,13 @@
|
||||||
|
package buttondevteam.lib.architecture;
|
||||||
|
|
||||||
|
import java.lang.annotation.ElementType;
|
||||||
|
import java.lang.annotation.Inherited;
|
||||||
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used to generate documentation for the config
|
||||||
|
*/
|
||||||
|
@Target(ElementType.TYPE)
|
||||||
|
@Inherited
|
||||||
|
public @interface HasConfig {
|
||||||
|
}
|
|
@ -8,14 +8,11 @@ import javax.annotation.processing.RoundEnvironment;
|
||||||
import javax.annotation.processing.SupportedAnnotationTypes;
|
import javax.annotation.processing.SupportedAnnotationTypes;
|
||||||
import javax.lang.model.SourceVersion;
|
import javax.lang.model.SourceVersion;
|
||||||
import javax.lang.model.element.*;
|
import javax.lang.model.element.*;
|
||||||
import javax.tools.Diagnostic;
|
|
||||||
import javax.tools.Diagnostic.Kind;
|
import javax.tools.Diagnostic.Kind;
|
||||||
import javax.tools.FileObject;
|
import javax.tools.FileObject;
|
||||||
import javax.tools.JavaFileObject;
|
|
||||||
import javax.tools.StandardLocation;
|
import javax.tools.StandardLocation;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.Writer;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
@ -25,6 +22,8 @@ import java.util.stream.Collectors;
|
||||||
public class ButtonProcessor extends AbstractProcessor {
|
public class ButtonProcessor extends AbstractProcessor {
|
||||||
@Override
|
@Override
|
||||||
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
|
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
|
||||||
|
if (configProcessor == null)
|
||||||
|
configProcessor = new ConfigProcessor(processingEnv);
|
||||||
for (TypeElement te : annotations) {
|
for (TypeElement te : annotations) {
|
||||||
Set<? extends Element> classes = roundEnv.getElementsAnnotatedWith(te);
|
Set<? extends Element> classes = roundEnv.getElementsAnnotatedWith(te);
|
||||||
for (Element targetcl : classes) {
|
for (Element targetcl : classes) {
|
||||||
|
@ -47,6 +46,8 @@ public class ButtonProcessor extends AbstractProcessor {
|
||||||
//System.out.println("Type: " + type);
|
//System.out.println("Type: " + type);
|
||||||
}
|
}
|
||||||
processSubcommands(targetcl, annotationMirrors);
|
processSubcommands(targetcl, annotationMirrors);
|
||||||
|
if (hasAnnotation.apply("HasConfig"))
|
||||||
|
configProcessor.process(targetcl);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
|
@ -63,6 +64,7 @@ public class ButtonProcessor extends AbstractProcessor {
|
||||||
|
|
||||||
private YamlConfiguration yc = new YamlConfiguration();
|
private YamlConfiguration yc = new YamlConfiguration();
|
||||||
private boolean found = false;
|
private boolean found = false;
|
||||||
|
private ConfigProcessor configProcessor;
|
||||||
|
|
||||||
private void processSubcommands(Element targetcl, List<? extends AnnotationMirror> annotationMirrors) {
|
private void processSubcommands(Element targetcl, List<? extends AnnotationMirror> annotationMirrors) {
|
||||||
if (!(targetcl instanceof ExecutableElement))
|
if (!(targetcl instanceof ExecutableElement))
|
||||||
|
@ -91,20 +93,4 @@ public class ButtonProcessor extends AbstractProcessor {
|
||||||
public SourceVersion getSupportedSourceVersion() {
|
public SourceVersion getSupportedSourceVersion() {
|
||||||
return SourceVersion.latestSupported();
|
return SourceVersion.latestSupported();
|
||||||
}
|
}
|
||||||
|
|
||||||
private String fetchSourcePath() {
|
|
||||||
try {
|
|
||||||
JavaFileObject generationForPath = processingEnv.getFiler().createSourceFile("PathFor" + getClass().getSimpleName());
|
|
||||||
Writer writer = generationForPath.openWriter();
|
|
||||||
String sourcePath = generationForPath.toUri().getPath();
|
|
||||||
writer.close();
|
|
||||||
generationForPath.delete();
|
|
||||||
|
|
||||||
return sourcePath;
|
|
||||||
} catch (IOException e) {
|
|
||||||
processingEnv.getMessager().printMessage(Diagnostic.Kind.WARNING, "Unable to determine source file path!");
|
|
||||||
}
|
|
||||||
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,43 @@
|
||||||
|
package buttondevteam.buttonproc;
|
||||||
|
|
||||||
|
import org.bukkit.configuration.file.YamlConfiguration;
|
||||||
|
|
||||||
|
import javax.annotation.processing.ProcessingEnvironment;
|
||||||
|
import javax.lang.model.element.Element;
|
||||||
|
import javax.lang.model.element.Modifier;
|
||||||
|
import javax.tools.FileObject;
|
||||||
|
import javax.tools.StandardLocation;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
public class ConfigProcessor {
|
||||||
|
private final ProcessingEnvironment procEnv;
|
||||||
|
private final YamlConfiguration yaml;
|
||||||
|
private final File file;
|
||||||
|
|
||||||
|
public ConfigProcessor(ProcessingEnvironment procEnv) {
|
||||||
|
this.procEnv = procEnv;
|
||||||
|
FileObject file = null;
|
||||||
|
try {
|
||||||
|
file = procEnv.getFiler().createResource(StandardLocation.CLASS_OUTPUT, "", "config.yml");
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
yaml = new YamlConfiguration();
|
||||||
|
this.file = new File(file.toUri());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void process(Element targetcl) {
|
||||||
|
if (targetcl.getModifiers().contains(Modifier.ABSTRACT)) return;
|
||||||
|
String javadoc = procEnv.getElementUtils().getDocComment(targetcl);
|
||||||
|
if (javadoc == null) return;
|
||||||
|
System.out.println("JAVADOC"); //TODO: Config methods
|
||||||
|
System.out.println(javadoc);
|
||||||
|
yaml.set("components." + targetcl.getSimpleName() + "._doc", javadoc);
|
||||||
|
try {
|
||||||
|
yaml.save(file);
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue