diff --git a/core/src/mindustry/core/NetServer.java b/core/src/mindustry/core/NetServer.java index 905425f1c9..64cd73c4ad 100644 --- a/core/src/mindustry/core/NetServer.java +++ b/core/src/mindustry/core/NetServer.java @@ -344,8 +344,7 @@ public class NetServer implements ApplicationListener{ boolean checkPass(){ if(votes >= votesRequired()){ Call.sendMessage(Strings.format("[orange]Vote passed.[scarlet] @[orange] will be banned from the server for @ minutes.", target.name, (kickDuration / 60))); - target.getInfo().lastKicked = Time.millis() + kickDuration * 1000; - Groups.player.each(p -> p.uuid().equals(target.uuid()), p -> p.kick(KickReason.vote)); + Groups.player.each(p -> p.uuid().equals(target.uuid()), p -> p.kick(KickReason.vote, kickDuration * 1000)); map[0] = null; task.cancel(); return true; diff --git a/core/src/mindustry/entities/comp/PlayerComp.java b/core/src/mindustry/entities/comp/PlayerComp.java index 14cb71c10f..057687ada8 100644 --- a/core/src/mindustry/entities/comp/PlayerComp.java +++ b/core/src/mindustry/entities/comp/PlayerComp.java @@ -238,6 +238,10 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra con.kick(reason); } + void kick(KickReason reason, long duration){ + con.kick(reason, duration); + } + void kick(String reason){ con.kick(reason); } diff --git a/core/src/mindustry/net/NetConnection.java b/core/src/mindustry/net/NetConnection.java index a7bcc9b7fd..87eedd6675 100644 --- a/core/src/mindustry/net/NetConnection.java +++ b/core/src/mindustry/net/NetConnection.java @@ -4,7 +4,6 @@ import arc.struct.*; import arc.util.*; import mindustry.entities.units.*; import mindustry.gen.*; -import mindustry.net.Administration.*; import mindustry.net.Packets.*; import java.io.*; @@ -37,38 +36,39 @@ public abstract class NetConnection{ /** Kick with a special, localized reason. Use this if possible. */ public void kick(KickReason reason){ - if(kicked) return; + kick(reason, (reason == KickReason.kick || reason == KickReason.banned || reason == KickReason.vote) ? 30 * 1000 : 0); + } - Log.info("Kicking connection @ / @; Reason: @", address, uuid, reason.name()); - - if((reason == KickReason.kick || reason == KickReason.banned || reason == KickReason.vote)){ - PlayerInfo info = netServer.admins.getInfo(uuid); - info.timesKicked++; - info.lastKicked = Math.max(Time.millis() + 30 * 1000, info.lastKicked); - } - - Call.kick(this, reason); - - close(); - - netServer.admins.save(); - kicked = true; + /** Kick with a special, localized reason. Use this if possible. */ + public void kick(KickReason reason, long kickDuration){ + kick(null, reason, kickDuration); } /** Kick with an arbitrary reason. */ public void kick(String reason){ - kick(reason, 30 * 1000); + kick(reason, null, 30 * 1000); + } + + /** Kick with an arbitrary reason. */ + public void kick(String reason, long duration){ + kick(reason, null, duration); } /** Kick with an arbitrary reason, and a kick duration in milliseconds. */ - public void kick(String reason, long kickDuration){ + private void kick(String reason, KickReason kickType, long kickDuration){ if(kicked) return; - Log.info("Kicking connection @ / @; Reason: @", address, uuid, reason.replace("\n", " ")); + Log.info("Kicking connection @ / @; Reason: @", address, uuid, reason == null ? kickType.name() : reason.replace("\n", " ")); - netServer.admins.handleKicked(uuid, address, kickDuration); + if(kickDuration > 0){ + netServer.admins.handleKicked(uuid, address, kickDuration); + } - Call.kick(this, reason); + if(reason == null){ + Call.kick(this, kickType); + }else{ + Call.kick(this, reason); + } close(); diff --git a/gradle.properties b/gradle.properties index 69dad80b1d..d732f03f20 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,4 +10,4 @@ kapt.include.compile.classpath=false kotlin.stdlib.default.dependency=false #needed for android compilation android.useAndroidX=true -archash=4b1c4b4565f24298c9c5c7e9b40d94957d4aa226 +archash=52cd02b71205949b68e9b620b6a02fed3622bac0 diff --git a/tests/src/test/java/ApplicationTests.java b/tests/src/test/java/ApplicationTests.java index 3284377f0a..01dce8947e 100644 --- a/tests/src/test/java/ApplicationTests.java +++ b/tests/src/test/java/ApplicationTests.java @@ -21,6 +21,7 @@ import mindustry.maps.*; import mindustry.mod.*; import mindustry.mod.Mods.*; import mindustry.net.*; +import mindustry.net.Packets.*; import mindustry.type.*; import mindustry.world.*; import mindustry.world.blocks.storage.*; @@ -134,6 +135,7 @@ public class ApplicationTests{ @ParameterizedTest @NullSource @ValueSource(strings = { + "a", "asd asd asd asd asdagagasasjakbgeah;jwrej 23424234", "这个服务器可以用自己的语言说话", "\uD83D\uDEA3" @@ -161,6 +163,28 @@ public class ApplicationTests{ pack.handled(); assertEquals(string, pack.message); + + buffer.position(0); + Writes writes = new Writes(new ByteBufferOutput(buffer)); + TypeIO.writeString(writes, string); + + buffer.position(0); + + assertEquals(string, TypeIO.readString(new Reads(new ByteBufferInput(buffer)))); + + buffer.position(0); + ConnectPacket con = new ConnectPacket(); + con.name = string; + con.uuid = "AAAAAAAA"; + con.usid = "AAAAAAAA"; + con.mods = new Seq<>(); + con.write(new Writes(new ByteBufferOutput(buffer))); + + con.name = "INVALID"; + buffer.position(0); + con.read(new Reads(new ByteBufferInput(buffer))); + + assertEquals(string, con.name); } @Test