Load premium account status on player login.

This commit is contained in:
MobiusDev
2017-11-18 22:20:23 +00:00
parent 572b8629ab
commit 0f64cdbf42
12 changed files with 150 additions and 173 deletions

View File

@@ -151,7 +151,7 @@ public class AdminPremium implements IAdminCommandHandler
if (PremiumManager.getInstance().getPremiumExpiration(accountName) > 0) if (PremiumManager.getInstance().getPremiumExpiration(accountName) > 0)
{ {
PremiumManager.getInstance().removePremiumStatus(accountName); PremiumManager.getInstance().removePremiumStatus(accountName, true);
admin.sendMessage("Account " + accountName + " has no longer premium status."); admin.sendMessage("Account " + accountName + " has no longer premium status.");
} }
else else

View File

@@ -25,7 +25,6 @@ import java.util.Map;
import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.logging.Logger;
import com.l2jmobius.commons.database.DatabaseFactory; import com.l2jmobius.commons.database.DatabaseFactory;
import com.l2jmobius.gameserver.ThreadPoolManager; import com.l2jmobius.gameserver.ThreadPoolManager;
@@ -37,19 +36,15 @@ import com.l2jmobius.gameserver.model.events.ListenersContainer;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerLogin; import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerLogin;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerLogout; import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerLogout;
import com.l2jmobius.gameserver.model.events.listeners.ConsumerEventListener; import com.l2jmobius.gameserver.model.events.listeners.ConsumerEventListener;
import com.l2jmobius.gameserver.network.serverpackets.ExBrPremiumState;
/** /**
* @author Mobius * @author Mobius
*/ */
public class PremiumManager public class PremiumManager
{ {
private static final Logger LOGGER = Logger.getLogger(PremiumManager.class.getName());
// SQL Statement // SQL Statement
private static final String LOAD_SQL = "SELECT account_name,enddate FROM account_premium"; private static final String LOAD_SQL = "SELECT account_name,enddate FROM account_premium WHERE account_name = ?";
private static final String UPDATE_SQL = "UPDATE account_premium SET enddate = ? WHERE account_name = ?"; private static final String UPDATE_SQL = "REPLACE INTO account_premium (enddate,account_name) VALUE (?,?)";
private static final String ADD_SQL = "INSERT INTO account_premium (enddate,account_name) VALUE (?,?)";
private static final String DELETE_SQL = "DELETE FROM account_premium WHERE account_name = ?"; private static final String DELETE_SQL = "DELETE FROM account_premium WHERE account_name = ?";
class PremiumExpireTask implements Runnable class PremiumExpireTask implements Runnable
@@ -65,7 +60,6 @@ public class PremiumManager
public void run() public void run()
{ {
player.setPremiumStatus(false); player.setPremiumStatus(false);
player.sendPacket(new ExBrPremiumState(player));
} }
} }
@@ -82,15 +76,19 @@ public class PremiumManager
{ {
final L2PcInstance player = event.getActiveChar(); final L2PcInstance player = event.getActiveChar();
final String accountName = player.getAccountName(); final String accountName = player.getAccountName();
loadPremiumData(accountName);
final long now = System.currentTimeMillis(); final long now = System.currentTimeMillis();
final long premiumExpiration = getPremiumExpiration(accountName); final long premiumExpiration = getPremiumExpiration(accountName);
player.setPremiumStatus(premiumExpiration > now); player.setPremiumStatus(premiumExpiration > now);
player.sendPacket(new ExBrPremiumState(player));
if (player.hasPremiumStatus()) if (player.hasPremiumStatus())
{ {
startExpireTask(player, premiumExpiration - now); startExpireTask(player, premiumExpiration - now);
} }
else
{
removePremiumStatus(accountName, false);
}
}; };
private final Consumer<OnPlayerLogout> playerLogoutEvent = (event) -> private final Consumer<OnPlayerLogout> playerLogoutEvent = (event) ->
@@ -101,7 +99,6 @@ public class PremiumManager
protected PremiumManager() protected PremiumManager()
{ {
loadPremiumData();
listenerContainer.addListener(new ConsumerEventListener(listenerContainer, EventType.ON_PLAYER_LOGIN, playerLoginEvent, this)); listenerContainer.addListener(new ConsumerEventListener(listenerContainer, EventType.ON_PLAYER_LOGIN, playerLoginEvent, this));
listenerContainer.addListener(new ConsumerEventListener(listenerContainer, EventType.ON_PLAYER_LOGOUT, playerLogoutEvent, this)); listenerContainer.addListener(new ConsumerEventListener(listenerContainer, EventType.ON_PLAYER_LOGOUT, playerLogoutEvent, this));
} }
@@ -129,24 +126,24 @@ public class PremiumManager
} }
} }
private void loadPremiumData() private void loadPremiumData(String accountName)
{ {
try (Connection con = DatabaseFactory.getInstance().getConnection(); try (Connection con = DatabaseFactory.getInstance().getConnection();
PreparedStatement statement = con.prepareStatement(LOAD_SQL); PreparedStatement stmt = con.prepareStatement(LOAD_SQL))
ResultSet rset = statement.executeQuery()) {
stmt.setString(1, accountName);
try (ResultSet rset = stmt.executeQuery())
{ {
while (rset.next()) while (rset.next())
{ {
premiumData.put(rset.getString(1), rset.getLong(2)); premiumData.put(rset.getString(1), rset.getLong(2));
} }
} }
}
catch (SQLException e) catch (SQLException e)
{ {
e.printStackTrace(); e.printStackTrace();
} }
long expiredData = premiumData.values().stream().filter(d -> d < System.currentTimeMillis()).count();
LOGGER.info(getClass().getSimpleName() + ": Loaded " + premiumData.size() + " premium data (" + expiredData + " have expired)");
} }
public long getPremiumExpiration(String accountName) public long getPremiumExpiration(String accountName)
@@ -162,11 +159,9 @@ public class PremiumManager
long oldPremiumExpiration = Math.max(now, getPremiumExpiration(accountName)); long oldPremiumExpiration = Math.max(now, getPremiumExpiration(accountName));
long newPremiumExpiration = oldPremiumExpiration + addTime; long newPremiumExpiration = oldPremiumExpiration + addTime;
String sqlCmd = premiumData.containsKey(accountName) ? UPDATE_SQL : ADD_SQL;
// UPDATE DATABASE // UPDATE DATABASE
try (Connection con = DatabaseFactory.getInstance().getConnection(); try (Connection con = DatabaseFactory.getInstance().getConnection();
PreparedStatement stmt = con.prepareStatement(sqlCmd)) PreparedStatement stmt = con.prepareStatement(UPDATE_SQL))
{ {
stmt.setLong(1, newPremiumExpiration); stmt.setLong(1, newPremiumExpiration);
stmt.setString(2, accountName); stmt.setString(2, accountName);
@@ -190,20 +185,21 @@ public class PremiumManager
if (!playerOnline.hasPremiumStatus()) if (!playerOnline.hasPremiumStatus())
{ {
playerOnline.setPremiumStatus(true); playerOnline.setPremiumStatus(true);
playerOnline.sendPacket(new ExBrPremiumState(playerOnline));
} }
} }
} }
public void removePremiumStatus(String accountName) public void removePremiumStatus(String accountName, boolean checkOnline)
{
if (checkOnline)
{ {
L2PcInstance playerOnline = L2World.getInstance().getPlayers().stream().filter(p -> accountName.equals(p.getAccountName())).findFirst().orElse(null); L2PcInstance playerOnline = L2World.getInstance().getPlayers().stream().filter(p -> accountName.equals(p.getAccountName())).findFirst().orElse(null);
if ((playerOnline != null) && playerOnline.hasPremiumStatus()) if ((playerOnline != null) && playerOnline.hasPremiumStatus())
{ {
playerOnline.setPremiumStatus(false); playerOnline.setPremiumStatus(false);
playerOnline.sendPacket(new ExBrPremiumState(playerOnline));
stopExpireTask(playerOnline); stopExpireTask(playerOnline);
} }
}
// UPDATE CACHE // UPDATE CACHE
premiumData.remove(accountName); premiumData.remove(accountName);

View File

@@ -151,7 +151,7 @@ public class AdminPremium implements IAdminCommandHandler
if (PremiumManager.getInstance().getPremiumExpiration(accountName) > 0) if (PremiumManager.getInstance().getPremiumExpiration(accountName) > 0)
{ {
PremiumManager.getInstance().removePremiumStatus(accountName); PremiumManager.getInstance().removePremiumStatus(accountName, true);
admin.sendMessage("Account " + accountName + " has no longer premium status."); admin.sendMessage("Account " + accountName + " has no longer premium status.");
} }
else else

View File

@@ -25,7 +25,6 @@ import java.util.Map;
import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.logging.Logger;
import com.l2jmobius.commons.database.DatabaseFactory; import com.l2jmobius.commons.database.DatabaseFactory;
import com.l2jmobius.gameserver.ThreadPoolManager; import com.l2jmobius.gameserver.ThreadPoolManager;
@@ -37,19 +36,15 @@ import com.l2jmobius.gameserver.model.events.ListenersContainer;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerLogin; import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerLogin;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerLogout; import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerLogout;
import com.l2jmobius.gameserver.model.events.listeners.ConsumerEventListener; import com.l2jmobius.gameserver.model.events.listeners.ConsumerEventListener;
import com.l2jmobius.gameserver.network.serverpackets.ExBrPremiumState;
/** /**
* @author Mobius * @author Mobius
*/ */
public class PremiumManager public class PremiumManager
{ {
private static final Logger LOGGER = Logger.getLogger(PremiumManager.class.getName());
// SQL Statement // SQL Statement
private static final String LOAD_SQL = "SELECT account_name,enddate FROM account_premium"; private static final String LOAD_SQL = "SELECT account_name,enddate FROM account_premium WHERE account_name = ?";
private static final String UPDATE_SQL = "UPDATE account_premium SET enddate = ? WHERE account_name = ?"; private static final String UPDATE_SQL = "REPLACE INTO account_premium (enddate,account_name) VALUE (?,?)";
private static final String ADD_SQL = "INSERT INTO account_premium (enddate,account_name) VALUE (?,?)";
private static final String DELETE_SQL = "DELETE FROM account_premium WHERE account_name = ?"; private static final String DELETE_SQL = "DELETE FROM account_premium WHERE account_name = ?";
class PremiumExpireTask implements Runnable class PremiumExpireTask implements Runnable
@@ -65,7 +60,6 @@ public class PremiumManager
public void run() public void run()
{ {
player.setPremiumStatus(false); player.setPremiumStatus(false);
player.sendPacket(new ExBrPremiumState(player));
} }
} }
@@ -82,15 +76,19 @@ public class PremiumManager
{ {
final L2PcInstance player = event.getActiveChar(); final L2PcInstance player = event.getActiveChar();
final String accountName = player.getAccountName(); final String accountName = player.getAccountName();
loadPremiumData(accountName);
final long now = System.currentTimeMillis(); final long now = System.currentTimeMillis();
final long premiumExpiration = getPremiumExpiration(accountName); final long premiumExpiration = getPremiumExpiration(accountName);
player.setPremiumStatus(premiumExpiration > now); player.setPremiumStatus(premiumExpiration > now);
player.sendPacket(new ExBrPremiumState(player));
if (player.hasPremiumStatus()) if (player.hasPremiumStatus())
{ {
startExpireTask(player, premiumExpiration - now); startExpireTask(player, premiumExpiration - now);
} }
else
{
removePremiumStatus(accountName, false);
}
}; };
private final Consumer<OnPlayerLogout> playerLogoutEvent = (event) -> private final Consumer<OnPlayerLogout> playerLogoutEvent = (event) ->
@@ -101,7 +99,6 @@ public class PremiumManager
protected PremiumManager() protected PremiumManager()
{ {
loadPremiumData();
listenerContainer.addListener(new ConsumerEventListener(listenerContainer, EventType.ON_PLAYER_LOGIN, playerLoginEvent, this)); listenerContainer.addListener(new ConsumerEventListener(listenerContainer, EventType.ON_PLAYER_LOGIN, playerLoginEvent, this));
listenerContainer.addListener(new ConsumerEventListener(listenerContainer, EventType.ON_PLAYER_LOGOUT, playerLogoutEvent, this)); listenerContainer.addListener(new ConsumerEventListener(listenerContainer, EventType.ON_PLAYER_LOGOUT, playerLogoutEvent, this));
} }
@@ -129,24 +126,24 @@ public class PremiumManager
} }
} }
private void loadPremiumData() private void loadPremiumData(String accountName)
{ {
try (Connection con = DatabaseFactory.getInstance().getConnection(); try (Connection con = DatabaseFactory.getInstance().getConnection();
PreparedStatement statement = con.prepareStatement(LOAD_SQL); PreparedStatement stmt = con.prepareStatement(LOAD_SQL))
ResultSet rset = statement.executeQuery()) {
stmt.setString(1, accountName);
try (ResultSet rset = stmt.executeQuery())
{ {
while (rset.next()) while (rset.next())
{ {
premiumData.put(rset.getString(1), rset.getLong(2)); premiumData.put(rset.getString(1), rset.getLong(2));
} }
} }
}
catch (SQLException e) catch (SQLException e)
{ {
e.printStackTrace(); e.printStackTrace();
} }
long expiredData = premiumData.values().stream().filter(d -> d < System.currentTimeMillis()).count();
LOGGER.info(getClass().getSimpleName() + ": Loaded " + premiumData.size() + " premium data (" + expiredData + " have expired)");
} }
public long getPremiumExpiration(String accountName) public long getPremiumExpiration(String accountName)
@@ -162,11 +159,9 @@ public class PremiumManager
long oldPremiumExpiration = Math.max(now, getPremiumExpiration(accountName)); long oldPremiumExpiration = Math.max(now, getPremiumExpiration(accountName));
long newPremiumExpiration = oldPremiumExpiration + addTime; long newPremiumExpiration = oldPremiumExpiration + addTime;
String sqlCmd = premiumData.containsKey(accountName) ? UPDATE_SQL : ADD_SQL;
// UPDATE DATABASE // UPDATE DATABASE
try (Connection con = DatabaseFactory.getInstance().getConnection(); try (Connection con = DatabaseFactory.getInstance().getConnection();
PreparedStatement stmt = con.prepareStatement(sqlCmd)) PreparedStatement stmt = con.prepareStatement(UPDATE_SQL))
{ {
stmt.setLong(1, newPremiumExpiration); stmt.setLong(1, newPremiumExpiration);
stmt.setString(2, accountName); stmt.setString(2, accountName);
@@ -190,20 +185,21 @@ public class PremiumManager
if (!playerOnline.hasPremiumStatus()) if (!playerOnline.hasPremiumStatus())
{ {
playerOnline.setPremiumStatus(true); playerOnline.setPremiumStatus(true);
playerOnline.sendPacket(new ExBrPremiumState(playerOnline));
} }
} }
} }
public void removePremiumStatus(String accountName) public void removePremiumStatus(String accountName, boolean checkOnline)
{
if (checkOnline)
{ {
L2PcInstance playerOnline = L2World.getInstance().getPlayers().stream().filter(p -> accountName.equals(p.getAccountName())).findFirst().orElse(null); L2PcInstance playerOnline = L2World.getInstance().getPlayers().stream().filter(p -> accountName.equals(p.getAccountName())).findFirst().orElse(null);
if ((playerOnline != null) && playerOnline.hasPremiumStatus()) if ((playerOnline != null) && playerOnline.hasPremiumStatus())
{ {
playerOnline.setPremiumStatus(false); playerOnline.setPremiumStatus(false);
playerOnline.sendPacket(new ExBrPremiumState(playerOnline));
stopExpireTask(playerOnline); stopExpireTask(playerOnline);
} }
}
// UPDATE CACHE // UPDATE CACHE
premiumData.remove(accountName); premiumData.remove(accountName);

View File

@@ -151,7 +151,7 @@ public class AdminPremium implements IAdminCommandHandler
if (PremiumManager.getInstance().getPremiumExpiration(accountName) > 0) if (PremiumManager.getInstance().getPremiumExpiration(accountName) > 0)
{ {
PremiumManager.getInstance().removePremiumStatus(accountName); PremiumManager.getInstance().removePremiumStatus(accountName, true);
admin.sendMessage("Account " + accountName + " has no longer premium status."); admin.sendMessage("Account " + accountName + " has no longer premium status.");
} }
else else

View File

@@ -25,7 +25,6 @@ import java.util.Map;
import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.logging.Logger;
import com.l2jmobius.commons.database.DatabaseFactory; import com.l2jmobius.commons.database.DatabaseFactory;
import com.l2jmobius.gameserver.ThreadPoolManager; import com.l2jmobius.gameserver.ThreadPoolManager;
@@ -37,19 +36,15 @@ import com.l2jmobius.gameserver.model.events.ListenersContainer;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerLogin; import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerLogin;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerLogout; import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerLogout;
import com.l2jmobius.gameserver.model.events.listeners.ConsumerEventListener; import com.l2jmobius.gameserver.model.events.listeners.ConsumerEventListener;
import com.l2jmobius.gameserver.network.serverpackets.ExBrPremiumState;
/** /**
* @author Mobius * @author Mobius
*/ */
public class PremiumManager public class PremiumManager
{ {
private static final Logger LOGGER = Logger.getLogger(PremiumManager.class.getName());
// SQL Statement // SQL Statement
private static final String LOAD_SQL = "SELECT account_name,enddate FROM account_premium"; private static final String LOAD_SQL = "SELECT account_name,enddate FROM account_premium WHERE account_name = ?";
private static final String UPDATE_SQL = "UPDATE account_premium SET enddate = ? WHERE account_name = ?"; private static final String UPDATE_SQL = "REPLACE INTO account_premium (enddate,account_name) VALUE (?,?)";
private static final String ADD_SQL = "INSERT INTO account_premium (enddate,account_name) VALUE (?,?)";
private static final String DELETE_SQL = "DELETE FROM account_premium WHERE account_name = ?"; private static final String DELETE_SQL = "DELETE FROM account_premium WHERE account_name = ?";
class PremiumExpireTask implements Runnable class PremiumExpireTask implements Runnable
@@ -65,7 +60,6 @@ public class PremiumManager
public void run() public void run()
{ {
player.setPremiumStatus(false); player.setPremiumStatus(false);
player.sendPacket(new ExBrPremiumState(player));
} }
} }
@@ -82,15 +76,19 @@ public class PremiumManager
{ {
final L2PcInstance player = event.getActiveChar(); final L2PcInstance player = event.getActiveChar();
final String accountName = player.getAccountName(); final String accountName = player.getAccountName();
loadPremiumData(accountName);
final long now = System.currentTimeMillis(); final long now = System.currentTimeMillis();
final long premiumExpiration = getPremiumExpiration(accountName); final long premiumExpiration = getPremiumExpiration(accountName);
player.setPremiumStatus(premiumExpiration > now); player.setPremiumStatus(premiumExpiration > now);
player.sendPacket(new ExBrPremiumState(player));
if (player.hasPremiumStatus()) if (player.hasPremiumStatus())
{ {
startExpireTask(player, premiumExpiration - now); startExpireTask(player, premiumExpiration - now);
} }
else
{
removePremiumStatus(accountName, false);
}
}; };
private final Consumer<OnPlayerLogout> playerLogoutEvent = (event) -> private final Consumer<OnPlayerLogout> playerLogoutEvent = (event) ->
@@ -101,7 +99,6 @@ public class PremiumManager
protected PremiumManager() protected PremiumManager()
{ {
loadPremiumData();
listenerContainer.addListener(new ConsumerEventListener(listenerContainer, EventType.ON_PLAYER_LOGIN, playerLoginEvent, this)); listenerContainer.addListener(new ConsumerEventListener(listenerContainer, EventType.ON_PLAYER_LOGIN, playerLoginEvent, this));
listenerContainer.addListener(new ConsumerEventListener(listenerContainer, EventType.ON_PLAYER_LOGOUT, playerLogoutEvent, this)); listenerContainer.addListener(new ConsumerEventListener(listenerContainer, EventType.ON_PLAYER_LOGOUT, playerLogoutEvent, this));
} }
@@ -129,24 +126,24 @@ public class PremiumManager
} }
} }
private void loadPremiumData() private void loadPremiumData(String accountName)
{ {
try (Connection con = DatabaseFactory.getInstance().getConnection(); try (Connection con = DatabaseFactory.getInstance().getConnection();
PreparedStatement statement = con.prepareStatement(LOAD_SQL); PreparedStatement stmt = con.prepareStatement(LOAD_SQL))
ResultSet rset = statement.executeQuery()) {
stmt.setString(1, accountName);
try (ResultSet rset = stmt.executeQuery())
{ {
while (rset.next()) while (rset.next())
{ {
premiumData.put(rset.getString(1), rset.getLong(2)); premiumData.put(rset.getString(1), rset.getLong(2));
} }
} }
}
catch (SQLException e) catch (SQLException e)
{ {
e.printStackTrace(); e.printStackTrace();
} }
long expiredData = premiumData.values().stream().filter(d -> d < System.currentTimeMillis()).count();
LOGGER.info(getClass().getSimpleName() + ": Loaded " + premiumData.size() + " premium data (" + expiredData + " have expired)");
} }
public long getPremiumExpiration(String accountName) public long getPremiumExpiration(String accountName)
@@ -162,11 +159,9 @@ public class PremiumManager
long oldPremiumExpiration = Math.max(now, getPremiumExpiration(accountName)); long oldPremiumExpiration = Math.max(now, getPremiumExpiration(accountName));
long newPremiumExpiration = oldPremiumExpiration + addTime; long newPremiumExpiration = oldPremiumExpiration + addTime;
String sqlCmd = premiumData.containsKey(accountName) ? UPDATE_SQL : ADD_SQL;
// UPDATE DATABASE // UPDATE DATABASE
try (Connection con = DatabaseFactory.getInstance().getConnection(); try (Connection con = DatabaseFactory.getInstance().getConnection();
PreparedStatement stmt = con.prepareStatement(sqlCmd)) PreparedStatement stmt = con.prepareStatement(UPDATE_SQL))
{ {
stmt.setLong(1, newPremiumExpiration); stmt.setLong(1, newPremiumExpiration);
stmt.setString(2, accountName); stmt.setString(2, accountName);
@@ -190,20 +185,21 @@ public class PremiumManager
if (!playerOnline.hasPremiumStatus()) if (!playerOnline.hasPremiumStatus())
{ {
playerOnline.setPremiumStatus(true); playerOnline.setPremiumStatus(true);
playerOnline.sendPacket(new ExBrPremiumState(playerOnline));
} }
} }
} }
public void removePremiumStatus(String accountName) public void removePremiumStatus(String accountName, boolean checkOnline)
{
if (checkOnline)
{ {
L2PcInstance playerOnline = L2World.getInstance().getPlayers().stream().filter(p -> accountName.equals(p.getAccountName())).findFirst().orElse(null); L2PcInstance playerOnline = L2World.getInstance().getPlayers().stream().filter(p -> accountName.equals(p.getAccountName())).findFirst().orElse(null);
if ((playerOnline != null) && playerOnline.hasPremiumStatus()) if ((playerOnline != null) && playerOnline.hasPremiumStatus())
{ {
playerOnline.setPremiumStatus(false); playerOnline.setPremiumStatus(false);
playerOnline.sendPacket(new ExBrPremiumState(playerOnline));
stopExpireTask(playerOnline); stopExpireTask(playerOnline);
} }
}
// UPDATE CACHE // UPDATE CACHE
premiumData.remove(accountName); premiumData.remove(accountName);

View File

@@ -151,7 +151,7 @@ public class AdminPremium implements IAdminCommandHandler
if (PremiumManager.getInstance().getPremiumExpiration(accountName) > 0) if (PremiumManager.getInstance().getPremiumExpiration(accountName) > 0)
{ {
PremiumManager.getInstance().removePremiumStatus(accountName); PremiumManager.getInstance().removePremiumStatus(accountName, true);
admin.sendMessage("Account " + accountName + " has no longer premium status."); admin.sendMessage("Account " + accountName + " has no longer premium status.");
} }
else else

View File

@@ -25,7 +25,6 @@ import java.util.Map;
import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.logging.Logger;
import com.l2jmobius.commons.database.DatabaseFactory; import com.l2jmobius.commons.database.DatabaseFactory;
import com.l2jmobius.gameserver.ThreadPoolManager; import com.l2jmobius.gameserver.ThreadPoolManager;
@@ -37,19 +36,15 @@ import com.l2jmobius.gameserver.model.events.ListenersContainer;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerLogin; import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerLogin;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerLogout; import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerLogout;
import com.l2jmobius.gameserver.model.events.listeners.ConsumerEventListener; import com.l2jmobius.gameserver.model.events.listeners.ConsumerEventListener;
import com.l2jmobius.gameserver.network.serverpackets.ExBrPremiumState;
/** /**
* @author Mobius * @author Mobius
*/ */
public class PremiumManager public class PremiumManager
{ {
private static final Logger LOGGER = Logger.getLogger(PremiumManager.class.getName());
// SQL Statement // SQL Statement
private static final String LOAD_SQL = "SELECT account_name,enddate FROM account_premium"; private static final String LOAD_SQL = "SELECT account_name,enddate FROM account_premium WHERE account_name = ?";
private static final String UPDATE_SQL = "UPDATE account_premium SET enddate = ? WHERE account_name = ?"; private static final String UPDATE_SQL = "REPLACE INTO account_premium (enddate,account_name) VALUE (?,?)";
private static final String ADD_SQL = "INSERT INTO account_premium (enddate,account_name) VALUE (?,?)";
private static final String DELETE_SQL = "DELETE FROM account_premium WHERE account_name = ?"; private static final String DELETE_SQL = "DELETE FROM account_premium WHERE account_name = ?";
class PremiumExpireTask implements Runnable class PremiumExpireTask implements Runnable
@@ -65,7 +60,6 @@ public class PremiumManager
public void run() public void run()
{ {
player.setPremiumStatus(false); player.setPremiumStatus(false);
player.sendPacket(new ExBrPremiumState(player));
} }
} }
@@ -82,15 +76,19 @@ public class PremiumManager
{ {
final L2PcInstance player = event.getActiveChar(); final L2PcInstance player = event.getActiveChar();
final String accountName = player.getAccountName(); final String accountName = player.getAccountName();
loadPremiumData(accountName);
final long now = System.currentTimeMillis(); final long now = System.currentTimeMillis();
final long premiumExpiration = getPremiumExpiration(accountName); final long premiumExpiration = getPremiumExpiration(accountName);
player.setPremiumStatus(premiumExpiration > now); player.setPremiumStatus(premiumExpiration > now);
player.sendPacket(new ExBrPremiumState(player));
if (player.hasPremiumStatus()) if (player.hasPremiumStatus())
{ {
startExpireTask(player, premiumExpiration - now); startExpireTask(player, premiumExpiration - now);
} }
else
{
removePremiumStatus(accountName, false);
}
}; };
private final Consumer<OnPlayerLogout> playerLogoutEvent = (event) -> private final Consumer<OnPlayerLogout> playerLogoutEvent = (event) ->
@@ -101,7 +99,6 @@ public class PremiumManager
protected PremiumManager() protected PremiumManager()
{ {
loadPremiumData();
listenerContainer.addListener(new ConsumerEventListener(listenerContainer, EventType.ON_PLAYER_LOGIN, playerLoginEvent, this)); listenerContainer.addListener(new ConsumerEventListener(listenerContainer, EventType.ON_PLAYER_LOGIN, playerLoginEvent, this));
listenerContainer.addListener(new ConsumerEventListener(listenerContainer, EventType.ON_PLAYER_LOGOUT, playerLogoutEvent, this)); listenerContainer.addListener(new ConsumerEventListener(listenerContainer, EventType.ON_PLAYER_LOGOUT, playerLogoutEvent, this));
} }
@@ -129,24 +126,24 @@ public class PremiumManager
} }
} }
private void loadPremiumData() private void loadPremiumData(String accountName)
{ {
try (Connection con = DatabaseFactory.getInstance().getConnection(); try (Connection con = DatabaseFactory.getInstance().getConnection();
PreparedStatement statement = con.prepareStatement(LOAD_SQL); PreparedStatement stmt = con.prepareStatement(LOAD_SQL))
ResultSet rset = statement.executeQuery()) {
stmt.setString(1, accountName);
try (ResultSet rset = stmt.executeQuery())
{ {
while (rset.next()) while (rset.next())
{ {
premiumData.put(rset.getString(1), rset.getLong(2)); premiumData.put(rset.getString(1), rset.getLong(2));
} }
} }
}
catch (SQLException e) catch (SQLException e)
{ {
e.printStackTrace(); e.printStackTrace();
} }
long expiredData = premiumData.values().stream().filter(d -> d < System.currentTimeMillis()).count();
LOGGER.info(getClass().getSimpleName() + ": Loaded " + premiumData.size() + " premium data (" + expiredData + " have expired)");
} }
public long getPremiumExpiration(String accountName) public long getPremiumExpiration(String accountName)
@@ -162,11 +159,9 @@ public class PremiumManager
long oldPremiumExpiration = Math.max(now, getPremiumExpiration(accountName)); long oldPremiumExpiration = Math.max(now, getPremiumExpiration(accountName));
long newPremiumExpiration = oldPremiumExpiration + addTime; long newPremiumExpiration = oldPremiumExpiration + addTime;
String sqlCmd = premiumData.containsKey(accountName) ? UPDATE_SQL : ADD_SQL;
// UPDATE DATABASE // UPDATE DATABASE
try (Connection con = DatabaseFactory.getInstance().getConnection(); try (Connection con = DatabaseFactory.getInstance().getConnection();
PreparedStatement stmt = con.prepareStatement(sqlCmd)) PreparedStatement stmt = con.prepareStatement(UPDATE_SQL))
{ {
stmt.setLong(1, newPremiumExpiration); stmt.setLong(1, newPremiumExpiration);
stmt.setString(2, accountName); stmt.setString(2, accountName);
@@ -190,20 +185,21 @@ public class PremiumManager
if (!playerOnline.hasPremiumStatus()) if (!playerOnline.hasPremiumStatus())
{ {
playerOnline.setPremiumStatus(true); playerOnline.setPremiumStatus(true);
playerOnline.sendPacket(new ExBrPremiumState(playerOnline));
} }
} }
} }
public void removePremiumStatus(String accountName) public void removePremiumStatus(String accountName, boolean checkOnline)
{
if (checkOnline)
{ {
L2PcInstance playerOnline = L2World.getInstance().getPlayers().stream().filter(p -> accountName.equals(p.getAccountName())).findFirst().orElse(null); L2PcInstance playerOnline = L2World.getInstance().getPlayers().stream().filter(p -> accountName.equals(p.getAccountName())).findFirst().orElse(null);
if ((playerOnline != null) && playerOnline.hasPremiumStatus()) if ((playerOnline != null) && playerOnline.hasPremiumStatus())
{ {
playerOnline.setPremiumStatus(false); playerOnline.setPremiumStatus(false);
playerOnline.sendPacket(new ExBrPremiumState(playerOnline));
stopExpireTask(playerOnline); stopExpireTask(playerOnline);
} }
}
// UPDATE CACHE // UPDATE CACHE
premiumData.remove(accountName); premiumData.remove(accountName);

View File

@@ -151,7 +151,7 @@ public class AdminPremium implements IAdminCommandHandler
if (PremiumManager.getInstance().getPremiumExpiration(accountName) > 0) if (PremiumManager.getInstance().getPremiumExpiration(accountName) > 0)
{ {
PremiumManager.getInstance().removePremiumStatus(accountName); PremiumManager.getInstance().removePremiumStatus(accountName, true);
admin.sendMessage("Account " + accountName + " has no longer premium status."); admin.sendMessage("Account " + accountName + " has no longer premium status.");
} }
else else

View File

@@ -25,7 +25,6 @@ import java.util.Map;
import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.logging.Logger;
import com.l2jmobius.commons.database.DatabaseFactory; import com.l2jmobius.commons.database.DatabaseFactory;
import com.l2jmobius.gameserver.ThreadPoolManager; import com.l2jmobius.gameserver.ThreadPoolManager;
@@ -43,12 +42,9 @@ import com.l2jmobius.gameserver.model.events.listeners.ConsumerEventListener;
*/ */
public class PremiumManager public class PremiumManager
{ {
private static final Logger LOGGER = Logger.getLogger(PremiumManager.class.getName());
// SQL Statement // SQL Statement
private static final String LOAD_SQL = "SELECT account_name,enddate FROM account_premium"; private static final String LOAD_SQL = "SELECT account_name,enddate FROM account_premium WHERE account_name = ?";
private static final String UPDATE_SQL = "UPDATE account_premium SET enddate = ? WHERE account_name = ?"; private static final String UPDATE_SQL = "REPLACE INTO account_premium (enddate,account_name) VALUE (?,?)";
private static final String ADD_SQL = "INSERT INTO account_premium (enddate,account_name) VALUE (?,?)";
private static final String DELETE_SQL = "DELETE FROM account_premium WHERE account_name = ?"; private static final String DELETE_SQL = "DELETE FROM account_premium WHERE account_name = ?";
class PremiumExpireTask implements Runnable class PremiumExpireTask implements Runnable
@@ -64,7 +60,6 @@ public class PremiumManager
public void run() public void run()
{ {
player.setPremiumStatus(false); player.setPremiumStatus(false);
// player.sendPacket(new ExBrPremiumState(player));
} }
} }
@@ -81,15 +76,19 @@ public class PremiumManager
{ {
final L2PcInstance player = event.getActiveChar(); final L2PcInstance player = event.getActiveChar();
final String accountName = player.getAccountName(); final String accountName = player.getAccountName();
loadPremiumData(accountName);
final long now = System.currentTimeMillis(); final long now = System.currentTimeMillis();
final long premiumExpiration = getPremiumExpiration(accountName); final long premiumExpiration = getPremiumExpiration(accountName);
player.setPremiumStatus(premiumExpiration > now); player.setPremiumStatus(premiumExpiration > now);
// player.sendPacket(new ExBrPremiumState(player));
if (player.hasPremiumStatus()) if (player.hasPremiumStatus())
{ {
startExpireTask(player, premiumExpiration - now); startExpireTask(player, premiumExpiration - now);
} }
else
{
removePremiumStatus(accountName, false);
}
}; };
private final Consumer<OnPlayerLogout> playerLogoutEvent = (event) -> private final Consumer<OnPlayerLogout> playerLogoutEvent = (event) ->
@@ -100,7 +99,6 @@ public class PremiumManager
protected PremiumManager() protected PremiumManager()
{ {
loadPremiumData();
listenerContainer.addListener(new ConsumerEventListener(listenerContainer, EventType.ON_PLAYER_LOGIN, playerLoginEvent, this)); listenerContainer.addListener(new ConsumerEventListener(listenerContainer, EventType.ON_PLAYER_LOGIN, playerLoginEvent, this));
listenerContainer.addListener(new ConsumerEventListener(listenerContainer, EventType.ON_PLAYER_LOGOUT, playerLogoutEvent, this)); listenerContainer.addListener(new ConsumerEventListener(listenerContainer, EventType.ON_PLAYER_LOGOUT, playerLogoutEvent, this));
} }
@@ -128,24 +126,24 @@ public class PremiumManager
} }
} }
private void loadPremiumData() private void loadPremiumData(String accountName)
{ {
try (Connection con = DatabaseFactory.getInstance().getConnection(); try (Connection con = DatabaseFactory.getInstance().getConnection();
PreparedStatement statement = con.prepareStatement(LOAD_SQL); PreparedStatement stmt = con.prepareStatement(LOAD_SQL))
ResultSet rset = statement.executeQuery()) {
stmt.setString(1, accountName);
try (ResultSet rset = stmt.executeQuery())
{ {
while (rset.next()) while (rset.next())
{ {
premiumData.put(rset.getString(1), rset.getLong(2)); premiumData.put(rset.getString(1), rset.getLong(2));
} }
} }
}
catch (SQLException e) catch (SQLException e)
{ {
e.printStackTrace(); e.printStackTrace();
} }
long expiredData = premiumData.values().stream().filter(d -> d < System.currentTimeMillis()).count();
LOGGER.info(getClass().getSimpleName() + ": Loaded " + premiumData.size() + " premium data (" + expiredData + " have expired)");
} }
public long getPremiumExpiration(String accountName) public long getPremiumExpiration(String accountName)
@@ -161,11 +159,9 @@ public class PremiumManager
long oldPremiumExpiration = Math.max(now, getPremiumExpiration(accountName)); long oldPremiumExpiration = Math.max(now, getPremiumExpiration(accountName));
long newPremiumExpiration = oldPremiumExpiration + addTime; long newPremiumExpiration = oldPremiumExpiration + addTime;
String sqlCmd = premiumData.containsKey(accountName) ? UPDATE_SQL : ADD_SQL;
// UPDATE DATABASE // UPDATE DATABASE
try (Connection con = DatabaseFactory.getInstance().getConnection(); try (Connection con = DatabaseFactory.getInstance().getConnection();
PreparedStatement stmt = con.prepareStatement(sqlCmd)) PreparedStatement stmt = con.prepareStatement(UPDATE_SQL))
{ {
stmt.setLong(1, newPremiumExpiration); stmt.setLong(1, newPremiumExpiration);
stmt.setString(2, accountName); stmt.setString(2, accountName);
@@ -189,20 +185,21 @@ public class PremiumManager
if (!playerOnline.hasPremiumStatus()) if (!playerOnline.hasPremiumStatus())
{ {
playerOnline.setPremiumStatus(true); playerOnline.setPremiumStatus(true);
// playerOnline.sendPacket(new ExBrPremiumState(playerOnline));
} }
} }
} }
public void removePremiumStatus(String accountName) public void removePremiumStatus(String accountName, boolean checkOnline)
{
if (checkOnline)
{ {
L2PcInstance playerOnline = L2World.getInstance().getPlayers().stream().filter(p -> accountName.equals(p.getAccountName())).findFirst().orElse(null); L2PcInstance playerOnline = L2World.getInstance().getPlayers().stream().filter(p -> accountName.equals(p.getAccountName())).findFirst().orElse(null);
if ((playerOnline != null) && playerOnline.hasPremiumStatus()) if ((playerOnline != null) && playerOnline.hasPremiumStatus())
{ {
playerOnline.setPremiumStatus(false); playerOnline.setPremiumStatus(false);
// playerOnline.sendPacket(new ExBrPremiumState(playerOnline));
stopExpireTask(playerOnline); stopExpireTask(playerOnline);
} }
}
// UPDATE CACHE // UPDATE CACHE
premiumData.remove(accountName); premiumData.remove(accountName);

View File

@@ -151,7 +151,7 @@ public class AdminPremium implements IAdminCommandHandler
if (PremiumManager.getInstance().getPremiumExpiration(accountName) > 0) if (PremiumManager.getInstance().getPremiumExpiration(accountName) > 0)
{ {
PremiumManager.getInstance().removePremiumStatus(accountName); PremiumManager.getInstance().removePremiumStatus(accountName, true);
admin.sendMessage("Account " + accountName + " has no longer premium status."); admin.sendMessage("Account " + accountName + " has no longer premium status.");
} }
else else

View File

@@ -25,7 +25,6 @@ import java.util.Map;
import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.logging.Logger;
import com.l2jmobius.commons.database.DatabaseFactory; import com.l2jmobius.commons.database.DatabaseFactory;
import com.l2jmobius.gameserver.ThreadPoolManager; import com.l2jmobius.gameserver.ThreadPoolManager;
@@ -37,19 +36,15 @@ import com.l2jmobius.gameserver.model.events.ListenersContainer;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerLogin; import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerLogin;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerLogout; import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerLogout;
import com.l2jmobius.gameserver.model.events.listeners.ConsumerEventListener; import com.l2jmobius.gameserver.model.events.listeners.ConsumerEventListener;
import com.l2jmobius.gameserver.network.serverpackets.ExBrPremiumState;
/** /**
* @author Mobius * @author Mobius
*/ */
public class PremiumManager public class PremiumManager
{ {
private static final Logger LOGGER = Logger.getLogger(PremiumManager.class.getName());
// SQL Statement // SQL Statement
private static final String LOAD_SQL = "SELECT account_name,enddate FROM account_premium"; private static final String LOAD_SQL = "SELECT account_name,enddate FROM account_premium WHERE account_name = ?";
private static final String UPDATE_SQL = "UPDATE account_premium SET enddate = ? WHERE account_name = ?"; private static final String UPDATE_SQL = "REPLACE INTO account_premium (enddate,account_name) VALUE (?,?)";
private static final String ADD_SQL = "INSERT INTO account_premium (enddate,account_name) VALUE (?,?)";
private static final String DELETE_SQL = "DELETE FROM account_premium WHERE account_name = ?"; private static final String DELETE_SQL = "DELETE FROM account_premium WHERE account_name = ?";
class PremiumExpireTask implements Runnable class PremiumExpireTask implements Runnable
@@ -65,7 +60,6 @@ public class PremiumManager
public void run() public void run()
{ {
player.setPremiumStatus(false); player.setPremiumStatus(false);
player.sendPacket(new ExBrPremiumState(player));
} }
} }
@@ -82,15 +76,19 @@ public class PremiumManager
{ {
final L2PcInstance player = event.getActiveChar(); final L2PcInstance player = event.getActiveChar();
final String accountName = player.getAccountName(); final String accountName = player.getAccountName();
loadPremiumData(accountName);
final long now = System.currentTimeMillis(); final long now = System.currentTimeMillis();
final long premiumExpiration = getPremiumExpiration(accountName); final long premiumExpiration = getPremiumExpiration(accountName);
player.setPremiumStatus(premiumExpiration > now); player.setPremiumStatus(premiumExpiration > now);
player.sendPacket(new ExBrPremiumState(player));
if (player.hasPremiumStatus()) if (player.hasPremiumStatus())
{ {
startExpireTask(player, premiumExpiration - now); startExpireTask(player, premiumExpiration - now);
} }
else
{
removePremiumStatus(accountName, false);
}
}; };
private final Consumer<OnPlayerLogout> playerLogoutEvent = (event) -> private final Consumer<OnPlayerLogout> playerLogoutEvent = (event) ->
@@ -101,7 +99,6 @@ public class PremiumManager
protected PremiumManager() protected PremiumManager()
{ {
loadPremiumData();
listenerContainer.addListener(new ConsumerEventListener(listenerContainer, EventType.ON_PLAYER_LOGIN, playerLoginEvent, this)); listenerContainer.addListener(new ConsumerEventListener(listenerContainer, EventType.ON_PLAYER_LOGIN, playerLoginEvent, this));
listenerContainer.addListener(new ConsumerEventListener(listenerContainer, EventType.ON_PLAYER_LOGOUT, playerLogoutEvent, this)); listenerContainer.addListener(new ConsumerEventListener(listenerContainer, EventType.ON_PLAYER_LOGOUT, playerLogoutEvent, this));
} }
@@ -129,24 +126,24 @@ public class PremiumManager
} }
} }
private void loadPremiumData() private void loadPremiumData(String accountName)
{ {
try (Connection con = DatabaseFactory.getInstance().getConnection(); try (Connection con = DatabaseFactory.getInstance().getConnection();
PreparedStatement statement = con.prepareStatement(LOAD_SQL); PreparedStatement stmt = con.prepareStatement(LOAD_SQL))
ResultSet rset = statement.executeQuery()) {
stmt.setString(1, accountName);
try (ResultSet rset = stmt.executeQuery())
{ {
while (rset.next()) while (rset.next())
{ {
premiumData.put(rset.getString(1), rset.getLong(2)); premiumData.put(rset.getString(1), rset.getLong(2));
} }
} }
}
catch (SQLException e) catch (SQLException e)
{ {
e.printStackTrace(); e.printStackTrace();
} }
long expiredData = premiumData.values().stream().filter(d -> d < System.currentTimeMillis()).count();
LOGGER.info(getClass().getSimpleName() + ": Loaded " + premiumData.size() + " premium data (" + expiredData + " have expired)");
} }
public long getPremiumExpiration(String accountName) public long getPremiumExpiration(String accountName)
@@ -162,11 +159,9 @@ public class PremiumManager
long oldPremiumExpiration = Math.max(now, getPremiumExpiration(accountName)); long oldPremiumExpiration = Math.max(now, getPremiumExpiration(accountName));
long newPremiumExpiration = oldPremiumExpiration + addTime; long newPremiumExpiration = oldPremiumExpiration + addTime;
String sqlCmd = premiumData.containsKey(accountName) ? UPDATE_SQL : ADD_SQL;
// UPDATE DATABASE // UPDATE DATABASE
try (Connection con = DatabaseFactory.getInstance().getConnection(); try (Connection con = DatabaseFactory.getInstance().getConnection();
PreparedStatement stmt = con.prepareStatement(sqlCmd)) PreparedStatement stmt = con.prepareStatement(UPDATE_SQL))
{ {
stmt.setLong(1, newPremiumExpiration); stmt.setLong(1, newPremiumExpiration);
stmt.setString(2, accountName); stmt.setString(2, accountName);
@@ -190,20 +185,21 @@ public class PremiumManager
if (!playerOnline.hasPremiumStatus()) if (!playerOnline.hasPremiumStatus())
{ {
playerOnline.setPremiumStatus(true); playerOnline.setPremiumStatus(true);
playerOnline.sendPacket(new ExBrPremiumState(playerOnline));
} }
} }
} }
public void removePremiumStatus(String accountName) public void removePremiumStatus(String accountName, boolean checkOnline)
{
if (checkOnline)
{ {
L2PcInstance playerOnline = L2World.getInstance().getPlayers().stream().filter(p -> accountName.equals(p.getAccountName())).findFirst().orElse(null); L2PcInstance playerOnline = L2World.getInstance().getPlayers().stream().filter(p -> accountName.equals(p.getAccountName())).findFirst().orElse(null);
if ((playerOnline != null) && playerOnline.hasPremiumStatus()) if ((playerOnline != null) && playerOnline.hasPremiumStatus())
{ {
playerOnline.setPremiumStatus(false); playerOnline.setPremiumStatus(false);
playerOnline.sendPacket(new ExBrPremiumState(playerOnline));
stopExpireTask(playerOnline); stopExpireTask(playerOnline);
} }
}
// UPDATE CACHE // UPDATE CACHE
premiumData.remove(accountName); premiumData.remove(accountName);