@@ -8,65 +8,64 @@ import org.bukkit.entity.Player
88import org.bukkit.event.EventHandler
99import org.bukkit.event.EventPriority
1010import org.bukkit.event.Listener
11- import org.bukkit.event.player.PlayerJoinEvent
1211import org.bukkit.event.player.PlayerQuitEvent
13- import java.util.UUID
14- import java.util.concurrent.ConcurrentHashMap
1512import java.util.logging.Level
1613import java.util.logging.Logger
14+ import kotlin.collections.LinkedHashMap
1715
1816class 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}
0 commit comments