/***
	 * When a player leaves the server, their join timestamp and playtime is removed to free up memory.
	 * Playtime will get stored into database if the time since his joining is more than 45 seconds
	 * to prevent database overloading when player tries to spam logins/logouts.
	 * @param e
	 */
	@EventHandler(priority = EventPriority.NORMAL)
	public void pQuit(PlayerQuitEvent e) {
		String pName = e.getPlayer().getName();
		Integer stamp = Utils.getUnixTimestamp(0L);

		// schedule player's IP removal
		CommandsEX.plugin.getServer().getScheduler().scheduleSyncDelayedTask(CommandsEX.plugin, new DelayedIpRemoval(pName), (20 * getConf().getInt("maxIPholdTime")));
		
		// save player's playtime
		if (sqlEnabled && joinTimes.containsKey(pName)) {
			Integer played = (stamp - joinTimes.get(pName));
			if (played >= minTimeToSavePlayTime) {
				// player was online for more than minTimeToSavePlayTime seconds, count this visit
				if (playTimes.containsKey(pName) && (playTimes.get(pName) > -1)) {
					// update playtime directly if we have previous time loaded
					playTimes.put(pName, (playTimes.get(pName) + played));
				} else {
					// get total playtime from database, since we don't have it loaded yet
					try {
						// first, reset the time, so we don't add to -1 later
						Integer pTime = 0;
						ResultSet res = SQLManager.query_res("SELECT seconds_played FROM " + SQLManager.prefix + "playtime WHERE player_name = ?", pName);
						while (res.next()) {
							pTime = res.getInt("seconds_played");
						}
						res.close();
						playTimes.put(pName, (pTime + played));
					} catch (Throwable ex) {
						// something went wrong...
						LogHelper.logSevere("[CommandsEX] " + _("dbTotalPlayTimeGetError", ""));
						LogHelper.logDebug("Message: " + ex.getMessage() + ", cause: " + ex.getCause());
					}
				}
				// update DB with new value
				played = playTimes.get(pName);
				SQLManager.query("INSERT "+ (SQLManager.sqlType.equals("mysql") ? "" : "OR REPLACE ") +"INTO " + SQLManager.prefix + "playtime VALUES (?, ?)"+ (SQLManager.sqlType.equals("mysql") ? " ON DUPLICATE KEY UPDATE seconds_played = VALUES(seconds_played)" : ""), pName, played);
			}
			joinTimes.remove(pName);
			playTimes.remove(pName);
		}
	}