From cc1de1d2d23364292296b8efe2046d40f2fa1151 Mon Sep 17 00:00:00 2001 From: Eneko Nieto Date: Sat, 23 Apr 2022 23:41:09 +0200 Subject: [PATCH] cancelTravel: WIP --- .../okupamicoche/matrix/MatrixApiClient.kt | 8 ++++ .../TravelCreatedMessageEventContent.kt | 10 +++-- .../usecase/travel/cancelTravel.kt | 37 ++++++++++++++++++- .../usecase/travel/createTravel.kt | 10 ++--- 4 files changed, 55 insertions(+), 10 deletions(-) diff --git a/src/main/kotlin/eu/fosil/okupamicoche/matrix/MatrixApiClient.kt b/src/main/kotlin/eu/fosil/okupamicoche/matrix/MatrixApiClient.kt index 6a5e05e..889bd60 100644 --- a/src/main/kotlin/eu/fosil/okupamicoche/matrix/MatrixApiClient.kt +++ b/src/main/kotlin/eu/fosil/okupamicoche/matrix/MatrixApiClient.kt @@ -69,6 +69,14 @@ object MatrixApiClient { } } + suspend fun removeRoomAliases( + roomId: RoomId + ) { + MatrixApiClient.client.rooms.getRoomAliases(roomId).getOrNull()?.forEach { alias -> + MatrixApiClient.client.rooms.deleteRoomAlias(alias) + } + } + private suspend fun createMainRoomIfNeeded(config: Config): RoomId? { val mainRoomId: RoomId? diff --git a/src/main/kotlin/eu/fosil/okupamicoche/matrix/event/message/TravelCreatedMessageEventContent.kt b/src/main/kotlin/eu/fosil/okupamicoche/matrix/event/message/TravelCreatedMessageEventContent.kt index f3418b8..2122399 100644 --- a/src/main/kotlin/eu/fosil/okupamicoche/matrix/event/message/TravelCreatedMessageEventContent.kt +++ b/src/main/kotlin/eu/fosil/okupamicoche/matrix/event/message/TravelCreatedMessageEventContent.kt @@ -5,6 +5,7 @@ import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import net.folivo.trixnity.core.model.events.MessageEventContent import net.folivo.trixnity.core.model.events.RelatesTo +import net.folivo.trixnity.core.model.events.StateEventContent const val TRAVEL_CREATED_MESSAGE_EVENT_TYPE = "eu.fosil.travel.created" @@ -24,16 +25,19 @@ data class TravelCreatedMessageEventContent( val places: Int, @SerialName("description") val description: String, + @SerialName("duplicateNum") + val duplicateNum: Int?, @SerialName("m.relates_to") override val relatesTo: RelatesTo.Reference? = null -) : MessageEventContent { - constructor(travel: Travel) : this( +) : MessageEventContent, StateEventContent { + constructor(travel: Travel, duplicateNum: Int? = null) : this( travel.room.full, travel.driver.full, travel.options.from, travel.options.to, travel.options.time, travel.options.places, - travel.options.description + travel.options.description, + duplicateNum ) } diff --git a/src/main/kotlin/eu/fosil/okupamicoche/usecase/travel/cancelTravel.kt b/src/main/kotlin/eu/fosil/okupamicoche/usecase/travel/cancelTravel.kt index f812f48..511116e 100644 --- a/src/main/kotlin/eu/fosil/okupamicoche/usecase/travel/cancelTravel.kt +++ b/src/main/kotlin/eu/fosil/okupamicoche/usecase/travel/cancelTravel.kt @@ -6,10 +6,14 @@ import eu.fosil.okupamicoche.usecase.Usecase import net.folivo.trixnity.clientserverapi.model.rooms.DirectoryVisibility import net.folivo.trixnity.core.model.RoomId import net.folivo.trixnity.core.model.UserId +import java.time.Instant +import java.time.ZoneId +import java.time.format.DateTimeFormatter suspend fun Usecase.cancelTravel( roomId: RoomId, - driverId: UserId + driverId: UserId, + eventSentToRoomId: RoomId ) { val isTravel = TravelRepository.isTravel(roomId) val isDriver = TravelRepository.isDriver(roomId, driverId) @@ -38,9 +42,38 @@ suspend fun Usecase.cancelTravel( MatrixApiClient.setRoomName(roomId, roomName) // Remove alias - // TODO + MatrixApiClient.removeRoomAliases(roomId) // Leave the room MatrixApiClient.client.rooms.leaveRoom(roomId, "Travel canceled") + + // Send messages to main room + sendCancelMessageEvents(roomId, eventSentToRoomId) } } + +private suspend fun sendCancelMessageEvents( + roomId: RoomId, + eventSentToRoomId: RoomId +) { + val mainRoomId = requireNotNull(MatrixApiClient.mainRoomId) + val travel = requireNotNull(TravelRepository.getTravel(roomId)) + + val instant = Instant.ofEpochMilli(travel.options.time) + val date = DateTimeFormatter.ofPattern("yyyy/MM/dd").withZone(ZoneId.systemDefault()).format(instant) + val time = DateTimeFormatter.ofPattern("H:mm").withZone(ZoneId.systemDefault()).format(instant) + + // Send text message to main room + val body = "TRAVEL CANCELED: ${travel.options.from}-${travel.options.to} on $date $time." + MatrixApiClient.sendErrorTextMessage(mainRoomId, body) + // Send text message to room where create command was sent (if it is not main room) + if (eventSentToRoomId != mainRoomId) + MatrixApiClient.sendErrorTextMessage(roomId, body) + + // TODO send state event to room and custom event to main room + // Send travel canceled message event to main room +// MatrixApiClient.client.rooms.sendMessageEvent( +// mainRoomId, +// TravelCreatedMessageEventContent(travel) +// ) +} 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 837ed70..f400c08 100644 --- a/src/main/kotlin/eu/fosil/okupamicoche/usecase/travel/createTravel.kt +++ b/src/main/kotlin/eu/fosil/okupamicoche/usecase/travel/createTravel.kt @@ -24,7 +24,7 @@ import java.time.format.DateTimeFormatter suspend fun Usecase.createTravel( travelOptions: TravelOptions, driver: UserId, - createdFromRoomId: RoomId + eventSentToRoomId: RoomId ) { val newRoomId = createRoom(travelOptions, driver) val travel = Travel( @@ -33,7 +33,7 @@ suspend fun Usecase.createTravel( travelOptions ) - sendCreateMessageEvents(travel, createdFromRoomId) + sendCreateMessageEvents(travel, eventSentToRoomId) transaction(db) { TravelEntity.new(travel) @@ -83,7 +83,7 @@ private suspend fun createRoom(travelOptions: TravelOptions, driver: UserId): Ro private suspend fun sendCreateMessageEvents( travel: Travel, - createdFromRoomId: RoomId + eventSentToRoomId: RoomId ) { val mainRoomId = requireNotNull(MatrixApiClient.mainRoomId) @@ -114,9 +114,9 @@ private suspend fun sendCreateMessageEvents( ) // Send text message to room where create command was sent (if it is not main room) - if (createdFromRoomId != mainRoomId) { + if (eventSentToRoomId != mainRoomId) { MatrixApiClient.client.rooms.sendMessageEvent( - createdFromRoomId, + eventSentToRoomId, RoomMessageEventContent.TextMessageEventContent( body = "Travel created!", format = "org.matrix.custom.html",