From 1bc59e8539a601fcc9be49183b520f7998aece75 Mon Sep 17 00:00:00 2001 From: Eneko Nieto Date: Mon, 18 Apr 2022 01:45:11 +0200 Subject: [PATCH] leaveTravel() --- .../fosil/okupamicoche/cli/CommandParser.kt | 16 ++--- .../eu/fosil/okupamicoche/usecase/Usecase.kt | 4 ++ .../usecase/travel/createTravel.kt | 3 +- .../okupamicoche/usecase/travel/joinTravel.kt | 5 +- .../usecase/travel/leaveTravel.kt | 70 +++++++++++++++++++ 5 files changed, 84 insertions(+), 14 deletions(-) create mode 100644 src/main/kotlin/eu/fosil/okupamicoche/usecase/Usecase.kt create mode 100644 src/main/kotlin/eu/fosil/okupamicoche/usecase/travel/leaveTravel.kt diff --git a/src/main/kotlin/eu/fosil/okupamicoche/cli/CommandParser.kt b/src/main/kotlin/eu/fosil/okupamicoche/cli/CommandParser.kt index f3f500e..6f56406 100644 --- a/src/main/kotlin/eu/fosil/okupamicoche/cli/CommandParser.kt +++ b/src/main/kotlin/eu/fosil/okupamicoche/cli/CommandParser.kt @@ -2,8 +2,10 @@ package eu.fosil.okupamicoche.cli import eu.fosil.okupamicoche.matrix.matrixApiClient import eu.fosil.okupamicoche.model.TravelOptions +import eu.fosil.okupamicoche.usecase.Usecase import eu.fosil.okupamicoche.usecase.travel.createTravel import eu.fosil.okupamicoche.usecase.travel.joinTravel +import eu.fosil.okupamicoche.usecase.travel.leaveTravel import mu.KotlinLogging import net.folivo.trixnity.core.model.RoomId import net.folivo.trixnity.core.model.UserId @@ -41,7 +43,8 @@ object CommandParser { when (command) { "create" -> handleCreate(user, room, args) - "join" -> handleJoin(user, room) + "join" -> Usecase.joinTravel(room, user) + "leave" -> Usecase.leaveTravel(room, user) } } catch (e: Exception) { logger.error { "Exception captured: $e" } @@ -71,16 +74,7 @@ object CommandParser { description = args.subList(5, args.size).joinToString(" ") ) - createTravel(travelOptions, userId, roomId) - } - - private suspend fun handleJoin( - userId: UserId, - roomId: RoomId - ) { - - - joinTravel(roomId, userId) + Usecase.createTravel(travelOptions, userId, roomId) } } diff --git a/src/main/kotlin/eu/fosil/okupamicoche/usecase/Usecase.kt b/src/main/kotlin/eu/fosil/okupamicoche/usecase/Usecase.kt new file mode 100644 index 0000000..3179920 --- /dev/null +++ b/src/main/kotlin/eu/fosil/okupamicoche/usecase/Usecase.kt @@ -0,0 +1,4 @@ +package eu.fosil.okupamicoche.usecase + +object Usecase { +} diff --git a/src/main/kotlin/eu/fosil/okupamicoche/usecase/travel/createTravel.kt b/src/main/kotlin/eu/fosil/okupamicoche/usecase/travel/createTravel.kt index 10c7204..d025dbd 100644 --- a/src/main/kotlin/eu/fosil/okupamicoche/usecase/travel/createTravel.kt +++ b/src/main/kotlin/eu/fosil/okupamicoche/usecase/travel/createTravel.kt @@ -11,6 +11,7 @@ import eu.fosil.okupamicoche.matrix.event.state.TravelCreatedStateEventContent import eu.fosil.okupamicoche.matrix.matrixApiClient import eu.fosil.okupamicoche.model.Travel import eu.fosil.okupamicoche.model.TravelOptions +import eu.fosil.okupamicoche.usecase.Usecase import mu.KotlinLogging import net.folivo.trixnity.clientserverapi.model.rooms.DirectoryVisibility import net.folivo.trixnity.core.model.RoomAliasId @@ -31,7 +32,7 @@ data class RoomAliasAndName( val name: String ) -suspend fun createTravel( +suspend fun Usecase.createTravel( travelOptions: TravelOptions, driver: UserId, createdFromRoomId: RoomId diff --git a/src/main/kotlin/eu/fosil/okupamicoche/usecase/travel/joinTravel.kt b/src/main/kotlin/eu/fosil/okupamicoche/usecase/travel/joinTravel.kt index 56c79c5..94ba545 100644 --- a/src/main/kotlin/eu/fosil/okupamicoche/usecase/travel/joinTravel.kt +++ b/src/main/kotlin/eu/fosil/okupamicoche/usecase/travel/joinTravel.kt @@ -3,12 +3,13 @@ package eu.fosil.okupamicoche.usecase.travel import eu.fosil.okupamicoche.matrix.MatrixApiClient import eu.fosil.okupamicoche.matrix.event.state.MembershipStateEventContent import eu.fosil.okupamicoche.matrix.matrixApiClient +import eu.fosil.okupamicoche.usecase.Usecase import net.folivo.trixnity.core.model.RoomId import net.folivo.trixnity.core.model.UserId import net.folivo.trixnity.core.model.events.m.room.Membership import net.folivo.trixnity.core.model.events.m.room.RoomMessageEventContent -suspend fun joinTravel( +suspend fun Usecase.joinTravel( roomId: RoomId, userId: UserId ) { @@ -45,7 +46,7 @@ private suspend fun sendJoinedMessageEvents( // Send text message to travel room val displayName = MatrixApiClient.getDisplayName(userId) - val messageBody = "$displayName joined the travel." + val messageBody = "$displayName joined the travel!" matrixApiClient.rooms.sendMessageEvent( roomId, RoomMessageEventContent.TextMessageEventContent(messageBody) diff --git a/src/main/kotlin/eu/fosil/okupamicoche/usecase/travel/leaveTravel.kt b/src/main/kotlin/eu/fosil/okupamicoche/usecase/travel/leaveTravel.kt new file mode 100644 index 0000000..dcc7417 --- /dev/null +++ b/src/main/kotlin/eu/fosil/okupamicoche/usecase/travel/leaveTravel.kt @@ -0,0 +1,70 @@ +package eu.fosil.okupamicoche.usecase.travel + +import eu.fosil.okupamicoche.matrix.MatrixApiClient +import eu.fosil.okupamicoche.matrix.event.state.MembershipStateEventContent +import eu.fosil.okupamicoche.matrix.matrixApiClient +import eu.fosil.okupamicoche.usecase.Usecase +import net.folivo.trixnity.core.model.RoomId +import net.folivo.trixnity.core.model.UserId +import net.folivo.trixnity.core.model.events.m.room.Membership +import net.folivo.trixnity.core.model.events.m.room.RoomMessageEventContent + +suspend fun Usecase.leaveTravel( + roomId: RoomId, + userId: UserId +) { + requireNotNull(matrixApiClient) + val isTravel = MatrixApiClient.isTravel(roomId) + val isDriver = MatrixApiClient.isDriver(roomId, userId) + val membershipState = MatrixApiClient.getTravelMembership(roomId, userId) + + if (!isTravel) { + sendErrorTextMessage(roomId, "There is no travel.") + } else if (isDriver) { + sendErrorTextMessage(roomId, "You are the driver, you cannot leave. You can cancel the travel if you want.") + } else if (membershipState != Membership.JOIN.value) { + sendErrorTextMessage(roomId, "You are not joined. state=$membershipState") + } else if (membershipState == Membership.LEAVE.value) { + sendErrorTextMessage(roomId, "You already left.") + } else { + sendLeftMessageEvents(roomId, userId) + } +} + +private suspend fun sendErrorTextMessage(roomId: RoomId, messageBody: String) { + requireNotNull(matrixApiClient) + + matrixApiClient.rooms.sendMessageEvent( + roomId, + RoomMessageEventContent.TextMessageEventContent(messageBody) + ) +} + +private suspend fun sendLeftMessageEvents( + roomId: RoomId, + userId: UserId +) { + requireNotNull(matrixApiClient) + + // Send text message to travel room + val displayName = MatrixApiClient.getDisplayName(userId) + val messageBody = "$displayName left the travel." + matrixApiClient.rooms.sendMessageEvent( + roomId, + RoomMessageEventContent.TextMessageEventContent(messageBody) + ) + + // Send membership change state event to travel room + matrixApiClient.rooms.sendStateEvent( + roomId, + MembershipStateEventContent(userId, Membership.LEAVE), + stateKey = userId.full.substring(1) // Synapse throws 403 if stateKey starts with '@' + ).getOrThrow() + + // THIS EVENT IS SENT BY CLIENT, NO APP SERVICE + // Send new travel message event to main room +// matrixApiClient.rooms.sendMessageEvent( +// roomId, +// JoinTravelMessageEventContent(roomId, userId) +// ) +}