Save client addresses async on chr select

Almost rid of all db queries in Client
This commit is contained in:
P0nk
2024-10-03 08:28:22 +02:00
parent e38344ceae
commit 2b6ef9feb5
10 changed files with 91 additions and 83 deletions

View File

@@ -69,7 +69,6 @@ import java.util.Calendar;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
@@ -269,6 +268,13 @@ public class Client extends ChannelInboundHandlerAdapter {
this.hwid = hwid;
}
public void setMacs(String macs) {
if (macs == null || macs.isEmpty()) {
throw new IllegalArgumentException("macs cannot be empty");
}
this.macs.addAll(Arrays.asList(macs.split(", ")));
}
public String getRemoteAddress() {
return remoteAddress;
}
@@ -427,39 +433,6 @@ public class Client extends ChannelInboundHandlerAdapter {
return account != null && account.bannedUntil() != null && account.bannedUntil().isAfter(recentThreshold);
}
public void updateHwid(Hwid hwid) {
try (Connection con = DatabaseConnection.getConnection();
PreparedStatement ps = con.prepareStatement("UPDATE accounts SET hwid = ? WHERE id = ?")) {
ps.setString(1, hwid.hwid());
ps.setInt(2, accId);
ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
public void updateMacs(String macData) {
macs.addAll(Arrays.asList(macData.split(", ")));
StringBuilder newMacData = new StringBuilder();
Iterator<String> iter = macs.iterator();
while (iter.hasNext()) {
String cur = iter.next();
newMacData.append(cur);
if (iter.hasNext()) {
newMacData.append(", ");
}
}
try (Connection con = DatabaseConnection.getConnection();
PreparedStatement ps = con.prepareStatement("UPDATE accounts SET macs = ? WHERE id = ?")) {
ps.setString(1, newMacData.toString());
ps.setInt(2, accId);
ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
public void setAccID(int id) {
this.accId = id;
}

View File

@@ -169,4 +169,19 @@ public class AccountRepository {
.execute() > 0;
}
}
public void setIpAndMacsAndHwid(int accountId, String ip, String hwid, String macs) {
String sql = """
UPDATE account
SET ip = :ip, macs = :macs, hwid = :hwid
WHERE id = :id""";
try (Handle handle = connection.getHandle()) {
handle.createUpdate(sql)
.bind("id", accountId)
.bind("ip", ip)
.bind("hwid", hwid)
.bind("macs", macs)
.execute();
}
}
}

View File

@@ -280,8 +280,8 @@ public final class PacketProcessor {
registerHandler(RecvOpcode.AFTER_LOGIN, new AfterLoginHandler(channelDeps.accountService()));
registerHandler(RecvOpcode.SERVERLIST_REREQUEST, new ServerlistRequestHandler());
registerHandler(RecvOpcode.CHARLIST_REQUEST, new CharlistRequestHandler());
registerHandler(RecvOpcode.CHAR_SELECT, new CharSelectedHandler(channelDeps.banService(),
channelDeps.transitionService()));
registerHandler(RecvOpcode.CHAR_SELECT, new CharSelectedHandler(channelDeps.accountService(),
channelDeps.banService(), channelDeps.transitionService()));
registerHandler(RecvOpcode.LOGIN_PASSWORD, new LoginPasswordHandler(channelDeps.accountService(),
channelDeps.transitionService(), channelDeps.banService()));
registerHandler(RecvOpcode.RELOG, new RelogRequestHandler());
@@ -291,17 +291,17 @@ public final class PacketProcessor {
registerHandler(RecvOpcode.CREATE_CHAR, new CreateCharHandler(channelDeps.characterCreator()));
registerHandler(RecvOpcode.DELETE_CHAR, new DeleteCharHandler());
registerHandler(RecvOpcode.VIEW_ALL_CHAR, new ViewAllCharHandler());
registerHandler(RecvOpcode.PICK_ALL_CHAR, new ViewAllCharSelectedHandler(channelDeps.banService(),
channelDeps.transitionService()));
registerHandler(RecvOpcode.PICK_ALL_CHAR, new ViewAllCharSelectedHandler(channelDeps.accountService(),
channelDeps.banService(), channelDeps.transitionService()));
registerHandler(RecvOpcode.REGISTER_PIN, new RegisterPinHandler(channelDeps.accountService()));
registerHandler(RecvOpcode.GUEST_LOGIN, new GuestLoginHandler());
registerHandler(RecvOpcode.REGISTER_PIC, new RegisterPicHandler(channelDeps.banService(),
channelDeps.accountService(), channelDeps.transitionService()));
registerHandler(RecvOpcode.CHAR_SELECT_WITH_PIC, new CharSelectedWithPicHandler(channelDeps.banService(),
channelDeps.transitionService()));
registerHandler(RecvOpcode.CHAR_SELECT_WITH_PIC, new CharSelectedWithPicHandler(channelDeps.accountService(),
channelDeps.banService(), channelDeps.transitionService()));
registerHandler(RecvOpcode.SET_GENDER, new SetGenderHandler(channelDeps.accountService()));
registerHandler(RecvOpcode.VIEW_ALL_WITH_PIC, new ViewAllCharSelectedWithPicHandler(channelDeps.banService(),
channelDeps.transitionService()));
registerHandler(RecvOpcode.VIEW_ALL_WITH_PIC, new ViewAllCharSelectedWithPicHandler(channelDeps.accountService(),
channelDeps.banService(), channelDeps.transitionService()));
registerHandler(RecvOpcode.VIEW_ALL_PIC_REGISTER, new ViewAllCharRegisterPicHandler(channelDeps.banService(),
channelDeps.accountService(), channelDeps.transitionService()));
}

View File

@@ -22,6 +22,7 @@
package net.server.handlers.login;
import client.Client;
import lombok.extern.slf4j.Slf4j;
import net.AbstractPacketHandler;
import net.packet.InPacket;
import net.server.Server;
@@ -29,8 +30,7 @@ import net.server.coordinator.session.Hwid;
import net.server.coordinator.session.SessionCoordinator;
import net.server.coordinator.session.SessionCoordinator.AntiMulticlientResult;
import net.server.world.World;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import service.AccountService;
import service.BanService;
import service.TransitionService;
import tools.PacketCreator;
@@ -38,13 +38,16 @@ import tools.PacketCreator;
import java.net.InetAddress;
import java.net.UnknownHostException;
// TODO: create abstract class for all six "char selected" handlers.
@Slf4j
public final class CharSelectedHandler extends AbstractPacketHandler {
private static final Logger log = LoggerFactory.getLogger(CharSelectedHandler.class);
private final AccountService accountService;
private final BanService banService;
private final TransitionService transitionService;
public CharSelectedHandler(BanService banService, TransitionService transitionService) {
public CharSelectedHandler(AccountService accountService, BanService banService,
TransitionService transitionService) {
this.accountService = accountService;
this.banService = banService;
this.transitionService = transitionService;
}
@@ -75,9 +78,9 @@ public final class CharSelectedHandler extends AbstractPacketHandler {
return;
}
c.updateMacs(macs);
c.updateHwid(hwid);
c.setHwid(hwid);
c.setMacs(macs);
accountService.setIpAndMacsAndHwidAsync(c.getAccID(), c.getRemoteAddress(), macs, hwid);
AntiMulticlientResult res = SessionCoordinator.getInstance().attemptGameSession(c, c.getAccID(), hwid);
if (res != AntiMulticlientResult.SUCCESS) {

View File

@@ -1,6 +1,7 @@
package net.server.handlers.login;
import client.Client;
import lombok.extern.slf4j.Slf4j;
import net.AbstractPacketHandler;
import net.packet.InPacket;
import net.server.Server;
@@ -8,8 +9,7 @@ import net.server.coordinator.session.Hwid;
import net.server.coordinator.session.SessionCoordinator;
import net.server.coordinator.session.SessionCoordinator.AntiMulticlientResult;
import net.server.world.World;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import service.AccountService;
import service.BanService;
import service.TransitionService;
import tools.PacketCreator;
@@ -17,13 +17,15 @@ import tools.PacketCreator;
import java.net.InetAddress;
import java.net.UnknownHostException;
@Slf4j
public class CharSelectedWithPicHandler extends AbstractPacketHandler {
private static final Logger log = LoggerFactory.getLogger(CharSelectedWithPicHandler.class);
private final AccountService accountService;
private final BanService banService;
private final TransitionService transitionService;
public CharSelectedWithPicHandler(BanService banService, TransitionService transitionService) {
public CharSelectedWithPicHandler(AccountService accountService, BanService banService,
TransitionService transitionService) {
this.accountService = accountService;
this.banService = banService;
this.transitionService = transitionService;
}
@@ -55,9 +57,9 @@ public class CharSelectedWithPicHandler extends AbstractPacketHandler {
return;
}
c.updateMacs(macs);
c.updateHwid(hwid);
c.setHwid(hwid);
c.setMacs(macs);
accountService.setIpAndMacsAndHwidAsync(c.getAccID(), c.getRemoteAddress(), macs, hwid);
if (banService.isBanned(c)) {
SessionCoordinator.getInstance().closeSession(c, true);

View File

@@ -1,6 +1,7 @@
package net.server.handlers.login;
import client.Client;
import lombok.extern.slf4j.Slf4j;
import net.AbstractPacketHandler;
import net.packet.InPacket;
import net.server.Server;
@@ -8,8 +9,6 @@ import net.server.coordinator.session.Hwid;
import net.server.coordinator.session.SessionCoordinator;
import net.server.coordinator.session.SessionCoordinator.AntiMulticlientResult;
import net.server.world.World;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import service.AccountService;
import service.BanService;
import service.TransitionService;
@@ -18,9 +17,8 @@ import tools.PacketCreator;
import java.net.InetAddress;
import java.net.UnknownHostException;
@Slf4j
public final class RegisterPicHandler extends AbstractPacketHandler {
private static final Logger log = LoggerFactory.getLogger(RegisterPicHandler.class);
private final BanService banService;
private final TransitionService transitionService;
private final AccountService accountService;
@@ -48,9 +46,9 @@ public final class RegisterPicHandler extends AbstractPacketHandler {
return;
}
c.updateMacs(macs);
c.updateHwid(hwid);
c.setHwid(hwid);
c.setMacs(macs);
accountService.setIpAndMacsAndHwidAsync(c.getAccID(), c.getRemoteAddress(), macs, hwid);
AntiMulticlientResult res = SessionCoordinator.getInstance().attemptGameSession(c, c.getAccID(), hwid);
if (res != AntiMulticlientResult.SUCCESS) {

View File

@@ -1,6 +1,7 @@
package net.server.handlers.login;
import client.Client;
import lombok.extern.slf4j.Slf4j;
import net.AbstractPacketHandler;
import net.packet.InPacket;
import net.server.Server;
@@ -8,8 +9,6 @@ import net.server.coordinator.session.Hwid;
import net.server.coordinator.session.SessionCoordinator;
import net.server.coordinator.session.SessionCoordinator.AntiMulticlientResult;
import net.server.world.World;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import service.AccountService;
import service.BanService;
import service.TransitionService;
@@ -19,9 +18,8 @@ import tools.Randomizer;
import java.net.InetAddress;
import java.net.UnknownHostException;
@Slf4j
public final class ViewAllCharRegisterPicHandler extends AbstractPacketHandler {
private static final Logger log = LoggerFactory.getLogger(ViewAllCharRegisterPicHandler.class);
private final BanService banService;
private final AccountService accountService;
private final TransitionService transitionService;
@@ -39,7 +37,7 @@ public final class ViewAllCharRegisterPicHandler extends AbstractPacketHandler {
int charId = p.readInt();
p.readInt(); // please don't let the client choose which world they should login
String mac = p.readString();
String macs = p.readString();
String hostString = p.readString();
final Hwid hwid;
@@ -51,9 +49,9 @@ public final class ViewAllCharRegisterPicHandler extends AbstractPacketHandler {
return;
}
c.updateMacs(mac);
c.updateHwid(hwid);
c.setHwid(hwid);
c.setMacs(macs);
accountService.setIpAndMacsAndHwidAsync(c.getAccID(), c.getRemoteAddress(), macs, hwid);
if (banService.isBanned(c)) {
SessionCoordinator.getInstance().closeSession(c, true);

View File

@@ -22,6 +22,7 @@
package net.server.handlers.login;
import client.Client;
import lombok.extern.slf4j.Slf4j;
import net.AbstractPacketHandler;
import net.packet.InPacket;
import net.server.Server;
@@ -29,8 +30,7 @@ import net.server.coordinator.session.Hwid;
import net.server.coordinator.session.SessionCoordinator;
import net.server.coordinator.session.SessionCoordinator.AntiMulticlientResult;
import net.server.world.World;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import service.AccountService;
import service.BanService;
import service.TransitionService;
import tools.PacketCreator;
@@ -39,13 +39,15 @@ import tools.Randomizer;
import java.net.InetAddress;
import java.net.UnknownHostException;
@Slf4j
public final class ViewAllCharSelectedHandler extends AbstractPacketHandler {
private static final Logger log = LoggerFactory.getLogger(ViewAllCharSelectedHandler.class);
private final AccountService accountService;
private final BanService banService;
private final TransitionService transitionService;
public ViewAllCharSelectedHandler(BanService banService, TransitionService transitionService) {
public ViewAllCharSelectedHandler(AccountService accountService, BanService banService,
TransitionService transitionService) {
this.accountService = accountService;
this.banService = banService;
this.transitionService = transitionService;
}
@@ -77,9 +79,9 @@ public final class ViewAllCharSelectedHandler extends AbstractPacketHandler {
return;
}
c.updateMacs(macs);
c.updateHwid(hwid);
c.setHwid(hwid);
c.setMacs(macs);
accountService.setIpAndMacsAndHwidAsync(c.getAccID(), c.getRemoteAddress(), macs, hwid);
if (banService.isBanned(c)) {
SessionCoordinator.getInstance().closeSession(c, true);

View File

@@ -1,6 +1,7 @@
package net.server.handlers.login;
import client.Client;
import lombok.extern.slf4j.Slf4j;
import net.AbstractPacketHandler;
import net.packet.InPacket;
import net.server.Server;
@@ -8,8 +9,7 @@ import net.server.coordinator.session.Hwid;
import net.server.coordinator.session.SessionCoordinator;
import net.server.coordinator.session.SessionCoordinator.AntiMulticlientResult;
import net.server.world.World;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import service.AccountService;
import service.BanService;
import service.TransitionService;
import tools.PacketCreator;
@@ -18,13 +18,15 @@ import tools.Randomizer;
import java.net.InetAddress;
import java.net.UnknownHostException;
@Slf4j
public class ViewAllCharSelectedWithPicHandler extends AbstractPacketHandler {
private static final Logger log = LoggerFactory.getLogger(ViewAllCharSelectedWithPicHandler.class);
private final AccountService accountService;
private final BanService banService;
private final TransitionService transitionService;
public ViewAllCharSelectedWithPicHandler(BanService banService, TransitionService transitionService) {
public ViewAllCharSelectedWithPicHandler(AccountService accountService, BanService banService,
TransitionService transitionService) {
this.accountService = accountService;
this.banService = banService;
this.transitionService = transitionService;
}
@@ -58,9 +60,9 @@ public class ViewAllCharSelectedWithPicHandler extends AbstractPacketHandler {
return;
}
c.updateMacs(macs);
c.updateHwid(hwid);
c.setHwid(hwid);
c.setMacs(macs);
accountService.setIpAndMacsAndHwidAsync(c.getAccID(), c.getRemoteAddress(), macs, hwid);
if (banService.isBanned(c)) {
SessionCoordinator.getInstance().closeSession(c, true);

View File

@@ -7,7 +7,9 @@ import database.account.Account;
import database.account.AccountRepository;
import lombok.extern.slf4j.Slf4j;
import net.server.Server;
import net.server.coordinator.session.Hwid;
import net.server.coordinator.session.SessionCoordinator;
import server.TimerManager;
import tools.BCrypt;
import tools.DatabaseConnection;
@@ -301,6 +303,19 @@ public class AccountService {
}
}
public void setIpAndMacsAndHwidAsync(int accountId, final String ip, final String macs, Hwid hwid) {
final String hwidToSave = hwid != null ? hwid.hwid() : null;
TimerManager.getInstance().schedule(() -> {
try {
accountRepository.setIpAndMacsAndHwid(accountId, ip, hwidToSave, macs);
} catch (Exception e) {
log.error("Failed to save ip: {}, macs: {}, hwid: {} for accountId: {}", ip, hwidToSave, macs,
accountId, e);
}
}, 0);
}
public boolean ban(int accountId, Instant bannedUntil, byte banReason, String description) {
return accountRepository.setBanned(accountId, bannedUntil, banReason, description);
}