diff --git a/src/main/kotlin/eu/fosil/okupamicoche/matrix/createAppService.kt b/src/main/kotlin/eu/fosil/okupamicoche/matrix/createAppService.kt index 734065e..dde4128 100644 --- a/src/main/kotlin/eu/fosil/okupamicoche/matrix/createAppService.kt +++ b/src/main/kotlin/eu/fosil/okupamicoche/matrix/createAppService.kt @@ -2,7 +2,7 @@ package eu.fosil.okupamicoche.matrix import eu.fosil.okupamicoche.cli.CommandParser import eu.fosil.okupamicoche.db.TravelsTable -import eu.fosil.okupamicoche.matrix.event.message.TravelCreatedMessageEventContent +import eu.fosil.okupamicoche.matrix.event.message.TravelMessageEventContent import eu.fosil.okupamicoche.matrix.services.EventTnxService import eu.fosil.okupamicoche.matrix.services.RoomService import eu.fosil.okupamicoche.matrix.services.UserService @@ -41,7 +41,7 @@ fun createAppService(matrixClientServerApiClient: MatrixClientServerApiClient): logger.info("${it.content.creator} created room ${it.roomId}") } } - subscribe(TravelCreatedMessageEventContent::class) { event -> + subscribe(TravelMessageEventContent::class) { event -> logger.info("NEW TRAVEL CREATED EVENT!!") logger.info("$event") } diff --git a/src/main/kotlin/eu/fosil/okupamicoche/matrix/event/TravelEventContentSerializerMappings.kt b/src/main/kotlin/eu/fosil/okupamicoche/matrix/event/TravelEventContentSerializerMappings.kt index 31a453c..b15428c 100644 --- a/src/main/kotlin/eu/fosil/okupamicoche/matrix/event/TravelEventContentSerializerMappings.kt +++ b/src/main/kotlin/eu/fosil/okupamicoche/matrix/event/TravelEventContentSerializerMappings.kt @@ -2,12 +2,12 @@ package eu.fosil.okupamicoche.matrix.event import eu.fosil.okupamicoche.matrix.event.message.JOIN_MESSAGE_EVENT_TYPE import eu.fosil.okupamicoche.matrix.event.message.JoinMessageEventContent -import eu.fosil.okupamicoche.matrix.event.message.TRAVEL_CREATED_MESSAGE_EVENT_TYPE -import eu.fosil.okupamicoche.matrix.event.message.TravelCreatedMessageEventContent +import eu.fosil.okupamicoche.matrix.event.message.TRAVEL_MESSAGE_EVENT_TYPE +import eu.fosil.okupamicoche.matrix.event.message.TravelMessageEventContent import eu.fosil.okupamicoche.matrix.event.state.MEMBERSHIP_STATE_EVENT_TYPE import eu.fosil.okupamicoche.matrix.event.state.MembershipStateEventContent -import eu.fosil.okupamicoche.matrix.event.state.TRAVEL_CREATED_STATE_EVENT_TYPE -import eu.fosil.okupamicoche.matrix.event.state.TravelCreatedStateEventContent +import eu.fosil.okupamicoche.matrix.event.state.TRAVEL_STATE_EVENT_TYPE +import eu.fosil.okupamicoche.matrix.event.state.TravelStateEventContent import net.folivo.trixnity.core.model.events.MessageEventContent import net.folivo.trixnity.core.model.events.StateEventContent import net.folivo.trixnity.core.serialization.events.BaseEventContentSerializerMappings @@ -15,11 +15,11 @@ import net.folivo.trixnity.core.serialization.events.EventContentSerializerMappi object TravelEventContentSerializerMappings : BaseEventContentSerializerMappings() { override val message: Set> = setOf( - EventContentSerializerMapping.of(TRAVEL_CREATED_MESSAGE_EVENT_TYPE), + EventContentSerializerMapping.of(TRAVEL_MESSAGE_EVENT_TYPE), EventContentSerializerMapping.of(JOIN_MESSAGE_EVENT_TYPE) ) override val state: Set> = setOf( - EventContentSerializerMapping.of(TRAVEL_CREATED_STATE_EVENT_TYPE), + EventContentSerializerMapping.of(TRAVEL_STATE_EVENT_TYPE), EventContentSerializerMapping.of(MEMBERSHIP_STATE_EVENT_TYPE) ) } diff --git a/src/main/kotlin/eu/fosil/okupamicoche/matrix/event/message/TravelCreatedMessageEventContent.kt b/src/main/kotlin/eu/fosil/okupamicoche/matrix/event/message/TravelMessageEventContent.kt similarity index 82% rename from src/main/kotlin/eu/fosil/okupamicoche/matrix/event/message/TravelCreatedMessageEventContent.kt rename to src/main/kotlin/eu/fosil/okupamicoche/matrix/event/message/TravelMessageEventContent.kt index 2122399..1981eb3 100644 --- a/src/main/kotlin/eu/fosil/okupamicoche/matrix/event/message/TravelCreatedMessageEventContent.kt +++ b/src/main/kotlin/eu/fosil/okupamicoche/matrix/event/message/TravelMessageEventContent.kt @@ -7,10 +7,10 @@ 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" +const val TRAVEL_MESSAGE_EVENT_TYPE = "eu.fosil.travel" @Serializable -data class TravelCreatedMessageEventContent( +data class TravelMessageEventContent( @SerialName("room") val room: String, @SerialName("driver") @@ -27,10 +27,12 @@ data class TravelCreatedMessageEventContent( val description: String, @SerialName("duplicateNum") val duplicateNum: Int?, + @SerialName("canceled") + val canceled: Boolean, @SerialName("m.relates_to") override val relatesTo: RelatesTo.Reference? = null ) : MessageEventContent, StateEventContent { - constructor(travel: Travel, duplicateNum: Int? = null) : this( + constructor(travel: Travel) : this( travel.room.full, travel.driver.full, travel.options.from, @@ -38,6 +40,7 @@ data class TravelCreatedMessageEventContent( travel.options.time, travel.options.places, travel.options.description, - duplicateNum + travel.duplicateNum, + travel.canceled ) } diff --git a/src/main/kotlin/eu/fosil/okupamicoche/matrix/event/state/TravelCreatedStateEventContent.kt b/src/main/kotlin/eu/fosil/okupamicoche/matrix/event/state/TravelStateEventContent.kt similarity index 68% rename from src/main/kotlin/eu/fosil/okupamicoche/matrix/event/state/TravelCreatedStateEventContent.kt rename to src/main/kotlin/eu/fosil/okupamicoche/matrix/event/state/TravelStateEventContent.kt index 97bf418..77643b8 100644 --- a/src/main/kotlin/eu/fosil/okupamicoche/matrix/event/state/TravelCreatedStateEventContent.kt +++ b/src/main/kotlin/eu/fosil/okupamicoche/matrix/event/state/TravelStateEventContent.kt @@ -6,10 +6,10 @@ import kotlinx.serialization.Serializable import net.folivo.trixnity.core.model.UserId import net.folivo.trixnity.core.model.events.StateEventContent -const val TRAVEL_CREATED_STATE_EVENT_TYPE = "eu.fosil.travel.created" +const val TRAVEL_STATE_EVENT_TYPE = "eu.fosil.travel" @Serializable -data class TravelCreatedStateEventContent( +data class TravelStateEventContent( @SerialName("driver") val driver: String, @SerialName("from") @@ -23,15 +23,23 @@ data class TravelCreatedStateEventContent( @SerialName("description") val description: String, @SerialName("duplicateNum") - val duplicateNum: Int? + val duplicateNum: Int?, + @SerialName("canceled") + val canceled: Boolean ) : StateEventContent { - constructor(travelOptions: TravelOptions, driver: UserId, duplicateNum: Int? = null) : this( + constructor( + travelOptions: TravelOptions, + driver: UserId, + duplicateNum: Int? = null, + canceled: Boolean = false + ) : this( driver.full, travelOptions.from, travelOptions.to, travelOptions.time, travelOptions.places, travelOptions.description, - duplicateNum + duplicateNum, + canceled ) } diff --git a/src/main/kotlin/eu/fosil/okupamicoche/model/Travel.kt b/src/main/kotlin/eu/fosil/okupamicoche/model/Travel.kt index 188e75b..4539953 100644 --- a/src/main/kotlin/eu/fosil/okupamicoche/model/Travel.kt +++ b/src/main/kotlin/eu/fosil/okupamicoche/model/Travel.kt @@ -11,7 +11,8 @@ class Travel( var driver: UserId, var options: TravelOptions, var travelers: List = listOf(), - var duplicateNum: Int? = null + var duplicateNum: Int? = null, + var canceled: Boolean = false ) class TravelOptions( diff --git a/src/main/kotlin/eu/fosil/okupamicoche/model/TravelRepository.kt b/src/main/kotlin/eu/fosil/okupamicoche/model/TravelRepository.kt index 29f06ea..d63476a 100644 --- a/src/main/kotlin/eu/fosil/okupamicoche/model/TravelRepository.kt +++ b/src/main/kotlin/eu/fosil/okupamicoche/model/TravelRepository.kt @@ -2,7 +2,7 @@ package eu.fosil.okupamicoche.model import eu.fosil.okupamicoche.matrix.MatrixApiClient import eu.fosil.okupamicoche.matrix.event.state.MembershipStateEventContent -import eu.fosil.okupamicoche.matrix.event.state.TravelCreatedStateEventContent +import eu.fosil.okupamicoche.matrix.event.state.TravelStateEventContent import net.folivo.trixnity.clientserverapi.client.getStateEvent import net.folivo.trixnity.core.model.RoomId import net.folivo.trixnity.core.model.UserId @@ -14,12 +14,12 @@ object TravelRepository { MatrixApiClient.client.users.getDisplayName(userId).getOrNull() ?: userId.localpart suspend fun isTravel(roomId: RoomId) = - MatrixApiClient.client.rooms.getStateEvent( + MatrixApiClient.client.rooms.getStateEvent( roomId ).getOrNull() !== null suspend fun getTravel(roomId: RoomId): Travel? { - val travelCreatedstateEvent = MatrixApiClient.client.rooms.getStateEvent( + val travelCreatedstateEvent = MatrixApiClient.client.rooms.getStateEvent( roomId ).getOrNull() ?: return null @@ -39,7 +39,7 @@ object TravelRepository { } suspend fun isDriver(roomId: RoomId, userId: UserId) = - MatrixApiClient.client.rooms.getStateEvent( + MatrixApiClient.client.rooms.getStateEvent( roomId ).getOrNull()?.driver == userId.full @@ -56,7 +56,7 @@ object TravelRepository { suspend fun getAvailablePlaces(roomId: RoomId): Int? { // Get travel total places (not counting driver) - val roomState = MatrixApiClient.client.rooms.getStateEvent(roomId).getOrNull() + val roomState = MatrixApiClient.client.rooms.getStateEvent(roomId).getOrNull() ?: return null // Get travelers count 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 511116e..b860882 100644 --- a/src/main/kotlin/eu/fosil/okupamicoche/usecase/travel/cancelTravel.kt +++ b/src/main/kotlin/eu/fosil/okupamicoche/usecase/travel/cancelTravel.kt @@ -1,6 +1,8 @@ package eu.fosil.okupamicoche.usecase.travel import eu.fosil.okupamicoche.matrix.MatrixApiClient +import eu.fosil.okupamicoche.matrix.event.message.TravelMessageEventContent +import eu.fosil.okupamicoche.matrix.event.state.TravelStateEventContent import eu.fosil.okupamicoche.model.TravelRepository import eu.fosil.okupamicoche.usecase.Usecase import net.folivo.trixnity.clientserverapi.model.rooms.DirectoryVisibility @@ -12,8 +14,7 @@ import java.time.format.DateTimeFormatter suspend fun Usecase.cancelTravel( roomId: RoomId, - driverId: UserId, - eventSentToRoomId: RoomId + driverId: UserId ) { val isTravel = TravelRepository.isTravel(roomId) val isDriver = TravelRepository.isDriver(roomId, driverId) @@ -48,13 +49,12 @@ suspend fun Usecase.cancelTravel( MatrixApiClient.client.rooms.leaveRoom(roomId, "Travel canceled") // Send messages to main room - sendCancelMessageEvents(roomId, eventSentToRoomId) + sendCancelMessageEvents(roomId) } } private suspend fun sendCancelMessageEvents( - roomId: RoomId, - eventSentToRoomId: RoomId + roomId: RoomId ) { val mainRoomId = requireNotNull(MatrixApiClient.mainRoomId) val travel = requireNotNull(TravelRepository.getTravel(roomId)) @@ -63,17 +63,29 @@ private suspend fun sendCancelMessageEvents( val date = DateTimeFormatter.ofPattern("yyyy/MM/dd").withZone(ZoneId.systemDefault()).format(instant) val time = DateTimeFormatter.ofPattern("H:mm").withZone(ZoneId.systemDefault()).format(instant) + // Remove state event from travel room + MatrixApiClient.client.rooms.sendStateEvent( + roomId, + TravelStateEventContent( + travelOptions = travel.options, + driver = travel.driver, + duplicateNum = travel.duplicateNum, + canceled = true + ), + "" + ) + // 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) + + // Send text message to travel room + 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) -// ) + travel.canceled = true + MatrixApiClient.client.rooms.sendMessageEvent( + mainRoomId, + TravelMessageEventContent(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 f400c08..422f6ed 100644 --- a/src/main/kotlin/eu/fosil/okupamicoche/usecase/travel/createTravel.kt +++ b/src/main/kotlin/eu/fosil/okupamicoche/usecase/travel/createTravel.kt @@ -3,9 +3,9 @@ package eu.fosil.okupamicoche.usecase.travel import eu.fosil.okupamicoche.db.TravelEntity import eu.fosil.okupamicoche.matrix.MatrixApiClient import eu.fosil.okupamicoche.matrix.db -import eu.fosil.okupamicoche.matrix.event.message.TravelCreatedMessageEventContent -import eu.fosil.okupamicoche.matrix.event.state.TRAVEL_CREATED_STATE_EVENT_TYPE -import eu.fosil.okupamicoche.matrix.event.state.TravelCreatedStateEventContent +import eu.fosil.okupamicoche.matrix.event.message.TravelMessageEventContent +import eu.fosil.okupamicoche.matrix.event.state.TRAVEL_STATE_EVENT_TYPE +import eu.fosil.okupamicoche.matrix.event.state.TravelStateEventContent import eu.fosil.okupamicoche.model.Travel import eu.fosil.okupamicoche.model.TravelOptions import eu.fosil.okupamicoche.model.TravelRepository @@ -45,7 +45,7 @@ private suspend fun createRoom(travelOptions: TravelOptions, driver: UserId): Ro val newRoomNameInfo = Usecase.getRoomNameInfoFromTravelOptions(travelOptions) val initialState = Event.InitialStateEvent( - TravelCreatedStateEventContent( + TravelStateEventContent( travelOptions, driver, newRoomNameInfo.duplicateNum @@ -53,7 +53,7 @@ private suspend fun createRoom(travelOptions: TravelOptions, driver: UserId): Ro "" ) val powerLevels = PowerLevelsEventContent( - events = mapOf(Pair(TRAVEL_CREATED_STATE_EVENT_TYPE, 100)), + events = mapOf(Pair(TRAVEL_STATE_EVENT_TYPE, 100)), users = mapOf( Pair(appServiceUserId, 100), Pair(driver, 50) @@ -110,7 +110,7 @@ private suspend fun sendCreateMessageEvents( // Send new travel message event to main room MatrixApiClient.client.rooms.sendMessageEvent( mainRoomId, - TravelCreatedMessageEventContent(travel) + TravelMessageEventContent(travel) ) // Send text message to room where create command was sent (if it is not main room)