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