Skip to content

Commit 2356185

Browse files
committed
Add localized messages
1 parent ac4c1f5 commit 2356185

8 files changed

Lines changed: 86 additions & 83 deletions

File tree

src/main/java/org/itxtech/nemisys/Client.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -345,7 +345,7 @@ public void handleDataPacket(SynapseDataPacket packet) {
345345
PlayerLogoutPacket playerLogoutPacket = (PlayerLogoutPacket) packet;
346346
player = this.players.get(playerLogoutPacket.sessionId);
347347
if (player != null) {
348-
player.close(playerLogoutPacket.reason, true);
348+
player.close(playerLogoutPacket.reason);
349349
}
350350
break;
351351
default:

src/main/java/org/itxtech/nemisys/Player.java

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ public void handleDataPacket(DataPacket packet) {
9595
}
9696

9797
if (!loginVerified && !packet.canBeSentBeforeLogin() && ++unverifiedPackets > 8) {
98-
this.close("Too many failed login attempts");
98+
this.close("Too many failed login attempts", "disconnectionScreen.unexpectedPacket", false);
9999
return;
100100
}
101101

@@ -127,7 +127,7 @@ public void handleDataPacket(DataPacket packet) {
127127
break;
128128
case ProtocolInfo.LOGIN_PACKET:
129129
if (this.loginPacketReceived) {
130-
this.close("Invalid login packet");
130+
this.close("Invalid login packet", "disconnectionScreen.unexpectedPacket", false);
131131
break;
132132
}
133133
this.loginPacketReceived = true;
@@ -186,7 +186,7 @@ public void handleDataPacket(DataPacket packet) {
186186
break;
187187
case ProtocolInfo.CLIENT_TO_SERVER_HANDSHAKE_PACKET:
188188
if (!this.awaitingEncryptionHandshake) {
189-
this.close("Invalid encryption handshake");
189+
this.close("Invalid encryption handshake", "disconnectionScreen.unexpectedPacket", false);
190190
break;
191191
}
192192

@@ -369,14 +369,22 @@ public int getPing() {
369369
}
370370

371371
public void close() {
372-
this.close("Generic Reason");
372+
this.close("disconnectionScreen.noReason");
373373
}
374374

375-
public void close(String reason) {
376-
this.close(reason, true);
375+
public void close(String message) {
376+
this.close(message, true);
377377
}
378378

379-
public void close(String reason, boolean notify) {
379+
public void close(String message, String reason) {
380+
this.close(message, reason, true);
381+
}
382+
383+
public void close(String message, boolean notify) {
384+
this.close(message, message, notify);
385+
}
386+
387+
public void close(String message, String reason, boolean notify) {
380388
if (!this.closed) {
381389
session.closeReader();
382390

@@ -393,7 +401,7 @@ public void close(String reason, boolean notify) {
393401
if (this.client != null) {
394402
PlayerLogoutPacket pk = new PlayerLogoutPacket();
395403
pk.sessionId = sessionId;
396-
pk.reason = reason;
404+
pk.reason = message;
397405
this.client.sendDataPacket(pk);
398406
this.client.removePlayer(this);
399407
}
@@ -402,7 +410,7 @@ public void close(String reason, boolean notify) {
402410
TextFormat.AQUA + this.getName() + TextFormat.WHITE,
403411
this.getIp(),
404412
String.valueOf(this.getPort()),
405-
this.getServer().getLanguage().translateString(reason)
413+
this.getServer().getLanguage().translateString(message)
406414
}));
407415

408416
Server.getInstance().getScheduler().scheduleDelayedTask(() -> this.session.close(notify ? reason : ""), 2);

src/main/java/org/itxtech/nemisys/event/player/PlayerCreationEvent.java

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,12 @@
33
import org.itxtech.nemisys.Player;
44
import org.itxtech.nemisys.event.Event;
55
import org.itxtech.nemisys.event.HandlerList;
6+
import org.itxtech.nemisys.network.Compressor;
7+
import org.itxtech.nemisys.network.NetworkSession;
68
import org.itxtech.nemisys.network.SourceInterface;
79

810
import java.net.InetSocketAddress;
11+
import java.util.Objects;
912

1013
/**
1114
* @author CreeperFace
@@ -24,17 +27,13 @@ public static HandlerList getHandlers() {
2427

2528
private final InetSocketAddress socketAddress;
2629

27-
private Class<? extends Player> baseClass;
30+
private PlayerFactory playerFactory;
2831

29-
private Class<? extends Player> playerClass;
30-
31-
public PlayerCreationEvent(SourceInterface interfaz, Class<? extends Player> baseClass, Class<? extends Player> playerClass, long clientId, InetSocketAddress socketAddress) {
32+
public PlayerCreationEvent(SourceInterface interfaz, PlayerFactory playerFactory, long clientId, InetSocketAddress socketAddress) {
3233
this.interfaz = interfaz;
3334
this.clientId = clientId;
3435
this.socketAddress = socketAddress;
35-
36-
this.baseClass = baseClass;
37-
this.playerClass = playerClass;
36+
this.playerFactory = playerFactory;
3837
}
3938

4039
public SourceInterface getInterface() {
@@ -57,19 +56,17 @@ public long getClientId() {
5756
return clientId;
5857
}
5958

60-
public Class<? extends Player> getBaseClass() {
61-
return baseClass;
62-
}
63-
64-
public void setBaseClass(Class<? extends Player> baseClass) {
65-
this.baseClass = baseClass;
59+
public PlayerFactory getPlayerFactory() {
60+
return playerFactory;
6661
}
6762

68-
public Class<? extends Player> getPlayerClass() {
69-
return playerClass;
63+
public void setPlayerFactory(PlayerFactory playerFactory) {
64+
Objects.requireNonNull(playerFactory, "constructor");
65+
this.playerFactory = playerFactory;
7066
}
7167

72-
public void setPlayerClass(Class<? extends Player> playerClass) {
73-
this.playerClass = playerClass;
68+
@FunctionalInterface
69+
public interface PlayerFactory {
70+
Player create(NetworkSession session, long clientId, InetSocketAddress socketAddress, Compressor compressor);
7471
}
7572
}

src/main/java/org/itxtech/nemisys/event/synapse/player/SynapsePlayerCreationEvent.java

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,14 @@
22

33
import org.itxtech.nemisys.event.HandlerList;
44
import org.itxtech.nemisys.event.synapse.SynapseEvent;
5+
import org.itxtech.nemisys.network.Compressor;
6+
import org.itxtech.nemisys.network.NetworkSession;
57
import org.itxtech.nemisys.network.SourceInterface;
8+
import org.itxtech.nemisys.synapse.SynapseEntry;
69
import org.itxtech.nemisys.synapse.SynapsePlayer;
710

811
import java.net.InetSocketAddress;
12+
import java.util.Objects;
913

1014
/**
1115
*/
@@ -15,16 +19,13 @@ public class SynapsePlayerCreationEvent extends SynapseEvent {
1519
private final SourceInterface interfaz;
1620
private final Long clientId;
1721
private final InetSocketAddress socketAddress;
18-
private Class<? extends SynapsePlayer> baseClass;
19-
private Class<? extends SynapsePlayer> playerClass;
22+
private SynapsePlayerFactory playerFactory;
2023

21-
public SynapsePlayerCreationEvent(SourceInterface interfaz, Class<? extends SynapsePlayer> baseClass, Class<? extends SynapsePlayer> playerClass, Long clientId, InetSocketAddress socketAddress) {
24+
public SynapsePlayerCreationEvent(SourceInterface interfaz, SynapsePlayerFactory playerFactory, Long clientId, InetSocketAddress socketAddress) {
2225
this.interfaz = interfaz;
2326
this.clientId = clientId;
2427
this.socketAddress = socketAddress;
25-
26-
this.baseClass = baseClass;
27-
this.playerClass = playerClass;
28+
this.playerFactory = playerFactory;
2829
}
2930

3031
public static HandlerList getHandlers() {
@@ -51,19 +52,17 @@ public Long getClientId() {
5152
return clientId;
5253
}
5354

54-
public Class<? extends SynapsePlayer> getBaseClass() {
55-
return baseClass;
56-
}
57-
58-
public void setBaseClass(Class<? extends SynapsePlayer> baseClass) {
59-
this.baseClass = baseClass;
55+
public SynapsePlayerFactory getPlayerFactory() {
56+
return playerFactory;
6057
}
6158

62-
public Class<? extends SynapsePlayer> getPlayerClass() {
63-
return playerClass;
59+
public void setPlayerFactory(SynapsePlayerFactory playerFactory) {
60+
Objects.requireNonNull(playerFactory, "constructor");
61+
this.playerFactory = playerFactory;
6462
}
6563

66-
public void setPlayerClass(Class<? extends SynapsePlayer> playerClass) {
67-
this.playerClass = playerClass;
64+
@FunctionalInterface
65+
public interface SynapsePlayerFactory {
66+
SynapsePlayer create(NetworkSession session, SynapseEntry synapseEntry, Long clientID, InetSocketAddress socketAddress, Compressor compressor);
6867
}
6968
}

src/main/java/org/itxtech/nemisys/network/Network.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -247,12 +247,12 @@ public void processBatch(BatchPacket packet, Player player, Compressor compresso
247247
try {
248248
valid = processBatch(packet.payload, packets, compressor);
249249
} catch (ProtocolException e) {
250-
player.close(e.getMessage());
250+
player.close(e.getMessage(), "disconnectionScreen.unexpectedPacket", false);
251251
log.error("Unable to process player packets ", e);
252252
return;
253253
}
254254
if (!valid) {
255-
player.close("malformed packet");
255+
player.close("malformed packet", "disconnectionScreen.unexpectedPacket", false);
256256
return;
257257
}
258258
processPackets(player, packets);

src/main/java/org/itxtech/nemisys/network/RakNetInterface.java

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.itxtech.nemisys.Player;
2626
import org.itxtech.nemisys.Server;
2727
import org.itxtech.nemisys.event.player.PlayerCreationEvent;
28+
import org.itxtech.nemisys.event.player.PlayerCreationEvent.PlayerFactory;
2829
import org.itxtech.nemisys.event.server.*;
2930
import org.itxtech.nemisys.network.protocol.mcpe.*;
3031
import org.itxtech.nemisys.utils.Binary;
@@ -37,8 +38,6 @@
3738
import javax.crypto.SecretKey;
3839
import javax.security.auth.DestroyFailedException;
3940
import java.io.IOException;
40-
import java.lang.reflect.Constructor;
41-
import java.lang.reflect.InvocationTargetException;
4241
import java.net.InetAddress;
4342
import java.net.InetSocketAddress;
4443
import java.net.URI;
@@ -109,10 +108,10 @@ public RakNetInterface(Server server, NemisysMetrics metrics) {
109108
InetSocketAddress bindAddress = new InetSocketAddress(Strings.isNullOrEmpty(this.server.getIp()) ? "0.0.0.0" : this.server.getIp(), this.server.getPort());
110109

111110
this.raknet = new RakNetServer(bindAddress, Runtime.getRuntime().availableProcessors());
112-
this.raknet.setMaxConnections(-1);
111+
this.raknet.setMaxConnections(0);
113112
// this.customRakNetServer(raknet);
114-
this.raknet.bind().join();
115113
this.raknet.setListener(this);
114+
this.raknet.bind().join();
116115

117116
for (EventExecutor executor : this.raknet.getBootstrap().config().group()) {
118117
this.tickFutures.add(executor.scheduleAtFixedRate(() -> {
@@ -135,17 +134,16 @@ public boolean process() {
135134
session.lastPacketBudgetUpdateTimeNs = System.nanoTime();
136135

137136
InetSocketAddress address = session.raknet.getAddress();
138-
PlayerCreationEvent ev = new PlayerCreationEvent(this, Player.class, Player.class, -1, address);
139-
this.server.getPluginManager().callEvent(ev);
140-
Class<? extends Player> clazz = ev.getPlayerClass();
141-
137+
PlayerCreationEvent ev = new PlayerCreationEvent(this, Player::new, -1, address);
142138
try {
143-
Constructor<? extends Player> constructor = clazz.getConstructor(NetworkSession.class, long.class, InetSocketAddress.class, Compressor.class);
144-
Player player = constructor.newInstance(session, ev.getClientId(), ev.getSocketAddress(), session.initCompression.compressor);
139+
this.server.getPluginManager().callEvent(ev);
140+
PlayerFactory factory = ev.getPlayerFactory();
141+
142+
Player player = factory.create(session, ev.getClientId(), ev.getSocketAddress(), session.initCompression.compressor);
145143
this.server.addPlayer(address, player);
146144
session.player = player;
147145
this.sessions.put(address, session);
148-
} catch (NoSuchMethodException | InvocationTargetException | InstantiationException | IllegalAccessException e) {
146+
} catch (Exception e) {
149147
Server.getInstance().getLogger().logException(e);
150148
}
151149
}
@@ -155,9 +153,9 @@ public boolean process() {
155153
NemisysRakNetSession nemisysSession = iterator.next();
156154
Player player = nemisysSession.player;
157155

158-
String disconnectReason = nemisysSession.disconnectReason;
159-
if (disconnectReason != null) {
160-
player.close(disconnectReason, false);
156+
Disconnection disconnection = nemisysSession.disconnection;
157+
if (disconnection != null) {
158+
player.close(disconnection.message, disconnection.reason, false);
161159
iterator.remove();
162160
continue;
163161
}
@@ -304,7 +302,7 @@ private class NemisysRakNetSession implements NetworkSession, RakNetSessionListe
304302
private final Queue<DataPacket> outbound = PlatformDependent.newMpscQueue();
305303
private volatile boolean readable = true;
306304
@Nullable
307-
private volatile String disconnectReason;
305+
private volatile Disconnection disconnection;
308306
private Player player;
309307

310308
private final Compression initCompression;
@@ -388,9 +386,9 @@ public void onPreDisconnect(DisconnectReason reason) {
388386
@Override
389387
public void onDisconnect(DisconnectReason disconnectReason) {
390388
if (disconnectReason == DisconnectReason.TIMED_OUT) {
391-
this.disconnect("Timed out");
389+
this.disconnect("Timed out", "disconnectionScreen.timeout");
392390
} else {
393-
this.disconnect("Disconnected from Server");
391+
this.disconnect("Disconnected from Server", "disconnectionScreen.disconnected");
394392
}
395393

396394
Encryption encryption = this.encryption;
@@ -423,7 +421,7 @@ public void onEncapsulated(EncapsulatedPacket packet) {
423421
int size = buffer.readableBytes();
424422
if (size >= Compressor.MAX_SIZE) {
425423
this.readable = false;
426-
this.disconnect("Packet content exceeds maximum size");
424+
this.disconnect("Packet content exceeds maximum size", "disconnect.overflow");
427425
log.debug("[{}] Packet size exceeds limit: {}", raknet.getAddress(), size);
428426
server.getPluginManager().callEvent(new RakNetExceptionEvent(raknet.getAddress(), "batch_size"));
429427
return;
@@ -442,7 +440,7 @@ public void onEncapsulated(EncapsulatedPacket packet) {
442440
decryptCipher.update(inBuffer, outBuffer);
443441
} catch (GeneralSecurityException e) {
444442
this.readable = false;
445-
this.disconnect("Bad decrypt");
443+
this.disconnect("Bad decrypt", "disconnectionScreen.unexpectedPacket");
446444
log.debug("[{}] Unable to decrypt packet", raknet.getAddress(), e);
447445
server.getPluginManager().callEvent(new RakNetExceptionEvent(raknet.getAddress(), "decrypt"));
448446
return;
@@ -457,7 +455,7 @@ public void onEncapsulated(EncapsulatedPacket packet) {
457455
buffer.readBytes(checksum);
458456
} catch (Exception e) {
459457
this.readable = false;
460-
this.disconnect("Bad checksum");
458+
this.disconnect("Bad checksum", "disconnectionScreen.unexpectedPacket");
461459
log.debug("[{}] Unable to verify checksum", raknet.getAddress(), e);
462460
server.getPluginManager().callEvent(new RakNetExceptionEvent(raknet.getAddress(), "checksum_corrupt"));
463461
return;
@@ -467,7 +465,7 @@ public void onEncapsulated(EncapsulatedPacket packet) {
467465
byte[] expected = calculateChecksum(count, payload, encryption.secretKey);
468466
if (!Arrays.equals(checksum, expected)) {
469467
this.readable = false;
470-
this.disconnect("Invalid checksum");
468+
this.disconnect("Invalid checksum", "disconnectionScreen.unexpectedPacket");
471469
log.debug("[{}] Encrypted packet {} has invalid checksum (expected {}, got {})", raknet.getAddress(),
472470
count, Binary.bytesToHexString(expected), Binary.bytesToHexString(checksum));
473471
server.getPluginManager().callEvent(new RakNetExceptionEvent(raknet.getAddress(), "checksum_mismatch"));
@@ -493,7 +491,7 @@ public void onEncapsulated(EncapsulatedPacket packet) {
493491
if (incomingPacketBatchBudget <= 0) {
494492
this.readable = false;
495493
log.warn("{} receiving packets too fast", raknet.getAddress());
496-
this.disconnect("Receiving packets too fast");
494+
this.disconnect("Receiving packets too fast", "disconnectionScreen.connectionLost");
497495
server.getPluginManager().callEvent(new RakNetExceptionEvent(raknet.getAddress(), "batch_fast"));
498496
return;
499497
}
@@ -509,7 +507,7 @@ public void onEncapsulated(EncapsulatedPacket packet) {
509507
compressionAlgorithm = buffer.readByte();
510508
if (compressionAlgorithm < CompressionAlgorithm.NONE || compressionAlgorithm > CompressionAlgorithm.SNAPPY) {
511509
this.readable = false;
512-
this.disconnect("Unknown compression algorithm");
510+
this.disconnect("Unknown compression algorithm", "disconnectionScreen.unexpectedPacket");
513511
log.debug("[{}] Unknown compression algorithm: {}", raknet.getAddress(), compressionAlgorithm);
514512
server.getPluginManager().callEvent(new RakNetExceptionEvent(raknet.getAddress(), "decompress"));
515513
return;
@@ -567,8 +565,8 @@ public void onDirect(ByteBuf byteBuf) {
567565
// We don't allow any direct packets so ignore.
568566
}
569567

570-
private void disconnect(String message) {
571-
this.disconnectReason = message;
568+
private void disconnect(String message, String reason) {
569+
this.disconnection = new Disconnection(message, reason);
572570
RakNetInterface.this.sessionsToTick.get().remove(this);
573571
}
574572

@@ -764,4 +762,7 @@ private record Encryption(SecretKey secretKey, Cipher encryptCipher, Cipher decr
764762

765763
private record Compression(Compressor compressor, boolean dynamicCompressor) {
766764
}
765+
766+
private record Disconnection(String message, String reason) {
767+
}
767768
}

0 commit comments

Comments
 (0)