/* ** j###t ########## #### #### ** j###t ########## #### #### ** j###T "###L J###" ** ######P' ########## ######### ** ######k, ########## T######T ** ####~###L #### ** #### q###L ########## .##### ** #### \###L ########## #####" ** ** Class History ** ** Date Name Description ** ---------|------------|----------------------------------------------- ** 19Jul97 subtle added first connect ever ** */ package key; import key.primitive.*; import java.io.*; /** * Ideas: * - Number of connections atm * - all time highest number of simultaneous connections * (with registering connection code (who, etc)) * - average length of connection * - maximum connection time ever */ public final class TimeStatistics extends Atom { static final AtomicElement[] ELEMENTS = { AtomicElement.construct( TimeStatistics.class, Duration.class, "totalConnectionTime", AtomicElement.PUBLIC_ACCESSORS | AtomicElement.READ_ONLY, "the total time spent connected" ), AtomicElement.construct( TimeStatistics.class, Duration.class, "timeSinceConnection", AtomicElement.PUBLIC_ACCESSORS | AtomicElement.READ_ONLY, "the time since the most recent connection" ), AtomicElement.construct( TimeStatistics.class, Integer.TYPE, "currentConnections", AtomicElement.PUBLIC_FIELD | AtomicElement.READ_ONLY, "the number of connections open at the moment" ), AtomicElement.construct( TimeStatistics.class, DateTime.class, "lastConnection", AtomicElement.PUBLIC_FIELD, "the time of the most recent connection" ), AtomicElement.construct( TimeStatistics.class, DateTime.class, "firstConnection", AtomicElement.PUBLIC_FIELD, "the time of the first connection ever" ), AtomicElement.construct( TimeStatistics.class, Integer.TYPE, "highestNumberConnections", AtomicElement.PUBLIC_FIELD, "the maximum number of connections ever at one time" ), AtomicElement.construct( TimeStatistics.class, Integer.TYPE, "numberConnections", AtomicElement.PUBLIC_FIELD, "the total number of connections" ) }; static final AtomicStructure STRUCTURE = new AtomicStructure( Atom.STRUCTURE, ELEMENTS ); /** * Used for the players total connection * time. Calculated by adding the different * between lastSaved and the current time * to the savedConnectTime if the player * is online, otherwise calculated by * using the savedConnectTime only. */ public Duration getTotalConnectionTime() { if( lastSaved != null ) updateSavedConnectTime( new DateTime() ); return( savedConnectTime ); } /** * The time *since* the most recent connection */ public Duration getTimeSinceConnection() { if( lastConnection == null ) return( null ); else return( lastConnection.difference( new DateTime() ) ); } public DateTime getLastConnection() { return( lastConnection ); } /** * The time of the most recent connection */ DateTime lastConnection; /** * The time of the first connection */ DateTime firstConnection; /** * The total connection time when the * player was last saved */ Duration savedConnectTime = new Duration(); /** * The time when the 'savedConnectTime' was * last updated from the currentTime */ transient DateTime lastSaved; /** * The number of connections at the moment. * * Every second, the number here is the amount * that the totalConnectTime goes up by. Every * time startConnection() is called, it is increased * by one, and it is decreased by one when * endConnection() is called. */ int currentConnections = 0; /** * The total number of connections ever. */ int numberConnections = 0; /** * The maximum number of simultaneous connections ever */ int highestNumberConnections = 0; public TimeStatistics() { lastSaved = null; } protected AtomicStructure getDeclaredStructure() { return( STRUCTURE ); } void reset() { lastConnection = null; firstConnection = null; savedConnectTime = new Duration(); lastSaved = null; currentConnections = 0; numberConnections = 0; highestNumberConnections = 0; } private void updateSavedConnectTime( DateTime current ) { if( lastSaved != null ) { savedConnectTime = savedConnectTime.addMultiple( lastSaved.difference( current ), currentConnections ); lastSaved = current; } } void startConnection() { DateTime current = new DateTime(); if( lastSaved != null ) updateSavedConnectTime( current ); else lastSaved = current; if( firstConnection == null ) firstConnection = current; // new connection numberConnections++; currentConnections++; if( currentConnections > highestNumberConnections ) highestNumberConnections = currentConnections; lastConnection = current; } void endConnection() { updateSavedConnectTime( new DateTime() ); if( currentConnections <= 1 ) lastSaved = null; currentConnections--; } }