Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 0 additions & 14 deletions build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
import dev.slne.surf.api.gradle.util.slneReleases

buildscript {
repositories {
gradlePluginPortal()
Expand All @@ -14,16 +12,4 @@ buildscript {
allprojects {
group = "dev.slne.surf.chat"
version = findProperty("version") as String
}

subprojects {
afterEvaluate {
plugins.withType<PublishingPlugin> {
configure<PublishingExtension> {
repositories {
slneReleases()
}
}
}
}
}
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
kotlin.code.style=official
kotlin.stdlib.default.dependency=false
org.gradle.parallel=true
version=4.3.0
version=4.3.1
Binary file modified gradle/wrapper/gradle-wrapper.jar
Binary file not shown.
4 changes: 3 additions & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.1-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-9.5.0-bin.zip
networkTimeout=10000
retries=0
retryBackOffMs=500
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
2 changes: 1 addition & 1 deletion gradlew

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

31 changes: 10 additions & 21 deletions gradlew.bat

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions surf-chat-api/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,7 +1,15 @@
import dev.slne.surf.api.gradle.util.slneReleases

plugins {
id("dev.slne.surf.api.gradle.core")
}

surfCoreApi {
withCoreCommon()
}

publishing {
repositories {
slneReleases()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,12 @@ sealed class MessageValidationResult {
"Kein Inhalt"
)


class TooManyCaps : MessageValidationError(
buildText { error("Deine Nachricht enthält zu viele Großbuchstaben.") },
"Zu viele Großbuchstaben"
)

/**
*
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,19 +7,4 @@ import org.spongepowered.configurate.objectmapping.meta.Comment
data class ConnectionMessageConfig(
@field:Comment("Whether join and quit messages are shown in chat at all.")
val enabled: Boolean = true,

@field:Comment(
"Automatically suppresses join and quit messages for regular players\n" +
"when too many connection events occur within one minute.\n" +
"Players with the permission 'surf.chat.connection.always-show'\n" +
"are exempt and their messages are always displayed."
)
val autoDisableOnHighConnectionEventThreshold: Boolean = true,

@field:Comment(
"Maximum number of combined join and quit events per minute before\n" +
"connection messages are suppressed automatically.\n" +
"Only relevant when 'autoDisableOnHighConnectionEventThreshold' is true."
)
val connectionEventsPerMinuteThreshold: Int = 15,
)
Comment thread
TheBjoRedCraft marked this conversation as resolved.
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,6 @@ import org.spongepowered.configurate.objectmapping.ConfigSerializable
@ConfigSerializable
data class SpamConfig(
val amount: Int = 5,
val interval: Long = 3_000
val interval: Long = 3_000,
val maxUppercaseCharsInRow: Int = 5,
)
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,7 @@ object SettingsHook {

fun hasChatPingsEnabled(playerUuid: UUID): Boolean =
SurfSettingsApi.getSettingValue(playerUuid, SettingKeys.CHAT_PINGS)

fun hasConnectionMessagesEnabled(playerUuid: UUID): Boolean =
SurfSettingsApi.getSettingValue(playerUuid, SettingKeys.CONNECTION_MESSAGES)
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,19 @@ package dev.slne.surf.chat.paper.listener
import dev.slne.surf.api.core.messages.adventure.buildText
import dev.slne.surf.api.core.messages.adventure.sendText
import dev.slne.surf.api.core.minimessage.miniMessage
import dev.slne.surf.api.paper.util.forEachPlayer
import dev.slne.surf.chat.core.common.service.IgnoreService
import dev.slne.surf.chat.paper.hook.LuckPermsHook
import dev.slne.surf.chat.paper.hook.MiniPlaceholdersHook
import dev.slne.surf.chat.paper.hook.SettingsHook
import dev.slne.surf.chat.paper.message.MessageFormatter
import dev.slne.surf.chat.paper.permission.PermissionRegistry
import dev.slne.surf.chat.paper.plugin
import dev.slne.surf.chat.paper.service.ConnectionMessageService
import io.papermc.paper.event.connection.configuration.AsyncPlayerConnectionConfigureEvent
import kotlinx.coroutines.runBlocking
import net.kyori.adventure.text.Component
import org.bukkit.event.EventHandler
import org.bukkit.event.EventPriority
import org.bukkit.event.Listener
import org.bukkit.event.player.PlayerJoinEvent

Expand All @@ -28,17 +30,42 @@ object ConnectListener : Listener {
}
}

@EventHandler
@EventHandler(priority = EventPriority.HIGH)
fun onPlayerJoin(event: PlayerJoinEvent) {
ConnectionMessageService.recordEvent()
if (event.joinMessage() == null) {
return
}

event.joinMessage(null)

if (!plugin.connectionMessageConfig.enabled) {
return
}

val alwaysShow = event.player.hasPermission(PermissionRegistry.CONNECTION_MESSAGE_ALWAYS_SHOW)
val shouldShowMessage = alwaysShow || ConnectionMessageService.shouldShowConnectionMessage()
val message = buildJoinMessage(event)

if (shouldShowMessage) {
event.joinMessage(buildJoinMessage(event))
if (alwaysShow) {
forEachPlayer {
it.sendText {
append(message)
}
}
Comment thread
TheBjoRedCraft marked this conversation as resolved.
} else {
event.joinMessage(null)
forEachPlayer {
if (plugin.checkSettingsHook()) {
if (!SettingsHook.hasConnectionMessagesEnabled(it.uniqueId)) {
return@forEachPlayer
}
it.sendText {
append(message)
}
} else {
it.sendText {
append(message)
}
}
}
}

if (plugin.chatMotdConfig.enabled) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,33 +3,62 @@ package dev.slne.surf.chat.paper.listener
import com.destroystokyo.paper.event.player.PlayerConnectionCloseEvent
import com.github.shynixn.mccoroutine.folia.launch
import dev.slne.surf.api.core.messages.adventure.buildText
import dev.slne.surf.api.core.messages.adventure.sendText
import dev.slne.surf.api.core.minimessage.miniMessage
import dev.slne.surf.api.paper.util.forEachPlayer
import dev.slne.surf.chat.core.common.service.IgnoreService
import dev.slne.surf.chat.core.common.service.SpyService
import dev.slne.surf.chat.paper.hook.LuckPermsHook
import dev.slne.surf.chat.paper.hook.SettingsHook
import dev.slne.surf.chat.paper.message.MessageFormatter
import dev.slne.surf.chat.paper.permission.PermissionRegistry
import dev.slne.surf.chat.paper.plugin
import dev.slne.surf.chat.paper.service.ConnectionMessageService
import net.kyori.adventure.text.Component
import org.bukkit.event.EventHandler
import org.bukkit.event.EventPriority
import org.bukkit.event.Listener
import org.bukkit.event.player.PlayerQuitEvent

object DisconnectListener : Listener {
@EventHandler
@EventHandler(priority = EventPriority.HIGH)
fun onDisconnect(event: PlayerQuitEvent) {
MessageFormatter.dirty = true

ConnectionMessageService.recordEvent()
if (event.quitMessage() == null) {
return
}
Comment thread
TheBjoRedCraft marked this conversation as resolved.

event.quitMessage(null)

if (!plugin.connectionMessageConfig.enabled) {
return
}

val alwaysShow = event.player.hasPermission(PermissionRegistry.CONNECTION_MESSAGE_ALWAYS_SHOW)
val shouldShowMessage = alwaysShow || ConnectionMessageService.shouldShowConnectionMessage()

if (shouldShowMessage) {
event.quitMessage(buildQuitMessage(event))
val message = buildQuitMessage(event)

if (alwaysShow) {
forEachPlayer {
it.sendText {
append(message)
}
}
} else {
event.quitMessage(null)
forEachPlayer {
if (plugin.checkSettingsHook()) {
if (!SettingsHook.hasConnectionMessagesEnabled(it.uniqueId)) {
return@forEachPlayer
}
it.sendText {
append(message)
}
} else {
it.sendText {
append(message)
}
}
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,8 @@ object MessageFormatter {
append(
formatItemTag(
updateLinks(highlightPlayers(messageData.message, viewer)),
senderPlayer
senderPlayer,
viewer
)
)
hoverEvent(buildText { appendMessageData(senderPlayer.name, messageData) })
Expand Down Expand Up @@ -108,7 +109,7 @@ object MessageFormatter {
darkSpacer(" | ")
appendName(player)
darkSpacer(" >> ")
append(updateLinks(formatItemTag(messageData.message, player)))
append(updateLinks(formatItemTag(messageData.message, player, messageData.receiver)))

hoverEvent(buildText { appendMessageData(player.name, messageData) })
clickSuggestsCommand("/teamchat ")
Expand Down Expand Up @@ -140,7 +141,7 @@ object MessageFormatter {
}


private fun formatItemTag(rawMessage: Component, player: Player): Component {
private fun formatItemTag(rawMessage: Component, player: Player, viewer: UUID?): Component {
if (!plugin.surfChatConfig.config.itemPlaceholder) {
return rawMessage
}
Expand All @@ -152,11 +153,15 @@ object MessageFormatter {
return message
}


if (item.type == Material.AIR) {
player.sendText {
appendErrorPrefix()
error("Du hast kein Item in der Hand!")
if (viewer == null || player.uniqueId == viewer) {
player.sendText {
appendErrorPrefix()
error("Du hast kein Item in der Hand!")
}
}

return message
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,13 +32,34 @@ object MessageValidator {
}
}

if (hasTooManyCapsInARow(message)) {
return MessageValidationResult.Failure(MessageValidationResult.MessageValidationError.TooManyCaps())
}

if (message.isBlank()) {
return MessageValidationResult.Failure(MessageValidationResult.MessageValidationError.EmptyContent())
}

return MessageValidationResult.Success()
}

fun hasTooManyCapsInARow(message: String): Boolean {
var consecutiveCaps = 0

for (char in message) {
if (char.isUpperCase()) {
consecutiveCaps++
if (consecutiveCaps >= plugin.spamConfig.maxUppercaseCharsInRow) {
return true
}
} else {
consecutiveCaps = 0
}
}

return false
}
Comment thread
TheBjoRedCraft marked this conversation as resolved.


fun checkAutoDisabling(player: UUID): Boolean =
!player.hasPermission(PermissionRegistry.BYPASS_DISABLING)
Expand Down
Loading