diff options
Diffstat (limited to 'EssentialsUpdate/src/f00f/net/irc/martyr/commands/QuitCommand.java')
-rw-r--r-- | EssentialsUpdate/src/f00f/net/irc/martyr/commands/QuitCommand.java | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/EssentialsUpdate/src/f00f/net/irc/martyr/commands/QuitCommand.java b/EssentialsUpdate/src/f00f/net/irc/martyr/commands/QuitCommand.java new file mode 100644 index 000000000..e12a2520d --- /dev/null +++ b/EssentialsUpdate/src/f00f/net/irc/martyr/commands/QuitCommand.java @@ -0,0 +1,132 @@ +package f00f.net.irc.martyr.commands; + +import java.util.Enumeration; + +import f00f.net.irc.martyr.InCommand; +import f00f.net.irc.martyr.clientstate.Channel; +import f00f.net.irc.martyr.clientstate.ClientState; +import f00f.net.irc.martyr.util.FullNick; + +/** + * <p>Defines QUIT command. The QUIT command asks the irc server to + * disconnect us, and we can optionally give a reason. The QUIT + * command is also received by us if someone on a channel we are on + * quits.</p> + * + * <p>What should be done to signal to the framework that the + * disconnection that should come from the server is legit, and we + * shouldn't try to re-connecet? For now it will be assumed that the + * user of the framework will signal all the appropriate classes that + * a legit disconnection will happen (ie AutoRegister which will try + * to re-connect otherwise).</p> + */ +public class QuitCommand extends AbstractCommand +{ + //static Logger log = Logger.getLogger(QuitCommand.class); + + private String reason; + private FullNick user; + + /** For use as a factory */ + public QuitCommand() + { + this( null, null ); + } + + /** + * For use as an incoming command. + * + * @param user User that has quit + * @param reason Specified reason for quitting + */ + public QuitCommand( FullNick user, String reason ) + { + this.user = user; + this.reason = reason; + } + + /** + * For use as an outgoing command. + * + * @param reason Specified reason for quitting + */ + public QuitCommand( String reason ) + { + this( null, reason ); + } + + public InCommand parse( String prefix, String identifier, String params ) + { + return new QuitCommand( new FullNick( prefix ), getParameter( params, 0 ) ); + } + + public String getIrcIdentifier() + { + return "QUIT"; + } + + public String renderParams() + { + return ":" + reason; + } + + public String getReason() + { + return reason; + } + + public FullNick getUser() + { + return user; + } + + /** + * Returns true if we are the ones quitting. + * + * @param state Client state we are checking against + * @return True or false if the quit is us quitting + */ + public boolean isOurQuit( ClientState state ) + { + return user.equals( state.getNick() ); + } + + /** If we are quitting, we won't be worrying about our client state. + * If someone else is leaving, then remove them from all the groups + * they are in. + */ + public boolean updateClientState( ClientState state ) + { + //log.debug( "Nick: " + state.getNick().toString() ); + if( isOurQuit(state) ) + { + // We've quit + //log.debug("QUIT: We've quit: " + reason); + + // What should we do with the client state here? + return true; + } + else + { + // Someone else quit. We need to remove them from each group + // they are in. + //log.debug("QUIT: " + user + " quit: " + reason); + + // 1) Grab channels + Enumeration channelNames = state.getChannelNames(); + while( channelNames.hasMoreElements() ) + { + String chanName = channelNames.nextElement().toString(); + + // 2) Remove from group. + Channel channelObj = state.getChannel( chanName); + channelObj.removeMember( user, this ); + } + + return true; + } + } + +} + + |