add GainExperience listeners

This commit is contained in:
41666 2023-05-28 13:07:05 -04:00
parent 24437b5520
commit 738d2975ec
5 changed files with 151 additions and 13 deletions

73
Cargo.lock generated
View file

@ -49,6 +49,7 @@ dependencies = [
"axum",
"chrono",
"lazy_static",
"openssl",
"reqwest",
"serde",
"serde_json",
@ -842,6 +843,19 @@ dependencies = [
"want",
]
[[package]]
name = "hyper-rustls"
version = "0.24.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0646026eb1b3eea4cd9ba47912ea5ce9cc07713d105b1a14698f4e6433d348b7"
dependencies = [
"http",
"hyper",
"rustls 0.21.1",
"tokio",
"tokio-rustls 0.24.0",
]
[[package]]
name = "hyper-tls"
version = "0.5.0"
@ -1143,6 +1157,15 @@ version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf"
[[package]]
name = "openssl-src"
version = "111.25.0+1.1.1t"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3173cd3626c43e3854b1b727422a276e568d9ec5fe8cec197822cf52cfb743d6"
dependencies = [
"cc",
]
[[package]]
name = "openssl-sys"
version = "0.9.77"
@ -1152,6 +1175,7 @@ dependencies = [
"autocfg",
"cc",
"libc",
"openssl-src",
"pkg-config",
"vcpkg",
]
@ -1401,6 +1425,7 @@ dependencies = [
"http",
"http-body",
"hyper",
"hyper-rustls",
"hyper-tls",
"ipnet",
"js-sys",
@ -1410,16 +1435,20 @@ dependencies = [
"once_cell",
"percent-encoding",
"pin-project-lite",
"rustls 0.21.1",
"rustls-pemfile",
"serde",
"serde_json",
"serde_urlencoded",
"tokio",
"tokio-native-tls",
"tokio-rustls 0.24.0",
"tower-service",
"url",
"wasm-bindgen",
"wasm-bindgen-futures",
"web-sys",
"webpki-roots",
"winreg",
]
@ -1450,6 +1479,18 @@ dependencies = [
"webpki",
]
[[package]]
name = "rustls"
version = "0.21.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c911ba11bc8433e811ce56fde130ccf32f5127cab0e0194e9c68c5a5b671791e"
dependencies = [
"log",
"ring",
"rustls-webpki",
"sct",
]
[[package]]
name = "rustls-pemfile"
version = "1.0.1"
@ -1459,6 +1500,16 @@ dependencies = [
"base64 0.13.1",
]
[[package]]
name = "rustls-webpki"
version = "0.100.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d6207cd5ed3d8dca7816f8f3725513a34609c0c765bf652b8c3cb4cfd87db46b"
dependencies = [
"ring",
"untrusted",
]
[[package]]
name = "rustversion"
version = "1.0.9"
@ -1705,7 +1756,7 @@ dependencies = [
"paste",
"percent-encoding",
"rand",
"rustls",
"rustls 0.20.7",
"rustls-pemfile",
"serde",
"serde_json",
@ -1748,7 +1799,7 @@ checksum = "24c5b2d25fa654cc5f841750b8e1cdedbe21189bf9a9382ee90bfa9dd3562396"
dependencies = [
"once_cell",
"tokio",
"tokio-rustls",
"tokio-rustls 0.23.4",
]
[[package]]
@ -1930,11 +1981,21 @@ version = "0.23.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59"
dependencies = [
"rustls",
"rustls 0.20.7",
"tokio",
"webpki",
]
[[package]]
name = "tokio-rustls"
version = "0.24.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e0d409377ff5b1e3ca6437aa86c1eb7d40c134bfec254e44c830defa92669db5"
dependencies = [
"rustls 0.21.1",
"tokio",
]
[[package]]
name = "tokio-stream"
version = "0.1.11"
@ -1954,9 +2015,9 @@ checksum = "54319c93411147bced34cb5609a80e0a8e44c5999c93903a81cd866630ec0bfd"
dependencies = [
"futures-util",
"log",
"rustls",
"rustls 0.20.7",
"tokio",
"tokio-rustls",
"tokio-rustls 0.23.4",
"tungstenite",
"webpki",
"webpki-roots",
@ -2072,7 +2133,7 @@ dependencies = [
"httparse",
"log",
"rand",
"rustls",
"rustls 0.20.7",
"sha1",
"thiserror",
"url",

View file

@ -14,5 +14,11 @@ sqlx = { version = "0.6.2", default_features = false, features = [ "runtime-toki
tokio = { version = "1.24.2", features = ["macros", "rt-multi-thread"] }
tower-http = { version = "0.3.5", features = ["cors"] }
lazy_static = "1.4.0"
reqwest = "0.11.14"
chrono = "0.4.23"
reqwest = { version = "0.11.14", features = ["rustls-tls-webpki-roots"] }
chrono = "0.4.23"
[dependencies.openssl]
version = "0.10.29"
features = [
"vendored"
]

View file

@ -24,7 +24,7 @@ impl Analytics {
) -> Vec<Event> {
let pool = ctx.data::<Pool<Postgres>>().unwrap();
let sql = format!("SELECT time_bucket_gapfill('{} seconds', time, start => now() - '{}'::interval, finish => now()) AS bucket, CASE WHEN count(*) IS NULL THEN 0 ELSE count(*) END AS count, event_name, world_id FROM analytics WHERE time > now() - '{}'::interval {} GROUP BY bucket, world_id, event_name ORDER BY bucket ASC",
let sql = format!("SELECT time_bucket_gapfill('{} seconds', time, start => now() - '{}'::interval, finish => now()) AS bucket, CASE WHEN count(*) IS NULL THEN 0 ELSE count(*) END AS count, event_name, world_id FROM analytics WHERE event_name IN ('Death', 'VehicleDestroy', 'GainExperience') AND time > now() - '{}'::interval {} GROUP BY bucket, world_id, event_name ORDER BY bucket ASC",
if hi_precision {
5
} else {

View file

@ -207,7 +207,7 @@
acc[ev.eventName][ev.time] = (acc[ev.time] || 0) + ev.count;
return acc;
},
{ Death: {}, VehicleDestroy: {} }
{ Death: {}, VehicleDestroy: {}, GainExperience: {} }
);
new Chart(document.getElementById(id), {
@ -228,6 +228,10 @@
label: "Vehicle Destroys",
data: allEvents.VehicleDestroy,
},
{
label: "Experience Events",
data: allEvents.GainExperience,
},
],
},
});

View file

@ -26,11 +26,20 @@ async fn send_init(tx: futures::channel::mpsc::UnboundedSender<Message>) {
let worlds_raw = env::var("WORLDS").unwrap_or("all".to_string());
let worlds: Vec<&str> = worlds_raw.split(',').collect();
let experience_ids = vec![5, 6, 7, 36, 53, 54, 201, 233, 293, 294, 353, 354, 355];
let mut events = experience_ids
.iter()
.map(|id| format!("GainExperience_experience_id_{}", id))
.collect::<Vec<String>>();
events.push("Death".to_string());
events.push("VehicleDestroy".to_string());
// Send setup message
let setup_msg = json!({
"action": "subscribe",
"worlds": worlds,
"eventNames": ["Death", "VehicleDestroy"],
"eventNames": events,
"characters": ["all"],
"logicalAndCharactersWithWorlds": true,
"service": "event",
@ -176,7 +185,7 @@ async fn track_analytics(analytics_event: AnalyticsEvent) {
.unwrap();
}
async fn process_event(event: &Event) {
async fn process_death_event(event: &Event) {
let mut set = JoinSet::new();
// println!("[ws/process_event] EVENT: {:?}", event);
@ -250,12 +259,57 @@ async fn process_event(event: &Event) {
while let Some(_) = set.join_next().await {}
}
async fn process_exp_event(event: &Event) {
let mut set = JoinSet::new();
// println!("[ws/process_event] EVENT: {:?}", event);
set.spawn(track_analytics(AnalyticsEvent {
world_id: event.world_id.clone(),
event_name: event.event_name.clone(),
}));
set.spawn(track_class(ClassEvent {
world_id: event.world_id.clone(),
character_id: event.character_id.clone(),
loadout_id: event.loadout_id.clone(),
zone_id: event.zone_id.clone(),
team_id: event.team_id.clone(),
}));
// Vehicle EXP events
match event.experience_id {
201 => {
// Galaxy Spawn Bonus
set.spawn(track_vehicle(VehicleEvent {
world_id: event.world_id.clone(),
vehicle_id: "11".to_string(),
character_id: event.character_id.clone(),
zone_id: event.zone_id.clone(),
team_id: event.team_id.clone(),
}));
}
233 => {
// Sunderer Spawn Bonus
set.spawn(track_vehicle(VehicleEvent {
world_id: event.world_id.clone(),
vehicle_id: "2".to_string(),
character_id: event.character_id.clone(),
zone_id: event.zone_id.clone(),
team_id: event.team_id.clone(),
}));
}
_ => {}
}
while let Some(_) = set.join_next().await {}
}
#[derive(Deserialize, Debug, Clone, Default)]
struct Event {
event_name: String,
#[serde(deserialize_with = "deserialize_number_from_string")]
world_id: i32,
character_id: String,
#[serde(default)]
attacker_character_id: String,
#[serde(default, deserialize_with = "deserialize_number_from_string")]
attacker_team_id: i32,
@ -275,6 +329,11 @@ struct Event {
vehicle_id: String,
#[serde(default)]
attacker_vehicle_id: String,
#[serde(default, deserialize_with = "deserialize_number_from_string")]
experience_id: i32,
#[serde(default)]
other_id: String,
}
#[derive(Deserialize, Debug, Clone)]
@ -336,7 +395,15 @@ async fn main() {
return;
}
process_event(&data.payload).await;
if data.payload.event_name == "Death" || data.payload.event_name == "VehicleDestroy" {
process_death_event(&data.payload).await;
return;
}
if data.payload.event_name == "GainExperience" {
process_exp_event(&data.payload).await;
return;
}
})
.fuse();