findNextReminderTime();
	void loadData() {		String filename = dataFileName;		log("Loading " + filename);		BufferedReader dataFileReader;		try {			dataFileReader = new BufferedReader(new FileReader(new File(sephiadir, filename)));		} catch (IOException ioe) {			return;  //Assume no datafile has been created if it doesn't exist		}		try {			int messagesLoaded = 0;			int messagesThrownOut = 0;			int hostsLoadedTotal = 0;			int hostsThrownOut = 0;			int awayMsgLoaded = 0;			int awayMsgThrownOut = 0;			firstMessage = null;		//Keep messages and reminders already in memory from persisting.			firstReminder = null;lineLoop:			while (dataFileReader.ready()) {				String line = dataFileReader.readLine();				StringTokenizer tok = new StringTokenizer(line, " ");				if (line.startsWith("//") || !tok.hasMoreElements())					continue;				String command = tok.nextToken();				if (command.equals("userdata")) {					String userName = tok.nextToken().trim();					User user = getUserByName(userName);					if (user == null) {						logerror("Tried to load userdata for nonexistent user " + userName + ".");						continue;					}					String subCommand = tok.nextToken();					if (subCommand.equals("hosts")) {						int hostsLoaded = 0;						while (tok.hasMoreElements() && hostsLoaded < 10) {							user.lastSeenTimes[hostsLoaded] = System.currentTimeMillis();	//When converting from old "hosts", default to current time.							user.hosts[hostsLoaded++] = tok.nextToken(" ").trim();						}						log("Loaded " + hostsLoaded + " hosts for user " + user.userName);					} else if (subCommand.equals("host")) {						String host = tok.nextToken();						long time = Long.parseLong(tok.nextToken().trim());						if (timeInWeeks(time, System.currentTimeMillis()) >= 1) {							hostsThrownOut++;							continue;						}						for (int i = 0; i < 10; i++) {							if (user.hosts[i] == null || user.hosts[i].length() == 0) {								user.hosts[i] = host.trim();								user.lastSeenTimes[i] = time;								hostsLoadedTotal++;								continue lineLoop;							}						}						//Execution should only get here if someone manually modified the data file and included 11 hosts for some reason.						log("Ran out of userhost slots for user " + user.userName);						hostsThrownOut++;					} else if (subCommand.equals("away")) {						user.away = tok.nextToken("").trim();						awayMsgLoaded++;					} else if (subCommand.equals("leavetime")) {						user.leaveTime = Long.parseLong(tok.nextToken("").trim());					} else if (subCommand.equals("lasttalked")) {						user.lastTalked = Long.parseLong(tok.nextToken("").trim());					}				} else if (command.equals("message")) {					String nick = tok.nextToken(" ").trim();					String target = tok.nextToken(" ").trim();					long time = Long.parseLong(tok.nextToken(" ").trim());					String message = " " + tok.nextToken("").trim();					//Throw out if more then a week old.					if (timeInWeeks(time, System.currentTimeMillis()) >= 1) {						messagesThrownOut++;						continue;					} else						messagesLoaded++;					if (firstMessage == null) {						firstMessage = new Message(target, message, nick, time);					} else {						Message currMsg = firstMessage;						while (currMsg.next != null)							currMsg = currMsg.next;						currMsg.next = new Message(target, message, nick, time);					}				//vinohost, vinoaway, and vinoleavetime should not be necessary anymore. Vino's info is loaded like any other user.				// It's left in here for backwards compatibility.				} else if (command.equals("vinohost")) {					int hostsLoaded = 0;					while (tok.hasMoreElements() && hostsLoaded < 10) {						this.vino.lastSeenTimes[hostsLoaded] = System.currentTimeMillis();   //When converting from old "hosts", default to current time.						this.vino.hosts[hostsLoaded++] = tok.nextToken(" ").trim();					}					log("Loaded " + hostsLoaded + " vinohosts");				} else if (command.equals("vinoaway")) {					this.vino.away = tok.nextToken("").trim();					log("Loaded vinoaway " + this.vino.away);				} else if (command.equals("vinoleavetime")) {					this.vino.leaveTime = Long.parseLong(tok.nextToken("").trim());					log("Loaded vinoleavetime " + this.vino.leaveTime);				}			}			//TODO: Cycle through away messages and throw out old ones.						log("Messages loaded: " + messagesLoaded);			log("Messages thrown out: " + messagesThrownOut);			log("Hosts loaded: " + hostsLoadedTotal);			log("Hosts thrown out: " + hostsThrownOut);			log("Away messages loaded: " + awayMsgLoaded);			log("Away messages thrown out: " + awayMsgThrownOut);		} catch (IOException ioe) {			logerror("Couldn't read data file " + filename + ".");		}	}