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