joinTravel() finished
This commit is contained in:
@@ -5,7 +5,7 @@ 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.state.MEMBERSHIP_CHANGE_STATE_EVENT_TYPE
|
||||
import eu.fosil.okupamicoche.matrix.event.state.MembershipChangeStateEventContent
|
||||
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 net.folivo.trixnity.core.model.events.MessageEventContent
|
||||
@@ -20,6 +20,6 @@ object TravelEventContentSerializerMappings : BaseEventContentSerializerMappings
|
||||
)
|
||||
override val state: Set<EventContentSerializerMapping<out StateEventContent>> = setOf(
|
||||
EventContentSerializerMapping.of<TravelCreatedStateEventContent>(TRAVEL_CREATED_STATE_EVENT_TYPE),
|
||||
EventContentSerializerMapping.of<MembershipChangeStateEventContent>(MEMBERSHIP_CHANGE_STATE_EVENT_TYPE)
|
||||
EventContentSerializerMapping.of<MembershipStateEventContent>(MEMBERSHIP_CHANGE_STATE_EVENT_TYPE)
|
||||
)
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@ import kotlinx.serialization.Serializable
|
||||
import net.folivo.trixnity.core.model.events.MessageEventContent
|
||||
import net.folivo.trixnity.core.model.events.RelatesTo
|
||||
|
||||
const val TRAVEL_CREATED_MESSAGE_EVENT_TYPE = "eu.fosil.travel.created.message"
|
||||
const val TRAVEL_CREATED_MESSAGE_EVENT_TYPE = "eu.fosil.travel.created"
|
||||
|
||||
@Serializable
|
||||
data class TravelCreatedMessageEventContent(
|
||||
|
||||
@@ -9,7 +9,7 @@ import net.folivo.trixnity.core.model.events.m.room.Membership
|
||||
const val MEMBERSHIP_CHANGE_STATE_EVENT_TYPE = "eu.fosil.travel.member"
|
||||
|
||||
@Serializable
|
||||
data class MembershipChangeStateEventContent(
|
||||
data class MembershipStateEventContent(
|
||||
@SerialName("user")
|
||||
val user: String,
|
||||
@SerialName("membership")
|
||||
@@ -6,7 +6,7 @@ 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.state"
|
||||
const val TRAVEL_CREATED_STATE_EVENT_TYPE = "eu.fosil.travel.created"
|
||||
|
||||
@Serializable
|
||||
data class TravelCreatedStateEventContent(
|
||||
|
||||
@@ -2,9 +2,12 @@ package eu.fosil.okupamicoche.matrix
|
||||
|
||||
import eu.fosil.okupamicoche.config.ConfigReader
|
||||
import eu.fosil.okupamicoche.matrix.event.TravelEventContentSerializerMappings
|
||||
import eu.fosil.okupamicoche.matrix.event.state.MembershipStateEventContent
|
||||
import eu.fosil.okupamicoche.matrix.event.state.TravelCreatedStateEventContent
|
||||
import io.ktor.http.*
|
||||
import mu.KotlinLogging
|
||||
import net.folivo.trixnity.clientserverapi.client.MatrixClientServerApiClient
|
||||
import net.folivo.trixnity.clientserverapi.client.getStateEvent
|
||||
import net.folivo.trixnity.clientserverapi.model.rooms.DirectoryVisibility
|
||||
import net.folivo.trixnity.core.model.RoomAliasId
|
||||
import net.folivo.trixnity.core.model.RoomId
|
||||
@@ -36,6 +39,22 @@ object MatrixApiClient {
|
||||
suspend fun getDisplayName(userId: UserId) =
|
||||
matrixApiClient?.users?.getDisplayName(userId)?.getOrNull() ?: userId.localpart
|
||||
|
||||
suspend fun isTravel(roomId: RoomId) =
|
||||
matrixApiClient?.rooms?.getStateEvent<TravelCreatedStateEventContent>(
|
||||
roomId
|
||||
)?.getOrNull() !== null
|
||||
|
||||
suspend fun isDriver(roomId: RoomId, userId: UserId) =
|
||||
matrixApiClient?.rooms?.getStateEvent<TravelCreatedStateEventContent>(
|
||||
roomId
|
||||
)?.getOrNull()?.driver == userId.full
|
||||
|
||||
suspend fun getTravelMembership(roomId: RoomId, userId: UserId) =
|
||||
matrixApiClient?.rooms?.getStateEvent<MembershipStateEventContent>(
|
||||
roomId,
|
||||
userId.full.substring(1) // Synapse throws 403 if stateKey starts with '@'
|
||||
)?.getOrNull()?.membership
|
||||
|
||||
private suspend fun createMainRoomIfNeeded(): RoomId? {
|
||||
requireNotNull(config)
|
||||
requireNotNull(matrixApiClient)
|
||||
@@ -52,9 +71,9 @@ object MatrixApiClient {
|
||||
).getOrNull()
|
||||
} else {
|
||||
mainRoomId = roomAliasRes.roomId
|
||||
val joinedToMainRoom = (matrixApiClient.rooms.getJoinedRooms().getOrNull()?.filter { roomId ->
|
||||
val joinedToMainRoom = (matrixApiClient.rooms.getJoinedRooms().getOrNull()?.firstOrNull { roomId ->
|
||||
roomId == mainRoomId
|
||||
}?.firstOrNull()) !== null
|
||||
}) !== null
|
||||
logger.info("alreadyJoinedToMainRoom=$joinedToMainRoom")
|
||||
|
||||
if (!joinedToMainRoom) {
|
||||
|
||||
@@ -74,10 +74,20 @@ private suspend fun createRoom(travelOptions: TravelOptions, driver: UserId): Ro
|
||||
name = newRoomAliasAndName.name,
|
||||
topic = travelOptions.description,
|
||||
invite = setOf(driver),
|
||||
roomVersion = "9",
|
||||
// TODO: uncomment when https://gitlab.com/benkuly/trixnity/-/issues/119 gets fixed
|
||||
// initialState = listOf(initialState),
|
||||
powerLevelContentOverride = powerLevels
|
||||
).getOrThrow()
|
||||
|
||||
// NOT IMPLEMENTED IN ELEMENT YET
|
||||
// https://github.com/vector-im/element-android/issues/3875
|
||||
// https://github.com/vector-im/element-web/issues/18655
|
||||
// Send joining rule state event
|
||||
// matrixApiClient.rooms.sendStateEvent(
|
||||
// roomId,
|
||||
// JoinRulesEventContent(JoinRulesEventContent.JoinRule.Knock)
|
||||
// )
|
||||
}
|
||||
|
||||
private suspend fun getRoomAliasAndName(travelOptions: TravelOptions): RoomAliasAndName {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package eu.fosil.okupamicoche.usecase.travel
|
||||
|
||||
import eu.fosil.okupamicoche.matrix.MatrixApiClient
|
||||
import eu.fosil.okupamicoche.matrix.event.state.MembershipChangeStateEventContent
|
||||
import eu.fosil.okupamicoche.matrix.event.state.MembershipStateEventContent
|
||||
import eu.fosil.okupamicoche.matrix.matrixApiClient
|
||||
import net.folivo.trixnity.core.model.RoomId
|
||||
import net.folivo.trixnity.core.model.UserId
|
||||
@@ -12,11 +12,32 @@ suspend fun joinTravel(
|
||||
roomId: RoomId,
|
||||
userId: UserId
|
||||
) {
|
||||
requireNotNull(matrixApiClient)
|
||||
val isTravel = MatrixApiClient.isTravel(roomId)
|
||||
val isDriver = MatrixApiClient.isDriver(roomId, userId)
|
||||
val membershipState = MatrixApiClient.getTravelMembership(roomId, userId)
|
||||
|
||||
sendJoinMessageEvents(roomId, userId)
|
||||
if (!isTravel) {
|
||||
sendErrorTextMessage(roomId, "There is no travel.")
|
||||
} else if (isDriver) {
|
||||
sendErrorTextMessage(roomId, "You are the driver, you don't need to join.")
|
||||
} else if (membershipState == Membership.JOIN.value) {
|
||||
sendErrorTextMessage(roomId, "You were already joined.")
|
||||
} else {
|
||||
sendJoinedMessageEvents(roomId, userId)
|
||||
}
|
||||
}
|
||||
|
||||
private suspend fun sendJoinMessageEvents(
|
||||
private suspend fun sendErrorTextMessage(roomId: RoomId, messageBody: String) {
|
||||
requireNotNull(matrixApiClient)
|
||||
|
||||
matrixApiClient.rooms.sendMessageEvent(
|
||||
roomId,
|
||||
RoomMessageEventContent.TextMessageEventContent(messageBody)
|
||||
)
|
||||
}
|
||||
|
||||
private suspend fun sendJoinedMessageEvents(
|
||||
roomId: RoomId,
|
||||
userId: UserId
|
||||
) {
|
||||
@@ -24,7 +45,7 @@ private suspend fun sendJoinMessageEvents(
|
||||
|
||||
// Send text message to travel room
|
||||
val displayName = MatrixApiClient.getDisplayName(userId)
|
||||
val messageBody = "$displayName joined the travel!"
|
||||
val messageBody = "$displayName joined the travel."
|
||||
matrixApiClient.rooms.sendMessageEvent(
|
||||
roomId,
|
||||
RoomMessageEventContent.TextMessageEventContent(messageBody)
|
||||
@@ -33,7 +54,7 @@ private suspend fun sendJoinMessageEvents(
|
||||
// Send membership change state event to travel room
|
||||
matrixApiClient.rooms.sendStateEvent(
|
||||
roomId,
|
||||
MembershipChangeStateEventContent(userId, Membership.JOIN),
|
||||
MembershipStateEventContent(userId, Membership.JOIN),
|
||||
stateKey = userId.full.substring(1) // Synapse throws 403 if stateKey starts with '@'
|
||||
).getOrThrow()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user