package xyz.etztech.minecraftmanager.listeners; 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.ChatColor; 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.CoreWeb; import xyz.etztech.core.web.ICallback; import xyz.etztech.minecraftmanager.*; import xyz.etztech.minecraftmanager.objects.Application; import xyz.etztech.minecraftmanager.objects.MCMResponse; 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(); MCMUtil.init(); } 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()); TextComponent pre = new TextComponent(ChatColor.GOLD + sender.getName() + " > "); 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()); pre.setHoverEvent(hover); TextComponent message = generateMessage(chat); message.setHoverEvent(hover); for (Player player : event.getRecipients()) { if (player.hasPermission("minecraftmanager.staff")) { player.spigot().sendMessage(pre, message); } } MCMUtil.log(MCMUtil.staffLog, componentText(pre, message)); } else { TextComponent message = generateMessage(chat); if (!MinecraftManager.getLogOverride()) { MCMUtil.log(MCMUtil.globalLog, componentText(pre, message)); } } } 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()); CoreWeb.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.GOLD + Question.COMPLETE.getQuestion()); MCMUtil.staffMessage(ChatColor.GREEN + "New application #" + response.getExtra().getAsString() + " from " + player.getName(), "/app info " + response.getExtra().getAsString()); } else { player.sendMessage(ChatColor.RED + response.getMessage()); } } } private TextComponent generateMessage(String message) { TextComponent text = new TextComponent(); for (String part : message.split(" ")) { text.addExtra(new TextComponent(ChatColor.GREEN + part + " ")); } return text; } 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(); } }