Add transport raid functionality to Falukant daemon: Introduced falukant_transport_raid module with SQL queries for managing transport raids, including candidate transports and user reputation updates. Updated documentation to reflect new WebSocket events and integrated the module into the UndergroundWorker for seamless processing of transport-related events.

This commit is contained in:
Torsten Schulz (local)
2026-03-23 14:25:21 +01:00
parent df143e2531
commit 3b25f8c3a0
7 changed files with 677 additions and 0 deletions

View File

@@ -276,6 +276,106 @@ UPDATE falukant_data.transport
WHERE id = $1;
"#;
// --- Falukant: Transportüberfälle (docs/FALUKANT_TRANSPORT_RAID_DAEMON.md) ---
pub const QUERY_RAID_SCHEMA_READY: &str = r#"
SELECT EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_schema = 'falukant_data'
AND table_name = 'transport'
AND column_name = 'guard_count'
) AS ready;
"#;
pub const QUERY_RAID_ACTIVE_UNDERGROUND: &str = r#"
SELECT u.id,
u.performer_id,
COALESCE(u.parameters::text, '{}') AS parameters
FROM falukant_data.underground u
JOIN falukant_type.underground t ON t.tr = u.underground_type_id
WHERE u.result IS NULL
AND t.tr = 'raid_transport'
ORDER BY u.created_at ASC
LIMIT 100;
"#;
pub const QUERY_RAID_REGION_ALLOWED: &str = r#"
SELECT r.id
FROM falukant_data.region r
JOIN falukant_type.region rt ON rt.id = r.region_type_id
WHERE r.id = $1::int
AND rt.id IN (4, 5)
AND COALESCE(rt.label_tr, '') <> 'town';
"#;
pub const QUERY_RAID_FALUKANT_USER_FOR_CHARACTER: &str = r#"
SELECT fu.id AS falukant_user_id, fu.user_id AS app_user_id
FROM falukant_data.character c
JOIN falukant_data.falukant_user fu ON fu.user_id = c.user_id
WHERE c.id = $1::int
LIMIT 1;
"#;
/// Aktive (noch unterwegs) Transporte mit Fracht, Route berührt Region, nicht vom Auftraggeber.
pub const QUERY_RAID_CANDIDATE_TRANSPORTS: &str = r#"
SELECT
t.id AS transport_id,
t.size AS transport_size,
t.product_id,
COALESCE(t.guard_count, 0)::int AS guard_count,
v.falukant_user_id AS victim_falukant_user_id,
vt.capacity AS vehicle_capacity
FROM falukant_data.transport t
JOIN falukant_data.vehicle v ON v.id = t.vehicle_id
JOIN falukant_type.vehicle vt ON vt.id = v.vehicle_type_id
JOIN falukant_data.region_distance rd
ON (
(rd.source_region_id = t.source_region_id AND rd.target_region_id = t.target_region_id)
OR (rd.source_region_id = t.target_region_id AND rd.target_region_id = t.source_region_id)
)
AND (rd.transport_mode = vt.transport_mode OR rd.transport_mode IS NULL)
WHERE t.product_id IS NOT NULL
AND t.size > 0
AND vt.speed > 0
AND t.created_at + (rd.distance / vt.speed::double precision) * INTERVAL '1 minute' > NOW()
AND (t.source_region_id = $1::int OR t.target_region_id = $1::int)
AND v.falukant_user_id <> $2::int
ORDER BY RANDOM()
LIMIT 20;
"#;
/// Bevorzugt eine Niederlassung in der Überfallregion, sonst kleinste branch_id.
pub const QUERY_RAID_NEAREST_BRANCH_FOR_USER: &str = r#"
SELECT b.id AS branch_id, b.region_id
FROM falukant_data.branch b
WHERE b.falukant_user_id = $2::int
ORDER BY CASE WHEN b.region_id = $1::int THEN 0 ELSE 1 END, b.id ASC
LIMIT 1;
"#;
pub const QUERY_RAID_APP_USER_FOR_FALUKANT: &str = r#"
SELECT fu.user_id
FROM falukant_data.falukant_user fu
WHERE fu.id = $1::int
LIMIT 1;
"#;
pub const QUERY_RAID_UPDATE_UNDERGROUND_RESULT: &str = r#"
UPDATE falukant_data.underground
SET result = $2::jsonb,
updated_at = NOW()
WHERE id = $1::int;
"#;
pub const QUERY_RAID_SUBTRACT_REP_BY_USER: &str = r#"
UPDATE falukant_data.character c
SET reputation = GREATEST(0::numeric, COALESCE(c.reputation, 50::numeric) - $2::numeric),
updated_at = NOW()
FROM falukant_data.falukant_user fu
WHERE fu.id = $1::int
AND fu.user_id = c.user_id
AND c.health > 0;
"#;
pub const QUERY_GET_REGION_WORTH_FOR_PRODUCT: &str = r#"
SELECT tpw.region_id, tpw.product_id, tpw.worth_percent FROM falukant_data.town_product_worth tpw JOIN falukant_data.branch b ON b.region_id = tpw.region_id WHERE b.falukant_user_id = $1 AND tpw.product_id = $2;
"#;