172 lines
7.1 KiB
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();
|
|
}
|
|
|
|
}
|