2016-03-02 19:28:01 +00:00
package me.totalfreedom.totalfreedommod.command ;
2015-10-19 17:43:46 +00:00
import java.util.ArrayList ;
import java.util.Arrays ;
import java.util.List ;
import java.util.regex.Matcher ;
import java.util.regex.Pattern ;
2016-03-06 15:56:15 +00:00
import me.totalfreedom.totalfreedommod.rank.Rank ;
2015-10-19 17:43:46 +00:00
import org.apache.commons.lang3.StringUtils ;
import org.bukkit.Bukkit ;
import org.bukkit.ChatColor ;
import org.bukkit.command.Command ;
import org.bukkit.command.CommandSender ;
import org.bukkit.entity.Player ;
2016-03-06 15:56:15 +00:00
@CommandPermissions ( level = Rank . OP , source = SourceType . BOTH )
2015-11-15 23:32:04 +00:00
@CommandParameters ( description = " NickFilter: Prefix any command with this command to replace nicknames in that command with real names. Nicknames should be prefixed with a !. " ,
usage = " /<command> <other_command> !<playernick> " ,
aliases = " nf " )
public class Command_nickfilter extends FreedomCommand
2015-10-19 17:43:46 +00:00
{
2015-11-22 18:26:47 +00:00
2015-10-19 17:43:46 +00:00
@Override
2015-11-22 18:26:47 +00:00
public boolean run ( CommandSender sender , Player playerSender , Command cmd , String commandLabel , String [ ] args , boolean senderIsConsole )
2015-10-19 17:43:46 +00:00
{
boolean nickMatched = false ;
2016-03-02 19:28:01 +00:00
final List < String > outputCommand = new ArrayList < > ( ) ;
2015-10-19 17:43:46 +00:00
if ( args . length > = 1 )
{
final List < String > argsList = Arrays . asList ( args ) ;
for ( String arg : argsList )
{
Player player = null ;
Matcher matcher = Pattern . compile ( " ^!(.+)$ " ) . matcher ( arg ) ;
if ( matcher . find ( ) )
{
String displayName = matcher . group ( 1 ) ;
player = getPlayerByDisplayName ( displayName ) ;
if ( player = = null )
{
player = getPlayerByDisplayNameAlt ( displayName ) ;
if ( player = = null )
{
sender . sendMessage ( ChatColor . GRAY + " Can't find player by nickname: " + displayName ) ;
return true ;
}
}
}
if ( player = = null )
{
outputCommand . add ( arg ) ;
}
else
{
nickMatched = true ;
outputCommand . add ( player . getName ( ) ) ;
}
}
}
if ( ! nickMatched )
{
sender . sendMessage ( " No nicknames replaced in command. " ) ;
return true ;
}
String newCommand = StringUtils . join ( outputCommand , " " ) ;
if ( plugin . cb . isCommandBlocked ( newCommand , sender ) )
{
// CommandBlocker handles messages and broadcasts
return true ;
}
sender . sendMessage ( " Sending command: \" " + newCommand + " \" . " ) ;
server . dispatchCommand ( sender , newCommand ) ;
return true ;
}
private static Player getPlayerByDisplayName ( String needle )
{
needle = needle . toLowerCase ( ) . trim ( ) ;
for ( Player player : Bukkit . getOnlinePlayers ( ) )
{
if ( player . getDisplayName ( ) . toLowerCase ( ) . trim ( ) . contains ( needle ) )
{
return player ;
}
}
return null ;
}
private static Player getPlayerByDisplayNameAlt ( String needle )
{
needle = needle . toLowerCase ( ) . trim ( ) ;
Integer minEditDistance = null ;
Player minEditMatch = null ;
for ( Player player : Bukkit . getOnlinePlayers ( ) )
{
String haystack = player . getDisplayName ( ) . toLowerCase ( ) . trim ( ) ;
int editDistance = StringUtils . getLevenshteinDistance ( needle , haystack . toLowerCase ( ) ) ;
if ( minEditDistance = = null | | minEditDistance . intValue ( ) > editDistance )
{
minEditDistance = editDistance ;
minEditMatch = player ;
}
}
return minEditMatch ;
}
}