Powerlevels

This commit is contained in:
2022-03-21 23:29:17 +01:00
parent 0494a06e9c
commit 9f8d59b7a9
8 changed files with 102 additions and 24 deletions

View File

@@ -29,8 +29,7 @@ suspend fun main() {
launch {
val roomMainAlias = "#${config.mainRoom}:${config.homeserver.host}"
val roomAliasRes =
matrixApiClient.rooms.getRoomAlias(RoomAliasId(roomMainAlias)).getOrNull()
val roomAliasRes = matrixApiClient.rooms.getRoomAlias(RoomAliasId(roomMainAlias)).getOrNull()
if (roomAliasRes == null) {
logger.info("Creating $roomMainAlias public room")
matrixApiClient.rooms.createRoom(

View File

@@ -1,10 +1,12 @@
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 mu.KotlinLogging
import net.folivo.trixnity.core.model.RoomId
import net.folivo.trixnity.core.model.UserId
import net.folivo.trixnity.core.model.events.m.room.RoomMessageEventContent
import java.time.Instant
import java.time.ZoneId
import java.time.format.DateTimeFormatter
@@ -34,12 +36,18 @@ object CommandParser {
) {
logger.info("command=$command args=$args")
try {
requireNotNull(matrixApiClient)
when (command) {
"create" -> handleCreate(user, room, args)
}
} catch (e: Exception) {
logger.error { "Exception captured: $e" }
e.printStackTrace()
matrixApiClient?.rooms?.sendMessageEvent(
room,
RoomMessageEventContent.TextMessageEventContent("Error executing command: $e")
)
}
}

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.TravelCreatedEventContent
import eu.fosil.okupamicoche.matrix.event.TravelCreatedMessageEventContent
import eu.fosil.okupamicoche.matrix.services.EventTnxService
import eu.fosil.okupamicoche.matrix.services.RoomService
import eu.fosil.okupamicoche.matrix.services.UserService
@@ -29,7 +29,9 @@ fun createAppService(matrixClientServerApiClient: MatrixClientServerApiClient):
}
return DefaultAppserviceService(
EventTnxService(), UserService(matrixClientServerApiClient), RoomService(matrixClientServerApiClient)
EventTnxService(),
UserService(matrixClientServerApiClient),
RoomService(matrixClientServerApiClient)
).apply {
subscribeAllEvents {
logger.debug("All events: $it")
@@ -39,9 +41,9 @@ fun createAppService(matrixClientServerApiClient: MatrixClientServerApiClient):
logger.info("${it.content.creator} created room ${it.roomId}")
}
}
subscribe<TravelCreatedEventContent> { event->
logger.info("NEW TRAVEL CREATED EVENT!!")
logger.info("$event")
subscribe<TravelCreatedMessageEventContent> { event ->
logger.info("NEW TRAVEL CREATED EVENT!!")
logger.info("$event")
}
subscribe<RoomMessageEventContent.TextMessageEventContent> { event ->
require(event is Event.MessageEvent)
@@ -60,5 +62,3 @@ fun createAppService(matrixClientServerApiClient: MatrixClientServerApiClient):
}
}
}

View File

@@ -6,8 +6,10 @@ 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_ID = "eu.fosil.travel.created"
@Serializable
data class TravelCreatedEventContent(
data class TravelCreatedMessageEventContent(
@SerialName("room")
val room: String,
@SerialName("driver")
@@ -34,4 +36,4 @@ data class TravelCreatedEventContent(
travel.options.places,
travel.options.description
)
}
}

View File

@@ -0,0 +1,31 @@
package eu.fosil.okupamicoche.matrix.event
import eu.fosil.okupamicoche.model.TravelOptions
import kotlinx.serialization.SerialName
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_ID = "eu.fosil.travel.created"
@Serializable
data class TravelCreatedStateEventContent(
@SerialName("driver")
val driver: String,
@SerialName("from")
val from: String,
@SerialName("to")
val to: String,
@SerialName("time")
val time: Long,
@SerialName("places")
val places: Int
) : StateEventContent {
constructor(travelOptions: TravelOptions, driver: UserId) : this(
driver.full,
travelOptions.from,
travelOptions.to,
travelOptions.time,
travelOptions.places
)
}

View File

@@ -6,11 +6,13 @@ import net.folivo.trixnity.core.serialization.events.EventContentSerializerMappi
object TravelEventContentSerializerMappings : EventContentSerializerMappings {
override val message: Set<EventContentSerializerMapping<out MessageEventContent>> = setOf(
EventContentSerializerMapping.of<TravelCreatedEventContent>("eu.fosil.travel.created")
EventContentSerializerMapping.of<TravelCreatedMessageEventContent>(TRAVEL_CREATED_MESSAGE_EVENT_ID)
)
override val state: Set<EventContentSerializerMapping<out StateEventContent>> = setOf(
EventContentSerializerMapping.of<TravelCreatedStateEventContent>(TRAVEL_CREATED_STATE_EVENT_ID)
)
override val state: Set<EventContentSerializerMapping<out StateEventContent>> = setOf()
override val ephemeral: Set<EventContentSerializerMapping<out EphemeralEventContent>> = setOf()
override val globalAccountData: Set<EventContentSerializerMapping<out GlobalAccountDataEventContent>> = setOf()
override val roomAccountData: Set<EventContentSerializerMapping<out RoomAccountDataEventContent>> = setOf()
override val toDevice: Set<EventContentSerializerMapping<out ToDeviceEventContent>> = setOf()
}
}

View File

@@ -3,7 +3,11 @@ package eu.fosil.okupamicoche.matrix
import eu.fosil.okupamicoche.config.ConfigReader
import eu.fosil.okupamicoche.matrix.event.TravelEventContentSerializerMappings
import io.ktor.http.*
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import net.folivo.trixnity.clientserverapi.client.MatrixClientServerApiClient
import net.folivo.trixnity.core.model.UserId
import net.folivo.trixnity.core.serialization.events.DefaultEventContentSerializerMappings
val config = ConfigReader.load()
@@ -13,4 +17,17 @@ val matrixApiClient = if (config == null) null else MatrixClientServerApiClient(
"://${config.homeserver.host}:${config.homeserver.port}"
),
eventContentSerializerMappings = DefaultEventContentSerializerMappings + TravelEventContentSerializerMappings
).apply { accessToken.value = config.tokens.appService }
).apply { accessToken.value = config.tokens.appService }
object MatrixApiClient {
var appServiceUserId: UserId? = null
init {
requireNotNull(matrixApiClient)
val ioScope = CoroutineScope(Dispatchers.IO)
ioScope.launch {
appServiceUserId = matrixApiClient.users.whoAmI().getOrThrow().userId
}
}
}

View File

@@ -2,8 +2,12 @@ package eu.fosil.okupamicoche.usecase.travel
import eu.fosil.okupamicoche.config.ConfigReader
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.TravelCreatedEventContent
import eu.fosil.okupamicoche.matrix.event.TRAVEL_CREATED_STATE_EVENT_ID
import eu.fosil.okupamicoche.matrix.event.TravelCreatedMessageEventContent
import eu.fosil.okupamicoche.matrix.event.TravelCreatedStateEventContent
import eu.fosil.okupamicoche.matrix.matrixApiClient
import eu.fosil.okupamicoche.model.Travel
import eu.fosil.okupamicoche.model.TravelOptions
@@ -12,6 +16,8 @@ import net.folivo.trixnity.clientserverapi.model.rooms.Visibility
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.Event
import net.folivo.trixnity.core.model.events.m.room.PowerLevelsEventContent
import net.folivo.trixnity.core.model.events.m.room.RoomMessageEventContent
import org.jetbrains.exposed.sql.transactions.transaction
import java.time.Instant
@@ -30,8 +36,6 @@ suspend fun createTravel(
driver: UserId,
roomId: RoomId
) {
requireNotNull(matrixApiClient)
val newRoomId = createRoom(travelOptions, driver)
val travel = Travel(
newRoomId,
@@ -39,7 +43,7 @@ suspend fun createTravel(
travelOptions
)
sendCreateEvents(travel, roomId)
sendCreateMessageEvents(travel, roomId)
transaction(db) {
TravelEntity.new(travel)
@@ -48,14 +52,29 @@ suspend fun createTravel(
private suspend fun createRoom(travelOptions: TravelOptions, driver: UserId): RoomId {
requireNotNull(matrixApiClient)
requireNotNull(config)
val newRoomAliasAndName = getRoomAliasAndName(travelOptions)
val initialState = Event.InitialStateEvent(
TravelCreatedStateEventContent(travelOptions, driver),
""
)
val powerLevels = PowerLevelsEventContent(
events = mapOf(Pair(TRAVEL_CREATED_STATE_EVENT_ID, 100)),
users = mapOf(
Pair(MatrixApiClient.appServiceUserId!!, 100),
Pair(driver, 50)
)
)
return matrixApiClient.rooms.createRoom(
visibility = Visibility.PUBLIC,
roomAliasId = newRoomAliasAndName.aliasId,
name = newRoomAliasAndName.name,
topic = travelOptions.description,
invite = setOf(driver)
invite = setOf(driver),
initialState = listOf(initialState),
powerLevelContentOverride = powerLevels
).getOrThrow()
}
@@ -104,14 +123,14 @@ private fun getRoomName(travelOptions: TravelOptions, attempt: Int): String {
val instant = Instant.ofEpochMilli(travelOptions.time)
val date = DateTimeFormatter.ofPattern("yyyy/MM/dd").withZone(ZoneId.systemDefault()).format(instant)
val time = DateTimeFormatter.ofPattern("H:mm").withZone(ZoneId.systemDefault()).format(instant)
val attemptSuffix = if (attempt > 0) " ($attempt)" else null
val attemptSuffix = if (attempt > 0) " ($attempt)" else ""
return travelOptions.run {
"Viaje ${from}-${to} $date $time | $places places available" + attemptSuffix
"Travel ${from}-${to} $date $time | $places places available" + attemptSuffix
}
}
private suspend fun sendCreateEvents(
private suspend fun sendCreateMessageEvents(
travel: Travel,
roomId: RoomId
) {
@@ -133,7 +152,7 @@ private suspend fun sendCreateEvents(
// Send new travel event
matrixApiClient.rooms.sendMessageEvent(
roomId,
TravelCreatedEventContent(travel)
TravelCreatedMessageEventContent(travel)
)
}