Skip to content

Commit a5013a0

Browse files
committed
authorization by ip
1 parent 5c0f911 commit a5013a0

File tree

7 files changed

+52
-25
lines changed

7 files changed

+52
-25
lines changed

src/main/java/ua/mei/minekord/mixin/PlayerManagerMixin.java

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,23 +8,35 @@
88
import org.spongepowered.asm.mixin.injection.Inject;
99
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
1010
import ua.mei.minekord.bot.DiscordUtils;
11+
import ua.mei.minekord.cache.IPCache;
1112
import ua.mei.minekord.config.AuthSpec;
1213
import ua.mei.minekord.config.MinekordConfigKt;
1314
import ua.mei.minekord.event.IPCheckEvent;
1415

16+
import java.net.InetSocketAddress;
1517
import java.net.SocketAddress;
1618

1719
@Mixin(PlayerManager.class)
1820
public class PlayerManagerMixin {
1921
@Inject(method = "checkCanJoin", at = @At("RETURN"), cancellable = true)
2022
private void minekord$checkRoles(SocketAddress socketAddress, GameProfile gameProfile, CallbackInfoReturnable<Text> cir) {
2123
if (cir.getReturnValue() == null) {
22-
if (!MinekordConfigKt.getConfig().get(AuthSpec.INSTANCE.getUuidFromSnowflake()) && !MinekordConfigKt.getConfig().get(AuthSpec.INSTANCE.getRequiredRoles()).isEmpty()) {
23-
if (DiscordUtils.INSTANCE.getPlayer(gameProfile.getName()) == null) {
24+
boolean uuidFromSnowflake = MinekordConfigKt.getConfig().get(AuthSpec.INSTANCE.getUuidFromSnowflake());
25+
boolean requiredRoles = !MinekordConfigKt.getConfig().get(AuthSpec.INSTANCE.getRequiredRoles()).isEmpty();
26+
boolean loginByIp = MinekordConfigKt.getConfig().get(AuthSpec.INSTANCE.getLoginByIp());
27+
String playerName = gameProfile.getName();
28+
String cachedIp = IPCache.INSTANCE.getFromCache(playerName);
29+
30+
if (!uuidFromSnowflake && requiredRoles) {
31+
if (DiscordUtils.INSTANCE.getPlayer(playerName) == null) {
2432
cir.setReturnValue(Text.translatable("multiplayer.disconnect.generic"));
2533
}
2634
}
27-
IPCheckEvent.Companion.getEvent().invoker().request(socketAddress, gameProfile);
35+
36+
if (loginByIp && socketAddress instanceof InetSocketAddress inet && !cachedIp.equals(inet.getHostName())) {
37+
IPCheckEvent.Companion.getEvent().invoker().request(socketAddress, gameProfile);
38+
cir.setReturnValue(Text.translatable("multiplayer.disconnect.generic"));
39+
}
2840
}
2941
}
3042
}

src/main/kotlin/ua/mei/minekord/Minekord.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package ua.mei.minekord
22

33
import net.fabricmc.api.ModInitializer
4-
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents
54
import net.fabricmc.loader.api.FabricLoader
65
import org.apache.logging.log4j.LogManager
76
import org.apache.logging.log4j.Logger

src/main/kotlin/ua/mei/minekord/bot/MinekordBot.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ import kotlinx.coroutines.CoroutineScope
77
import kotlinx.coroutines.Dispatchers
88
import kotlinx.coroutines.launch
99
import ua.mei.minekord.bot.extensions.IPCheckExtension
10+
import ua.mei.minekord.bot.extensions.SetupExtension
1011
import ua.mei.minekord.config.BotSpec
1112
import ua.mei.minekord.config.config
12-
import ua.mei.minekord.bot.extensions.SetupExtension
1313
import kotlin.coroutines.CoroutineContext
1414

1515
object MinekordBot : CoroutineScope {

src/main/kotlin/ua/mei/minekord/bot/extensions/IPCheckExtension.kt

Lines changed: 30 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,18 @@ package ua.mei.minekord.bot.extensions
22

33
import dev.kord.common.entity.ButtonStyle
44
import dev.kord.common.entity.Snowflake
5-
import dev.kord.core.behavior.channel.createEmbed
65
import dev.kord.core.behavior.channel.createMessage
76
import dev.kord.core.entity.User
8-
import dev.kord.rest.builder.message.actionRow
97
import dev.kord.rest.builder.message.embed
108
import dev.kordex.core.components.components
9+
import dev.kordex.core.components.disabledButton
1110
import dev.kordex.core.components.publicButton
1211
import dev.kordex.core.extensions.Extension
12+
import dev.kordex.core.time.TimestampType
13+
import dev.kordex.core.time.toDiscord
1314
import io.ktor.util.network.address
1415
import kotlinx.coroutines.launch
16+
import kotlinx.datetime.Clock
1517
import ua.mei.minekord.bot.DiscordUtils
1618
import ua.mei.minekord.bot.MinekordBot
1719
import ua.mei.minekord.cache.IPCache
@@ -29,18 +31,32 @@ class IPCheckExtension : Extension() {
2931

3032
user?.getDmChannelOrNull()?.createMessage {
3133
embed {
32-
title = "Join with new IP"
33-
description = "This is your IP?\n> ${address.address}"
34+
title = "This is your IP?"
35+
36+
field {
37+
name = "> IP"
38+
value = "> ${address.address}"
39+
}
40+
field {
41+
name = "> Time"
42+
value = "> ${Clock.System.now().toDiscord(TimestampType.Default)}"
43+
}
3444
}
3545
components {
3646
publicButton {
3747
label = "Yes"
3848
style = ButtonStyle.Success
3949

4050
action {
41-
IPCache.putIntoCache(profile.id, address.address)
42-
respond {
43-
content = "ІДІ НАХУЙ"
51+
IPCache.putIntoCache(profile.name, address.address)
52+
53+
edit {
54+
components {
55+
disabledButton {
56+
label = "Yes"
57+
style = ButtonStyle.Success
58+
}
59+
}
4460
}
4561
}
4662
}
@@ -49,8 +65,13 @@ class IPCheckExtension : Extension() {
4965
style = ButtonStyle.Danger
5066

5167
action {
52-
respond {
53-
content = "ІДІ НАХУЙ"
68+
edit {
69+
components {
70+
disabledButton {
71+
label = "No"
72+
style = ButtonStyle.Danger
73+
}
74+
}
5475
}
5576
}
5677
}

src/main/kotlin/ua/mei/minekord/cache/IPCache.kt

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,9 @@ import net.fabricmc.loader.api.FabricLoader
77
import java.io.FileReader
88
import java.nio.file.Files
99
import java.nio.file.Path
10-
import java.util.UUID
1110

1211
object IPCache {
13-
private var cache: MutableMap<UUID, String> = mutableMapOf()
12+
private var cache: MutableMap<String, String> = mutableMapOf()
1413
val path: Path = FabricLoader.getInstance().gameDir.resolve("ip-cache.json")
1514
val gson: Gson = GsonBuilder()
1615
.setPrettyPrinting()
@@ -22,7 +21,7 @@ object IPCache {
2221
Files.write(path, "{}".toByteArray())
2322
}
2423
val reader: JsonReader = JsonReader(FileReader(path.toFile()))
25-
cache = gson.fromJson(reader, MutableMap::class.java)
24+
cache = gson.fromJson(reader, Map::class.java)
2625
reader.close()
2726
}
2827

@@ -33,12 +32,12 @@ object IPCache {
3332
Files.write(path, gson.toJson(cache).toByteArray())
3433
}
3534

36-
fun putIntoCache(uuid: UUID, ip: String) {
37-
cache[uuid] = ip
35+
fun putIntoCache(nickname: String, ip: String) {
36+
cache[nickname] = ip
3837
save()
3938
}
4039

41-
fun getFromCache(uuid: UUID): String {
42-
return cache[uuid] ?: ""
40+
fun getFromCache(nickname: String): String {
41+
return cache[nickname] ?: ""
4342
}
4443
}

src/main/kotlin/ua/mei/minekord/config/AuthSpec.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,4 @@ object AuthSpec : ConfigSpec() {
77
val allowOfflinePlayers by required<Boolean>()
88
val requiredRoles by required<List<ULong>>()
99
val loginByIp by required<Boolean>()
10-
val ignorePremiumIp by required<Boolean>()
1110
}

src/main/resources/minekord.toml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,3 @@ requiredRoles = []
3030
# Option made for players, who are lazy to type /login and /register,
3131
# or for best safety.
3232
loginByIp = false
33-
34-
# Don't request IP confirmation to premium players.
35-
ignorePremiumIp = false

0 commit comments

Comments
 (0)