Restore durable log ingest and typed plugin projections

This commit is contained in:
npc0-hue
2026-09-02 10:20:30 +08:00
parent 40ac46ba17
commit 6018d8f0fc
61 changed files with 809 additions and 3157 deletions
+159 -409
View File
@@ -3,7 +3,7 @@
"id": "game.scum",
"name": "SCUM Server",
"description": "First-party SCUM game server operations plugin with platform-mediated lifecycle and companion bridge support.",
"version": "0.1.14",
"version": "0.1.15",
"kind": "game-plugin",
"tags": [
"scum",
@@ -205,13 +205,6 @@
"keepForSeconds": 604800,
"maxRecords": 1000
},
{
"type": "semantic.events",
"schemaVersion": "1",
"schemaRef": "schemas/bridge/semantic-events.snapshot.schema.json",
"keepForSeconds": 604800,
"maxRecords": 1000
},
{
"type": "online.sessions",
"schemaVersion": "1",
@@ -268,7 +261,21 @@
"sqlRef": "sql/scum-db-v57/users.sql",
"pollIntervalSeconds": 3,
"maxRows": 500,
"timeoutSeconds": 15
"timeoutSeconds": 15,
"projections": [
{
"collection": "scum_users",
"rowPath": "rows",
"upsertKeys": [
"steamId"
],
"fixedValues": {
"source": "run.sqlite.scum.player.profile"
},
"observedAtField": "profileSampledAt",
"mergeExisting": true
}
]
},
{
"key": "scum.squads",
@@ -310,7 +317,66 @@
"sqlRef": "sql/scum-db-v57/vehicles.sql",
"pollIntervalSeconds": 3,
"maxRows": 500,
"timeoutSeconds": 15
"timeoutSeconds": 15,
"projections": [
{
"collection": "scum_vehicles",
"rowPath": "rows",
"upsertKeys": [
"vehicleId"
],
"fixedValues": {
"source": "run.sqlite.scum.vehicles"
},
"observedAtField": "sampledAt"
},
{
"collection": "scum_trajectories",
"rowPath": "rows",
"upsertKeys": [
"subjectType",
"subjectId",
"sampledAt"
],
"fieldMappings": {
"subjectId": "vehicleId",
"vehicleId": "vehicleId",
"entityId": "entityId",
"className": "className",
"label": "label",
"x": "x",
"y": "y",
"z": "z",
"lastAccessTime": "lastAccessTime"
},
"fixedValues": {
"subjectType": "vehicle",
"source": "run.sqlite.scum.vehicles"
},
"observedAtField": "sampledAt"
},
{
"collection": "scum_trade_goods",
"rowPath": "rows",
"upsertKeys": [
"code"
],
"fieldMappings": {
"className": "className"
},
"fixedValues": {
"code": "#spawnvehicle {{className}}",
"spawnCommand": "#spawnvehicle {{className}}",
"catalogType": "vehicle",
"type": "21",
"typeName": "其他载具",
"imagePath": "/original/{{className}}.webp",
"source": "run.sqlite.scum.vehicles"
},
"observedAtField": "lastSeenAt",
"mergeExisting": true
}
]
},
{
"key": "scum.flags",
@@ -338,7 +404,69 @@
"sqlRef": "sql/scum-db-v57/map-points.sql",
"pollIntervalSeconds": 3,
"maxRows": 500,
"timeoutSeconds": 15
"timeoutSeconds": 15,
"projections": [
{
"collection": "scum_users",
"rowPath": "rows",
"matchField": "subjectType",
"matchValue": "player",
"upsertKeys": [
"steamId"
],
"fieldMappings": {
"steamId": "subjectId",
"userProfileId": "userProfileId",
"gamePlayerId": "gamePlayerId",
"x": "x",
"y": "y",
"z": "z",
"lastPositionObservedAt": "observedAt"
},
"fixedValues": {
"source": "run.sqlite.scum.positions"
},
"observedAtField": "positionSampledAt"
},
{
"collection": "scum_map_points",
"rowPath": "rows",
"upsertKeys": [
"subjectType",
"subjectId"
],
"fixedValues": {
"source": "run.sqlite.scum.positions"
},
"observedAtField": "sampledAt"
},
{
"collection": "scum_trajectories",
"rowPath": "rows",
"matchField": "subjectType",
"matchValue": "player",
"upsertKeys": [
"subjectType",
"subjectId",
"sampledAt"
],
"fieldMappings": {
"subjectType": "subjectType",
"subjectId": "subjectId",
"steamId": "subjectId",
"userProfileId": "userProfileId",
"gamePlayerId": "gamePlayerId",
"x": "x",
"y": "y",
"z": "z",
"observedAt": "observedAt"
},
"fixedValues": {
"source": "run.sqlite.scum.positions"
},
"observedAtField": "sampledAt"
}
]
},
{
"key": "scum.tasks",
@@ -383,249 +511,6 @@
"timeoutSeconds": 15
}
],
"logProjections": [
{
"key": "scum.trade.catalog",
"streamKeys": [
"scum.trade"
],
"steps": [
{
"pattern": "^\\d{4}\\.\\d{2}\\.\\d{2}-\\d{2}\\.\\d{2}\\.\\d{2}: \\[Trade\\] Tradeable \\((?P<itemCode>[A-Za-z0-9_.-]{1,128}) \\(x(?P<quantity>\\d{1,9})\\)\\) (?P<tradeVerb>purchased|sold) by .*?\\((?P<steamId>\\d{1,50})\\) for (?P<price>-?\\d{1,12})$"
}
],
"correlationFields": [
"itemCode"
],
"maxInterveningLines": 0,
"target": {
"collection": "scum_trade_goods",
"upsertKeys": [
"code"
],
"captureMappings": {
"code": "itemCode"
},
"fixedValues": {
"catalogType": "item",
"source": "scum.trade"
},
"observedAtField": "lastSeenAt"
}
},
{
"key": "scum.trade.events",
"streamKeys": [
"scum.trade"
],
"steps": [
{
"pattern": "^\\d{4}\\.\\d{2}\\.\\d{2}-\\d{2}\\.\\d{2}\\.\\d{2}: \\[Trade\\] Tradeable \\((?P<itemCode>[A-Za-z0-9_.-]{1,128}) \\(x(?P<quantity>\\d{1,9})\\)\\) (?P<tradeVerb>purchased|sold) by .*?\\((?P<steamId>\\d{1,50})\\) for (?P<price>-?\\d{1,12})$"
}
],
"correlationFields": [
"steamId",
"itemCode",
"tradeVerb"
],
"maxInterveningLines": 0,
"target": {
"collection": "scum_trade_events",
"upsertKeys": [
"steamId",
"itemCode",
"tradeVerb",
"quantity",
"price",
"observedAt"
],
"captureMappings": {
"steamId": "steamId",
"itemCode": "itemCode",
"tradeVerb": "tradeVerb",
"quantity": "quantity",
"price": "price"
},
"fixedValues": {
"eventType": "trade",
"source": "scum.trade"
},
"observedAtField": "observedAt"
}
},
{
"key": "scum.battleye.login",
"streamKeys": [
"scum.console.stdout"
],
"steps": [
{
"pattern": "Player \"(?P<displayName>[^\"]+)\" reported as player (?P<slot>\\d+)"
},
{
"pattern": "Player (?P<slot>\\d+) SteamID \\(assumed\\): (?P<steamId>\\d+)"
}
],
"correlationFields": [
"slot"
],
"maxInterveningLines": 8,
"target": {
"collection": "scum_users",
"upsertKeys": [
"steamId"
],
"captureMappings": {
"steamId": "steamId",
"displayName": "displayName",
"slot": "slot"
},
"fixedValues": {
"online": "true",
"source": "process.stdout"
},
"observedAtField": "lastLoginObservedAt"
},
"presence": {
"timestampField": "lastLoginObservedAt",
"activeWindowSeconds": 600,
"activityTarget": {
"collection": "scum_activity_events",
"upsertKeys": [
"steamId",
"observedAt"
],
"captureMappings": {
"steamId": "steamId",
"displayName": "displayName"
},
"fixedValues": {
"eventType": "login",
"source": "process.stdout"
},
"observedAtField": "observedAt"
}
}
},
{
"key": "scum.login-log.login",
"streamKeys": [
"scum.login"
],
"steps": [
{
"pattern": "^\\d{4}\\.\\d{2}\\.\\d{2}-\\d{2}\\.\\d{2}\\.\\d{2}: '(?P<ip>[0-9.]+) (?P<steamId>\\d{1,50}):(?P<displayName>[^']{1,80})\\(\\d+\\)' logged in(?: at: X=.*)?$"
}
],
"correlationFields": [
"steamId"
],
"maxInterveningLines": 0,
"target": {
"collection": "scum_users",
"upsertKeys": [
"steamId"
],
"captureMappings": {
"steamId": "steamId",
"displayName": "displayName",
"lastLoginIp": "ip"
},
"hashMappings": {
"networkCorrelation": "ip"
},
"fixedValues": {
"online": "true",
"status": "online",
"source": "scum.login"
},
"observedAtField": "lastLoginObservedAt"
},
"presence": {
"timestampField": "lastLoginObservedAt",
"activeWindowSeconds": 1,
"activityTarget": {
"collection": "scum_activity_events",
"upsertKeys": [
"steamId",
"observedAt"
],
"captureMappings": {
"steamId": "steamId",
"displayName": "displayName",
"lastLoginIp": "ip"
},
"hashMappings": {
"networkCorrelation": "ip"
},
"fixedValues": {
"eventType": "login",
"source": "scum.login"
},
"observedAtField": "observedAt"
}
}
},
{
"key": "scum.login-log.logout",
"streamKeys": [
"scum.login"
],
"steps": [
{
"pattern": "^\\d{4}\\.\\d{2}\\.\\d{2}-\\d{2}\\.\\d{2}\\.\\d{2}: '(?P<ip>[0-9.]+) (?P<steamId>\\d{1,50}):(?P<displayName>[^']{1,80})\\(\\d+\\)' logged out.*$"
}
],
"correlationFields": [
"steamId"
],
"maxInterveningLines": 0,
"target": {
"collection": "scum_users",
"upsertKeys": [
"steamId"
],
"captureMappings": {
"steamId": "steamId",
"displayName": "displayName"
},
"hashMappings": {
"networkCorrelation": "ip"
},
"fixedValues": {
"online": "false",
"status": "offline",
"logoutReason": "disconnect",
"source": "scum.login"
},
"observedAtField": "lastLogoutObservedAt"
},
"presence": {
"timestampField": "lastLogoutObservedAt",
"activeWindowSeconds": 1,
"activityTarget": {
"collection": "scum_activity_events",
"upsertKeys": [
"steamId",
"observedAt"
],
"captureMappings": {
"steamId": "steamId",
"displayName": "displayName"
},
"hashMappings": {
"networkCorrelation": "ip"
},
"fixedValues": {
"eventType": "logout",
"reason": "disconnect",
"source": "scum.login"
},
"observedAtField": "observedAt"
}
}
}
],
"lifecycleProjections": [
{
"key": "scum.lifecycle.stop-logout",
@@ -745,16 +630,12 @@
{
"key": "scum-db-v57",
"databaseUserVersion": 57,
"logParserRefs": [
"data-packs/scum-db-v57/log-parsers.json"
],
"configMapRefs": [
"data-packs/scum-db-v57/config-maps.json"
],
"dataRefs": [
"data-packs/scum-db-v57/gift-items.json",
"data-packs/scum-db-v57/map-geometry.json",
"data-packs/scum-db-v57/storage-model.json"
"data-packs/scum-db-v57/map-geometry.json"
]
}
],
@@ -767,9 +648,6 @@
"permission": "server.game-client.read",
"requiredHandlers": [
"player.lookup"
],
"requiredEventProducers": [
"semantic.events"
]
},
{
@@ -792,10 +670,7 @@
{
"key": "trajectory.collect",
"title": "SCUM trajectories",
"permission": "server.game-client.read",
"requiredEventProducers": [
"semantic.events"
]
"permission": "server.game-client.read"
}
],
"pages": [
@@ -1196,10 +1071,6 @@
"path": "data-packs/scum-db-v57/config-maps.json",
"mode": 384
},
{
"path": "data-packs/scum-db-v57/log-parsers.json",
"mode": 384
},
{
"path": "data-packs/scum-db-v57/gift-items.json",
"mode": 384
@@ -1207,10 +1078,6 @@
{
"path": "data-packs/scum-db-v57/map-geometry.json",
"mode": 384
},
{
"path": "data-packs/scum-db-v57/storage-model.json",
"mode": 384
}
],
"productionLifecycle": {
@@ -1379,6 +1246,7 @@
},
"transportKeys": [
"server-files",
"scum-database",
"scum-management"
],
"dllExtensionRefs": [
@@ -1538,138 +1406,6 @@
"retentionDays": 30
}
],
"logEvents": [
{
"key": "scum-player-position",
"title": "SCUM player position",
"sourceKey": "scum-client-events",
"eventType": "player.position",
"permission": "server.logs.read",
"schemaRef": "schemas/log-events/player-position.event.schema.json",
"retentionDays": 7,
"severity": "info"
},
{
"key": "scum-vehicle-position",
"title": "SCUM vehicle position",
"sourceKey": "scum-client-events",
"eventType": "vehicle.position",
"permission": "server.logs.read",
"schemaRef": "schemas/log-events/vehicle-position.event.schema.json",
"retentionDays": 7,
"severity": "info"
},
{
"key": "scum-player-vehicle-enter",
"title": "SCUM player vehicle enter",
"sourceKey": "scum-client-events",
"eventType": "player.vehicle.enter",
"permission": "server.logs.read",
"schemaRef": "schemas/log-events/player-vehicle-enter.event.schema.json",
"retentionDays": 7,
"severity": "info"
},
{
"key": "scum-player-vehicle-leave",
"title": "SCUM player vehicle leave",
"sourceKey": "scum-client-events",
"eventType": "player.vehicle.leave",
"permission": "server.logs.read",
"schemaRef": "schemas/log-events/player-vehicle-leave.event.schema.json",
"retentionDays": 7,
"severity": "info"
},
{
"key": "scum-chat",
"title": "SCUM chat message",
"sourceKey": "scum-chat-events",
"eventType": "scum.chat",
"permission": "server.logs.read",
"schemaRef": "schemas/log-events/chat.event.schema.json",
"retentionDays": 90,
"severity": "info"
},
{
"key": "scum-login",
"title": "SCUM player login",
"sourceKey": "scum-login-events",
"eventType": "scum.login",
"permission": "server.logs.read",
"schemaRef": "schemas/log-events/login.event.schema.json",
"retentionDays": 90,
"severity": "info"
},
{
"key": "scum-logout",
"title": "SCUM player logout",
"sourceKey": "scum-login-events",
"eventType": "scum.logout",
"permission": "server.logs.read",
"schemaRef": "schemas/log-events/logout.event.schema.json",
"retentionDays": 90,
"severity": "info"
},
{
"key": "scum-kill",
"title": "SCUM player kill",
"sourceKey": "scum-kill-events",
"eventType": "scum.kill",
"permission": "server.logs.read",
"schemaRef": "schemas/log-events/kill.event.schema.json",
"retentionDays": 90,
"severity": "info"
},
{
"key": "scum-trade",
"title": "SCUM trade activity",
"sourceKey": "scum-trade-events",
"eventType": "scum.trade",
"permission": "server.logs.read",
"schemaRef": "schemas/log-events/trade.event.schema.json",
"retentionDays": 90,
"severity": "info"
},
{
"key": "scum-mine",
"title": "SCUM mine activity",
"sourceKey": "scum-server-events",
"eventType": "scum.mine",
"permission": "server.logs.read",
"schemaRef": "schemas/log-events/mine.event.schema.json",
"retentionDays": 90,
"severity": "warning"
},
{
"key": "scum-unlock",
"title": "SCUM unlock activity",
"sourceKey": "scum-server-events",
"eventType": "scum.unlock",
"permission": "server.logs.read",
"schemaRef": "schemas/log-events/unlock.event.schema.json",
"retentionDays": 90,
"severity": "warning"
},
{
"key": "scum-admin",
"title": "SCUM admin activity",
"sourceKey": "scum-admin-events",
"eventType": "scum.admin",
"permission": "server.logs.read",
"schemaRef": "schemas/log-events/admin.event.schema.json",
"retentionDays": 90,
"severity": "warning"
},
{
"key": "scum-performance",
"title": "SCUM server performance",
"sourceKey": "scum-performance-events",
"eventType": "scum.performance",
"permission": "server.logs.read",
"schemaRef": "schemas/log-events/performance.event.schema.json",
"retentionDays": 30,
"severity": "info"
}
],
"transportProfiles": [
{
"key": "server-files",
@@ -1724,6 +1460,21 @@
]
}
],
"dataTargets": [
{
"key": "scum-database",
"kind": "sqlite.snapshot",
"transportKey": "scum-database",
"sourceRootKey": "server-root",
"sourcePath": "SCUM/Saved/SaveFiles/SCUM.db",
"workspaceKey": "databases/scum-database",
"refreshPolicy": "on-demand-snapshot",
"maxBytes": 1073741824,
"platforms": [
"windows"
]
}
],
"dllExtensions": [
{
"key": "scum-simple-rcon",
@@ -1756,7 +1507,7 @@
"displayName": "SCUM Client Manager",
"version": "1.0.0",
"repository": {
"url": "https://git.npc0.com/admin343/browser.git",
"url": "https://github.com/F88888/scum_client.git",
"revisionPolicy": "branch",
"branch": "main"
},
@@ -1768,8 +1519,7 @@
],
"build": {
"system": "go",
"workspaceRef": "plugins/examples/scum-server-plugin/companion",
"entryRef": "cmd/scum-companion"
"entryRef": "main.go"
},
"configTemplates": [
{