cancelTravel: WIP
This commit is contained in:
@@ -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" }
|
||||
|
||||
@@ -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?
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user