Skip to content

Commit 38d68ce

Browse files
committed
Fixed crash issue where con() becomes null during sending message
1 parent 1f0fea7 commit 38d68ce

5 files changed

Lines changed: 100 additions & 35 deletions

File tree

Essential/src/main/kotlin/essential/common/database/data/PlayerData.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -117,13 +117,13 @@ data class PlayerData(
117117

118118
fun send(key: String, vararg args: Any) {
119119
val message = bundle.get(key, *args)
120-
player.sendMessage(message)
120+
if (player.con() != null) player.sendMessage(message)
121121
lastReceivedMessage = message
122122
}
123123

124124
fun err(key: String, vararg args: Any) {
125125
val message = "[scarlet]" + bundle.get(key, *args)
126-
player.sendMessage(message)
126+
if (player.con() != null) player.sendMessage(message)
127127
lastReceivedMessage = message
128128
}
129129

@@ -139,7 +139,7 @@ data class PlayerData(
139139
* @param message The message to send
140140
*/
141141
fun sendDirect(message: String) {
142-
player.sendMessage(message)
142+
if (player.con() != null) player.sendMessage(message)
143143
lastReceivedMessage = message
144144
}
145145
}

Essential/src/main/kotlin/essential/core/CoreEvent.kt

Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -510,23 +510,42 @@ fun serverLoad(event: ServerLoadEvent) {
510510
Events.on(PlayerJoin::class.java, Cons<PlayerJoin> {
511511
it.player.admin(false)
512512

513+
val player = it.player
514+
val uuid = player.uuid()
515+
val name = player.name
516+
val locale = player.locale()
517+
val con = player.con
518+
513519
scope.launch {
514-
val data = getPlayerData(it.player.uuid())
520+
val data = getPlayerData(uuid)
515521

516522
if (data == null) {
517-
if (suspendTransaction {
518-
PlayerTable.select(PlayerTable.name).where { PlayerTable.name eq it.player.name }.empty()
519-
}) {
520-
val data = createPlayerData(it.player)
521-
data.permission = "user"
522-
data.player = it.player
523-
Events.fire(CustomEvents.PlayerDataLoad(data))
523+
val nameExists = suspendTransaction {
524+
PlayerTable.select(PlayerTable.name).where { PlayerTable.name eq name }.empty().not()
525+
}
526+
if (!nameExists) {
527+
val newData = createPlayerData(player)
528+
newData.permission = "user"
529+
newData.player = player
530+
Core.app.post {
531+
val activePlayer = Groups.player.find { p -> p.uuid() == uuid }
532+
if (activePlayer != null) {
533+
Events.fire(CustomEvents.PlayerDataLoad(newData))
534+
}
535+
}
524536
} else {
525-
Call.kick(it.player.con, Bundle(it.player.locale)["event.player.name.duplicate"])
537+
Core.app.post {
538+
Call.kick(con, Bundle(locale)["event.player.name.duplicate"])
539+
}
526540
}
527541
} else {
528-
data.player = it.player
529-
Events.fire(CustomEvents.PlayerDataLoad(data))
542+
data.player = player
543+
Core.app.post {
544+
val activePlayer = Groups.player.find { p -> p.uuid() == uuid }
545+
if (activePlayer != null) {
546+
Events.fire(CustomEvents.PlayerDataLoad(data))
547+
}
548+
}
530549
}
531550
}
532551
}.also { listener -> eventListeners[PlayerJoin::class.java] = listener })

Essential/src/main/kotlin/essential/core/Trigger.kt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -625,12 +625,13 @@ class Trigger {
625625
it.afk = true
626626
if (conf.feature.afk.enabled) {
627627
if (conf.feature.afk.server == null) {
628-
629-
it.player.kick(it.bundle["event.player.afk"])
630-
628+
val kickedName = it.player.plainName()
631629
players.forEach { data ->
632-
data.send("event.player.afk.other", it.player.plainName())
630+
if (data.uuid != it.uuid) {
631+
data.send("event.player.afk.other", kickedName)
632+
}
633633
}
634+
it.player.kick(it.bundle["event.player.afk"])
634635
} else {
635636
val server = conf.feature.afk.server!!.split(":")
636637
val port = if (server.size == 1) {

Essential/src/main/kotlin/essential/core/service/protect/Commands.kt

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import essential.core.service.protect.ProtectService.Companion.conf
1818
import kotlinx.coroutines.launch
1919
import ksp.command.ClientCommand
2020
import mindustry.Vars
21+
import mindustry.gen.Groups
2122
import mindustry.net.Administration.PlayerInfo
2223
import org.jetbrains.exposed.v1.core.eq
2324
import org.jetbrains.exposed.v1.r2dbc.select
@@ -87,8 +88,11 @@ class Commands {
8788
rebindAccountUuid(target.id, currentUuid)
8889
target.uuid = currentUuid
8990
Core.app.post {
90-
Events.fire(CustomEvents.PlayerDataLoad(target))
91-
player.sendMessage(bundle["command.login.success"])
91+
val activePlayer = Groups.player.find { p -> p.uuid() == currentUuid }
92+
if (activePlayer != null) {
93+
Events.fire(CustomEvents.PlayerDataLoad(target))
94+
activePlayer.sendMessage(bundle["command.login.success"])
95+
}
9296
}
9397
} catch (e: Exception) {
9498
Log.err("Failed to login account ${arg[0]}", e)
@@ -147,8 +151,11 @@ class Commands {
147151
}
148152
Log.info(bundle["log.data_created", player.plainName()])
149153
Core.app.post {
150-
Events.fire(CustomEvents.PlayerDataLoad(data))
151-
player.sendMessage(bundle["command.reg.success"])
154+
val activePlayer = Groups.player.find { p -> p.uuid() == currentUuid }
155+
if (activePlayer != null) {
156+
Events.fire(CustomEvents.PlayerDataLoad(data))
157+
activePlayer.sendMessage(bundle["command.reg.success"])
158+
}
152159
}
153160
}
154161
}

Essential/src/main/kotlin/essential/core/service/protect/ProtectEvent.kt

Lines changed: 51 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -144,57 +144,95 @@ fun config(e: EventType.ConfigEvent) {
144144
@Event
145145
fun playerJoin(e: EventType.PlayerJoin) {
146146
e.player.admin(false)
147+
val player = e.player
148+
val uuid = player.uuid()
149+
val plainName = player.plainName()
150+
val locale = player.locale
151+
val con = player.con
152+
147153
scope.launch {
148-
val data: PlayerData? = getPlayerData(e.player.uuid())
154+
val data: PlayerData? = getPlayerData(uuid)
155+
if (data != null) {
156+
data.player = player
157+
}
149158
if (conf.account.getAuthType() == ProtectConfig.AuthType.None || !conf.account.enabled) {
150159
if (data == null) {
151160
val exists = suspendTransaction {
152161
!PlayerTable
153162
.select(PlayerTable.name)
154-
.where { PlayerTable.name eq e.player.plainName() }
163+
.where { PlayerTable.name eq plainName }
155164
.empty()
156165
}
157166

158167
if (!exists) {
159168
try {
160-
val newData = createPlayerData(e.player)
169+
val newData = createPlayerData(player)
161170
newData.permission = "user"
162171
newData.update()
163-
Events.fire(CustomEvents.PlayerDataLoad(newData))
172+
arc.Core.app.post {
173+
val activePlayer = Groups.player.find { p -> p.uuid() == uuid }
174+
if (activePlayer != null) {
175+
Events.fire(CustomEvents.PlayerDataLoad(newData))
176+
}
177+
}
164178
} catch (e: Exception) {
165179
Log.err("Failed to create player data", e)
166180
}
167181
} else {
168-
val reason = Bundle(e.player.locale)["event.player.name.duplicate"]
169-
e.player.con.kick(reason, 0L)
182+
val reason = Bundle(locale)["event.player.name.duplicate"]
183+
arc.Core.app.post {
184+
con.kick(reason, 0L)
185+
}
170186
}
171187
} else {
172-
Events.fire(CustomEvents.PlayerDataLoad(data))
188+
arc.Core.app.post {
189+
val activePlayer = Groups.player.find { p -> p.uuid() == uuid }
190+
if (activePlayer != null) {
191+
Events.fire(CustomEvents.PlayerDataLoad(data))
192+
}
193+
}
173194
}
174195
} else if (conf.account.getAuthType() == ProtectConfig.AuthType.Discord) {
175196
if (data == null) {
176197
val exists = suspendTransaction {
177198
!PlayerTable
178199
.select(PlayerTable.name)
179-
.where { PlayerTable.name eq e.player.plainName() }
200+
.where { PlayerTable.name eq plainName }
180201
.empty()
181202
}
182203

183204
if (!exists) {
184205
//data.send("event.discord.not.registered")
185206
// TODO discord 로그인 추가
186207
} else {
187-
val reason = Bundle(e.player.locale)["event.player.name.duplicate"]
188-
e.player.con.kick(reason, 0L)
208+
val reason = Bundle(locale)["event.player.name.duplicate"]
209+
arc.Core.app.post {
210+
con.kick(reason, 0L)
211+
}
189212
}
190213
} else {
191-
Events.fire(CustomEvents.PlayerDataLoad(data))
214+
arc.Core.app.post {
215+
val activePlayer = Groups.player.find { p -> p.uuid() == uuid }
216+
if (activePlayer != null) {
217+
Events.fire(CustomEvents.PlayerDataLoad(data))
218+
}
219+
}
192220
}
193221
} else {
194222
if (data != null) {
195-
Events.fire(CustomEvents.PlayerDataLoad(data))
223+
arc.Core.app.post {
224+
val activePlayer = Groups.player.find { p -> p.uuid() == uuid }
225+
if (activePlayer != null) {
226+
Events.fire(CustomEvents.PlayerDataLoad(data))
227+
}
228+
}
196229
} else {
197-
e.player.sendMessage(Bundle(e.player.locale)["event.player.first.register"])
230+
arc.Core.app.post {
231+
val activePlayer = Groups.player.find { p -> p.uuid() == uuid }
232+
if (activePlayer != null) {
233+
activePlayer.sendMessage(Bundle(locale)["event.player.first.register"])
234+
}
235+
}
198236
}
199237
}
200238
}

0 commit comments

Comments
 (0)