leaveTravel()
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
4
src/main/kotlin/eu/fosil/okupamicoche/usecase/Usecase.kt
Normal file
4
src/main/kotlin/eu/fosil/okupamicoche/usecase/Usecase.kt
Normal file
@@ -0,0 +1,4 @@
|
||||
package eu.fosil.okupamicoche.usecase
|
||||
|
||||
object Usecase {
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
// )
|
||||
}
|
||||
Reference in New Issue
Block a user