aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--basetypes/src/main/kotlin/moe/nea/ledger/TransactionType.kt3
-rw-r--r--basetypes/src/main/kotlin/moe/nea/ledger/utils/ULIDWrapper.kt8
-rw-r--r--build.gradle.kts3
-rw-r--r--database/core/src/main/kotlin/moe/nea/ledger/database/Column.kt10
-rw-r--r--database/core/src/main/kotlin/moe/nea/ledger/database/Constraint.kt2
-rw-r--r--database/core/src/main/kotlin/moe/nea/ledger/database/DBType.kt16
-rw-r--r--database/core/src/main/kotlin/moe/nea/ledger/database/InsertStatement.kt4
-rw-r--r--database/core/src/main/kotlin/moe/nea/ledger/database/Query.kt2
-rw-r--r--database/core/src/main/kotlin/moe/nea/ledger/database/ResultRow.kt6
-rw-r--r--database/core/src/main/kotlin/moe/nea/ledger/database/Table.kt14
-rw-r--r--database/core/src/main/kotlin/moe/nea/ledger/database/UniqueConstraint.kt4
-rw-r--r--database/core/src/main/kotlin/moe/nea/ledger/database/columns/DBDouble.kt2
-rw-r--r--database/core/src/main/kotlin/moe/nea/ledger/database/columns/DBEnum.kt2
-rw-r--r--database/core/src/main/kotlin/moe/nea/ledger/database/columns/DBInstant.kt2
-rw-r--r--database/core/src/main/kotlin/moe/nea/ledger/database/columns/DBInt.kt2
-rw-r--r--database/core/src/main/kotlin/moe/nea/ledger/database/columns/DBString.kt2
-rw-r--r--database/core/src/main/kotlin/moe/nea/ledger/database/columns/DBUlid.kt2
-rw-r--r--database/core/src/main/kotlin/moe/nea/ledger/database/columns/DBUuid.kt2
-rw-r--r--database/core/src/main/kotlin/moe/nea/ledger/database/sql/ANDExpression.kt5
-rw-r--r--database/core/src/main/kotlin/moe/nea/ledger/database/sql/Clause.kt6
-rw-r--r--database/core/src/main/kotlin/moe/nea/ledger/database/sql/ClauseBuilder.kt22
-rw-r--r--database/core/src/main/kotlin/moe/nea/ledger/database/sql/ColumnOperand.kt6
-rw-r--r--database/core/src/main/kotlin/moe/nea/ledger/database/sql/EqualsClause.kt2
-rw-r--r--database/core/src/main/kotlin/moe/nea/ledger/database/sql/IntoSelectable.kt2
-rw-r--r--database/core/src/main/kotlin/moe/nea/ledger/database/sql/LessThanEqualsExpression.kt15
-rw-r--r--database/core/src/main/kotlin/moe/nea/ledger/database/sql/LessThanExpression.kt15
-rw-r--r--database/core/src/main/kotlin/moe/nea/ledger/database/sql/LikeClause.kt2
-rw-r--r--database/core/src/main/kotlin/moe/nea/ledger/database/sql/ListClause.kt8
-rw-r--r--database/core/src/main/kotlin/moe/nea/ledger/database/sql/ListExpression.kt22
-rw-r--r--database/core/src/main/kotlin/moe/nea/ledger/database/sql/Operand.kt7
-rw-r--r--database/core/src/main/kotlin/moe/nea/ledger/database/sql/SQLQueryComponent.kt19
-rw-r--r--database/core/src/main/kotlin/moe/nea/ledger/database/sql/Selectable.kt8
-rw-r--r--database/core/src/main/kotlin/moe/nea/ledger/database/sql/StringOperand.kt5
-rw-r--r--database/core/src/main/kotlin/moe/nea/ledger/database/sql/TypedOperand.kt7
-rw-r--r--database/core/src/main/kotlin/moe/nea/ledger/database/sql/ValuedOperand.kt15
-rw-r--r--database/impl/src/main/kotlin/moe/nea/ledger/database/DBUpgrade.kt4
-rw-r--r--database/impl/src/main/kotlin/moe/nea/ledger/database/Upgrades.kt2
-rw-r--r--flake.lock61
-rw-r--r--flake.nix30
-rw-r--r--mod/log4j2.xml6
-rw-r--r--mod/src/main/java/moe/nea/ledger/init/AutoDiscoveryMixinPlugin.java2
-rw-r--r--mod/src/main/java/moe/nea/ledger/mixin/AccessorContainerDispenser.java12
-rw-r--r--mod/src/main/java/moe/nea/ledger/mixin/AccessorContainerHopper.java13
-rw-r--r--mod/src/main/kotlin/moe/nea/ledger/ItemIdProvider.kt4
-rw-r--r--mod/src/main/kotlin/moe/nea/ledger/Ledger.kt11
-rw-r--r--mod/src/main/kotlin/moe/nea/ledger/QueryCommand.kt2
-rw-r--r--mod/src/main/kotlin/moe/nea/ledger/config/DebugOptions.kt3
-rw-r--r--mod/src/main/kotlin/moe/nea/ledger/events/BeforeGuiAction.kt12
-rw-r--r--mod/src/main/kotlin/moe/nea/ledger/events/LedgerEvent.kt22
-rw-r--r--mod/src/main/kotlin/moe/nea/ledger/modules/CaducousFeederDetection.kt48
-rw-r--r--mod/src/main/kotlin/moe/nea/ledger/modules/ExternalDataProvider.kt5
-rw-r--r--mod/src/main/kotlin/moe/nea/ledger/modules/ForgeDetection.kt3
-rw-r--r--mod/src/main/kotlin/moe/nea/ledger/modules/GhostCoinDropDetection.kt38
-rw-r--r--mod/src/main/kotlin/moe/nea/ledger/modules/StonksAuctionDetection.kt59
-rw-r--r--mod/src/main/kotlin/moe/nea/ledger/telemetry/GuiContextValue.kt16
-rw-r--r--mod/src/main/kotlin/moe/nea/ledger/telemetry/TelemetryProvider.kt (renamed from mod/src/main/kotlin/moe/nea/ledger/TelemetryProvider.kt)6
-rw-r--r--mod/src/main/kotlin/moe/nea/ledger/utils/ScreenUtil.kt29
-rw-r--r--mod/src/main/kotlin/moe/nea/ledger/utils/network/RequestTrace.kt21
-rw-r--r--mod/src/main/kotlin/moe/nea/ledger/utils/network/RequestUtil.kt9
-rw-r--r--mod/src/main/kotlin/moe/nea/ledger/utils/telemetry/Span.kt3
-rw-r--r--server/analysis/build.gradle.kts16
-rw-r--r--server/analysis/src/main/kotlin/moe/nea/ledger/analysis/Analysis.kt9
-rw-r--r--server/analysis/src/main/kotlin/moe/nea/ledger/analysis/AnalysisFilter.kt26
-rw-r--r--server/analysis/src/main/kotlin/moe/nea/ledger/analysis/AnalysisResult.kt8
-rw-r--r--server/analysis/src/main/kotlin/moe/nea/ledger/analysis/CoinsSpentOnAuctions.kt49
-rw-r--r--server/analysis/src/main/kotlin/moe/nea/ledger/analysis/DailyCashflow.kt52
-rw-r--r--server/analysis/src/main/kotlin/moe/nea/ledger/analysis/Visualization.kt30
-rw-r--r--server/core/build.gradle.kts1
-rw-r--r--server/core/src/main/kotlin/moe/nea/ledger/server/core/api/BaseApi.kt109
-rw-r--r--server/frontend/index.html2
-rw-r--r--server/frontend/package.json14
-rw-r--r--server/frontend/pnpm-lock.yaml916
-rw-r--r--server/frontend/pnpm-workspace.yaml3
-rw-r--r--server/frontend/src/Analysis.tsx137
-rw-r--r--server/frontend/src/App.tsx17
-rw-r--r--server/frontend/src/api-schema.d.ts98
-rw-r--r--server/frontend/src/api.ts7
-rw-r--r--server/frontend/src/index.css5
-rw-r--r--server/frontend/src/index.tsx13
-rw-r--r--server/frontend/tsconfig.json4
-rw-r--r--server/frontend/vite.config.ts11
-rw-r--r--server/swagger/src/main/kotlin/moe/nea/ledger/server/core/api/OpenApiModel.kt1
-rw-r--r--settings.gradle.kts6
83 files changed, 2091 insertions, 116 deletions
diff --git a/basetypes/src/main/kotlin/moe/nea/ledger/TransactionType.kt b/basetypes/src/main/kotlin/moe/nea/ledger/TransactionType.kt
index b353e29..d4c15e5 100644
--- a/basetypes/src/main/kotlin/moe/nea/ledger/TransactionType.kt
+++ b/basetypes/src/main/kotlin/moe/nea/ledger/TransactionType.kt
@@ -17,6 +17,7 @@ enum class TransactionType {
BAZAAR_SELL_ORDER,
BITS_PURSE_STATUS,
BOOSTER_COOKIE_ATE,
+ CADUCOUS_FEEDER_USED,
CAPSAICIN_EYEDROPS_USED,
COMMUNITY_SHOP_BUY,
CORPSE_DESECRATED,
@@ -24,6 +25,7 @@ enum class TransactionType {
DRACONIC_SACRIFICE,
DUNGEON_CHEST_OPEN,
FORGED,
+ GHOST_COIN_DROP,
GOD_POTION_DRANK,
GOD_POTION_MIXIN_DRANK,
GUMMY_POLAR_BEAR_ATE,
@@ -34,6 +36,7 @@ enum class TransactionType {
NPC_BUY,
NPC_SELL,
PEST_REPELLENT_USED,
+ STONKS_AUCTION,
VISITOR_BARGAIN,
WYRM_EVOKED,
} \ No newline at end of file
diff --git a/basetypes/src/main/kotlin/moe/nea/ledger/utils/ULIDWrapper.kt b/basetypes/src/main/kotlin/moe/nea/ledger/utils/ULIDWrapper.kt
index b8c5d3b..29d5e31 100644
--- a/basetypes/src/main/kotlin/moe/nea/ledger/utils/ULIDWrapper.kt
+++ b/basetypes/src/main/kotlin/moe/nea/ledger/utils/ULIDWrapper.kt
@@ -9,6 +9,14 @@ value class ULIDWrapper(
val wrapped: String
) {
companion object {
+ fun lowerBound(timestamp: Instant): ULIDWrapper {
+ return ULIDWrapper(ULID.generate(timestamp.toEpochMilli(), ByteArray(10)))
+ }
+
+ fun upperBound(timestamp: Instant): ULIDWrapper {
+ return ULIDWrapper(ULID.generate(timestamp.toEpochMilli(), ByteArray(10) { -1 }))
+ }
+
fun createULIDAt(timestamp: Instant): ULIDWrapper {
return ULIDWrapper(ULID.generate(
timestamp.toEpochMilli(),
diff --git a/build.gradle.kts b/build.gradle.kts
index 8377205..4c6ee45 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -2,11 +2,12 @@ import com.github.gmazzo.buildconfig.BuildConfigExtension
import java.io.ByteArrayOutputStream
plugins {
- val kotlinVersion = "2.0.20"
+ val kotlinVersion = "2.0.21"
kotlin("jvm") version kotlinVersion apply false
kotlin("plugin.serialization") version kotlinVersion apply false
id("com.github.gmazzo.buildconfig") version "5.5.0" apply false
id("ledger-globals")
+ id("com.google.devtools.ksp") version "2.0.21-1.0.26" apply false
id("com.github.johnrengelman.shadow") version "8.1.1" apply false
}
diff --git a/database/core/src/main/kotlin/moe/nea/ledger/database/Column.kt b/database/core/src/main/kotlin/moe/nea/ledger/database/Column.kt
index 33727de..c21a159 100644
--- a/database/core/src/main/kotlin/moe/nea/ledger/database/Column.kt
+++ b/database/core/src/main/kotlin/moe/nea/ledger/database/Column.kt
@@ -4,20 +4,20 @@ import moe.nea.ledger.database.sql.IntoSelectable
import moe.nea.ledger.database.sql.Selectable
import java.sql.PreparedStatement
-class Column<T> @Deprecated("Use Table.column instead") constructor(
+class Column<T, Raw> @Deprecated("Use Table.column instead") constructor(
val table: Table,
val name: String,
- val type: DBType<T>
+ val type: DBType<T, Raw>
) : IntoSelectable<T> {
- override fun asSelectable() = object : Selectable<T> {
+ override fun asSelectable() = object : Selectable<T, Raw> {
override fun asSql(): String {
return qualifiedSqlName
}
- override val dbType: DBType<T>
+ override val dbType: DBType<T, Raw>
get() = this@Column.type
- override fun guessColumn(): Column<T>? {
+ override fun guessColumn(): Column<T, Raw> {
return this@Column
}
diff --git a/database/core/src/main/kotlin/moe/nea/ledger/database/Constraint.kt b/database/core/src/main/kotlin/moe/nea/ledger/database/Constraint.kt
index 9f7c9ef..729c6b8 100644
--- a/database/core/src/main/kotlin/moe/nea/ledger/database/Constraint.kt
+++ b/database/core/src/main/kotlin/moe/nea/ledger/database/Constraint.kt
@@ -1,6 +1,6 @@
package moe.nea.ledger.database
interface Constraint {
- val affectedColumns: Collection<Column<*>>
+ val affectedColumns: Collection<Column<*, *>>
fun asSQL(): String
} \ No newline at end of file
diff --git a/database/core/src/main/kotlin/moe/nea/ledger/database/DBType.kt b/database/core/src/main/kotlin/moe/nea/ledger/database/DBType.kt
index 86ff544..622aff3 100644
--- a/database/core/src/main/kotlin/moe/nea/ledger/database/DBType.kt
+++ b/database/core/src/main/kotlin/moe/nea/ledger/database/DBType.kt
@@ -1,9 +1,19 @@
package moe.nea.ledger.database
+import moe.nea.ledger.database.sql.ClauseBuilder
import java.sql.PreparedStatement
import java.sql.ResultSet
-interface DBType<T> {
+
+interface DBType<
+ /**
+ * Mapped type of this db type. Represents the Java type this db type accepts for saving to the database.
+ */
+ T,
+ /**
+ * Phantom marker type representing how this db type is presented to the actual DB. Is used by APIs such as [ClauseBuilder] to allow for rough typechecking.
+ */
+ RawType> {
val dbType: String
fun get(result: ResultSet, index: Int): T
@@ -12,8 +22,8 @@ interface DBType<T> {
fun <R> mapped(
from: (R) -> T,
to: (T) -> R,
- ): DBType<R> {
- return object : DBType<R> {
+ ): DBType<R, RawType> {
+ return object : DBType<R, RawType> {
override fun getName(): String {
return "Mapped(${this@DBType.getName()})"
}
diff --git a/database/core/src/main/kotlin/moe/nea/ledger/database/InsertStatement.kt b/database/core/src/main/kotlin/moe/nea/ledger/database/InsertStatement.kt
index 7871ba8..25bef22 100644
--- a/database/core/src/main/kotlin/moe/nea/ledger/database/InsertStatement.kt
+++ b/database/core/src/main/kotlin/moe/nea/ledger/database/InsertStatement.kt
@@ -1,7 +1,7 @@
package moe.nea.ledger.database
-class InsertStatement(val properties: MutableMap<Column<*>, Any>) {
- operator fun <T : Any> set(key: Column<T>, value: T) {
+class InsertStatement(val properties: MutableMap<Column<*, *>, Any>) {
+ operator fun <T : Any> set(key: Column<T, *>, value: T) {
properties[key] = value
}
} \ No newline at end of file
diff --git a/database/core/src/main/kotlin/moe/nea/ledger/database/Query.kt b/database/core/src/main/kotlin/moe/nea/ledger/database/Query.kt
index e58eef4..a23c878 100644
--- a/database/core/src/main/kotlin/moe/nea/ledger/database/Query.kt
+++ b/database/core/src/main/kotlin/moe/nea/ledger/database/Query.kt
@@ -12,7 +12,7 @@ import java.sql.Connection
class Query(
val connection: Connection,
- val selectedColumns: MutableList<Selectable<*>>,
+ val selectedColumns: MutableList<Selectable<*, *>>,
var table: Table,
var limit: UInt? = null,
var skip: UInt? = null,
diff --git a/database/core/src/main/kotlin/moe/nea/ledger/database/ResultRow.kt b/database/core/src/main/kotlin/moe/nea/ledger/database/ResultRow.kt
index 6715f27..7b57abd 100644
--- a/database/core/src/main/kotlin/moe/nea/ledger/database/ResultRow.kt
+++ b/database/core/src/main/kotlin/moe/nea/ledger/database/ResultRow.kt
@@ -2,19 +2,19 @@ package moe.nea.ledger.database
import moe.nea.ledger.database.sql.Selectable
-class ResultRow(val selectableValues: Map<Selectable<*>, *>) {
+class ResultRow(val selectableValues: Map<Selectable<*, *>, *>) {
val columnValues = selectableValues.mapNotNull {
val col = it.key.guessColumn() ?: return@mapNotNull null
col to it.value
}.toMap()
- operator fun <T> get(column: Column<T>): T {
+ operator fun <T> get(column: Column<T, *>): T {
val value = columnValues[column]
?: error("Invalid column ${column.name}. Only ${columnValues.keys.joinToString { it.name }} are available.")
return value as T
}
- operator fun <T> get(column: Selectable<T>): T {
+ operator fun <T> get(column: Selectable<T, *>): T {
val value = selectableValues[column]
?: error("Invalid selectable ${column}. Only ${selectableValues.keys} are available.")
return value as T
diff --git a/database/core/src/main/kotlin/moe/nea/ledger/database/Table.kt b/database/core/src/main/kotlin/moe/nea/ledger/database/Table.kt
index 61dc8f0..a462813 100644
--- a/database/core/src/main/kotlin/moe/nea/ledger/database/Table.kt
+++ b/database/core/src/main/kotlin/moe/nea/ledger/database/Table.kt
@@ -4,15 +4,15 @@ import java.sql.Connection
abstract class Table(val name: String) {
val sqlName get() = "`$name`"
- protected val _mutable_columns: MutableList<Column<*>> = mutableListOf()
+ protected val _mutable_columns: MutableList<Column<*, *>> = mutableListOf()
protected val _mutable_constraints: MutableList<Constraint> = mutableListOf()
- val columns: List<Column<*>> get() = _mutable_columns
+ val columns: List<Column<*, *>> get() = _mutable_columns
val constraints get() = _mutable_constraints
- protected fun unique(vararg columns: Column<*>) {
+ protected fun unique(vararg columns: Column<*, *>) {
_mutable_constraints.add(UniqueConstraint(columns.toList()))
}
- protected fun <T> column(name: String, type: DBType<T>): Column<T> {
+ protected fun <T, R> column(name: String, type: DBType<T, R>): Column<T, R> {
@Suppress("DEPRECATION") val column = Column(this, name, type)
_mutable_columns.add(column)
return column
@@ -39,7 +39,7 @@ abstract class Table(val name: String) {
fun createIfNotExists(
connection: Connection,
- filteredColumns: List<Column<*>> = columns
+ filteredColumns: List<Column<*, *>> = columns
) {
val properties = mutableListOf<String>()
for (column in filteredColumns) {
@@ -57,7 +57,7 @@ abstract class Table(val name: String) {
fun alterTableAddColumns(
connection: Connection,
- newColumns: List<Column<*>>
+ newColumns: List<Column<*, *>>
) {
for (column in newColumns) {
connection.prepareAndLog("ALTER TABLE $sqlName ADD ${column.sqlName} ${column.type.dbType}")
@@ -88,7 +88,7 @@ abstract class Table(val name: String) {
val statement =
connection.prepareAndLog("INSERT OR ${onConflict.asSql()} INTO $sqlName ($columnNames) VALUES ($valueNames)")
for ((index, column) in columns.withIndex()) {
- (column as Column<Any>).type.set(statement, index + 1, insert.properties[column]!!)
+ (column as Column<Any, *>).type.set(statement, index + 1, insert.properties[column]!!)
}
statement.execute()
}
diff --git a/database/core/src/main/kotlin/moe/nea/ledger/database/UniqueConstraint.kt b/database/core/src/main/kotlin/moe/nea/ledger/database/UniqueConstraint.kt
index 32e9f79..31ef06c 100644
--- a/database/core/src/main/kotlin/moe/nea/ledger/database/UniqueConstraint.kt
+++ b/database/core/src/main/kotlin/moe/nea/ledger/database/UniqueConstraint.kt
@@ -1,11 +1,11 @@
package moe.nea.ledger.database