package xyz.etztech.minecraftmanager.listeners; import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.chat.BaseComponent; import net.md_5.bungee.api.chat.ComponentBuilder; import net.md_5.bungee.api.chat.HoverEvent; import net.md_5.bungee.api.chat.TextComponent; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.AsyncPlayerChatEvent; import xyz.etztech.core.web.Http; import xyz.etztech.core.web.ICallback; import xyz.etztech.minecraftmanager.MCMAPI; import xyz.etztech.minecraftmanager.MCMUtil; import xyz.etztech.minecraftmanager.MinecraftManager; import xyz.etztech.minecraftmanager.objects.Application; import xyz.etztech.minecraftmanager.objects.MCMResponse; import xyz.etztech.minecraftmanager.objects.MinecraftManagerThread; import xyz.etztech.minecraftmanager.objects.Question; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.regex.Pattern; public class AsyncPlayerChatListener implements Listener { private MinecraftManager plugin; private List staffPrefixes; public AsyncPlayerChatListener(MinecraftManager minecraftManager) { this.plugin = minecraftManager; reload(); } public void reload() { this.staffPrefixes = new ArrayList<>(); this.staffPrefixes.addAll(trimmed(this.plugin.getConfig().getStringList("staff-chat.prefix"))); } @EventHandler public void onChat(AsyncPlayerChatEvent event) { Player sender = event.getPlayer(); String chat = event.getMessage(); boolean applyChat = MinecraftManager.inApplyMode(sender.getUniqueId().toString()); ComponentBuilder message = new ComponentBuilder(""); message.append(sender.getName() + " > ").color(ChatColor.GOLD); if (!applyChat) { boolean hasPermission = sender.hasPermission("minecraftmanager.staff"); boolean singlePrefix = false; for (String prefix : this.staffPrefixes) { if (chat.startsWith(prefix)) { chat = chat.substring(1); singlePrefix = true; if (chat.startsWith(prefix)) { singlePrefix = false; event.setMessage(chat); } } } if (hasPermission && singlePrefix) { event.setCancelled(true); for (String prefix : this.staffPrefixes) { chat = chat.replaceFirst(Pattern.quote(prefix), ""); } HoverEvent hover = new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder("Staff Chat").create()); message.event(hover); message.append(chat).color(ChatColor.GREEN).event(hover); MCMUtil.staffMessage(new TextComponent(message.create())); } else { message.append(chat); if (!MinecraftManager.getLogOverride()) { MCMUtil.log(MCMUtil.globalLogger, componentText(message.create())); } } } else { // Applying event.setCancelled(true); Question applyQuestion = MinecraftManager.getApplyQuestion(sender.getUniqueId().toString()); if ("stop".equalsIgnoreCase(chat)) { // Pause application MinecraftManager.setApplyMode(sender.getUniqueId().toString(), false); sender.sendMessage(ChatColor.GREEN + "Exiting apply mode. Use \"/apply\" to return to your application."); } else if ("last".equalsIgnoreCase(chat)) { // Previous question if (Question.ONE == applyQuestion) { sender.sendMessage(ChatColor.RED + "This is the first question you ding dong. Say \"stop\" in chat to pause your application."); } else { Question lastQuestion = Question.last(applyQuestion); MinecraftManager.setApplyQuestion(sender.getUniqueId().toString(), lastQuestion); sender.sendMessage(ChatColor.GREEN + lastQuestion.getQuestion()); } } else { // Answering question boolean valid = Question.validate(applyQuestion, chat); boolean rules = this.plugin.getConfig().getBoolean("rules.application.validate"); String answer = this.plugin.getConfig().getString("rules.application.answer"); if (Question.FIVE == applyQuestion && rules && !chat.equalsIgnoreCase(answer)) { sender.sendMessage(ChatColor.RED + Question.READ_RULES); return; } if (!valid) { sender.sendMessage(ChatColor.RED + applyQuestion.getError()); return; } Application app = MinecraftManager.getApplication(sender.getUniqueId().toString()); app.setUsername(sender.getName()); app.setAnswer(applyQuestion, chat); MinecraftManager.setApplication(sender.getUniqueId().toString(), app); Question nextQuestion = Question.next(applyQuestion, chat); MinecraftManager.setApplyQuestion(sender.getUniqueId().toString(), nextQuestion); if (Question.COMPLETE == nextQuestion) { MinecraftManager.setApplyMode(sender.getUniqueId().toString(), false); Bukkit.getConsoleSender().sendMessage(app.getFormatted()); String djangoUrl = MCMAPI.getDjangoUrl() + "plugin/application/"; Map data = MCMAPI.setup(); data.putAll(app.getForm()); Http.asyncPostCallback(plugin, djangoUrl, data, new ApplicationCallback(sender)); } else { sender.sendMessage(ChatColor.GREEN + nextQuestion.getQuestion()); } } } } private class ApplicationCallback implements ICallback { private Player player; ApplicationCallback(Player player) { this.player = player; } @Override public void invoke(String s) { MCMResponse response = new MCMResponse(s); if (response.getStatus()) { player.sendMessage(ChatColor.GREEN + "Your application has been submitted! Hang tight while it gets reviewed by staff."); MinecraftManagerThread.application(player.getName(), response.getExtra().getAsString()); } else { player.sendMessage(ChatColor.RED + response.getMessage()); } } } private List trimmed(List list) { for (int i = 0; i < list.size(); i++) { list.set(i, list.get(i).trim()); } return list; } public String componentText(BaseComponent... components) { StringBuilder text = new StringBuilder(); for (BaseComponent component : components) { text.append(ChatColor.stripColor(component.toPlainText())); } return text.toString(); } }