Skip to content

Commit 9e68bcd

Browse files
authored
Fix wrong detection online players (#6)
1 parent 3be9419 commit 9e68bcd

2 files changed

Lines changed: 35 additions & 37 deletions

File tree

modules/listener/src/main/kotlin/com/imedvedev/minecraft/notification/bot/listener/NotificationEventListener.kt

Lines changed: 33 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -8,65 +8,64 @@ import org.bukkit.entity.Player
88
import org.bukkit.event.EventHandler
99
import org.bukkit.event.EventPriority
1010
import org.bukkit.event.Listener
11-
import org.bukkit.event.player.PlayerJoinEvent
1211
import org.bukkit.event.player.PlayerQuitEvent
13-
import java.util.UUID
14-
import java.util.concurrent.ConcurrentHashMap
1512
import java.util.logging.Level
1613
import java.util.logging.Logger
14+
import kotlin.collections.LinkedHashMap
1715

1816
class NotificationEventListener(private val joinedMessage: String,
1917
private val leftMessage: String,
2018
private val onlineMessage: String,
2119
private val messenger: Messenger,
22-
private val onlinePlayers: () -> Iterable<Player>,
2320
private val authMeApi: AuthMeApi,
2421
private val logger: Logger,
2522
private val quarantineScheduler: (() -> Unit) -> Unit) : Listener {
26-
private val quarantine: MutableMap<String, UUID> = ConcurrentHashMap()
27-
28-
@EventHandler(priority = EventPriority.MONITOR)
29-
fun onJoin(event: PlayerJoinEvent) {
30-
event.player.takeIf(authMeApi::isAuthenticated)?.joinNotification()
31-
}
32-
33-
@EventHandler(priority = EventPriority.MONITOR)
34-
fun onQuit(event: PlayerQuitEvent) {
35-
event.player.takeIf(authMeApi::isAuthenticated)?.leftNotification()
36-
}
23+
private val onlinePlayers: MutableMap<String, Int> = LinkedHashMap()
3724

3825
@EventHandler(priority = EventPriority.MONITOR)
3926
fun onLogin(event: LoginEvent) {
40-
event.player.takeIf(Player::isOnline)?.joinNotification()
27+
event.player.takeIf(Player::isOnline)?.run {
28+
if (onlinePlayers.put(name, entityId) == null) {
29+
logger.log(Level.INFO) { "$name joined the game. " +
30+
"Server is sending notification" }
31+
sendNotification(joinedMessage)
32+
} else {
33+
logger.log(Level.INFO) { "$name joined the game when was quarantined. " +
34+
"Server is not sending notification" }
35+
}
36+
}
4137
}
4238

4339
@EventHandler(priority = EventPriority.MONITOR)
4440
fun onLogout(event: LogoutEvent) {
45-
event.player.takeIf(Player::isOnline)?.leftNotification()
46-
}
47-
48-
private fun Player.joinNotification() {
49-
if (quarantine.remove(name) == null) {
50-
notification(joinedMessage, onlinePlayers().filter(authMeApi::isAuthenticated).map(Player::getName))
41+
event.player.takeIf(Player::isOnline)?.run {
42+
onlinePlayers.remove(name)
43+
logger.log(Level.INFO) { "$name left the game. " +
44+
"Server is sending notification" }
45+
sendNotification(leftMessage)
5146
}
5247
}
5348

54-
private fun Player.leftNotification() {
55-
val quarantineId = UUID.randomUUID()
56-
quarantine[name] = quarantineId
57-
onlinePlayers().filter { this != it }.filter(authMeApi::isAuthenticated).let { onlinePlayers ->
49+
@EventHandler(priority = EventPriority.MONITOR)
50+
fun onQuit(event: PlayerQuitEvent) {
51+
event.player.takeIf(authMeApi::isAuthenticated)?.run {
52+
logger.log(Level.INFO) { "$name has been quarantined" }
5853
quarantineScheduler.invoke {
59-
if (quarantine.remove(name, quarantineId)) {
60-
onlinePlayers.plus(onlinePlayers().filter(authMeApi::isAuthenticated))
61-
.map(Player::getName)
62-
.distinct()
63-
.let { onlinePlayers -> notification(leftMessage, onlinePlayers) }
54+
if (onlinePlayers.remove(name, entityId)) {
55+
logger.log(Level.INFO) { "Quarantine has been finished. $name left the game. " +
56+
"Server is sending notification" }
57+
sendNotification(leftMessage)
58+
} else {
59+
logger.log(Level.INFO) { "Quarantine has been finished. $name already joined the game again. " +
60+
"Server is not sending notification" }
6461
}
6562
}
6663
}
6764
}
6865

69-
private fun Player.notification(message: String, onlinePlayers: Iterable<String>) = messenger
70-
.send("<b>$name $message</b>\n$onlineMessage: ${onlinePlayers.map { "<i>$it</i>" }}")
71-
.forEach { job -> job.exceptionally { e -> logger.log(Level.WARNING, "Can not send the message", e) } }
66+
private fun Player.sendNotification(message: String) = messenger
67+
.send("<b>$name $message</b>\n$onlineMessage: ${onlinePlayers.keys.map { "<i>${it}</i>" }}")
68+
.forEach { job -> job.exceptionally { exception -> logger.log(Level.WARNING, exception) {
69+
"Server can not send the notification: \"$message\""
70+
} } }
7271
}

modules/plugin/src/main/kotlin/com/imedvedev/minecraft/notification/bot/injector/module/NotificationEventListenerModule.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,10 @@ val notificationEventListenerModule = module(true) {
1414
config.getString("left")!!,
1515
config.getString("online")!!,
1616
get(),
17-
plugin.server::getOnlinePlayers,
1817
AuthMeApi.getInstance(),
1918
plugin.logger,
20-
config.getLong("leftMessageQuarantineInTicks").let { delay ->
21-
{ task: () -> Unit -> plugin.server.scheduler.runTaskLater(plugin, task, delay).let { Unit } }
19+
config.getLong("leftMessageQuarantineInTicks").let<Long, (() -> Unit) -> Unit> { delay ->
20+
{ task -> plugin.server.scheduler.runTaskLater(plugin, task, delay) }
2221
}
2322
)
2423
} }

0 commit comments

Comments
 (0)