/*
** j###t ########## #### ####
** j###t ########## #### ####
** j###T "###L J###"
** ######P' ########## #########
** ######k, ########## T######T
** ####~###L ####
** #### q###L ########## .#####
** #### \###L ########## #####"
**
** Class History
**
** Date Name Description
** ---------|------------|-----------------------------------------------
** 18Jul97 snapper added countMembers() routine
** 18Jul97 subtle added timestatistics keeping
**
*/
package key;
import key.primitive.*;
import key.commands.ClanBroadcast;
import java.util.Enumeration;
import java.io.*;
/**
* A clan is land - but it also encompasses the
* rank and structures of that land
*/
public class Clan extends Channel
{
private static final long serialVersionUID = -46981576610977923L;
public static final int MAX_DESCRIPTION_LINES = Player.MAX_DESCRIPTION_LINES;
public static final int MAX_DESCRIPTION_BYTES = Player.MAX_DESCRIPTION_BYTES;
public static final int MAX_TITLE_LENGTH = 60;
public static final int MAX_PREFIX_LENGTH = 10;
public static final AtomicElement[] ELEMENTS =
{
AtomicElement.construct( Clan.class, TimeStatistics.class, "loginStats",
AtomicElement.PUBLIC_FIELD | AtomicElement.ATOMIC,
"information about the cumulative time spent in the clan" ),
AtomicElement.construct( Clan.class, Player.class, "founder",
AtomicElement.PUBLIC_FIELD,
"the leader and owner of the clan" ),
AtomicElement.construct( Clan.class, Room.class, "hall",
AtomicElement.PUBLIC_FIELD,
"the clan's main room" ),
//AtomicElement.construct( Clan.class, Landscape.class, "land",
//AtomicElement.PUBLIC_FIELD,
//"the clan's rooms" ),
AtomicElement.construct( Clan.class, Landscape.class, "ranks",
AtomicElement.PUBLIC_FIELD,
"the clan's ranks" ),
AtomicElement.construct( Clan.class, Landscape.class, "commandSets",
AtomicElement.PUBLIC_FIELD,
"the clan's command sets" ),
AtomicElement.construct( Clan.class, Rank.class, "baseRank",
AtomicElement.PUBLIC_FIELD,
"the clan's ranks" ),
AtomicElement.construct( Clan.class, String.class, "title", "title",
AtomicElement.PUBLIC_FIELD,
"a string that sometimes comes after the clan's name",
AtomicSpecial.StringLengthLimit( MAX_TITLE_LENGTH, false, true ) ),
AtomicElement.construct( Clan.class, String.class, "prefix", "prefix",
AtomicElement.PUBLIC_FIELD,
"a string that sometimes comes before the clan's name",
AtomicSpecial.StringLengthLimit( MAX_PREFIX_LENGTH, false, true ) ),
AtomicElement.construct( Clan.class, TextParagraph.class,
"description", "description",
AtomicElement.PUBLIC_FIELD,
"a short description of the clan",
// these constants should be put elsewhere
AtomicSpecial.TextParagraphLengthLimit( MAX_DESCRIPTION_BYTES,
MAX_DESCRIPTION_LINES ) ),
AtomicElement.construct( Clan.class, Webpage.class, "homepage",
AtomicElement.PUBLIC_FIELD,
"the clan's homepage" ),
AtomicElement.construct( Clan.class, Screen.class, "motd",
AtomicElement.PUBLIC_FIELD,
"a message of the day for the clan" ),
AtomicElement.construct( Clan.class, String.class, "titledName",
AtomicElement.PUBLIC_ACCESSORS | AtomicElement.READ_ONLY |
AtomicElement.GENERATED,
"the name and title of the clan" )
};
public static final AtomicStructure STRUCTURE = new AtomicStructure( Channel.STRUCTURE, ELEMENTS );
public final TimeStatistics loginStats = new TimeStatistics();
public Reference founder = Reference.EMPTY;
public Reference hall = Reference.EMPTY;
//public final Landscape land = (Landscape) Factory.makeAtom( Landscape.class, "land" );
public final Container ranks = (Container) Factory.makeAtom( Container.class, "ranks" );
public final Container commandSets = (Container) Factory.makeAtom( Container.class, "commandSets" );
public final Screen motd = (Screen) Factory.makeAtom( Screen.class, "motd" );
public Reference baseRank = Reference.EMPTY;
public String title = " the shiny new clan";
public String prefix = "CLAN";
public TextParagraph description = new TextParagraph();
public Webpage homepage = new Webpage();
public static final int MAX_RANKS = 6;
public static final int MAX_NAME = 20;
public AtomicStructure getDeclaredStructure()
{
return( STRUCTURE );
}
public Clan()
{
ranks.setConstraint( Type.RANK );
ranks.setLimit( MAX_RANKS );
// make founder, leader, and member ranks...
// founder
Rank founder = (Rank) Factory.makeAtom( Rank.class, "founder" );
Rank leader = (Rank) Factory.makeAtom( Rank.class, "leader" );
Rank member = (Rank) Factory.makeAtom( Rank.class, "member" );
try
{
ranks.add( founder );
ranks.add( leader );
ranks.add( member );
// set the base rank to member.
baseRank = member.getThis();
// add the joined-to property so they can use commands in
// clan as opposed to rank.
member.setJoinedTo( this );
PermissionList pl;
pl = leader.getPermissionList();
pl.allow( founder.getThis(), Container.addToAction );
pl.allow( founder.getThis(), Container.removeFromAction );
pl = member.getPermissionList();
pl.allow( leader.getThis(), Container.addToAction );
pl.allow( leader.getThis(), Container.removeFromAction );
// set up the implies, founder implies leader,
// leader implies member.
founder.implies.add( leader );
leader.implies.add( member );
CommandList clanCommands = (CommandList) Factory.makeAtom( CommandList.class, "clanCommands" );
clanCommands.setLimit( 20 );
clanCommands.setTitle( "clan" );
commandSets.add( clanCommands );
commands = clanCommands.getThis();
{
CommandCategory refClan = (CommandCategory) Factory.makeAtom( key.CommandCategoryContainer.class );
refClan.setKey( "clan" );
clanCommands.add( refClan );
CommandList clanClanCommands = refClan.getCommandList();
clanClanCommands.setTitle( "clan" );
Command cmds = (Command) Factory.makeAtom( key.commands.Alias.class, "commands" );
cmds.setProperty( "command", "commands clan" );
clanClanCommands.add( cmds );
Command cwho = (Command) Factory.makeAtom( key.commands.ScapeWho.class, "who" );
cwho.setProperty( "scapeFor", this );
cwho.setProperty( "singular", "There is one clan member online" );
cwho.setProperty( "footer", "You have %n clan members online" );
cwho.setProperty( "empty", "No clan members on at the moment" );
clanClanCommands.add( cwho );
// Communication, ick...
// clan say
ClanBroadcast csay = (ClanBroadcast) Factory.makeAtom( ClanBroadcast.class, "say" );
csay.setProperty( "broadcast", "(%c): %o says '^@%m^$'" );
csay.setProperty( "broadcastQuestion", "(%c): %o asks '^@%m^$'" );
csay.setProperty( "broadcastExclaim", "(%c): %o exclaims '^@%m^$'" );
csay.setProperty( "feedback", "(%c): %o says '^@%m^$'" );
csay.setProperty( "feedbackQuestion", "(%c): %o asks '^@%m^$'" );
csay.setProperty( "feedbackExclaim", "(%c): %o exclaims '^@%m^$'" );
csay.setScapeFor( this );
clanClanCommands.add( csay );
// clan emote
ClanBroadcast cemote = (ClanBroadcast) Factory.makeAtom( ClanBroadcast.class, "emote" );
cemote.setProperty( "broadcast", "(%c): %o%s^@%m^$" );
cemote.setProperty( "feedback", "(%c): %o%s^@%m^$" );
cemote.setScapeFor( this );
clanClanCommands.add( cemote );
// clan think
ClanBroadcast cthink = (ClanBroadcast) Factory.makeAtom( ClanBroadcast.class, "think" );
cthink.setProperty( "broadcast", "(%c): %o thinks . o O ( ^@%m^$ )" );
cthink.setProperty( "feedback", "(%c): %o thinks . o O ( ^@%m^$ )" );
cthink.setScapeFor( this );
clanClanCommands.add( cthink );
// Now punctuation for the communication
Command cPunctuation = (Command) Factory.makeAtom( key.commands.Punctuation.class, "c" );
clanCommands.add( cPunctuation );
// add the say, emote and think to c
cPunctuation.setProperty( "say", csay );
cPunctuation.setProperty( "emote", cemote );
cPunctuation.setProperty( "think", cthink );
// Add commands to the ranks, founders get generic
// grant style command named 'raise'
// leader get accept, exile
// member secede
// code: construct the new commandlist;
// set the rank's command list to created
// create a new command
// put in in the list
// make the founder the owner
Command secede = (Command) Factory.makeAtom( key.commands.Secede.class );
clanClanCommands.add( secede );
clanClanCommands.sort();
}
// member
CommandList memberCommands = (CommandList) Factory.makeAtom( CommandList.class, "member" );
memberCommands.setLimit( 20 );
commandSets.add( memberCommands );
member.setProperty( "commands", memberCommands );
{
CommandCategory refClan = (CommandCategory) Factory.makeAtom( key.CommandCategoryContainer.class );
refClan.setKey( "clan" );
memberCommands.add( refClan );
CommandList clanClanCommands = refClan.getCommandList();
clanClanCommands.setTitle( "clan" );
Command clanMotd = (Command) Factory.makeAtom( key.commands.clan.ClanMotd.class );
clanMotd.setKey( "clanmotd" );
clanClanCommands.add( clanMotd );
clanClanCommands.sort();
}
// leader
CommandList leaderCommands = (CommandList) Factory.makeAtom( CommandList.class, "leader" );
leaderCommands.setLimit( 20 );
commandSets.add( leaderCommands );
leader.setProperty( "commands", leaderCommands );
{
CommandCategory refClan = (CommandCategory) Factory.makeAtom( key.CommandCategoryContainer.class );
refClan.setKey( "clan" );
leaderCommands.add( refClan );
CommandList clanClanCommands = refClan.getCommandList();
clanClanCommands.setTitle( "clan" );
Command accept = (Command) Factory.makeAtom( key.commands.clan.Accept.class );
clanClanCommands.add( accept );
Command revoke = (Command) Factory.makeAtom( key.commands.clan.Revoke.class );
clanClanCommands.add( revoke );
clanClanCommands.sort();
}
// founders
CommandList founderCommands = (CommandList) Factory.makeAtom( CommandList.class, "founder" );
founderCommands.setLimit( 20 );
commandSets.add( founderCommands );
founder.setProperty( "commands", founderCommands );
CommandCategoryContainer create = (CommandCategoryContainer) Factory.makeAtom( CommandCategoryContainer.class, "create" );
founderCommands.add( create );
Command rank = (Command) Factory.makeAtom( key.commands.clan.Create_rank.class, "rank" );
create.getCommandList().add( rank );
{
CommandCategory refClan = (CommandCategory) Factory.makeAtom( key.CommandCategoryContainer.class );
refClan.setKey( "clan" );
founderCommands.add( refClan );
CommandList clanClanCommands = refClan.getCommandList();
clanClanCommands.setTitle( "clan" );
Command refRank = (Command) Factory.makeAtom( key.commands.clan.RefRank.class );
refRank.setKey( "rank" );
clanClanCommands.add( refRank );
Command add = (Command) Factory.makeAtom( key.commands.clan.Add.class );
add.setKey( "add" );
clanClanCommands.add( add );
Command take = (Command) Factory.makeAtom( key.commands.clan.Take.class );
clanClanCommands.add( take );
Command baserank = (Command) Factory.makeAtom( key.commands.clan.BaseRank.class );
clanClanCommands.add( baserank );
Command editmotd = (Command) Factory.makeAtom( key.commands.clan.EditMotd.class );
clanClanCommands.add( editmotd );
Command setHall = (Command) Factory.makeAtom( key.commands.clan.SetHall.class );
clanClanCommands.add( setHall );
Command dissolve = (Command) Factory.makeAtom( key.commands.clan.Dissolve.class );
clanClanCommands.add( dissolve );
Command implies = (Command) Factory.makeAtom( key.commands.clan.Implies.class );
clanClanCommands.add( implies );
Command notImplies = (Command) Factory.makeAtom( key.commands.clan.NotImplies.class );
notImplies.setKey( "notimplies" );
clanClanCommands.add( notImplies );
//Command clanland = (Command) Factory.makeAtom( key.commands.clan.RefClanLand.class );
//clanland.setKey( "clanland" );
//clanClanCommands.add( clanland );
Command structure = (Command) Factory.makeAtom( key.commands.clan.Structure.class );
structure.setKey( "structure" );
clanClanCommands.add( structure );
clanClanCommands.sort();
}
// sort those command sets!
memberCommands.sort();
leaderCommands.sort();
founderCommands.sort();
}
catch( BadKeyException e )
{
throw new UnexpectedResult( "static string should contain only alphabetic characters" );
}
catch( NonUniqueKeyException e )
{
throw new UnexpectedResult( "There is already something of that name here" );
}
}
public Player getFounder()
{
try
{
return( (Player) founder.get() );
}
catch( OutOfDateReferenceException e )
{
founder = Reference.EMPTY;
Log.log( "clan", "Clan " + getName() + " no longer has a valid founder" );
return( null );
}
catch( ClassCastException e )
{
founder = Reference.EMPTY;
Log.log( "clan", "Clan " + getName() + " no longer has a valid founder" );
return( null );
}
}
public void setFounder( Player p )
{
if( founder == Reference.EMPTY )
{
founder = p.getThis();
Container c = (Container) ranks.getElement( "founder" );
if( c != null )
{
try
{
c.add( p );
}
catch( Exception e )
{
Log.error( "during clan setFounder()", e );
}
}
}
else
throw new AccessViolationException( this, "founder already set in clan " + getName() + ". Cannot set the founder to be " + p.getName() );
}
public String getTitledName()
{
return( getName() + title );
}
public String getPrefix()
{
return( prefix );
}
public int countMembers()
{
int temp = 0;
for( Enumeration e = ranks.elements(); e.hasMoreElements(); )
temp += ((Rank)e.nextElement()).count();
return temp;
}
public String getCreationDate()
{
return( loginStats.firstConnection.toString() );
}
public void linkPlayer( Player p ) throws NonUniqueKeyException,BadKeyException
{
super.linkPlayer( p );
loginStats.startConnection();
}
public void unlinkPlayer( Player p ) throws NonUniqueKeyException,java.util.NoSuchElementException,BadKeyException
{
super.unlinkPlayer( p );
loginStats.endConnection();
}
}