/*
** j###t ########## #### ####
** j###t ########## #### ####
** j###T "###L J###"
** ######P' ########## #########
** ######k, ########## T######T
** ####~###L ####
** #### q###L ########## .#####
** #### \###L ########## #####"
*/
package key.commands;
import key.*;
import java.util.StringTokenizer;
import java.io.IOException;
public class Block extends CommandCategoryContainer
{
private static final long serialVersionUID = -2639627322424562207L;
public static final String SPOON_CLAUSE = "Worried about having to talk to yourself?";
public Block()
{
setKey( "block" );
usage = "( subcommand | <player> ) [on | off]";
}
public void run( Player p, StringTokenizer args, String fullLine, CategoryCommand caller, InteractiveConnection ic, Flags flags ) throws IOException
{
if( !args.hasMoreTokens() )
{
super.run( p, args, fullLine, caller, ic, flags );
ic.send( "For convenience, you may also use " + getName() + " to block individual players from talking to you. Just use the players name instead of the subcommand, such as 'block subtle'. (This is a shortcut for 'deny <name> tell')" );
return;
}
QualifierList ql = p.getQualifierList();
// if this gets executed, we have not matched any
// of the custom block routines, so we're going to
// try and block a player.
String name = args.nextToken();
String toggle = "";
if( args.hasMoreTokens() )
toggle = args.nextToken();
Player t = (Player) getPlayer( ic, name );
if( t == null )
return;
PermissionList pl = p.getPermissionList();
PermissionList.Entry ple = pl.getEntryFor( t.getThis() );
if( ple == null && toggle.equalsIgnoreCase( "off" ) )
{
pl.allow( t.getThis(), p.tellAction );
ic.sendFeedback( "You were not blocking " + t.getName() + " and you still aren't... so whatever." );
}
else if( ple == null )
{
if( p == t )
ic.sendFailure( SPOON_CLAUSE );
else
{
// this person wasn't in the list previously
pl.deny( t.getThis(), p.tellAction );
ic.sendFeedback( "You block " + t.getName() );
}
}
else
{
if( toggle.equalsIgnoreCase( "on" ) )
{
if( p == t )
ic.sendFailure( SPOON_CLAUSE );
else
{
ple.deny( p.tellAction );
ic.sendFeedback( "You block " + t.getName() );
}
}
else if( toggle.equalsIgnoreCase( "off" ) )
{
ple.allow( p.tellAction );
ic.sendFeedback( "You stop blocking " + t.getName() );
}
else if( ple.isDenying( p.tellAction ) )
{
ple.allow( p.tellAction );
ic.sendFeedback( "You stop blocking " + t.getName() );
}
else
{
if( p == t )
ic.sendFailure( SPOON_CLAUSE );
else
{
ple.deny( p.tellAction );
ic.sendFeedback( "You block " + t.getName() );
}
}
}
}
public boolean recloneArgs()
{
return( true );
}
public Commandable getMatch( final Player p, key.util.StringTokenizer st )
{
if( st.hasMoreTokens() )
{
Commandable c = (Commandable) commands.getExactElement( st.nextToken() );
if( c != null )
return( c );
else
return( null );
}
else
return( this );
}
public Command.Match getFinalMatch( final Player p, key.util.StringTokenizer st )
{
if( st.hasMoreTokens() )
{
final String command = st.nextToken();
return( new Command.Match()
{
{
Commandable c = (Commandable) commands.getExactElement( command );
if( c != null )
match = c;
else
match = null;
lastchance = Block.this;
}
public String getErrorString()
{
return( "No such command '" + command + "' in " + Block.this.getName() );
}
} );
}
else
return( super.getFinalMatch( p, st ) );
}
public abstract static class block extends Command
{
public block()
{
usage = "[on | off]";
}
/**
* @return true iff blocked
*/
public boolean doBlock( Player p, StringTokenizer args, InteractiveConnection ic, Type c )
{
QualifierList ql = p.getQualifierList();
String toggle = "";
if( args.hasMoreTokens() )
toggle = args.nextToken();
// for groups (clans, friends etc)
if( toggle.equalsIgnoreCase( "on" ) )
ql.set( c, Qualifiers.SUPPRESSION_CODE );
else if( toggle.equalsIgnoreCase( "off" ) )
ql.set( c, Qualifiers.UNSUPPRESSION_CODE );
else if( ql.check( c ) == Qualifiers.SUPPRESSION_CODE )
ql.set( c, Qualifiers.UNSUPPRESSION_CODE );
else
ql.set( c, Qualifiers.SUPPRESSION_CODE );
return( ql.check( c ) == Qualifiers.SUPPRESSION_CODE );
}
}
// hack until JDK 1.2 fixes this bug
public static final AtomicElement[] TYPE_ELEMENTS =
{
AtomicElement.construct( Block.type.class, String.class, "type",
AtomicElement.PUBLIC_FIELD,
"the type to block, such as friends, movement, etc" ),
AtomicElement.construct( Block.type.class, String.class, "blockMsg",
AtomicElement.PUBLIC_FIELD,
"the message sent when the type is blocked." ),
AtomicElement.construct( Block.type.class, String.class, "unblockMsg",
AtomicElement.PUBLIC_FIELD,
"the message sent when the type is unblocked." ),
};
public static final AtomicStructure TYPE_STRUCTURE = new AtomicStructure( Command.STRUCTURE, TYPE_ELEMENTS );
public static class type extends block
{
public String type = null;
public String blockMsg = "You block";
public String unblockMsg = "You unblock";
public type()
{
setKey( "type" );
usage = "[on | off]";
}
public AtomicStructure getDeclaredStructure()
{
return( TYPE_STRUCTURE );
}
protected boolean doBlock( Player p, StringTokenizer args, String fullLine, CategoryCommand caller, InteractiveConnection ic, Flags flags ) throws IOException
{
if( type == null )
{
ic.sendFailure( "This command is not properly set up." );
throw new InvalidArgumentException( "This command is not properly set up." );
}
Type t = null;
try
{
t = Type.forName( type );
}
catch( ClassNotFoundException e )
{
}
if( t == null )
{
ic.sendFailure( "This command is not properly set up. Type '" + type + "' unknown." );
throw new InvalidArgumentException( "This command is not properly set up. '" + type + "' unknown." );
}
return( this.doBlock( p, args, ic, t ) );
}
public void run( Player p, StringTokenizer args, String fullLine, CategoryCommand caller, InteractiveConnection ic, Flags flags ) throws IOException
{
try
{
if( doBlock( p, args, fullLine, caller, ic, flags ) )
ic.sendFeedback( blockMsg );
else
ic.sendFeedback( unblockMsg );
}
catch( InvalidArgumentException e )
{
}
}
}
public static class clan extends block
{
public clan()
{
setKey( "clan" );
}
public void run( Player p, StringTokenizer args, String fullLine, CategoryCommand caller, InteractiveConnection ic, Flags flags ) throws IOException
{
Clan clan = p.getClan();
if( this.doBlock( p, args, ic, Type.CLAN ) )
{
if( clan == null )
{
ic.sendFeedback( "Schmuck, you're not *in* a clan. Next time you are, though, it'll be blocked, just like you asked." );
}
else
{
key.effect.Block block = new key.effect.Block( p, clan, "(" + clan.getPrefix() + "): " + p.getName() + " blocks the clan." );
block.cause();
ic.sendFeedback( "You block your clan." );
}
}
else
{
if( clan == null )
{
ic.sendFeedback( "You're no longer blocking the clan you're not in." );
}
else
{
key.effect.Block unblock = new key.effect.Block( p, clan, "(" + clan.getPrefix() + "): " + p.getName() + " stops blocking the clan." );
unblock.cause();
ic.sendFeedback( "You stop blocking your clan." );
}
}
}
}
// hack until JDK 1.2 fixes this bug
public static final AtomicElement[] SCAPE_ELEMENTS =
{
AtomicElement.construct( Block.scape.class, String.class, "notinBlockMsg",
AtomicElement.PUBLIC_FIELD,
"the message sent when blocked and you aren't in the scape." ),
AtomicElement.construct( Block.scape.class, String.class, "notinUnblockMsg",
AtomicElement.PUBLIC_FIELD,
"the message sent when unblocked and you aren't in the scape." ),
AtomicElement.construct( Block.scape.class, String.class, "blockScapeMsg",
AtomicElement.PUBLIC_FIELD,
"the message sent to the scape when blocked." ),
AtomicElement.construct( Block.scape.class, String.class, "unblockScapeMsg",
AtomicElement.PUBLIC_FIELD,
"the message sent to the scape when unblocked." ),
AtomicElement.construct( Block.scape.class, Scape.class, "scapeFor",
AtomicElement.PUBLIC_FIELD,
"the scape to block (the type must still be unique, this indicates the scape to notify)" )
};
public static final AtomicStructure SCAPE_STRUCTURE = new AtomicStructure( TYPE_STRUCTURE, SCAPE_ELEMENTS );
public static class scape extends type
{
public String notinBlockMsg = blockMsg;
public String notinUnblockMsg = unblockMsg;
public String blockScapeMsg = "<> %o blocks.";
public String unblockScapeMsg = "<> %o stops blocking.";
public Reference scapeFor = Reference.EMPTY;
public scape()
{
setKey( "scape" );
}
public AtomicStructure getDeclaredStructure()
{
return( SCAPE_STRUCTURE );
}
public void run( Player p, StringTokenizer args, String fullLine, CategoryCommand caller, InteractiveConnection ic, Flags flags ) throws IOException
{
Scape scape = null;
try
{
scape = (Scape) scapeFor.get();
}
catch( OutOfDateReferenceException e )
{
scapeFor = Reference.EMPTY;
}
catch( ClassCastException e )
{
scapeFor = Reference.EMPTY;
Log.error( "somebody set " + getId() + ".scapeFor wrong (reset)", e );
}
try
{
if( this.doBlock( p, args, fullLine, caller, ic, flags ) )
{
if( scape == null || !scape.containsPlayer( p ) )
{
ic.sendFeedback( notinBlockMsg );
}
else
{
p.putCode( 'o', p.getName() );
key.effect.Block block = new key.effect.Block( p, scape, blockScapeMsg );
block.cause();
ic.sendFeedback( blockMsg );
}
}
else
{
if( scape == null || !scape.containsPlayer( p ) )
{
ic.sendFeedback( notinUnblockMsg );
}
else
{
p.putCode( 'o', p.getName() );
key.effect.Block unblock = new key.effect.Block( p, scape, unblockScapeMsg );
unblock.cause();
ic.sendFeedback( unblockMsg );
}
}
}
catch( InvalidArgumentException e )
{
}
}
}
}