2018-09-12 15:55:10 +00:00
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 ;
2018-09-12 16:03:59 +00:00
import xyz.etztech.core.web.CoreWeb ;
import xyz.etztech.core.web.ICallback ;
2018-09-12 15:55:10 +00:00
import xyz.etztech.minecraftmanager.* ;
2018-09-12 16:03:59 +00:00
import xyz.etztech.minecraftmanager.objects.Application ;
import xyz.etztech.minecraftmanager.objects.MCMResponse ;
import xyz.etztech.minecraftmanager.objects.Question ;
2018-09-12 15:55:10 +00:00
import java.util.ArrayList ;
import java.util.List ;
2018-09-12 16:03:59 +00:00
import java.util.Map ;
2018-09-12 15:55:10 +00:00
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 ( ) ;
MCMUtil . init ( ) ;
}
public void reload ( ) {
this . staffPrefixes = new ArrayList < > ( ) ;
this . staffPrefixes . addAll ( trimmed ( this . plugin . getConfig ( ) . getStringList ( "staff-chat.prefix" ) ) ) ;
}
2018-09-12 16:03:59 +00:00
@EventHandler
2018-09-12 15:55:10 +00:00
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 ) {
2018-09-12 16:03:59 +00:00
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 ) {
2018-09-12 15:55:10 +00:00
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 ) ;
2018-09-12 16:03:59 +00:00
if ( ! MinecraftManager . getLogOverride ( ) ) {
MCMUtil . log ( MCMUtil . globalLog , componentText ( pre , message ) ) ;
}
2018-09-12 15:55:10 +00:00
}
} 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" ) ;
2018-09-12 16:03:59 +00:00
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 ;
2018-09-12 15:55:10 +00:00
}
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 ( ) ) ;
2018-09-12 16:03:59 +00:00
String djangoUrl = MCMAPI . getDjangoUrl ( ) + "plugin/application/" ;
Map < String , String > data = MCMAPI . setup ( ) ;
data . putAll ( app . getForm ( ) ) ;
CoreWeb . asyncPostCallback ( plugin , djangoUrl , data , new ApplicationCallback ( sender ) ) ;
2018-09-12 15:55:10 +00:00
} else {
sender . sendMessage ( ChatColor . GREEN + nextQuestion . getQuestion ( ) ) ;
}
}
}
}
2018-09-12 16:03:59 +00:00
private class ApplicationCallback implements ICallback {
private Player player ;
ApplicationCallback ( Player player ) {
this . player = player ;
2018-09-12 15:55:10 +00:00
}
2018-09-12 16:03:59 +00:00
@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 ( ) ) ;
2018-09-12 15:55:10 +00:00
}
}
}
2018-09-12 16:03:59 +00:00
2018-09-12 15:55:10 +00:00
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 < 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 ( ) ;
}
}