diff --git a/src/main/kotlin/eu/fosil/okupamicoche/cli/CommandParser.kt b/src/main/kotlin/eu/fosil/okupamicoche/cli/CommandParser.kt index c96368b..548d1e9 100644 --- a/src/main/kotlin/eu/fosil/okupamicoche/cli/CommandParser.kt +++ b/src/main/kotlin/eu/fosil/okupamicoche/cli/CommandParser.kt @@ -3,6 +3,7 @@ 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.cancelTravel import eu.fosil.okupamicoche.usecase.travel.createTravel import eu.fosil.okupamicoche.usecase.travel.joinTravel import eu.fosil.okupamicoche.usecase.travel.leaveTravel @@ -42,6 +43,7 @@ object CommandParser { "create" -> handleCreate(user, room, args) "join" -> Usecase.joinTravel(room, user) "leave" -> Usecase.leaveTravel(room, user) + "cancel" -> Usecase.cancelTravel(room, user) } } catch (e: Exception) { logger.error { "Exception captured: $e" } diff --git a/src/main/kotlin/eu/fosil/okupamicoche/matrix/MatrixApiClient.kt b/src/main/kotlin/eu/fosil/okupamicoche/matrix/MatrixApiClient.kt index df16706..6a5e05e 100644 --- a/src/main/kotlin/eu/fosil/okupamicoche/matrix/MatrixApiClient.kt +++ b/src/main/kotlin/eu/fosil/okupamicoche/matrix/MatrixApiClient.kt @@ -9,6 +9,7 @@ import net.folivo.trixnity.clientserverapi.model.rooms.DirectoryVisibility import net.folivo.trixnity.core.model.RoomAliasId import net.folivo.trixnity.core.model.RoomId import net.folivo.trixnity.core.model.UserId +import net.folivo.trixnity.core.model.events.m.room.NameEventContent import net.folivo.trixnity.core.model.events.m.room.RoomMessageEventContent import net.folivo.trixnity.core.serialization.createEventContentSerializerMappings import net.folivo.trixnity.core.serialization.createMatrixJson @@ -54,11 +55,20 @@ object MatrixApiClient { } suspend fun isRoomAliasAvailable(roomAliasId: RoomAliasId): Boolean { - val roomId = MatrixApiClient.client.rooms.getRoomAlias(roomAliasId).getOrNull() + val roomId = client.rooms.getRoomAlias(roomAliasId).getOrNull() return roomId == null } + suspend fun setRoomName(roomId: RoomId, name: String?) { + name?.let { + client.rooms.sendStateEvent( + roomId, + NameEventContent(it) + ) + } + } + private suspend fun createMainRoomIfNeeded(config: Config): RoomId? { val mainRoomId: RoomId? diff --git a/src/main/kotlin/eu/fosil/okupamicoche/model/Travel.kt b/src/main/kotlin/eu/fosil/okupamicoche/model/Travel.kt index d22032f..188e75b 100644 --- a/src/main/kotlin/eu/fosil/okupamicoche/model/Travel.kt +++ b/src/main/kotlin/eu/fosil/okupamicoche/model/Travel.kt @@ -30,13 +30,18 @@ class TravelOptions( return "#viaje_${from}-${to}_${date}_${time}" } - fun getRoomName(duplicateNum: Int?, travelers: List? = null): String { + fun getRoomNamePrefix(): String { val instant = Instant.ofEpochMilli(time) val date = DateTimeFormatter.ofPattern("yyyy/MM/dd").withZone(ZoneId.systemDefault()).format(instant) val time = DateTimeFormatter.ofPattern("H:mm").withZone(ZoneId.systemDefault()).format(instant) + + return "Travel ${from}-${to} $date $time" + } + + fun getRoomName(duplicateNum: Int?, travelers: List? = null): String { val attemptSuffix = if ((duplicateNum ?: 0) > 0) " ($duplicateNum)" else "" val availablePlaces = places - (travelers?.size ?: 0) - return "Travel ${from}-${to} $date $time | $availablePlaces places available" + attemptSuffix + return getRoomNamePrefix() + " | $availablePlaces places available" + attemptSuffix } } diff --git a/src/main/kotlin/eu/fosil/okupamicoche/usecase/travel/cancelTravel.kt b/src/main/kotlin/eu/fosil/okupamicoche/usecase/travel/cancelTravel.kt new file mode 100644 index 0000000..f812f48 --- /dev/null +++ b/src/main/kotlin/eu/fosil/okupamicoche/usecase/travel/cancelTravel.kt @@ -0,0 +1,46 @@ +package eu.fosil.okupamicoche.usecase.travel + +import eu.fosil.okupamicoche.matrix.MatrixApiClient +import eu.fosil.okupamicoche.model.TravelRepository +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 + +suspend fun Usecase.cancelTravel( + roomId: RoomId, + driverId: UserId +) { + val isTravel = TravelRepository.isTravel(roomId) + val isDriver = TravelRepository.isDriver(roomId, driverId) + + if (!isTravel) { + MatrixApiClient.sendErrorTextMessage(roomId, "There is no travel.") + } else if (!isDriver) { + MatrixApiClient.sendErrorTextMessage( + roomId, + "Only the driver can cancel the travel." + ) + } else { + // Kick all users in room except app service user + MatrixApiClient.client.rooms.getJoinedMembers(roomId).getOrNull()?.joined?.filter { userMap -> + userMap.key != MatrixApiClient.appServiceUserId + }?.forEach { userMap -> + MatrixApiClient.client.rooms.kickUser(roomId, userMap.key, "Travel canceled") + } + + // Make room private + MatrixApiClient.client.rooms.setDirectoryVisibility(roomId, DirectoryVisibility.PRIVATE) + + // Change name + val travel = TravelRepository.getTravel(roomId) + val roomName = if (travel == null) "Travel CANCELED" else travel.options.getRoomNamePrefix() + " CANCELED" + MatrixApiClient.setRoomName(roomId, roomName) + + // Remove alias + // TODO + + // Leave the room + MatrixApiClient.client.rooms.leaveRoom(roomId, "Travel canceled") + } +} diff --git a/src/main/kotlin/eu/fosil/okupamicoche/usecase/travel/getRoomNameInfo.kt b/src/main/kotlin/eu/fosil/okupamicoche/usecase/travel/getRoomNameInfo.kt index e0dcd32..325378c 100644 --- a/src/main/kotlin/eu/fosil/okupamicoche/usecase/travel/getRoomNameInfo.kt +++ b/src/main/kotlin/eu/fosil/okupamicoche/usecase/travel/getRoomNameInfo.kt @@ -25,7 +25,7 @@ suspend fun Usecase.getRoomNameInfoFromTravelOptions(travelOptions: TravelOption ) } -suspend fun Usecase.getRoomNameFromRoomId(roomId: RoomId): RoomNameInfo? { +suspend fun Usecase.getRoomNameInfoFromRoomId(roomId: RoomId): RoomNameInfo? { val travel = TravelRepository.getTravel(roomId) ?: return null val roomAliasPrefix = travel.options.getRoomAliasPrefix() val duplicateNum = travel.duplicateNum 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 113d37a..aff3c20 100644 --- a/src/main/kotlin/eu/fosil/okupamicoche/usecase/travel/joinTravel.kt +++ b/src/main/kotlin/eu/fosil/okupamicoche/usecase/travel/joinTravel.kt @@ -25,7 +25,8 @@ suspend fun Usecase.joinTravel( MatrixApiClient.sendErrorTextMessage(roomId, "You are already joined.") } else { sendJoinedMessageEvents(roomId, userId) - Usecase.updateRoomNameInfo(roomId) + val roomNameInfo = Usecase.getRoomNameInfoFromRoomId(roomId) + MatrixApiClient.setRoomName(roomId, roomNameInfo?.name) } } diff --git a/src/main/kotlin/eu/fosil/okupamicoche/usecase/travel/leaveTravel.kt b/src/main/kotlin/eu/fosil/okupamicoche/usecase/travel/leaveTravel.kt index 522f02b..cab37c8 100644 --- a/src/main/kotlin/eu/fosil/okupamicoche/usecase/travel/leaveTravel.kt +++ b/src/main/kotlin/eu/fosil/okupamicoche/usecase/travel/leaveTravel.kt @@ -15,7 +15,7 @@ suspend fun Usecase.leaveTravel( ) { val isTravel = TravelRepository.isTravel(roomId) val isDriver = TravelRepository.isDriver(roomId, userId) - val membershipState = TravelRepository.getTravelMembership(roomId, userId) + val travelMembershipState = TravelRepository.getTravelMembership(roomId, userId) if (!isTravel) { MatrixApiClient.sendErrorTextMessage(roomId, "There is no travel.") @@ -25,13 +25,14 @@ suspend fun Usecase.leaveTravel( "You are the driver, you cannot leave. You can cancel the travel sending '!cancel' if you want.", "You are the driver, you cannot leave. You can cancel the travel sending !cancel if you want." ) - } else if (membershipState != Membership.JOIN.value) { + } else if (travelMembershipState != Membership.JOIN.value) { MatrixApiClient.sendErrorTextMessage(roomId, "You are not joined.") - } else if (membershipState == Membership.LEAVE.value) { + } else if (travelMembershipState == Membership.LEAVE.value) { MatrixApiClient.sendErrorTextMessage(roomId, "You already left.") } else { sendLeftMessageEvents(roomId, userId) - Usecase.updateRoomNameInfo(roomId) + val roomNameInfo = Usecase.getRoomNameInfoFromRoomId(roomId) + MatrixApiClient.setRoomName(roomId, roomNameInfo?.name) } } diff --git a/src/main/kotlin/eu/fosil/okupamicoche/usecase/travel/updateRoomNameInfo.kt b/src/main/kotlin/eu/fosil/okupamicoche/usecase/travel/updateRoomNameInfo.kt deleted file mode 100644 index 38ca06d..0000000 --- a/src/main/kotlin/eu/fosil/okupamicoche/usecase/travel/updateRoomNameInfo.kt +++ /dev/null @@ -1,17 +0,0 @@ -package eu.fosil.okupamicoche.usecase.travel - -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.events.m.room.NameEventContent - -suspend fun Usecase.updateRoomNameInfo(roomId: RoomId) { - val roomNameInfo = Usecase.getRoomNameFromRoomId(roomId) - - roomNameInfo?.let { - MatrixApiClient.client.rooms.sendStateEvent( - roomId, - NameEventContent(it.name) - ) - } -}