From cb31121fe777ccf89e3811e1993aa733e0797fde Mon Sep 17 00:00:00 2001 From: P0nk Date: Thu, 10 Aug 2023 21:58:26 +0200 Subject: [PATCH] Disconnect client with TransitionService --- src/main/java/client/Character.java | 30 +++++-------------- .../command/commands/gm2/DcCommand.java | 11 +++---- .../command/commands/gm3/BanCommand.java | 6 +++- .../command/commands/gm6/DCAllCommand.java | 2 +- src/main/java/net/PacketProcessor.java | 2 +- src/main/java/net/netty/ChannelServer.java | 10 +++---- .../net/netty/ChannelServerInitializer.java | 6 ++-- .../java/net/netty/DisconnectHandler.java | 10 +++---- src/main/java/net/netty/LoginServer.java | 10 +++---- .../net/netty/LoginServerInitializer.java | 6 ++-- .../net/netty/ServerChannelInitializer.java | 6 ++-- src/main/java/net/server/Server.java | 14 ++++----- src/main/java/net/server/channel/Channel.java | 8 ++--- .../channel/handlers/AdminCommandHandler.java | 17 ++++++++++- .../java/net/server/task/TimeoutTask.java | 13 ++++---- src/main/java/net/server/world/World.java | 6 ++-- 16 files changed, 83 insertions(+), 74 deletions(-) diff --git a/src/main/java/client/Character.java b/src/main/java/client/Character.java index 2f3ede417e..a34b73114d 100644 --- a/src/main/java/client/Character.java +++ b/src/main/java/client/Character.java @@ -42,6 +42,7 @@ import constants.id.MobId; import constants.inventory.ItemConstants; import constants.skills.*; import model.CharacterIdentity; +import net.netty.GameViolationException; import net.packet.Packet; import net.server.PlayerBuffValueHolder; import net.server.PlayerCoolDownValueHolder; @@ -1379,6 +1380,7 @@ public class Character extends AbstractCharacterObject { eventAfterChangedMap(this.getMapId()); } + // Only used when entering Magic Door (Priest skill). public void changeMap(final MapleMap target, final Point pos) { canWarpCounter++; @@ -8639,34 +8641,14 @@ public class Character extends AbstractCharacterObject { } } - public void sendPolice(int greason, String reason, int duration) { - sendPacket(PacketCreator.sendPolice(String.format("You have been blocked by the#b %s Police for %s.#k", "Cosmic", reason))); - this.isbanned = true; - TimerManager.getInstance().schedule(new Runnable() { - @Override - public void run() { - client.disconnect(false, false); - } - }, duration); - } - public void sendPolice(String text) { final String message = getName() + " received this - " + text; + log.info(message); if (Server.getInstance().isGmOnline(this.getWorld())) { //Alert and log if a GM is online Server.getInstance().broadcastGMMessage(this.getWorld(), PacketCreator.sendYellowTip(message)); } else { //Auto DC and log if no GM is online - client.disconnect(false, false); + throw new GameViolationException(text); } - log.info(message); - //Server.getInstance().broadcastGMMessage(0, PacketCreator.serverNotice(1, getName() + " received this - " + text)); - //sendPacket(PacketCreator.sendPolice(text)); - //this.isbanned = true; - //TimerManager.getInstance().schedule(new Runnable() { - // @Override - // public void run() { - // client.disconnect(false, false); - // } - //}, 6000); } public void sendKeymap() { @@ -10071,6 +10053,10 @@ public class Character extends AbstractCharacterObject { return isbanned; } + public void setBanned() { + isbanned = true; + } + public List getTrockMaps() { return trockmaps; } diff --git a/src/main/java/client/command/commands/gm2/DcCommand.java b/src/main/java/client/command/commands/gm2/DcCommand.java index 2b6e70f539..4c8178b0d0 100644 --- a/src/main/java/client/command/commands/gm2/DcCommand.java +++ b/src/main/java/client/command/commands/gm2/DcCommand.java @@ -41,14 +41,15 @@ public class DcCommand extends Command { return; } - Character victim = c.getWorldServer().getPlayerStorage().getCharacterByName(params[0]); + String chrName = params[0]; + Character victim = c.getWorldServer().getPlayerStorage().getCharacterByName(chrName); if (victim == null) { - victim = c.getChannelServer().getPlayerStorage().getCharacterByName(params[0]); + victim = c.getChannelServer().getPlayerStorage().getCharacterByName(chrName); if (victim == null) { - victim = player.getMap().getCharacterByName(params[0]); + victim = player.getMap().getCharacterByName(chrName); if (victim != null) { try {//sometimes bugged because the map = null - victim.getClient().disconnect(true, false); + ctx.transitionService().disconnect(victim.getClient(), true, false); player.getMap().removePlayer(victim); } catch (Exception e) { e.printStackTrace(); @@ -61,6 +62,6 @@ public class DcCommand extends Command { if (player.gmLevel() < victim.gmLevel()) { victim = player; } - victim.getClient().disconnect(false, false); + ctx.transitionService().disconnect(victim.getClient(), false, false); } } diff --git a/src/main/java/client/command/commands/gm3/BanCommand.java b/src/main/java/client/command/commands/gm3/BanCommand.java index 5e00123889..6b20d02eaf 100644 --- a/src/main/java/client/command/commands/gm3/BanCommand.java +++ b/src/main/java/client/command/commands/gm3/BanCommand.java @@ -35,6 +35,7 @@ import tools.PacketCreator; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; +import java.util.concurrent.TimeUnit; public class BanCommand extends Command { { @@ -76,7 +77,10 @@ public class BanCommand extends Command { target.yellowMessage("Reason: " + reason); c.sendPacket(PacketCreator.getGMEffect(4, (byte) 0)); final Character rip = target; - TimerManager.getInstance().schedule(() -> rip.getClient().disconnect(false, false), 5000); //5 Seconds + TimerManager.getInstance().schedule( + () -> ctx.transitionService().disconnect(rip.getClient(), false, false), + TimeUnit.SECONDS.toMillis(5) + ); Server.getInstance().broadcastMessage(c.getWorld(), PacketCreator.serverNotice(6, "[RIP]: " + ign + " has been banned.")); } else if (Character.ban(ign, reason, false)) { c.sendPacket(PacketCreator.getGMEffect(4, (byte) 0)); diff --git a/src/main/java/client/command/commands/gm6/DCAllCommand.java b/src/main/java/client/command/commands/gm6/DCAllCommand.java index 0ab5e55789..d4a94a613e 100644 --- a/src/main/java/client/command/commands/gm6/DCAllCommand.java +++ b/src/main/java/client/command/commands/gm6/DCAllCommand.java @@ -41,7 +41,7 @@ public class DCAllCommand extends Command { for (World world : Server.getInstance().getWorlds()) { for (Character chr : world.getPlayerStorage().getAllCharacters()) { if (!chr.isGM()) { - chr.getClient().disconnect(false, false); + ctx.transitionService().disconnect(chr.getClient(), false, false); } } } diff --git a/src/main/java/net/PacketProcessor.java b/src/main/java/net/PacketProcessor.java index b84ce52b70..c48cbacfb7 100644 --- a/src/main/java/net/PacketProcessor.java +++ b/src/main/java/net/PacketProcessor.java @@ -248,7 +248,7 @@ public final class PacketProcessor { registerHandler(RecvOpcode.SCRIPTED_ITEM, new ScriptedItemHandler()); registerHandler(RecvOpcode.TOUCHING_REACTOR, new TouchReactorHandler()); registerHandler(RecvOpcode.BEHOLDER, new BeholderHandler()); - registerHandler(RecvOpcode.ADMIN_COMMAND, new AdminCommandHandler()); + registerHandler(RecvOpcode.ADMIN_COMMAND, new AdminCommandHandler(channelDeps.transitionService())); registerHandler(RecvOpcode.ADMIN_LOG, new AdminLogHandler()); registerHandler(RecvOpcode.ALLIANCE_OPERATION, new AllianceOperationHandler()); registerHandler(RecvOpcode.DENY_ALLIANCE_REQUEST, new DenyAllianceRequestHandler()); diff --git a/src/main/java/net/netty/ChannelServer.java b/src/main/java/net/netty/ChannelServer.java index 4e10a775e6..6113e37363 100644 --- a/src/main/java/net/netty/ChannelServer.java +++ b/src/main/java/net/netty/ChannelServer.java @@ -1,23 +1,23 @@ package net.netty; -import database.character.CharacterSaver; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.Channel; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioServerSocketChannel; +import service.TransitionService; public class ChannelServer extends AbstractServer { private final int world; private final int channel; - private final CharacterSaver characterSaver; + private final TransitionService transitionService; private Channel nettyChannel; - public ChannelServer(int port, int world, int channel, CharacterSaver characterSaver) { + public ChannelServer(int port, int world, int channel, TransitionService transitionService) { super(port); this.world = world; this.channel = channel; - this.characterSaver = characterSaver; + this.transitionService = transitionService; } @Override @@ -27,7 +27,7 @@ public class ChannelServer extends AbstractServer { ServerBootstrap bootstrap = new ServerBootstrap() .group(parentGroup, childGroup) .channel(NioServerSocketChannel.class) - .childHandler(new ChannelServerInitializer(world, channel, characterSaver)); + .childHandler(new ChannelServerInitializer(world, channel, transitionService)); this.nettyChannel = bootstrap.bind(port).syncUninterruptibly().channel(); } diff --git a/src/main/java/net/netty/ChannelServerInitializer.java b/src/main/java/net/netty/ChannelServerInitializer.java index 4de7a3cfaa..5b2ebaf9e7 100644 --- a/src/main/java/net/netty/ChannelServerInitializer.java +++ b/src/main/java/net/netty/ChannelServerInitializer.java @@ -1,13 +1,13 @@ package net.netty; import client.Client; -import database.character.CharacterSaver; import io.netty.channel.socket.SocketChannel; import net.PacketProcessor; import net.server.Server; import net.server.coordinator.session.SessionCoordinator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import service.TransitionService; public class ChannelServerInitializer extends ServerChannelInitializer { private static final Logger log = LoggerFactory.getLogger(ChannelServerInitializer.class); @@ -15,8 +15,8 @@ public class ChannelServerInitializer extends ServerChannelInitializer { private final int world; private final int channel; - public ChannelServerInitializer(int world, int channel, CharacterSaver characterSaver) { - super(characterSaver); + public ChannelServerInitializer(int world, int channel, TransitionService transitionService) { + super(transitionService); this.world = world; this.channel = channel; } diff --git a/src/main/java/net/netty/DisconnectHandler.java b/src/main/java/net/netty/DisconnectHandler.java index 2339d18cfe..1bf192af76 100644 --- a/src/main/java/net/netty/DisconnectHandler.java +++ b/src/main/java/net/netty/DisconnectHandler.java @@ -1,23 +1,23 @@ package net.netty; -import database.character.CharacterSaver; import io.netty.channel.ChannelHandler.Sharable; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; +import service.TransitionService; @Sharable public class DisconnectHandler extends ChannelInboundHandlerAdapter { - private final CharacterSaver characterSaver; + private final TransitionService transitionService; - public DisconnectHandler(CharacterSaver characterSaver) { - this.characterSaver = characterSaver; + public DisconnectHandler(TransitionService transitionService) { + this.transitionService = transitionService; } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { if (cause instanceof DisconnectException de) { var client = de.getClient(); - client.disconnect(true, false); + transitionService.disconnect(client, true, false); } else { ctx.fireExceptionCaught(cause); } diff --git a/src/main/java/net/netty/LoginServer.java b/src/main/java/net/netty/LoginServer.java index 131b82c4ee..aeb95b52e1 100644 --- a/src/main/java/net/netty/LoginServer.java +++ b/src/main/java/net/netty/LoginServer.java @@ -1,22 +1,22 @@ package net.netty; -import database.character.CharacterSaver; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.Channel; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioServerSocketChannel; +import service.TransitionService; public class LoginServer extends AbstractServer { public static final int WORLD_ID = -1; public static final int CHANNEL_ID = -1; - private final CharacterSaver characterSaver; + private final TransitionService transitionService; private Channel channel; - public LoginServer(int port, CharacterSaver characterSaver) { + public LoginServer(int port, TransitionService transitionService) { super(port); - this.characterSaver = characterSaver; + this.transitionService = transitionService; } @Override @@ -26,7 +26,7 @@ public class LoginServer extends AbstractServer { ServerBootstrap bootstrap = new ServerBootstrap() .group(parentGroup, childGroup) .channel(NioServerSocketChannel.class) - .childHandler(new LoginServerInitializer(characterSaver)); + .childHandler(new LoginServerInitializer(transitionService)); this.channel = bootstrap.bind(port).syncUninterruptibly().channel(); } diff --git a/src/main/java/net/netty/LoginServerInitializer.java b/src/main/java/net/netty/LoginServerInitializer.java index 671c1d3ebd..e9b22a83c9 100644 --- a/src/main/java/net/netty/LoginServerInitializer.java +++ b/src/main/java/net/netty/LoginServerInitializer.java @@ -1,18 +1,18 @@ package net.netty; import client.Client; -import database.character.CharacterSaver; import io.netty.channel.socket.SocketChannel; import net.PacketProcessor; import net.server.coordinator.session.SessionCoordinator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import service.TransitionService; public class LoginServerInitializer extends ServerChannelInitializer { private static final Logger log = LoggerFactory.getLogger(LoginServerInitializer.class); - public LoginServerInitializer(CharacterSaver characterSaver) { - super(characterSaver); + public LoginServerInitializer(TransitionService transitionService) { + super(transitionService); } @Override diff --git a/src/main/java/net/netty/ServerChannelInitializer.java b/src/main/java/net/netty/ServerChannelInitializer.java index 737bc39b39..dfcfde3b9d 100644 --- a/src/main/java/net/netty/ServerChannelInitializer.java +++ b/src/main/java/net/netty/ServerChannelInitializer.java @@ -3,7 +3,6 @@ package net.netty; import client.Client; import config.YamlConfig; import constants.net.ServerConstants; -import database.character.CharacterSaver; import io.netty.buffer.Unpooled; import io.netty.channel.Channel; import io.netty.channel.ChannelHandler; @@ -19,6 +18,7 @@ import net.packet.logging.OutPacketLogger; import net.server.coordinator.session.IpAddresses; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import service.TransitionService; import tools.PacketCreator; import java.net.InetSocketAddress; @@ -35,8 +35,8 @@ public abstract class ServerChannelInitializer extends ChannelInitializer channelInfo = new HashMap<>(); long bootTime = getCurrentTime(); @@ -928,7 +926,7 @@ public class Server { } } - loginServer = initLoginServer(8484, channelDependencies.characterSaver()); + loginServer = initLoginServer(8484, channelDependencies.transitionService()); log.info("Listening on port 8484"); @@ -999,8 +997,8 @@ public class Server { return channelDependencies; } - private LoginServer initLoginServer(int port, CharacterSaver characterSaver) { - LoginServer loginServer = new LoginServer(port, characterSaver); + private LoginServer initLoginServer(int port, TransitionService transitionService) { + LoginServer loginServer = new LoginServer(port, transitionService); loginServer.start(); return loginServer; } @@ -1898,7 +1896,7 @@ public class Server { for (Client c : toDisconnect) { // thanks Lei for pointing a deadlock issue with srvLock if (c.isLoggedIn()) { - c.disconnect(false, false); + channelDependencies.transitionService().disconnect(c, false, false); } else { SessionCoordinator.getInstance().closeSession(c, true); } diff --git a/src/main/java/net/server/channel/Channel.java b/src/main/java/net/server/channel/Channel.java index b74af6aa55..fc5fb41da6 100644 --- a/src/main/java/net/server/channel/Channel.java +++ b/src/main/java/net/server/channel/Channel.java @@ -24,7 +24,6 @@ package net.server.channel; import client.Character; import config.YamlConfig; import constants.id.MapId; -import database.character.CharacterSaver; import database.drop.DropProvider; import net.ChannelDependencies; import net.netty.ChannelServer; @@ -45,6 +44,7 @@ import server.events.gm.Event; import server.expeditions.Expedition; import server.expeditions.ExpeditionType; import server.maps.*; +import service.TransitionService; import tools.PacketCreator; import tools.Pair; @@ -126,7 +126,7 @@ public final class Channel { this.merchWlock = rwLock.writeLock(); try { - this.channelServer = initServer(port, world, channel, channelDependencies.characterSaver()); + this.channelServer = initServer(port, world, channel, channelDependencies.transitionService()); expedType.addAll(Arrays.asList(ExpeditionType.values())); if (Server.getInstance().isOnline()) { // postpone event loading to improve boot time... thanks Riizade, daronhudson for noticing slow startup times @@ -154,8 +154,8 @@ public final class Channel { } } - private ChannelServer initServer(int port, int world, int channel, CharacterSaver characterSaver) { - ChannelServer channelServer = new ChannelServer(port, world, channel, characterSaver); + private ChannelServer initServer(int port, int world, int channel, TransitionService transitionService) { + ChannelServer channelServer = new ChannelServer(port, world, channel, transitionService); channelServer.start(); return channelServer; } diff --git a/src/main/java/net/server/channel/handlers/AdminCommandHandler.java b/src/main/java/net/server/channel/handlers/AdminCommandHandler.java index 3cd9dd6704..36bb00c3a2 100644 --- a/src/main/java/net/server/channel/handlers/AdminCommandHandler.java +++ b/src/main/java/net/server/channel/handlers/AdminCommandHandler.java @@ -31,19 +31,27 @@ import net.packet.InPacket; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import server.ItemInformationProvider; +import server.TimerManager; import server.life.LifeFactory; import server.life.Monster; import server.maps.MapObject; import server.maps.MapObjectType; import server.quest.Quest; +import service.TransitionService; import tools.PacketCreator; import tools.Randomizer; import java.util.Arrays; import java.util.List; +import java.util.concurrent.TimeUnit; public final class AdminCommandHandler extends AbstractPacketHandler { private static final Logger log = LoggerFactory.getLogger(AdminCommandHandler.class); + private final TransitionService transitionService; + + public AdminCommandHandler(TransitionService transitionService) { + this.transitionService = transitionService; + } @Override public void handlePacket(InPacket p, Client c) { @@ -95,7 +103,7 @@ public final class AdminCommandHandler extends AbstractPacketHandler { target.ban(description + " " + reason); } else { target.block(type, duration, description); - target.sendPolice(duration, reason, 6000); + sendPolice(target.getClient(), reason); } c.sendPacket(PacketCreator.getGMEffect(4, (byte) 0)); } else if (Character.ban(victim, reason, false)) { @@ -183,4 +191,11 @@ public final class AdminCommandHandler extends AbstractPacketHandler { break; } } + + private void sendPolice(Client c, String reason) { + c.sendPacket(PacketCreator.sendPolice(String.format("You have been blocked by the#b %s Police for %s.#k", "Cosmic", reason))); + c.getPlayer().setBanned(); + TimerManager.getInstance().schedule(() -> transitionService.disconnect(c, false, false), + TimeUnit.SECONDS.toMillis(6)); + } } diff --git a/src/main/java/net/server/task/TimeoutTask.java b/src/main/java/net/server/task/TimeoutTask.java index df5560d2b7..d4fc88f5e0 100644 --- a/src/main/java/net/server/task/TimeoutTask.java +++ b/src/main/java/net/server/task/TimeoutTask.java @@ -5,6 +5,7 @@ import config.YamlConfig; import net.server.world.World; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import service.TransitionService; import java.util.Collection; @@ -13,6 +14,12 @@ import java.util.Collection; */ public class TimeoutTask extends BaseTask implements Runnable { private static final Logger log = LoggerFactory.getLogger(TimeoutTask.class); + private final TransitionService transitionService; + + public TimeoutTask(World world, TransitionService transitionService) { + super(world); + this.transitionService = transitionService; + } @Override public void run() { @@ -21,12 +28,8 @@ public class TimeoutTask extends BaseTask implements Runnable { for (Character chr : chars) { if (time - chr.getClient().getLastPacket() > YamlConfig.config.server.TIMEOUT_DURATION) { log.info("Chr {} auto-disconnected due to inactivity", chr.getName()); - chr.getClient().disconnect(true, chr.getCashShop().isOpened()); + transitionService.disconnect(chr.getClient(), true, chr.getCashShop().isOpened()); } } } - - public TimeoutTask(World world) { - super(world); - } } diff --git a/src/main/java/net/server/world/World.java b/src/main/java/net/server/world/World.java index 509396b943..cc85a274f7 100644 --- a/src/main/java/net/server/world/World.java +++ b/src/main/java/net/server/world/World.java @@ -53,6 +53,7 @@ import scripting.event.EventInstanceManager; import server.Storage; import server.TimerManager; import server.maps.*; +import service.TransitionService; import tools.DatabaseConnection; import tools.PacketCreator; import tools.Pair; @@ -161,7 +162,8 @@ public class World { private ScheduledFuture timeoutSchedule; private ScheduledFuture hpDecSchedule; - public World(int world, int flag, String eventmsg, int exprate, int droprate, int bossdroprate, int mesorate, int questrate, int travelrate, int fishingrate) { + public World(int world, int flag, String eventmsg, int exprate, int droprate, int bossdroprate, int mesorate, + int questrate, int travelrate, int fishingrate, TransitionService transitionService) { this.id = world; this.flag = flag; this.eventmsg = eventmsg; @@ -200,7 +202,7 @@ public class World { mapOwnershipSchedule = tman.register(new MapOwnershipTask(this), SECONDS.toMillis(20), SECONDS.toMillis(20)); fishingSchedule = tman.register(new FishingTask(this), SECONDS.toMillis(10), SECONDS.toMillis(10)); partySearchSchedule = tman.register(new PartySearchTask(this), SECONDS.toMillis(10), SECONDS.toMillis(10)); - timeoutSchedule = tman.register(new TimeoutTask(this), SECONDS.toMillis(10), SECONDS.toMillis(10)); + timeoutSchedule = tman.register(new TimeoutTask(this, transitionService), SECONDS.toMillis(10), SECONDS.toMillis(10)); hpDecSchedule = tman.register(new CharacterHpDecreaseTask(this), YamlConfig.config.server.MAP_DAMAGE_OVERTIME_INTERVAL, YamlConfig.config.server.MAP_DAMAGE_OVERTIME_INTERVAL); if (YamlConfig.config.server.USE_FAMILY_SYSTEM) {