Skip to content

Commit a36b951

Browse files
refactor: replace mutableObjectSetOf with mutableObject2ObjectMapOf for entries, clean up unused utilities, and optimize tablist management logic
1 parent f4ad73c commit a36b951

File tree

3 files changed

+23
-71
lines changed

3 files changed

+23
-71
lines changed

surf-tab-velocity/src/main/kotlin/dev/slne/surf/tab/velocity/redis/TabRedisEventListener.kt

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,10 @@ object TabRedisEventListener {
1717
val seenServers = tablistService.getSeenServers(server)
1818
val visiblePlayers = seenServers.flatMap { it.playersConnected }
1919

20-
tablistService.entries.add(event.tabEntry)
20+
seenServers.forEach {
21+
tablistService.entries[it] =
22+
tablistService.entries.getOrDefault(it, mutableListOf()) + event.tabEntry
23+
}
2124

2225
visiblePlayers.forEach {
2326
tablistService.addPlayer(it, event.tabEntry)
@@ -26,12 +29,18 @@ object TabRedisEventListener {
2629

2730
@OnRedisEvent
2831
fun onTabEntryRemove(event: TabEntryRemoveRedisEvent) {
29-
println("Removing tab entry for UUID ${event.profileUuid} from tablist via Redis event")
3032
val server = event.baseServer
3133
val seenServers = tablistService.getSeenServers(server)
3234
val visiblePlayers = seenServers.flatMap { it.playersConnected }
3335

34-
tablistService.entries.removeIf { it.profile.uuid == event.profileUuid }
36+
seenServers.forEach { server ->
37+
tablistService.entries[server]?.forEach {
38+
if (it.profile.uuid == event.profileUuid) {
39+
tablistService.entries[server] =
40+
tablistService.entries[server]?.filter { entry -> entry.profile.uuid != event.profileUuid }
41+
}
42+
}
43+
}
3544

3645
visiblePlayers.forEach {
3746
tablistService.removePlayer(it, event.profileUuid)
@@ -47,7 +56,9 @@ object TabRedisEventListener {
4756
@OnRedisEvent
4857
fun onTabShow(event: TabShowRedisEvent) {
4958
val player = plugin.proxy.getPlayer(event.player).getOrNull() ?: return
50-
val entry = tablistService.entries.find { it.profile.uuid == event.toShow } ?: return
59+
val server = player.currentServer.getOrNull()?.server ?: return
60+
val entry =
61+
tablistService.entries[server]?.find { it.profile.uuid == event.toShow } ?: return
5162

5263
player.tabList.addEntry(entry.toVelocity(player.tabList))
5364
}

surf-tab-velocity/src/main/kotlin/dev/slne/surf/tab/velocity/service/TablistService.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package dev.slne.surf.tab.velocity.service
22

33
import com.velocitypowered.api.proxy.Player
44
import com.velocitypowered.api.proxy.server.RegisteredServer
5-
import dev.slne.surf.surfapi.core.api.util.mutableObjectSetOf
5+
import dev.slne.surf.surfapi.core.api.util.mutableObject2ObjectMapOf
66
import dev.slne.surf.tab.api.entry.TabEntry
77
import dev.slne.surf.tab.api.entry.TabGameMode
88
import dev.slne.surf.tab.velocity.hook.LuckPermsHook
@@ -12,11 +12,12 @@ import dev.slne.surf.tab.velocity.util.getServers
1212
import dev.slne.surf.tab.velocity.util.toTabProfile
1313
import dev.slne.surf.tab.velocity.util.toVelocity
1414
import java.util.*
15+
import kotlin.jvm.optionals.getOrNull
1516

1617
val tablistService = VelocityTablistService()
1718

1819
class VelocityTablistService {
19-
val entries = mutableObjectSetOf<TabEntry>()
20+
val entries = mutableObject2ObjectMapOf<RegisteredServer, List<TabEntry>>()
2021

2122
fun addPlayer(viewer: Player, entry: TabEntry) {
2223
viewer.tabList.addEntry(entry.toVelocity(viewer.tabList))
@@ -34,7 +35,8 @@ class VelocityTablistService {
3435
}
3536

3637
fun sendCurrentTablist(player: Player) {
37-
entries.forEach { entry ->
38+
val currentServer = player.currentServer.getOrNull()?.server ?: return
39+
entries[currentServer]?.forEach { entry ->
3840
addPlayer(player, entry)
3941
}
4042
}

surf-tab-velocity/src/main/kotlin/dev/slne/surf/tab/velocity/util/formatting-util.kt

Lines changed: 3 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,14 @@ import dev.slne.surf.surfapi.core.api.messages.adventure.buildText
55
import dev.slne.surf.tab.api.entry.TabGroup
66
import dev.slne.surf.tab.velocity.plugin
77
import io.github.miniplaceholders.api.MiniPlaceholders
8-
import io.github.miniplaceholders.api.types.RelationalAudience
9-
import net.kyori.adventure.audience.Audience
10-
import net.kyori.adventure.text.Component
11-
import net.kyori.adventure.text.format.TextColor
128
import net.kyori.adventure.text.minimessage.MiniMessage
13-
import net.kyori.adventure.text.minimessage.tag.Tag
149
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver
1510
import java.time.ZonedDateTime
1611
import java.time.format.DateTimeFormatter
1712
import kotlin.jvm.optionals.getOrNull
1813

1914
private val dateFormatter = DateTimeFormatter.ofPattern("dd.MM.yyyy")
2015
private val timeFormatter = DateTimeFormatter.ofPattern("HH:mm")
21-
private val miniMessage = MiniMessage.miniMessage()
2216
private val globalResolver = TagResolver.resolver(
2317
MiniPlaceholders.globalPlaceholders(),
2418
MiniPlaceholders.audiencePlaceholders(),
@@ -27,49 +21,8 @@ private val globalResolver = TagResolver.resolver(
2721
MiniPlaceholders.audienceGlobalPlaceholders()
2822
)
2923

30-
private fun dynamicResolver(player: Player): TagResolver =
31-
TagResolver.resolver(
32-
TagResolver.resolver("server") { _, _ ->
33-
val name = player.currentServer
34-
.getOrNull()?.server?.serverInfo?.name ?: "N/A"
35-
Tag.inserting {
36-
buildText { info(name) }
37-
}
38-
},
39-
TagResolver.resolver("players_online") { _, _ ->
40-
Tag.inserting {
41-
buildText { info(plugin.proxy.playerCount) }
42-
}
43-
},
44-
TagResolver.resolver("players_max") { _, _ ->
45-
Tag.inserting {
46-
buildText { info(plugin.proxy.configuration.showMaxPlayers) }
47-
}
48-
},
49-
TagResolver.resolver("date") { _, _ ->
50-
Tag.inserting {
51-
buildText { info(nowDate()) }
52-
}
53-
},
54-
TagResolver.resolver("time") { _, _ ->
55-
Tag.inserting {
56-
buildText { info(nowTime()) }
57-
}
58-
}
59-
)
60-
61-
62-
fun String.formatWithAdventure(player: Player, other: Audience? = null): Component {
63-
if (other != null) {
64-
return MiniMessage.miniMessage()
65-
.deserialize(
66-
this,
67-
RelationalAudience(player, other),
68-
TagResolver.resolver(globalResolver)
69-
)
70-
}
71-
72-
return MiniMessage.miniMessage().deserialize(this, player, TagResolver.resolver(globalResolver))
24+
fun String.formatWithAdventure(player: Player) =
25+
MiniMessage.miniMessage().deserialize(this, player, TagResolver.resolver(globalResolver))
7326
.replaceText {
7427
it.matchLiteral("<server>")
7528
it.replacement(buildText {
@@ -83,7 +36,7 @@ fun String.formatWithAdventure(player: Player, other: Audience? = null): Compone
8336
it.matchLiteral("<players_online>")
8437
it.replacement(buildText {
8538
info(
86-
plugin.proxy.allPlayers.size
39+
plugin.proxy.playerCount
8740
)
8841
})
8942
}
@@ -107,7 +60,6 @@ fun String.formatWithAdventure(player: Player, other: Audience? = null): Compone
10760
info(ZonedDateTime.now().format(timeFormatter))
10861
})
10962
}
110-
}
11163

11264
@Volatile
11365
private var cachedMinute = -1
@@ -128,17 +80,4 @@ private fun updateTimeCache() {
12880
}
12981
}
13082

131-
private fun nowDate(): String {
132-
updateTimeCache()
133-
return cachedDate
134-
}
135-
136-
private fun nowTime(): String {
137-
updateTimeCache()
138-
return cachedTime
139-
}
140-
141-
142-
fun TextColor.mm() = "<${this.asHexString()}>"
143-
14483
fun TabGroup.getServers() = clients.mapNotNull { plugin.proxy.getServer(it).getOrNull() }

0 commit comments

Comments
 (0)