WIP: joinTravel

This commit is contained in:
2022-04-17 20:53:59 +02:00
parent 6650603814
commit 52781d2862
10 changed files with 129 additions and 14 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.travel.createTravel
import eu.fosil.okupamicoche.usecase.travel.joinTravel
import mu.KotlinLogging
import net.folivo.trixnity.core.model.RoomId
import net.folivo.trixnity.core.model.UserId
@@ -40,6 +41,7 @@ object CommandParser {
when (command) {
"create" -> handleCreate(user, room, args)
"join" -> handleJoin(user, room)
}
} catch (e: Exception) {
logger.error { "Exception captured: $e" }
@@ -56,7 +58,6 @@ object CommandParser {
roomId: RoomId,
args: List<String>
) {
val date = args[2]
val time = args[3]
val formatter = DateTimeFormatter.ofPattern("yyyy/M/d H:mm").withZone(ZoneId.systemDefault())
@@ -67,12 +68,19 @@ object CommandParser {
to = args[1],
time = unixTime,
places = args[4].toIntOrNull() ?: 0,
description = args[5]
description = args.subList(5, args.size).joinToString(" ")
)
createTravel(travelOptions, userId, roomId)
}
private suspend fun handleJoin(
userId: UserId,
roomId: RoomId
) {
joinTravel(roomId, userId)
}
}

View File

@@ -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.TravelCreatedMessageEventContent
import eu.fosil.okupamicoche.matrix.event.message.TravelCreatedMessageEventContent
import eu.fosil.okupamicoche.matrix.services.EventTnxService
import eu.fosil.okupamicoche.matrix.services.RoomService
import eu.fosil.okupamicoche.matrix.services.UserService

View File

@@ -1,5 +1,13 @@
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.state.MEMBERSHIP_CHANGE_STATE_EVENT_TYPE
import eu.fosil.okupamicoche.matrix.event.state.MembershipChangeStateEventContent
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
import net.folivo.trixnity.core.model.events.StateEventContent
import net.folivo.trixnity.core.serialization.events.BaseEventContentSerializerMappings
@@ -7,9 +15,11 @@ import net.folivo.trixnity.core.serialization.events.EventContentSerializerMappi
object TravelEventContentSerializerMappings : BaseEventContentSerializerMappings() {
override val message: Set<EventContentSerializerMapping<out MessageEventContent>> = setOf(
EventContentSerializerMapping.of<TravelCreatedMessageEventContent>(TRAVEL_CREATED_MESSAGE_EVENT_TYPE)
EventContentSerializerMapping.of<TravelCreatedMessageEventContent>(TRAVEL_CREATED_MESSAGE_EVENT_TYPE),
EventContentSerializerMapping.of<JoinMessageEventContent>(JOIN_MESSAGE_EVENT_TYPE)
)
override val state: Set<EventContentSerializerMapping<out StateEventContent>> = setOf(
EventContentSerializerMapping.of<TravelCreatedStateEventContent>(TRAVEL_CREATED_STATE_EVENT_TYPE)
EventContentSerializerMapping.of<TravelCreatedStateEventContent>(TRAVEL_CREATED_STATE_EVENT_TYPE),
EventContentSerializerMapping.of<MembershipChangeStateEventContent>(MEMBERSHIP_CHANGE_STATE_EVENT_TYPE)
)
}

View File

@@ -0,0 +1,25 @@
package eu.fosil.okupamicoche.matrix.event.message
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import net.folivo.trixnity.core.model.RoomId
import net.folivo.trixnity.core.model.UserId
import net.folivo.trixnity.core.model.events.MessageEventContent
import net.folivo.trixnity.core.model.events.RelatesTo
const val JOIN_MESSAGE_EVENT_TYPE = "eu.fosil.travel.join"
@Serializable
data class JoinMessageEventContent(
@SerialName("room")
val room: String,
@SerialName("user")
val user: String,
@SerialName("m.relates_to")
override val relatesTo: RelatesTo.Reference? = null
) : MessageEventContent {
constructor(roomId: RoomId, userId: UserId) : this(
roomId.full,
userId.full
)
}

View File

@@ -1,4 +1,4 @@
package eu.fosil.okupamicoche.matrix.event
package eu.fosil.okupamicoche.matrix.event.message
import eu.fosil.okupamicoche.model.Travel
import kotlinx.serialization.SerialName
@@ -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"
const val TRAVEL_CREATED_MESSAGE_EVENT_TYPE = "eu.fosil.travel.created.message"
@Serializable
data class TravelCreatedMessageEventContent(

View File

@@ -0,0 +1,22 @@
package eu.fosil.okupamicoche.matrix.event.state
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import net.folivo.trixnity.core.model.UserId
import net.folivo.trixnity.core.model.events.StateEventContent
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(
@SerialName("user")
val user: String,
@SerialName("membership")
val membership: String
) : StateEventContent {
constructor(userId: UserId, membership: Membership) : this(
userId.full,
membership.value
)
}

View File

@@ -1,4 +1,4 @@
package eu.fosil.okupamicoche.matrix.event
package eu.fosil.okupamicoche.matrix.event.state
import eu.fosil.okupamicoche.model.TravelOptions
import kotlinx.serialization.SerialName
@@ -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"
const val TRAVEL_CREATED_STATE_EVENT_TYPE = "eu.fosil.travel.created.state"
@Serializable
data class TravelCreatedStateEventContent(

View File

@@ -33,6 +33,9 @@ object MatrixApiClient {
mainRoomId = createMainRoomIfNeeded()
}
suspend fun getDisplayName(userId: UserId) =
matrixApiClient?.users?.getDisplayName(userId)?.getOrNull() ?: userId.localpart
private suspend fun createMainRoomIfNeeded(): RoomId? {
requireNotNull(config)
requireNotNull(matrixApiClient)

View File

@@ -5,9 +5,9 @@ import eu.fosil.okupamicoche.db.TravelEntity
import eu.fosil.okupamicoche.matrix.MatrixApiClient
import eu.fosil.okupamicoche.matrix.config
import eu.fosil.okupamicoche.matrix.db
import eu.fosil.okupamicoche.matrix.event.TRAVEL_CREATED_STATE_EVENT_TYPE
import eu.fosil.okupamicoche.matrix.event.TravelCreatedMessageEventContent
import eu.fosil.okupamicoche.matrix.event.TravelCreatedStateEventContent
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.matrixApiClient
import eu.fosil.okupamicoche.model.Travel
import eu.fosil.okupamicoche.model.TravelOptions
@@ -74,7 +74,8 @@ private suspend fun createRoom(travelOptions: TravelOptions, driver: UserId): Ro
name = newRoomAliasAndName.name,
topic = travelOptions.description,
invite = setOf(driver),
initialState = listOf(initialState),
// TODO: uncomment when https://gitlab.com/benkuly/trixnity/-/issues/119 gets fixed
// initialState = listOf(initialState),
powerLevelContentOverride = powerLevels
).getOrThrow()
}
@@ -143,7 +144,7 @@ private suspend fun sendCreateMessageEvents(
val time = DateTimeFormatter.ofPattern("H:mm").withZone(ZoneId.systemDefault()).format(instant)
// Send text message to main room
val displayName = matrixApiClient.users.getDisplayName(travel.driver).getOrNull() ?: travel.driver.full
val displayName = MatrixApiClient.getDisplayName(travel.driver)
val messageBody = "$displayName created a new travel! ${travel.options.from}-${travel.options.to}" +
" on $date $time with ${travel.options.places} free places."
matrixApiClient.rooms.sendMessageEvent(

View File

@@ -0,0 +1,46 @@
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.matrixApiClient
import net.folivo.trixnity.core.model.RoomId
import net.folivo.trixnity.core.model.UserId
import net.folivo.trixnity.core.model.events.m.room.Membership
import net.folivo.trixnity.core.model.events.m.room.RoomMessageEventContent
suspend fun joinTravel(
roomId: RoomId,
userId: UserId
) {
sendJoinMessageEvents(roomId, userId)
}
private suspend fun sendJoinMessageEvents(
roomId: RoomId,
userId: UserId
) {
requireNotNull(matrixApiClient)
// Send text message to travel room
val displayName = MatrixApiClient.getDisplayName(userId)
val messageBody = "$displayName joined the travel!"
matrixApiClient.rooms.sendMessageEvent(
roomId,
RoomMessageEventContent.TextMessageEventContent(messageBody)
)
// Send membership change state event to travel room
matrixApiClient.rooms.sendStateEvent(
roomId,
MembershipChangeStateEventContent(userId, Membership.JOIN),
stateKey = userId.full.substring(1) // Synapse throws 403 if stateKey starts with '@'
).getOrThrow()
// THIS EVENT IS SENT BY CLIENT, NO APP SERVICE
// Send new travel message event to main room
// matrixApiClient.rooms.sendMessageEvent(
// roomId,
// JoinTravelMessageEventContent(roomId, userId)
// )
}