/* ** j###t ########## #### #### ** j###t ########## #### #### ** j###T "###L J###" ** ######P' ########## ######### ** ######k, ########## T######T ** ####~###L #### ** #### q###L ########## .##### ** #### \###L ########## #####" ** ** $Id$ ** ** Class History ** ** Date Name Description ** ---------|------------|----------------------------------------------- ** 24Aug98 subtle start of recorded history ** */ package key.commands; import key.*; import java.util.StringTokenizer; import java.util.Hashtable; import java.io.*; public class Directed extends Command implements Repeatable { private static final long serialVersionUID = 2397330230954817944L; public static final AtomicElement[] ELEMENTS = { AtomicElement.construct( Directed.class, String.class, "direct", AtomicElement.PUBLIC_FIELD, "the message format sent to the person" ), AtomicElement.construct( Directed.class, String.class, "feedback", AtomicElement.PUBLIC_FIELD, "the message format sent back to the player" ), AtomicElement.construct( Directed.class, String.class, "directQuestion", AtomicElement.PUBLIC_FIELD, "the message format sent to the person if the string ends with a ?" ), AtomicElement.construct( Directed.class, String.class, "feedbackQuestion", AtomicElement.PUBLIC_FIELD, "the message format sent back to the player if the string ends with a ?" ), AtomicElement.construct( Directed.class, String.class, "directExclaim", AtomicElement.PUBLIC_FIELD, "the message format sent to the person if the string ends with a !" ), AtomicElement.construct( Directed.class, String.class, "feedbackExclaim", AtomicElement.PUBLIC_FIELD, "the message format sent back to the player if the string ends with a !" ), AtomicElement.construct( Directed.class, String.class, "repeatUsage", AtomicElement.PUBLIC_FIELD, "the usage string when used with a repeat" ), AtomicElement.construct( Directed.class, String.class, "spoonClause", AtomicElement.PUBLIC_FIELD, "the string sent if you start talking yourself" ), AtomicElement.construct( Broadcast.class, Integer.TYPE, "throttleType", AtomicElement.PUBLIC_ACCESSORS, "the throttle type (0 or 1)" ) }; public static final AtomicStructure STRUCTURE = new AtomicStructure( Command.STRUCTURE, ELEMENTS ); public static final char originatorCode = 'o'; public static final char prefixNameCode = 'p'; public static final char messageCode = 'm'; public static final char sometimesSpaceCode = 's'; public static final char targetCode = 't'; public String direct = ""; public String feedback = ""; public String directQuestion = null; public String feedbackQuestion = null; public String directExclaim = null; public String feedbackExclaim = null; public int throttleType = 0; public String repeatUsage = "<name>"; public String spoonClause = "They say talking to yourself is the first sign of madness"; public Directed() { setKey( "directed" ); // text for command usage = "<name> <message>"; } public AtomicStructure getDeclaredStructure() { return( STRUCTURE ); } public void run( Player p, StringTokenizer args, String fullLine, CategoryCommand caller, InteractiveConnection ic, Flags flags ) throws IOException { if( args.hasMoreTokens() ) { String name = args.nextToken(); if( args.hasMoreTokens() ) { String message = args.nextToken( "" ).trim(); p.getRepeated().set( message, this ); Object t = getOnlinePlayer( p, ic, name ); if( t != null ) { if( t == p ) ic.sendFeedback( spoonClause ); else execute( p, message, (Splashable) t ); } return; } } usage( ic ); } protected void execute( Player p, String message, Splashable t ) { String other; String self; p.putCode( originatorCode, p.getName() ); p.putCode( prefixNameCode, p.getFullName() ); p.putCode( messageCode, message ); if( message.charAt( 0 ) == '\'' ) p.putCode( sometimesSpaceCode, "" ); else p.putCode( sometimesSpaceCode, " " ); if( message.endsWith( "?" ) ) { other = directQuestion != null ? directQuestion : direct; self = feedbackQuestion != null ? feedbackQuestion : feedback; } else if( message.endsWith( "!" ) ) { other = directExclaim != null ? directExclaim : direct; self = feedbackExclaim != null ? feedbackExclaim : feedback; } else { other = direct; self = feedback; } p.aboutToBroadcast( throttleType ); (new key.effect.Directed( p, t, self, other, targetCode )).cause(); } public void run( Player p, StringTokenizer args, Repeated r, Command caller, InteractiveConnection ic, Flags flags ) throws IOException { String message = r.getMessage(); if( args.hasMoreTokens() ) { Splashable t = getOnlinePlayer( p, ic, args.nextToken() ); if( t != null ) { if( t == p ) ic.sendFeedback( spoonClause ); else execute( p, message, t ); } return; } ic.sendError( "Format: " + caller.getName() + " " + repeatUsage ); } public void setThrottleType( int i ) { if( i < Player.NUMBER_OF_THROTTLES ) throttleType = i; else throw new InvalidArgumentException( "bad throttle type: must be < " + Player.NUMBER_OF_THROTTLES ); } public int getThrottleType() { return( throttleType ); } }