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:
@@ -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;
|
||||
"#;
|
||||
|
||||
Reference in New Issue
Block a user