cancelTravel: WIP

This commit is contained in:
2022-04-21 00:58:25 +02:00
parent 89b6c90b65
commit eb45ea10d6
8 changed files with 74 additions and 26 deletions

View File

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

View File

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

View File

@@ -30,13 +30,18 @@ class TravelOptions(
return "#viaje_${from}-${to}_${date}_${time}"
}
fun getRoomName(duplicateNum: Int?, travelers: List<UserId>? = 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<UserId>? = 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
}
}

View File

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

View File

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

View File

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

View File

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

View File

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