/* * This file is part of aion-emu <aion-emu.com>. * * aion-emu is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * aion-emu is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with aion-emu. If not, see <http://www.gnu.org/licenses/>. */ package com.aionemu.loginserver.controller; import java.sql.Timestamp; import com.aionemu.commons.database.dao.DAOManager; import com.aionemu.loginserver.dao.AccountTimeDAO; import com.aionemu.loginserver.model.Account; import com.aionemu.loginserver.model.AccountTime; /** * This class is for account time controlling. * When character logins any server, it should get * its day online time and rest time. Some aion ingame * feautres also depend on player's online time * * @author EvilSpirit */ public class AccountTimeController { /** * Update account time when character logins. * The following field are being updated: * - LastLoginTime (set to CurrentTime) * - RestTime (set to (RestTime + (CurrentTime-LastLoginTime - SessionDuration)) * @param account */ public static void updateOnLogin(Account account) { AccountTime accountTime = account.getAccountTime(); /** * It seems the account was just created, so new accountTime * should be created too */ if(accountTime == null) { accountTime = new AccountTime(); } int lastLoginDay = getDays(accountTime.getLastLoginTime().getTime()); int currentDay = getDays(System.currentTimeMillis()); /** * The character from that account was online not today, so it's account timings * should be nulled. */ if(lastLoginDay < currentDay) { accountTime.setAccumulatedOnlineTime(0); accountTime.setAccumulatedRestTime(0); } else { long restTime = System.currentTimeMillis() - accountTime.getLastLoginTime().getTime() - accountTime.getSessionDuration(); accountTime.setAccumulatedRestTime(accountTime.getAccumulatedRestTime() + restTime); } accountTime.setLastLoginTime(new Timestamp(System.currentTimeMillis())); DAOManager.getDAO(AccountTimeDAO.class).updateAccountTime(account.getId(), accountTime); account.setAccountTime(accountTime); } /** * Update account time when character logouts. * The following field are being updated: * - SessionTime (set to CurrentTime - LastLoginTime) * - AccumulatedOnlineTime (set to AccumulatedOnlineTime + SessionTime) * @param account */ public static void updateOnLogout(Account account) { AccountTime accountTime = account.getAccountTime(); accountTime.setSessionDuration(System.currentTimeMillis() - accountTime.getLastLoginTime().getTime()); accountTime.setAccumulatedOnlineTime(accountTime.getAccumulatedOnlineTime() + accountTime.getSessionDuration()); DAOManager.getDAO(AccountTimeDAO.class).updateAccountTime(account.getId(), accountTime); account.setAccountTime(accountTime); } /** * Checks if account is already expired or not * @param account * @return true, if account is expired, false otherwise */ public static boolean isAccountExpired(Account account) { AccountTime accountTime = account.getAccountTime(); return accountTime != null && accountTime.getExpirationTime() != null && accountTime.getExpirationTime().getTime() < System.currentTimeMillis(); } /** * Checks if account is restricted by penalty or not * @param account * @return true, is penalty is active, false otherwise */ public static boolean isAccountPenaltyActive(Account account) { AccountTime accountTime = account.getAccountTime(); return accountTime != null && accountTime.getPenaltyEnd() != null && accountTime.getPenaltyEnd().getTime() >= System.currentTimeMillis(); } /** * Get days from time presented in milliseconds * @param millis time in ms * @return days */ public static int getDays(long millis) { return (int) (millis / 1000 / 3600 / 24); } }