leaveTravel()

This commit is contained in:
2022-04-18 01:45:11 +02:00
parent a4c84879d1
commit 1bc59e8539
5 changed files with 84 additions and 14 deletions

View File

@@ -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)
}
}

View File

@@ -0,0 +1,4 @@
package eu.fosil.okupamicoche.usecase
object Usecase {
}

View File

@@ -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

View File

@@ -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)

View File

@@ -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)
// )
}