MinecraftManagerPlugin/src/main/java/xyz/etztech/minecraftmanager/listeners/AsyncPlayerChatListener.java

172 lines
7.1 KiB
Java

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<String> 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<String, String> 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<String> trimmed(List<String> 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();
}
}