Skip to content

Commit bfe9fea

Browse files
committed
Implement LaunchURL tag handler
1 parent 66b18e5 commit bfe9fea

File tree

9 files changed

+61
-0
lines changed

9 files changed

+61
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package warlockfe.warlock3.compose.util
2+
3+
import java.net.URL
4+
5+
actual fun openUrl(url: URL) {
6+
TODO("Not yet implemented")
7+
}

compose/src/commonMain/kotlin/warlockfe/warlock3/compose/ui/game/GameViewModel.kt

+6
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,11 @@ import warlockfe.warlock3.compose.ui.window.WindowLine
5555
import warlockfe.warlock3.compose.ui.window.WindowUiState
5656
import warlockfe.warlock3.compose.util.getEntireLineStyles
5757
import warlockfe.warlock3.compose.util.highlight
58+
import warlockfe.warlock3.compose.util.openUrl
5859
import warlockfe.warlock3.compose.util.toAnnotatedString
5960
import warlockfe.warlock3.compose.util.toSpanStyle
6061
import warlockfe.warlock3.core.client.ClientCompassEvent
62+
import warlockfe.warlock3.core.client.ClientOpenUrlEvent
6163
import warlockfe.warlock3.core.client.ClientProgressBarEvent
6264
import warlockfe.warlock3.core.client.GameCharacter
6365
import warlockfe.warlock3.core.client.ProgressBarData
@@ -361,6 +363,10 @@ class GameViewModel(
361363
_compassState.value = CompassState(directions = event.directions.toSet())
362364
}
363365

366+
is ClientOpenUrlEvent -> {
367+
openUrl(event.url)
368+
}
369+
364370
else -> {
365371
// don't care
366372
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package warlockfe.warlock3.compose.util
2+
3+
import java.net.URL
4+
5+
expect fun openUrl(url: URL)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package warlockfe.warlock3.compose.util
2+
3+
import java.awt.Desktop
4+
import java.net.URL
5+
6+
actual fun openUrl(url: URL) {
7+
try {
8+
Desktop.getDesktop().browse(url.toURI())
9+
} catch (_: Exception) {
10+
// Silently ignore problems
11+
}
12+
}

core/src/commonMain/kotlin/warlockfe/warlock3/core/client/ClientEvent.kt

+2
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@ package warlockfe.warlock3.core.client
22

33
import warlockfe.warlock3.core.compass.DirectionType
44
import kotlinx.collections.immutable.ImmutableSet
5+
import java.net.URL
56

67
sealed interface ClientEvent
78
data class ClientTextEvent(val text: String) : ClientEvent
89
data class ClientProgressBarEvent(val progressBarData: ProgressBarData) : ClientEvent
910
data class ClientCompassEvent(val directions: ImmutableSet<DirectionType>) : ClientEvent
1011
data object ClientNavEvent : ClientEvent
1112
data object ClientPromptEvent : ClientEvent
13+
data class ClientOpenUrlEvent(val url: URL) : ClientEvent

stormfront/src/main/kotlin/warlockfe/warlock3/stormfront/network/StormfrontClient.kt

+12
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import okio.Path
3636
import warlockfe.warlock3.core.client.ClientCompassEvent
3737
import warlockfe.warlock3.core.client.ClientEvent
3838
import warlockfe.warlock3.core.client.ClientNavEvent
39+
import warlockfe.warlock3.core.client.ClientOpenUrlEvent
3940
import warlockfe.warlock3.core.client.ClientProgressBarEvent
4041
import warlockfe.warlock3.core.client.ClientPromptEvent
4142
import warlockfe.warlock3.core.client.ClientTextEvent
@@ -69,6 +70,7 @@ import warlockfe.warlock3.stormfront.protocol.StormfrontEolEvent
6970
import warlockfe.warlock3.stormfront.protocol.StormfrontHandledEvent
7071
import warlockfe.warlock3.stormfront.protocol.StormfrontModeEvent
7172
import warlockfe.warlock3.stormfront.protocol.StormfrontNavEvent
73+
import warlockfe.warlock3.stormfront.protocol.StormfrontOpenUrlEvent
7274
import warlockfe.warlock3.stormfront.protocol.StormfrontOutputEvent
7375
import warlockfe.warlock3.stormfront.protocol.StormfrontParseErrorEvent
7476
import warlockfe.warlock3.stormfront.protocol.StormfrontPopStyleEvent
@@ -93,6 +95,7 @@ import java.io.InputStreamReader
9395
import java.net.Socket
9496
import java.net.SocketException
9597
import java.net.SocketTimeoutException
98+
import java.net.URL
9699
import java.nio.charset.Charset
97100
import java.util.*
98101
import java.util.concurrent.ConcurrentHashMap
@@ -459,6 +462,15 @@ class StormfrontClient(
459462
)
460463
}
461464

465+
is StormfrontOpenUrlEvent -> {
466+
try {
467+
val url = URL(URL("https://www.play.net/"), event.url)
468+
notifyListeners(ClientOpenUrlEvent(url))
469+
} catch (_: Exception) {
470+
// Silently ignore exceptions
471+
}
472+
}
473+
462474
is StormfrontUnhandledTagEvent -> {
463475
debug("Unhandled tag: ${event.tag}")
464476
}

stormfront/src/main/kotlin/warlockfe/warlock3/stormfront/protocol/StormfrontEvent.kt

+1
Original file line numberDiff line numberDiff line change
@@ -40,5 +40,6 @@ object StormfrontHandledEvent : StormfrontEvent
4040
data class StormfrontStreamWindowEvent(val window: StormfrontWindow) : StormfrontEvent
4141
object StormfrontNavEvent : StormfrontEvent
4242
data class StormfrontActionEvent(val text: String, val command: String) : StormfrontEvent
43+
data class StormfrontOpenUrlEvent(val url: String) : StormfrontEvent
4344
data class StormfrontParseErrorEvent(val text: String) : StormfrontEvent
4445
data class StormfrontUnhandledTagEvent(val tag: String) : StormfrontEvent

stormfront/src/main/kotlin/warlockfe/warlock3/stormfront/protocol/StormfrontProtocolHandler.kt

+2
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import warlockfe.warlock3.stormfront.protocol.elements.DirHandler
2121
import warlockfe.warlock3.stormfront.protocol.elements.DynaStreamHandler
2222
import warlockfe.warlock3.stormfront.protocol.elements.IndicatorHandler
2323
import warlockfe.warlock3.stormfront.protocol.elements.InvHandler
24+
import warlockfe.warlock3.stormfront.protocol.elements.LaunchURLHandler
2425
import warlockfe.warlock3.stormfront.protocol.elements.LeftHandler
2526
import warlockfe.warlock3.stormfront.protocol.elements.ModeHandler
2627
import warlockfe.warlock3.stormfront.protocol.elements.NavHandler
@@ -62,6 +63,7 @@ class StormfrontProtocolHandler {
6263
"dynastream" to DynaStreamHandler(),
6364
"indicator" to IndicatorHandler(),
6465
"inv" to InvHandler(),
66+
"launchurl" to LaunchURLHandler(),
6567
"left" to LeftHandler(),
6668
"mode" to ModeHandler(),
6769
"nav" to NavHandler(),
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package warlockfe.warlock3.stormfront.protocol.elements
2+
3+
import warlockfe.warlock3.stormfront.protocol.BaseElementListener
4+
import warlockfe.warlock3.stormfront.protocol.StartElement
5+
import warlockfe.warlock3.stormfront.protocol.StormfrontEvent
6+
import warlockfe.warlock3.stormfront.protocol.StormfrontOpenUrlEvent
7+
8+
class LaunchURLHandler : BaseElementListener() {
9+
override fun startElement(element: StartElement): StormfrontEvent? {
10+
return element.attributes["src"]?.let {
11+
StormfrontOpenUrlEvent(it)
12+
}
13+
}
14+
}

0 commit comments

Comments
 (0)