Skip to content

Commit

Permalink
refactoring + messages for kick & ip check
Browse files Browse the repository at this point in the history
  • Loading branch information
MeiNanziiii committed Oct 16, 2024
1 parent 756d6d1 commit 42e1ad9
Show file tree
Hide file tree
Showing 18 changed files with 103 additions and 93 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@

@Mixin(PlayerAdvancementTracker.class)
public abstract class PlayerAdvancementTrackerMixin {
@Shadow private ServerPlayerEntity owner;
@Shadow
private ServerPlayerEntity owner;

@Inject(method = "method_53637", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/PlayerManager;broadcast(Lnet/minecraft/text/Text;Z)V"))
public void bonfire$callEvent(AdvancementEntry advancementEntry, AdvancementDisplay advancementDisplay, CallbackInfo ci) {
Expand Down
7 changes: 4 additions & 3 deletions src/main/java/ua/mei/minekord/mixin/PlayerManagerMixin.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,9 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import ua.mei.minekord.cache.IPCache;
import ua.mei.minekord.config.spec.ExperimentalSpec;
import ua.mei.minekord.config.MinekordConfigKt;
import ua.mei.minekord.config.spec.ExperimentalSpec;
import ua.mei.minekord.config.spec.MessagesSpec;
import ua.mei.minekord.event.IPCheckEvent;

import java.net.SocketAddress;
Expand All @@ -20,12 +21,12 @@ public abstract class PlayerManagerMixin {
private void minekord$checkRoles(SocketAddress socketAddress, GameProfile gameProfile, CallbackInfoReturnable<Text> cir) {
if (cir.getReturnValue() == null && MinekordConfigKt.getConfig().get(ExperimentalSpec.DiscordSpec.INSTANCE.getEnabled()) && MinekordConfigKt.getConfig().get(ExperimentalSpec.DiscordSpec.INSTANCE.getLoginByIp())) {
if (IPCache.INSTANCE.isBlockedIp(socketAddress)) {
cir.setReturnValue(Text.translatable("multiplayer.disconnect.generic"));
cir.setReturnValue(Text.translatable("multiplayer.disconnect.ip_banned"));
}

if (!IPCache.INSTANCE.containsInCache(gameProfile.getName(), socketAddress)) {
IPCheckEvent.Companion.getEVENT().invoker().request(socketAddress, gameProfile);
cir.setReturnValue(Text.translatable("multiplayer.disconnect.generic"));
cir.setReturnValue(Text.literal(MinekordConfigKt.getConfig().get(MessagesSpec.INSTANCE.getIpKickMessage())));
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ public abstract class ServerLoginNetworkHandlerMixin {
private void minekord$trueUuids(LoginHelloC2SPacket loginHelloC2SPacket, CallbackInfo ci) {
if (MinekordConfigKt.getConfig().get(ExperimentalSpec.DiscordSpec.INSTANCE.getEnabled())) {
if (this.server.isOnlineMode() && !MinekordConfigKt.getConfig().get(ExperimentalSpec.DiscordSpec.INSTANCE.getAllowOfflinePlayers()) && !ExperimentalUtils.INSTANCE.premiumPlayer(loginHelloC2SPacket.comp_907())) {
this.disconnect(Text.translatable("multiplayer.disconnect.generic"));
this.disconnect(Text.translatable("multiplayer.disconnect.unverified_username"));
ci.cancel();
}

Expand All @@ -48,7 +48,7 @@ public abstract class ServerLoginNetworkHandlerMixin {
this.profile = new GameProfile(trueUuid, loginHelloC2SPacket.comp_765());
this.sendSuccessPacket(this.profile);
} else {
this.disconnect(Text.translatable("multiplayer.disconnect.generic"));
this.disconnect(Text.translatable("multiplayer.disconnect.unverified_username"));
}

ci.cancel();
Expand Down
4 changes: 4 additions & 0 deletions src/main/kotlin/ua/mei/minekord/Minekord.kt
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@ object Minekord : ModInitializer {
override fun onInitialize() {
logger.info("Initializing Minekord")

if (!Files.exists(FabricLoader.getInstance().gameDir.resolve("minekord"))) {
Files.createDirectories(FabricLoader.getInstance().gameDir.resolve("minekord"))
}

if (!Files.exists(FabricLoader.getInstance().configDir.resolve(CONFIG_PATH))) {
Files.copy(
FabricLoader.getInstance().getModContainer(MOD_ID).get().findPath(CONFIG_PATH).get(),
Expand Down
58 changes: 52 additions & 6 deletions src/main/kotlin/ua/mei/minekord/bot/MinekordBot.kt
Original file line number Diff line number Diff line change
@@ -1,28 +1,43 @@
package ua.mei.minekord.bot

import dev.kord.common.entity.Snowflake
import dev.kord.core.entity.Guild
import dev.kord.core.entity.Webhook
import dev.kord.core.entity.channel.TextChannel
import dev.kord.core.entity.channel.TopGuildMessageChannel
import dev.kordex.core.ExtensibleBot
import dev.kordex.core.extensions.Extension
import dev.kordex.core.utils.ensureWebhook
import dev.kordex.core.utils.loadModule
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import net.fabricmc.fabric.api.entity.event.v1.ServerLivingEntityEvents
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents
import net.fabricmc.fabric.api.message.v1.ServerMessageEvents
import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents
import net.minecraft.server.MinecraftServer
import net.minecraft.server.network.ServerPlayerEntity
import ua.mei.minekord.bot.extensions.IPCheckExtension
import ua.mei.minekord.bot.extensions.MessageExtension
import ua.mei.minekord.bot.extensions.PlayerListExtension
import ua.mei.minekord.bot.extensions.SetupExtension
import ua.mei.minekord.config.config
import ua.mei.minekord.config.spec.BotSpec
import ua.mei.minekord.config.spec.ChatSpec
import ua.mei.minekord.config.spec.CommandsSpec
import ua.mei.minekord.config.spec.ExperimentalSpec
import ua.mei.minekord.event.AdvancementGrantEvent
import ua.mei.minekord.event.player.MinekordAdvancementGrantEvent
import ua.mei.minekord.event.player.MinekordPlayerDeathEvent
import ua.mei.minekord.event.player.MinekordPlayerJoinEvent
import ua.mei.minekord.event.player.MinekordPlayerLeaveEvent
import ua.mei.minekord.event.player.MinekordPlayerMessageEvent
import ua.mei.minekord.event.server.MinekordServerStartedEvent
import kotlin.coroutines.CoroutineContext

object MinekordBot : CoroutineScope {
internal var bot: ExtensibleBot? = null
internal lateinit var bot: ExtensibleBot

val extensions: MutableList<() -> Extension> = mutableListOf()

Expand All @@ -38,9 +53,6 @@ object MinekordBot : CoroutineScope {
}

extensions {
add(::SetupExtension)
add(::MessageExtension)

if (config[CommandsSpec.PlayerListSpec.enabled])
add(::PlayerListExtension)

Expand All @@ -62,10 +74,44 @@ object MinekordBot : CoroutineScope {
}
}
}
setupVariables()
setupEvents()

bot.addExtension(::MessageExtension)
}
launch {
bot!!.start()
bot.start()
}
}

fun setupEvents() {
AdvancementGrantEvent.EVENT.register { player, advancement ->
launch { bot.send(MinekordAdvancementGrantEvent(player, advancement)) }
}
ServerLivingEntityEvents.ALLOW_DEATH.register { entity, source, amount ->
if (entity is ServerPlayerEntity) {
launch { bot.send(MinekordPlayerDeathEvent(entity, source)) }
}
true
}
ServerPlayConnectionEvents.JOIN.register { handler, sender, server ->
launch { bot.send(MinekordPlayerJoinEvent(handler.player)) }
}
ServerPlayConnectionEvents.DISCONNECT.register { handler, server ->
launch { bot.send(MinekordPlayerLeaveEvent(handler.player)) }
}
ServerMessageEvents.CHAT_MESSAGE.register { message, sender, type ->
launch { bot.send(MinekordPlayerMessageEvent(sender, message.content)) }
}
ServerLifecycleEvents.SERVER_STARTED.register { server ->
launch { bot.send(MinekordServerStartedEvent(server)) }
}
}

suspend fun setupVariables() {
guild = bot.kordRef.getGuild(Snowflake(config[BotSpec.guild]))
channel = guild.getChannel(Snowflake(config[BotSpec.channel])) as TextChannel
webhook = ensureWebhook(channel as TopGuildMessageChannel, config[ChatSpec.WebhookSpec.webhookName])
}

override val coroutineContext: CoroutineContext = Dispatchers.Default
Expand Down
23 changes: 12 additions & 11 deletions src/main/kotlin/ua/mei/minekord/bot/extensions/IPCheckExtension.kt
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import ua.mei.minekord.bot.MinekordBot
import ua.mei.minekord.cache.IPCache
import ua.mei.minekord.config.config
import ua.mei.minekord.config.spec.ExperimentalSpec
import ua.mei.minekord.config.spec.MessagesSpec
import ua.mei.minekord.event.IPCheckEvent
import ua.mei.minekord.utils.ExperimentalUtils

Expand All @@ -35,22 +36,22 @@ class IPCheckExtension : Extension() {

user?.getDmChannelOrNull()?.createMessage {
embed {
title = "This is your IP?"
title = config[MessagesSpec.embedTitle]

field {
name = "> IP"
value = "> ${socketAddress.address}"
inline = true
}
field {
name = "> Time"
name = "> ${config[MessagesSpec.timeLabel]}"
value = "> ${Clock.System.now().toDiscord(TimestampType.Default)}"
inline = true
}
}
components {
publicButton {
label = "Yes"
label = config[MessagesSpec.yesButton]
style = ButtonStyle.Success

action {
Expand All @@ -59,61 +60,61 @@ class IPCheckExtension : Extension() {
edit {
components {
disabledButton {
label = "Yes"
label = config[MessagesSpec.yesButton]
style = ButtonStyle.Success
}
}
}
}
}
publicButton {
label = "No"
label = config[MessagesSpec.noButton]
style = ButtonStyle.Danger

action {
IPCache.blockedIps += socketAddress.address

edit {
embed {
title = "IP was blocked!"
title = config[MessagesSpec.ipBlockedTitle]

field {
name = "> IP"
value = "> ${socketAddress.address}"
inline = true
}
field {
name = "> Time"
name = "> ${config[MessagesSpec.timeLabel]}"
value = "> ${Clock.System.now().toDiscord(TimestampType.Default)}"
inline = true
}
}
components {
publicButton {
label = "Unblock"
label = config[MessagesSpec.unblockButton]
style = ButtonStyle.Danger

action {
IPCache.blockedIps.removeAll { it == socketAddress.address }

edit {
embed {
title = "IP was unblocked!"
title = config[MessagesSpec.ipUnblockedTitle]

field {
name = "> IP"
value = "> ${socketAddress.address}"
inline = true
}
field {
name = "> Time"
name = "> ${config[MessagesSpec.timeLabel]}"
value = "> ${Clock.System.now().toDiscord(TimestampType.Default)}"
inline = true
}
}
components {
disabledButton {
label = "Unblock"
label = config[MessagesSpec.unblockButton]
style = ButtonStyle.Danger
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ class MessageExtension : MinekordExtension() {
if (message.referencedMessage != null) {
val replyText: Text = MinecraftSerializer.INSTANCE.serialize(message.referencedMessage!!.content, minecraftOptions).toNative(server.registryManager)

val reply = parse(config[ChatSpec.MinecraftSpec.replyFormat], PlaceholderContext.of(server)) {
val reply: Text = parse(config[ChatSpec.MinecraftSpec.replyFormat], PlaceholderContext.of(server)) {
"sender" to sender.effectiveName.literal()
"message" to replyText
"summary" to replyText.string.summary().literal()
Expand Down
56 changes: 0 additions & 56 deletions src/main/kotlin/ua/mei/minekord/bot/extensions/SetupExtension.kt

This file was deleted.

2 changes: 1 addition & 1 deletion src/main/kotlin/ua/mei/minekord/cache/IPCache.kt
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import java.nio.file.Path

object IPCache {
private var cache: MutableMap<String, String> = mutableMapOf()
val path: Path = FabricLoader.getInstance().gameDir.resolve("ip-cache.json")
val path: Path = FabricLoader.getInstance().gameDir.resolve("minekord/ip-cache.json")
val gson: Gson = GsonBuilder()
.setPrettyPrinting()
.create()
Expand Down
2 changes: 2 additions & 0 deletions src/main/kotlin/ua/mei/minekord/config/MinekordConfig.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import ua.mei.minekord.config.spec.ChatSpec
import ua.mei.minekord.config.spec.ColorsSpec
import ua.mei.minekord.config.spec.CommandsSpec
import ua.mei.minekord.config.spec.ExperimentalSpec
import ua.mei.minekord.config.spec.MessagesSpec
import ua.mei.minekord.config.spec.PresenceSpec

const val CONFIG_PATH: String = "minekord.toml"
Expand All @@ -18,6 +19,7 @@ val config: Config = Config {
addSpec(PresenceSpec)
addSpec(CommandsSpec)
addSpec(ColorsSpec)
addSpec(MessagesSpec)
addSpec(ExperimentalSpec)
}
.from.toml.resource(CONFIG_PATH)
Expand Down
14 changes: 14 additions & 0 deletions src/main/kotlin/ua/mei/minekord/config/spec/MessagesSpec.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package ua.mei.minekord.config.spec

import com.uchuhimo.konf.ConfigSpec

object MessagesSpec : ConfigSpec() {
val ipKickMessage by required<String>()
val embedTitle by required<String>()
val timeLabel by required<String>()
val yesButton by required<String>()
val noButton by required<String>()
val unblockButton by required<String>()
val ipBlockedTitle by required<String>()
val ipUnblockedTitle by required<String>()
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package ua.mei.minekord.event.base

import dev.kordex.core.events.KordExEvent
import eu.pb4.placeholders.api.PlaceholderContext
import net.minecraft.server.network.ServerPlayerEntity
import ua.mei.minekord.config.config
Expand All @@ -8,7 +9,7 @@ import ua.mei.minekord.utils.literal
import ua.mei.minekord.utils.parse
import ua.mei.minekord.utils.texture

interface MinekordPlayerBaseEvent {
interface MinekordPlayerBaseEvent : KordExEvent {
val player: ServerPlayerEntity

val playerAvatar: String
Expand Down
Loading

0 comments on commit 42e1ad9

Please sign in to comment.