/*** * 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); } }