package io.github.lucaseasedup.logit.command.wizard;
import static io.github.lucaseasedup.logit.message.MessageHelper.sendMsg;
import static io.github.lucaseasedup.logit.message.MessageHelper.t;
import io.github.lucaseasedup.logit.LogItCoreObject;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.HandlerList;
import org.bukkit.event.Listener;
import org.bukkit.event.player.AsyncPlayerChatEvent;
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
import org.bukkit.event.player.PlayerKickEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.event.server.ServerCommandEvent;
public abstract class Wizard extends LogItCoreObject implements Listener
{
public Wizard(CommandSender sender, Object initStep)
{
this.sender = sender;
this.initStep = initStep;
}
public final void createWizard()
{
step = initStep;
Bukkit.getPluginManager().registerEvents(this, getPlugin());
onCreate();
}
@EventHandler(priority = EventPriority.NORMAL)
public final void onPlayerChat(AsyncPlayerChatEvent event)
{
if (event.getPlayer() == sender)
{
if (event.getMessage().equals(MAGIC_QUIT_WORD))
{
sendMessage(t("wizardCancelled"));
cancelWizard();
}
else
{
onMessage(event.getMessage());
}
event.setCancelled(true);
}
}
@EventHandler(priority = EventPriority.NORMAL)
public final void onPlayerCommandPreprocess(PlayerCommandPreprocessEvent event)
{
if (event.getPlayer() == sender)
{
sendMessage(t("wizardCancelled"));
cancelWizard();
Bukkit.dispatchCommand(
event.getPlayer(), event.getMessage().substring(1)
);
event.setCancelled(true);
}
}
@EventHandler(priority = EventPriority.NORMAL)
public final void onServerCommand(ServerCommandEvent event)
{
if (event.getSender() == sender)
{
if (event.getCommand().equals(MAGIC_QUIT_WORD))
{
sendMessage(t("wizardCancelled"));
cancelWizard();
}
else
{
onMessage(event.getCommand());
}
event.setCommand("$logit-nop-command");
}
}
@EventHandler(priority = EventPriority.NORMAL)
public final void onPlayerQuit(PlayerQuitEvent event)
{
if (event.getPlayer() == sender)
{
cancelWizard();
}
}
@EventHandler(priority = EventPriority.NORMAL)
public final void onPlayerKick(PlayerKickEvent event)
{
if (event.getPlayer() == sender)
{
cancelWizard();
}
}
public final Object getCurrentStep()
{
return step;
}
protected abstract void onCreate();
protected abstract void onMessage(String message);
protected final void sendMessage(String message)
{
sendMsg(getSender(), message);
}
protected final void cancelWizard()
{
HandlerList.unregisterAll(this);
}
protected final CommandSender getSender()
{
return sender;
}
protected final void updateStep(Object step)
{
this.step = step;
}
private static final String MAGIC_QUIT_WORD = ":E1,X2/$";
private final CommandSender sender;
private final Object initStep;
private Object step = null;
}