Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
8bce3c8
build: add OWASP dependency-check with CVSS 7.0 gate
shiftySenpai Jun 22, 2026
40d67a4
build: target Java 21 and bump maven-compiler-plugin to 3.14.0
shiftySenpai Jun 22, 2026
a2e7dcd
refactor: replace json-simple with gson for HEC envelope
shiftySenpai Jun 22, 2026
dc43255
build: centralize dependency versions in parent, bump junit to 4.13.2
shiftySenpai Jun 22, 2026
e4db6d1
build: drop forge from reactor, bump shade plugin to 3.6.0, remove st…
shiftySenpai Jun 22, 2026
ce08786
build: restructure Maven modules for multi-version packaging, pin CVE…
shiftySenpai Jul 13, 2026
cfab6b3
feat(shared-mc): add SERVER/PERFORMANCE/COMBAT/ITEM/PROGRESSION types…
shiftySenpai Jun 22, 2026
839a87f
feat(shared-mc): add LoggableServerEvent and LoggablePerformanceEvent
shiftySenpai Jun 22, 2026
753724c
feat(shared-mc): add LoggableCombatEvent
shiftySenpai Jun 22, 2026
93ca786
feat(shared-mc): add LoggableItemEvent and LoggableProgressionEvent
shiftySenpai Jun 22, 2026
a063e84
feat(shared-mc): add session-detail actions and fields to LoggablePla…
shiftySenpai Jun 22, 2026
00bb758
feat(shared-mc): add Bukkit-free EventThrottle helper
shiftySenpai Jun 22, 2026
f944b33
feat(shared-mc): add per-category enable toggles to AbstractEventLogger
shiftySenpai Jun 22, 2026
6a25681
feat(spigot): add CombatEventLogger with per-player throttling
shiftySenpai Jun 22, 2026
609841b
feat(spigot): add ItemEventLogger and ProgressionEventLogger
shiftySenpai Jun 22, 2026
1cbbb09
feat(spigot): add teleport/gamemode/bed/world-change and login sessio…
shiftySenpai Jun 22, 2026
ddd7152
feat(spigot): add ScheduledMetricLogger base, PerformanceSampler, Ser…
shiftySenpai Jun 22, 2026
6b9eac3
feat(spigot): register new event loggers gated by per-category toggles
shiftySenpai Jun 22, 2026
1de72e5
docs: document extended-logging config toggles in plugin splunk.prope…
shiftySenpai Jun 22, 2026
6bed5c4
fix(spigot): drop duplicate mob-kill log, gate session-detail behind …
shiftySenpai Jun 22, 2026
15e89bd
docs: add javadoc to new logging classes, PR description, and enhance…
shiftySenpai Jun 23, 2026
c308ea2
feat(spigot): add PlayerStatsScraper + KvStoreConnection for KV-store…
shiftySenpai Jul 13, 2026
9176d61
feat(forge): port extended-logging + KV-store scraper to Forge 1.20.1
shiftySenpai Jul 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 29 additions & 17 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,18 +1,30 @@
*.pyo
*.pyc
*.swp
build
.gradle
bin/
.project
*.iml
.idea/
eclipse/
.classpath
logs/
.settings
target/
*.pyo
*.pyc
*.swp
build
.gradle
bin/
.project
*.iml
.idea/
eclipse/
.classpath
logs/
.settings
target/

#forge .idea things:
*.ipr
*.iws
# Editor/tooling droppings
.vscode/
.cursor/
.codegraph/
graphify-out/
*.code-workspace

#forge .idea things:
*.ipr
*.iws
# Local tool installs / build output not meant for version control
mvn-bin/
dist/
node_modules/
*.tar.gz
23 changes: 23 additions & 0 deletions SplunkCraft/default/app.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
#
# SplunkCraft -- Minecraft player analytics app.
# Owns the minecraft_player_stats KV-store collection populated by the logtosplunk plugin,
# plus the reports and dashboards built on top of it.
#

[install]
state = enabled
state_change_requires_restart = 0
is_configured = 1
build = 1

[ui]
is_visible = 1
label = SplunkCraft

[launcher]
author = masao.jeffery@gmail.com
description = Minecraft player stats, reports and dashboards (KV-store backed).
version = 1.0

[package]
id = SplunkCraft
9 changes: 9 additions & 0 deletions SplunkCraft/default/collections.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# KV-store collection holding the latest per-player snapshot scraped from the Minecraft
# server's on-disk stats/advancements JSON by the logtosplunk plugin (PlayerStatsScraper).
# Documents are keyed by player UUID (_key), so each scrape upserts (overwrites) the player's
# row rather than appending -- this is current-state snapshot data, not a time series.

[minecraft_player_stats]
enforceTypes = false
# Accelerate the fields we filter/sort on most.
accelerated_fields.player_idx = {"uuid": 1, "name": 1}
14 changes: 14 additions & 0 deletions SplunkCraft/default/transforms.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# Lookup definition exposing the minecraft_player_stats KV-store collection to SPL.
# Use in searches as: | inputlookup minecraft_player_stats
# or: ... | lookup minecraft_player_stats uuid OUTPUT name advancements_completed ...

[minecraft_player_stats]
external_type = kvstore
collection = minecraft_player_stats
fields_list = _key, uuid, name, last_modified, data_version, \
stat_mined_total, stat_used_total, stat_crafted_total, stat_broken_total, \
stat_dropped_total, stat_picked_up_total, stat_killed_total, stat_killed_by_total, \
stat_custom_total, \
deaths, mob_kills, player_kills, play_time, total_world_time, walk_one_cm, sprint_one_cm, \
jump, damage_dealt, damage_taken, time_since_rest, \
advancements_completed, advancements_total
12 changes: 12 additions & 0 deletions SplunkCraft/metadata/default.meta
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# Make the collection and its lookup readable app-wide (and globally, so other apps and
# saved searches can reference the lookup). Writes restricted to admin/power.

[]
access = read : [ * ], write : [ admin, power ]
export = system

[collections/minecraft_player_stats]
export = system

[transforms/minecraft_player_stats]
export = system
43 changes: 22 additions & 21 deletions default/app.conf
Original file line number Diff line number Diff line change
@@ -1,21 +1,22 @@
#
# Splunk app configuration file
#

[install]
state = enabled
state_change_requires_restart = 0
is_configured = 0
build = 1

[ui]
is_visible = 1
label = Minecraft

[launcher]
author = mpapale@splunk.com
description = The Splunk App for Minecraft let's you visualize your Minecraft server data.
version = 1.0

[package]
id = minecraft-app
#
# Splunk app configuration file
#

[install]
state = enabled
state_change_requires_restart = 0
is_configured = 0
build = 1

[ui]
is_visible = 1
label = Minecraft
supported_themes = light, dark

[launcher]
author = mpapale@splunk.com
description = The Splunk App for Minecraft let's you visualize your Minecraft server data.
version = 1.0

[package]
id = minecraft-app
97 changes: 97 additions & 0 deletions forge-1.20.1-47.4.20/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
plugins {
id 'eclipse'
id 'idea'
id 'net.minecraftforge.gradle' version '[6.0,6.2)'
id 'com.github.johnrengelman.shadow' version '8.1.1'
id 'java'
}

version = "${mod_version}"
group = "${mod_group_id}"

base {
archivesName = "${archives_base_name}"
}

java {
toolchain.languageVersion = JavaLanguageVersion.of(17)
}

minecraft {
// 1.20.1 uses Mojang's official mappings.
mappings channel: 'official', version: minecraft_version
copyIdeResources = true
}

// Reuse the platform-agnostic core from the shared-mc module (single source of truth).
sourceSets.main.java.srcDir '../shared-mc/src/main/java'

// 'shade' holds runtime libs that Minecraft/Forge does NOT provide; they get fat-jarred
// into the final mod jar by shadowJar, then reobfuscated.
configurations {
shade
implementation.extendsFrom shade
}

repositories {
mavenCentral()
maven {
name = 'Splunk Artifactory'
url = 'https://splunk.jfrog.io/splunk/ext-releases-local/'
}
}

dependencies {
minecraft "net.minecraftforge:forge:${minecraft_version}-${forge_version}"

// Provided by Minecraft/Forge at runtime: compile-only, not bundled.
compileOnly "com.google.code.gson:gson:2.13.2"
compileOnly "com.google.guava:guava:33.5.0-jre"

// Not provided by Minecraft/Forge: bundle via shadow (transitive=false, exact set only).
// httpcore5-h2 is REQUIRED even for plain HTTP: httpclient5's TlsConfig references
// org.apache.hc.core5.http2.HttpVersionPolicy. Omitting it => NoClassDefFoundError on
// the first POST.
shade("com.splunk.logging:splunk-library-javalogging:1.11.8") { transitive = false }
shade("org.apache.httpcomponents.client5:httpclient5:5.5.1") { transitive = false }
shade("org.apache.httpcomponents.core5:httpcore5:5.3.6") { transitive = false }
shade("org.apache.httpcomponents.core5:httpcore5-h2:5.3.6") { transitive = false }
shade("commons-codec:commons-codec:1.17.1") { transitive = false }
}

tasks.withType(JavaCompile).configureEach {
options.encoding = 'UTF-8'
}

// Plain jar = thin dev jar (named mappings, NO bundled libs). Pushed to build/devlibs so it
// can never be mistaken for the shippable artifact in build/libs. Deploying it = missing
// httpcore5 at runtime. The shaded+reobf shadowJar (build/libs) is the only deployable jar.
tasks.named('jar', Jar) {
archiveClassifier = 'slim'
destinationDirectory = layout.buildDirectory.dir('devlibs')
manifest {
attributes([
'Implementation-Version': project.version,
'Specification-Title' : 'logtosplunk',
'Specification-Version' : '1'
])
}
}

tasks.named('shadowJar') {
configurations = [project.configurations.shade]
archiveClassifier = ''
manifest {
attributes(['Implementation-Version': project.version])
}
finalizedBy 'reobfShadowJar'
}

// Reobfuscate the shaded jar from official -> SRG so Forge can load it at runtime.
reobf {
shadowJar { }
}

tasks.named('assemble') {
dependsOn 'shadowJar'
}
9 changes: 9 additions & 0 deletions forge-1.20.1-47.4.20/gradle.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
org.gradle.jvmargs=-Xmx3G
org.gradle.daemon=false

minecraft_version=1.20.1
forge_version=47.4.20

mod_version=1.0.0
mod_group_id=com.splunk
archives_base_name=logtosplunk-forge-47.4.20
Binary file not shown.
7 changes: 7 additions & 0 deletions forge-1.20.1-47.4.20/gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
Loading