/** (C) Game Page Network, Inc., Confidential, All Rights Reserved */
// LoginCommand.java
// --paul@gamepage.net, 29jul97

import java.util.*;

public class LoginCommand extends Command {
  LoginCommand() {
    super("login", -1, "MEMBER PASSWORD [ID [!]]",
	  "Login as MEMBER with PASSWORD.\n"+
	  "If !, first terminate any existing MEMBER session.");
    anonymous = true;
  }

  public void process(StringTokenizer args, Client c) {
    int argc = args.countTokens();
    boolean force = true;	// HACK
    if (argc<2 || argc>4) {
      c.send("? login");
      return;
    }
    String login = args.nextToken();
    String password = args.nextToken();

    // 1. Is this Client already logged in?
    Member current = c.getMember();
    if (current!=null) {
      c.send("! login "+login+": Already logged in: "+current);
      return;
    }

    // Grab encrypted Client session ID.
    int id = (args.hasMoreTokens() ? Club.atoi(args.nextToken()) : 0);
	      
    if (args.hasMoreTokens() && args.nextToken().equals("!"))
      force = true;

    // 2. Is there already another Client with this login?
    Member member = Member.findMember(login);
    if (member!=null && Member.match(login,password,id,c)) {
      Club.log(c,"login "+login+" "+force+" find="+member);
      if (!force) {
	c.send("! login "+login+": Active "+
		   member.getHostName() +" "+
		   Club.dayTime(member.getLoginAt()));
	return;
      } else {
	// Force close other login session of this member.
	Client oldClient = member.getClient();
	Table.logout(member,null); // BUG: tells logout to table
	if (oldClient!=null) {
	  oldClient.log("login close "+member);
	  oldClient.close(true);
	}
      }
    }

    // 3. Try to login this Client now.
    member = Member.login(login,password,id,c);
    Club.log(c,"login " +login +" " +(member==null ? "N " : "Y "));
    if (member==null) {
      c.send("! login invalid");
      return;
    }
    c.setMember(member);
    Thread.currentThread().setName("Client: "+member);
    c.send("last " + member+" "+Club.dayTime(member.getLastLogin()) + 
	   " " +member.getLastHost());
    Club.lobby.login(member);
  }
}

