From efdc559fc0a1456953ef439a363c34b6bf183f01 Mon Sep 17 00:00:00 2001 From: Sakuhl <2012collector@gmail.com> Date: Wed, 4 Apr 2018 13:07:24 +0200 Subject: [PATCH] Add federation territory ownership listener --- Cargo.lock | 2 +- Cargo.toml | 2 +- .../down.sql | 1 + .../up.sql | 3 + src/commands/feed.rs | 117 +++++++++++++++++- src/commands/mod.rs | 2 +- src/main.rs | 11 ++ src/models.rs | 6 + src/schema.rs | 7 ++ 9 files changed, 147 insertions(+), 4 deletions(-) create mode 100644 migrations/2018-04-04-101720_create_federationfeed_listeners/down.sql create mode 100644 migrations/2018-04-04-101720_create_federationfeed_listeners/up.sql diff --git a/Cargo.lock b/Cargo.lock index 4de58cb..ad220ac 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1349,7 +1349,7 @@ dependencies = [ [[package]] name = "wynnrobot" -version = "0.13.1" +version = "0.14.0" dependencies = [ "chrono 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "configure 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/Cargo.toml b/Cargo.toml index 22bb757..3369a00 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] authors = ["Sakuhl <2012collector@gmail.com>"] name = "wynnrobot" -version = "0.13.1" +version = "0.14.0" [dependencies] chrono = "0.4.0" diff --git a/migrations/2018-04-04-101720_create_federationfeed_listeners/down.sql b/migrations/2018-04-04-101720_create_federationfeed_listeners/down.sql new file mode 100644 index 0000000..bb81b5b --- /dev/null +++ b/migrations/2018-04-04-101720_create_federationfeed_listeners/down.sql @@ -0,0 +1 @@ +DROP TABLE federationfeed_listeners \ No newline at end of file diff --git a/migrations/2018-04-04-101720_create_federationfeed_listeners/up.sql b/migrations/2018-04-04-101720_create_federationfeed_listeners/up.sql new file mode 100644 index 0000000..e066507 --- /dev/null +++ b/migrations/2018-04-04-101720_create_federationfeed_listeners/up.sql @@ -0,0 +1,3 @@ +CREATE TABLE federationfeed_listeners ( + id BIGINT PRIMARY KEY +) \ No newline at end of file diff --git a/src/commands/feed.rs b/src/commands/feed.rs index 30f91ed..08676cb 100644 --- a/src/commands/feed.rs +++ b/src/commands/feed.rs @@ -31,7 +31,7 @@ pub fn territory_livefeed() { let mut timestamp = territories.as_object().unwrap().get("request").unwrap().as_object().unwrap().get("timestamp").unwrap().as_u64().unwrap(); loop { - thread::sleep_ms(20_000); // 10 seconds + thread::sleep_ms(20_000); // 20 seconds let resp = reqwest::get("https://api.wynncraft.com/public_api.php?action=territoryList").unwrap(); let new_territories: Value = serde_json::from_reader(resp).unwrap(); @@ -62,6 +62,84 @@ pub fn territory_livefeed() { } } +pub fn federation_livefeed() { + use models::FederationfeedListener; + use schema::federationfeed_listeners::dsl::*; + + let ffa = vec!["Qira's Battle Room", "Hive", "Lava Lake", "Temple of Legends", "Bob's Tomb", "Battle Tower", "Detlas", "Cinfras", "Avos Temple", + "Factory Entrance", "Swamp Dark Forest Transition Mid", "Emerald Trail", "Rodoroc", "Molten Reach", "Molten Heights Portal", "Lava Lake Bridge", + "Active Volcano", "Volcanic Slope", "Crater Descent", "Wybel Island", "Herb Cave"]; + + let federation_allies = vec!["Angels Of Eternal", + "DogsAmongUs", + "DeathReapers", + "Fantasy", + "Hall of Fame", + "Holders Of LE", + "IceBlue Team", + "Immortalish", + "Imperial", + "Kasai Shinrai", + "Kingdom Foxes", + "KingdomPhoenixes", + "LE Flowers", + "Paladins United", + "Serpentem Empire", + "Sins of Seedia", + "The Hive", + "The Divine Swords", + "Titans Valor", + "Illustratus"]; + + let connection = establish_connection(); + + let resp = reqwest::get("https://api.wynncraft.com/public_api.php?action=territoryList").unwrap(); + + let mut territories: Value = serde_json::from_reader(resp).unwrap(); + + let mut timestamp = territories.as_object().unwrap().get("request").unwrap().as_object().unwrap().get("timestamp").unwrap().as_u64().unwrap(); + + loop { + thread::sleep_ms(10_000); + let resp = reqwest::get("https://api.wynncraft.com/public_api.php?action=territoryList").unwrap(); + + let new_territories: Value = serde_json::from_reader(resp).unwrap(); + + let new_timestamp = new_territories.as_object().unwrap().get("request").unwrap().as_object().unwrap().get("timestamp").unwrap().as_u64().unwrap(); + if !(new_timestamp > timestamp) { // time went backwards for wynncraft? + continue; + } + timestamp = new_timestamp; + + let mut assigned_owned_by_enemies = vec![]; + let mut ffa_owned_by_enemies = vec![]; + + for key in territories.get("territories").unwrap().as_object().unwrap().keys() { + let new_value = new_territories.get("territories").unwrap().as_object().unwrap().get(key).unwrap(); + let new_guild = new_value.get("guild").unwrap().as_str().unwrap(); + if !federation_allies.contains(&new_guild) { + if !ffa.contains(&&**key) { + assigned_owned_by_enemies.push(key.to_owned()); + } else { + ffa_owned_by_enemies.push(key.to_owned()); + } + } + } + + for listener in federationfeed_listeners + .load::(&connection) + .expect("Error loading listeners") { + let _ = ChannelId(listener.id as u64).say(format!("Assigned owned by others: {:?} +FFA owned by others: {:?}", + assigned_owned_by_enemies, + ffa_owned_by_enemies + )); + } + + territories = new_territories; + } +} + pub fn war_livefeed() { use models::WarfeedListener; use schema::warfeedlisteners::dsl::*; @@ -152,6 +230,43 @@ pub fn wc_unlivefeed(msg: &Message) -> Result<(), Error> { Ok(()) } +pub fn wc_federationfeed(msg: &Message) -> Result<(), Error> { + use models::FederationfeedListener; + use schema::federationfeed_listeners; + + let connection = establish_connection(); + + if let Err(error) = diesel::insert_into(federationfeed_listeners::table) + .values(&FederationfeedListener { + id: msg.channel_id.0 as i64 + }) + .execute(&connection) { + if let diesel::result::Error::DatabaseError(DatabaseErrorKind::UniqueViolation, _) = error { + bail!(failure::err_msg("already enabled")); + } else { + bail!(error); + } + } + + msg.channel_id.say("Success!")?; + + Ok(()) +} + +pub fn wc_unfederationfeed(msg: &Message) -> Result<(), Error> { + use schema::federationfeed_listeners::dsl::*; + + let connection = establish_connection(); + + let channel_id = msg.channel_id.0 as i64; + diesel::delete(federationfeed_listeners.filter(id.eq(channel_id))) + .execute(&connection)?; + + msg.channel_id.say("Success!")?; + + Ok(()) +} + pub fn wc_warfeed(msg: &Message) -> Result<(), Error> { use models::WarfeedListener; use schema::warfeedlisteners; diff --git a/src/commands/mod.rs b/src/commands/mod.rs index f2d701e..9009b7d 100644 --- a/src/commands/mod.rs +++ b/src/commands/mod.rs @@ -23,7 +23,7 @@ pub mod feed; pub use player::*; pub use guild::*; -pub use feed::{wc_livefeed, wc_unlivefeed, wc_warfeed, wc_unwarfeed}; +pub use feed::{wc_livefeed, wc_unlivefeed, wc_warfeed, wc_unwarfeed, wc_federationfeed, wc_unfederationfeed}; pub fn wc_prefix(command: &str, msg: &Message) -> Result<(), Error> { use models::PrefixConfig; diff --git a/src/main.rs b/src/main.rs index 78c8e75..5bfb0f7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -228,6 +228,10 @@ impl Handler { wc_livefeed(msg)?; } else if command.starts_with("unlivefeed") { wc_unlivefeed(msg)?; + } else if command.starts_with("federationfeed") { + wc_federationfeed(msg)?; + } else if command.starts_with("unfederationfeed") { + wc_unfederationfeed(msg)?; } else if command == "info" || command == "" { wc_info(msg)?; } else if command == "help" { @@ -313,5 +317,12 @@ fn start_daemons() { } }) .unwrap(); + thread::Builder::new() + .spawn(|| { + loop { + println!("{:?}", panic::catch_unwind(|| commands::feed::federation_livefeed())); + } + }) + .unwrap(); println!("Started daemons."); } diff --git a/src/models.rs b/src/models.rs index e10f102..311a43d 100644 --- a/src/models.rs +++ b/src/models.rs @@ -6,6 +6,12 @@ pub struct LivefeedListener { pub id: i64 } +#[derive(Queryable, Insertable)] +#[table_name="federationfeed_listeners"] +pub struct FederationfeedListener { + pub id: i64 +} + #[derive(Queryable, Insertable)] #[table_name="warfeedlisteners"] pub struct WarfeedListener { diff --git a/src/schema.rs b/src/schema.rs index a28e9f1..6ef6bbb 100644 --- a/src/schema.rs +++ b/src/schema.rs @@ -1,3 +1,9 @@ +table! { + federationfeed_listeners (id) { + id -> Int8, + } +} + table! { livefeedlisteners (id) { id -> Int8, @@ -18,6 +24,7 @@ table! { } allow_tables_to_appear_in_same_query!( + federationfeed_listeners, livefeedlisteners, prefixes, warfeedlisteners,