key0-96/
key0-96/doc/key/
key0-96/doc/key/credits/
key0-96/doc/key/developers/
key0-96/doc/key/developers/resources/
key0-96/setup/caves/
key0-96/setup/help/
key0-96/setup/ruins/
key0-96/src/
key0-96/src/commands/
key0-96/src/events/
key0-96/src/hack/
key0-96/src/sql/
key0-96/src/swing/
key0-96/src/talker/forest/
key0-96/src/talker/objects/
key0-96/src/terminals/
/*
**               j###t  ########## ####   ####
**              j###t   ########## ####   ####
**             j###T               "###L J###"
**          ######P'    ##########  #########
**          ######k,    ##########   T######T
**          ####~###L   ####
**          #### q###L  ##########   .#####
**          ####  \###L ##########   #####"
**
**  Class: friend
**
**  Class History
**  
**  Date        Name         Description
**  ---------|------------|-----------------------------------------------
**  02Jul97     exile        fix so that friending a player that is
**                           already a friend doesn't throw an exception
**  05Jul97     subtle       code restructure & additional sarcasm.
**  05Jul97     exile        tidied up some stuff such as adding a setKey etc.
*/

package key.commands;

import key.*;
import java.io.IOException;
import java.util.StringTokenizer;

public class Friend extends Command
{
	public Friend()
	{
		setKey( "friend" );
		usage = "<player>";
	}

	public void run( Player p, StringTokenizer args, String fullLine, CategoryCommand caller, InteractiveConnection ic, Flags flags ) throws IOException
	{
        if( !args.hasMoreTokens() )
		{
			usage( ic );
			return;
		}
		
		String friended = args.nextToken();
		Object o = getPlayer( ic, friended );
		
		if( o == null )
			return;
		
		if( o == p )
		{
			ic.sendError( "Hmmm.  That sort of friend, eh?" );
			return;
		}
	
		Player f = (Player) o;
		
		Scape friends = (Scape) p.friends;
		
		if( friends.contains( f ) )
		{
				//  this person is already friended.. unfriend them
			try
			{
				friends.remove( f );
			}
			catch( BadKeyException e )
			{
				throw new UnexpectedResult( e.toString() );
			}
			catch( NonUniqueKeyException e )
			{
				throw new UnexpectedResult( e.toString() );
			}
			
				//  forgive the sarcasm.  I'm not a big
				//  fan of friend channels. ;)
			ic.sendFeedback( f.getName() + " is no longer a friend.  (I'm sure they're heartbroken)" );
		}
		else
		{
			if( !f.canMakeFriend( p ) )
			{
				ic.sendFailure( f.getName() + " doesn't want to be friended." );
				return;
			}
			
			try
			{
				friends.add( f );
			}
			catch( NonUniqueKeyException e )
			{
				throw new UnexpectedResult( e.toString() );
			}
			catch( BadKeyException e )
			{
				throw new UnexpectedResult( e.toString() );
			}
			
			ic.sendFeedback( f.getName() + " has been added to your friends list." );
		}
	}
}