feat: server-handled routes and stops

This commit is contained in:
Cilly Leang 2025-08-12 22:43:33 +10:00
parent efba64ea90
commit 58ee095522
Signed by: cilly
GPG key ID: 6500251E087653C9
61 changed files with 1634 additions and 349 deletions

View file

@ -0,0 +1,50 @@
package moe.lava.banksia.model
import kotlinx.datetime.LocalTime
import kotlinx.serialization.KSerializer
import kotlinx.serialization.Serializable
import kotlinx.serialization.descriptors.PrimitiveKind
import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
import moe.lava.banksia.model.FutureTime.Companion.asInt
@Serializable(FutureTimeSerialiser::class)
data class FutureTime(
val dayOffset: Boolean,
val time: LocalTime,
) {
companion object {
fun from(hour: Int, minute: Int, second: Int): FutureTime {
var nHour = hour
val nextDay = hour >= 24
if (nextDay)
nHour -= 24
val time = LocalTime(nHour, minute, second)
return FutureTime(nextDay, time)
}
fun FutureTime.asInt() =
trueHour * 3600 + minute * 60 + second
fun fromInt(int: Int) = FutureTime.from(
int / 3600,
(int / 60) % 60,
int % 60,
)
}
val hour = time.hour
val minute = time.minute
val second = time.second
val trueHour = time.hour + (if (dayOffset) 24 else 0)
}
object FutureTimeSerialiser: KSerializer<FutureTime> {
override val descriptor: SerialDescriptor =
PrimitiveSerialDescriptor(FutureTimeSerialiser::class.qualifiedName!!, PrimitiveKind.INT)
override fun serialize(encoder: Encoder, value: FutureTime) = encoder.encodeInt(value.asInt())
override fun deserialize(decoder: Decoder) = FutureTime.fromInt(decoder.decodeInt())
}

View file

@ -1,11 +1,10 @@
package moe.lava.banksia.model
import androidx.room.Entity
import androidx.room.PrimaryKey
import kotlinx.serialization.Serializable
@Entity
@Serializable
data class Route(
@PrimaryKey val id: String,
val id: String,
val type: RouteType,
val number: String?,
val name: String,

View file

@ -1,7 +1,8 @@
package moe.lava.banksia.model
import androidx.room.TypeConverter
import kotlinx.serialization.Serializable
@Serializable
enum class RouteType(val value: Int) {
MetroTrain(2),
MetroTram(3),
@ -12,12 +13,4 @@ enum class RouteType(val value: Int) {
SkyBus(11),
Interstate(10),
;
companion object {
@TypeConverter
fun from(value: Int) = RouteType.entries.first { it.value == value }
@TypeConverter
fun to(routeType: RouteType) = routeType.value
}
}

View file

@ -0,0 +1,5 @@
package moe.lava.banksia.model
data class Run(
val ref: String,
)

View file

@ -0,0 +1,13 @@
package moe.lava.banksia.model
import kotlinx.datetime.DayOfWeek
import kotlinx.datetime.LocalDate
import kotlinx.serialization.Serializable
@Serializable
data class Service(
val id: String,
val days: List<DayOfWeek>,
val start: LocalDate,
val end: LocalDate,
)

View file

@ -1,16 +1,12 @@
package moe.lava.banksia.model
import androidx.room.Entity
import androidx.room.PrimaryKey
import androidx.room.TypeConverters
import moe.lava.banksia.room.converter.ShapeConverter
import kotlinx.serialization.Serializable
import moe.lava.banksia.util.Point
typealias ShapePath = List<Point>
@Entity
@TypeConverters(ShapeConverter::class)
@Serializable
data class Shape(
@PrimaryKey val id: String,
val id: String,
val path: ShapePath,
)

View file

@ -0,0 +1,15 @@
package moe.lava.banksia.model
import kotlinx.serialization.Serializable
import moe.lava.banksia.util.Point
@Serializable
data class Stop(
val id: String,
val name: String,
val pos: Point,
val parent: String,
val hasWheelChairBoarding: Boolean,
val level: String,
val platformCode: String,
)

View file

@ -0,0 +1,14 @@
package moe.lava.banksia.model
import kotlinx.serialization.Serializable
@Serializable
data class StopTime(
val tripId: String,
val stopId: String,
val arrivalTime: FutureTime,
val departureTime: FutureTime,
val headsign: String?,
val pickupType: Int,
val dropOffType: Int,
)

View file

@ -0,0 +1,15 @@
package moe.lava.banksia.model
import kotlinx.serialization.Serializable
@Serializable
data class Trip(
val id: String,
val routeId: String,
val serviceId: String,
val shapeId: String?,
val tripHeadsign: String,
val directionId: String,
val blockId: String,
val wheelchairAccessible: String,
)