This commit is contained in:
2022-03-16 00:23:52 +01:00
parent a2b50621f3
commit 869d37c5d1
8 changed files with 126 additions and 74 deletions

View File

@@ -1,18 +1,10 @@
package eu.fosil.okupamicoche.cli
import eu.fosil.okupamicoche.config.ConfigReader.config
import eu.fosil.okupamicoche.db.TravelEntity
import eu.fosil.okupamicoche.matrix.db
import eu.fosil.okupamicoche.matrix.event.NewTravelEventContent
import eu.fosil.okupamicoche.matrix.matrixApiClient
import eu.fosil.okupamicoche.model.Travel
import eu.fosil.okupamicoche.model.TravelOptions
import eu.fosil.okupamicoche.usecase.travel.createTravel
import mu.KotlinLogging
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.m.room.RoomMessageEventContent
import org.jetbrains.exposed.sql.transactions.transaction
import java.time.LocalDateTime
import java.time.ZoneOffset
import java.time.format.DateTimeFormatter
@@ -56,52 +48,21 @@ object CommandParser {
roomId: RoomId,
args: List<String>
) {
requireNotNull(matrixApiClient)
val from = args[0]
val to = args[1]
val date = args[2]
val time = args[3]
val formatter = DateTimeFormatter.ofPattern("yyyy/M/d H:mm")
val unixTime = LocalDateTime.from(formatter.parse("$date $time")).toEpochSecond(ZoneOffset.UTC)
val places = args[4].toIntOrNull() ?: 0
val description = args[5]
val unixTime = LocalDateTime.from(formatter.parse("$date $time")).toEpochSecond(ZoneOffset.UTC) * 1000
val newRoomAliasId = RoomAliasId("#viaje_$from-${to}_${date}_$time:${config?.homeserver}")
val newRoomId = matrixApiClient.rooms.createRoom(
visibility = Visibility.PUBLIC,
roomAliasId = newRoomAliasId
).getOrThrow()
val newTravel = Travel(
newRoomId,
userId,
from,
to,
unixTime,
places,
description
val travelOptions = TravelOptions(
from = args[0],
to = args[1],
time = unixTime,
places = args[4].toIntOrNull() ?: 0,
description = args[5]
)
transaction(db) {
TravelEntity.insert(newTravel)
TravelEntity.all().forEachIndexed { index, travel ->
logger.info("#$index: travel id=${travel.id} origin=${travel.from} dest=${travel.to} travel=$travel")
}
}
// Send text message
val displayName = matrixApiClient.users.getDisplayName(userId).getOrNull() ?: userId.full
matrixApiClient.rooms.sendMessageEvent(
roomId,
RoomMessageEventContent.TextMessageEventContent("$displayName created a new travel! $from-$to on $date $time with $places free places.")
)
// Send new travel event
matrixApiClient.rooms.sendMessageEvent(
roomId,
NewTravelEventContent(newTravel)
)
createTravel(userId, roomId, travelOptions)
}

View File

@@ -18,14 +18,14 @@ object TravelsTable: IntIdTable() {
class TravelEntity(id: EntityID<Int>) : IntEntity(id) {
companion object : IntEntityClass<TravelEntity>(TravelsTable) {
fun insert(travel: Travel) = TravelEntity.new {
fun new(travel: Travel) = TravelEntity.new {
this.roomId = travel.room.full
this.driver = travel.driver.full
this.from = travel.from
this.to = travel.to
this.time = travel.time
this.places = travel.places
this.description = travel.description
this.from = travel.options.from
this.to = travel.options.to
this.time = travel.options.time
this.places = travel.options.places
this.description = travel.options.description
}
}
var roomId by TravelsTable.roomId

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.NewTravelEventContent
import eu.fosil.okupamicoche.matrix.event.TravelCreatedEventContent
import eu.fosil.okupamicoche.matrix.services.EventTnxService
import eu.fosil.okupamicoche.matrix.services.RoomService
import eu.fosil.okupamicoche.matrix.services.UserService
@@ -39,7 +39,7 @@ fun createAppService(matrixClientServerApiClient: MatrixClientServerApiClient):
logger.info("${it.content.creator} created room ${it.roomId}")
}
}
subscribe<NewTravelEventContent> { event->
subscribe<TravelCreatedEventContent> { event->
logger.info("NEW TRAVEL CREATED EVENT!!")
logger.info("$event")
}

View File

@@ -7,7 +7,7 @@ import net.folivo.trixnity.core.model.events.MessageEventContent
import net.folivo.trixnity.core.model.events.RelatesTo
@Serializable
data class NewTravelEventContent(
data class TravelCreatedEventContent(
@SerialName("room")
val room: String,
@SerialName("driver")
@@ -22,20 +22,16 @@ data class NewTravelEventContent(
val places: Int,
@SerialName("description")
val description: String,
@SerialName("body")
val body: String = "New travel created",
@SerialName("m.relates_to")
override val relatesTo: RelatesTo.Reference? = null,
override val relatesTo: RelatesTo.Reference? = null
) : MessageEventContent {
constructor(travel: Travel) : this(
travel.room.full,
travel.driver.full,
travel.from,
travel.to,
travel.time,
travel.places,
travel.description,
"New travel created2",
travel.options.from,
travel.options.to,
travel.options.time,
travel.options.places,
travel.options.description
)
}

View File

@@ -6,7 +6,7 @@ import net.folivo.trixnity.core.serialization.events.EventContentSerializerMappi
object TravelEventContentSerializerMappings : EventContentSerializerMappings {
override val message: Set<EventContentSerializerMapping<out MessageEventContent>> = setOf(
EventContentSerializerMapping.of<NewTravelEventContent>("eu.fosil.travel.create")
EventContentSerializerMapping.of<TravelCreatedEventContent>("eu.fosil.travel.created")
)
override val state: Set<EventContentSerializerMapping<out StateEventContent>> = setOf()
override val ephemeral: Set<EventContentSerializerMapping<out EphemeralEventContent>> = setOf()

View File

@@ -2,17 +2,17 @@ package eu.fosil.okupamicoche.model
import net.folivo.trixnity.core.model.RoomId
import net.folivo.trixnity.core.model.UserId
import org.jetbrains.exposed.dao.IntEntity
import org.jetbrains.exposed.dao.IntEntityClass
import org.jetbrains.exposed.dao.id.EntityID
import org.jetbrains.exposed.dao.id.IntIdTable
class Travel(
var room: RoomId,
var driver: UserId,
var options: TravelOptions
)
class TravelOptions(
var from: String,
var to: String,
var time: Long,
var places: Int,
var description: String
)
)

View File

@@ -0,0 +1,95 @@
package eu.fosil.okupamicoche.usecase.travel
import eu.fosil.okupamicoche.config.ConfigReader
import eu.fosil.okupamicoche.db.TravelEntity
import eu.fosil.okupamicoche.matrix.db
import eu.fosil.okupamicoche.matrix.event.TravelCreatedEventContent
import eu.fosil.okupamicoche.matrix.matrixApiClient
import eu.fosil.okupamicoche.model.Travel
import eu.fosil.okupamicoche.model.TravelOptions
import mu.KotlinLogging
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.m.room.RoomMessageEventContent
import org.jetbrains.exposed.sql.transactions.transaction
import java.time.Instant
import java.time.LocalDateTime
import java.time.ZoneId
import java.time.format.DateTimeFormatter
private val logger = KotlinLogging.logger {}
suspend fun createTravel(
driver: UserId,
roomId: RoomId,
travelOptions: TravelOptions
) {
requireNotNull(matrixApiClient)
val newRoomAliasId = getRoomAlias(travelOptions)
val newRoomId = matrixApiClient.rooms.createRoom(
visibility = Visibility.PUBLIC,
roomAliasId = newRoomAliasId,
// name =
).getOrThrow()
val travel = Travel(
newRoomId,
driver,
travelOptions
)
sendCreateEvents(travel, roomId)
transaction(db) {
TravelEntity.new(travel)
TravelEntity.all().forEachIndexed { index, travel ->
logger.info("#$index: travel id=${travel.id} origin=${travel.from} dest=${travel.to} travel=$travel")
}
}
}
private fun getRoomAlias(travelOptions: TravelOptions): RoomAliasId {
val timezone = ZoneId.of("Europe/Paris")
val localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(travelOptions.time), timezone)
val date = DateTimeFormatter.ofPattern("yyyy/MM/dd").format(localDateTime)
val time = DateTimeFormatter.ofPattern("H:mm").format(localDateTime).replace(':', 'H')
val newRoomAliasId = travelOptions.run {
RoomAliasId("#viaje_${from}-${to}_${date}_${time}:${ConfigReader.config?.homeserver}")
}
return newRoomAliasId
}
private suspend fun sendCreateEvents(
travel: Travel,
roomId: RoomId
) {
requireNotNull(matrixApiClient)
val timezone = ZoneId.of("Europe/Paris")
val localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(travel.options.time), timezone)
val date = DateTimeFormatter.ofPattern("yyyy/MM/dd").format(localDateTime)
val time = DateTimeFormatter.ofPattern("H:mm").format(localDateTime)
// Send text message
val displayName = matrixApiClient.users.getDisplayName(travel.driver).getOrNull() ?: travel.driver.full
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(
roomId,
RoomMessageEventContent.TextMessageEventContent(messageBody)
)
// Send new travel event
matrixApiClient.rooms.sendMessageEvent(
roomId,
TravelCreatedEventContent(travel)
)
}