diff --git a/Cargo.lock b/Cargo.lock index b4effdc..a821ece 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1100,7 +1100,7 @@ dependencies = [ [[package]] name = "wynnrobot" -version = "0.9.1" +version = "0.9.2" dependencies = [ "diesel 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "reqwest 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/migrations/2018-01-12-175530_create_warfeed_listeners/down.sql b/migrations/2018-01-12-175530_create_warfeed_listeners/down.sql new file mode 100644 index 0000000..72a5897 --- /dev/null +++ b/migrations/2018-01-12-175530_create_warfeed_listeners/down.sql @@ -0,0 +1 @@ +DROP TABLE warfeedlisteners \ No newline at end of file diff --git a/migrations/2018-01-12-175530_create_warfeed_listeners/up.sql b/migrations/2018-01-12-175530_create_warfeed_listeners/up.sql new file mode 100644 index 0000000..39cab93 --- /dev/null +++ b/migrations/2018-01-12-175530_create_warfeed_listeners/up.sql @@ -0,0 +1,3 @@ +CREATE TABLE warfeedlisteners ( + id BIGINT PRIMARY KEY +) \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index fb35384..4f3cf4d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -42,14 +42,18 @@ impl EventHandler for Handler { wc_status(msg); } else if msg.content.starts_with("wc!player ") { wc_player(msg); - } else if msg.content.starts_with("wc!livefeed") { + } else if msg.content == "wc!livefeed" { wc_livefeed(msg); - } else if msg.content.starts_with("wc!unlivefeed") { + } else if msg.content == "wc!unlivefeed" { wc_unlivefeed(msg); } else if msg.content == "wc!info" || msg.content == "wc!help" || msg.content == "wc!" { wc_info(msg); } else if msg.content.starts_with("wc!crop ") { wc_crop(msg); + } else if msg.content == "wc!warfeed" { + wc_warfeed(msg); + } else if msg.content == "wc!unwarfeed" { + wc_unwarfeed(msg); } } @@ -223,7 +227,7 @@ fn wc_livefeed(msg: Message) { id: msg.channel_id.0 as i64 }) .execute(&connection) - .expect("Error saving new post"); + .expect("Error saving new listener"); msg.channel_id.say("Success!").unwrap(); } @@ -236,7 +240,36 @@ fn wc_unlivefeed(msg: Message) { let channel_id = msg.channel_id.0 as i64; diesel::delete(livefeedlisteners.filter(id.eq(channel_id))) .execute(&connection) - .expect("Error deleting posts"); + .expect("Error deleting listener"); + + msg.channel_id.say("Success!").unwrap(); +} + +fn wc_warfeed(msg: Message) { + use models::WarfeedListener; + use schema::warfeedlisteners; + + let connection = establish_connection(); + + diesel::insert_into(warfeedlisteners::table) + .values(&WarfeedListener { + id: msg.channel_id.0 as i64 + }) + .execute(&connection) + .expect("Error saving new listener"); + + msg.channel_id.say("Success!").unwrap(); +} + +fn wc_unwarfeed(msg: Message) { + use schema::warfeedlisteners::dsl::*; + + let connection = establish_connection(); + + let channel_id = msg.channel_id.0 as i64; + diesel::delete(warfeedlisteners.filter(id.eq(channel_id))) + .execute(&connection) + .expect("Error deleting listener"); msg.channel_id.say("Success!").unwrap(); } @@ -291,10 +324,63 @@ fn territory_livefeed() { } } +fn war_livefeed() { + use models::WarfeedListener; + use schema::warfeedlisteners::dsl::*; + + let connection = establish_connection(); + + let resp = reqwest::get("https://api.wynncraft.com/public_api.php?action=onlinePlayers").unwrap(); + + let mut players: Value = serde_json::from_reader(resp).unwrap(); + + loop { + thread::sleep_ms(50_000); // 50 seconds + let resp = reqwest::get("https://api.wynncraft.com/public_api.php?action=onlinePlayers").unwrap(); + + let new_players: Value = serde_json::from_reader(resp).unwrap(); + + for key in new_players.as_object().unwrap().keys() { + if key == "request" { + continue; + } + if !key.starts_with("WAR") { + continue; + } + let war_players = new_players.get(key).unwrap().as_array().unwrap(); + for player in war_players.into_iter() { + let old_server = players.as_object().unwrap().iter().map(|(server, players)| { + if server == "request" { + (&**server, false) + } else { + (&**server, players.as_array().unwrap().contains(player)) + } + }).filter(|&(_, is_in_it)| is_in_it).next().unwrap_or(("WC?", true)).0; + if old_server != key { + for listener in warfeedlisteners + .load::(&connection) + .expect("Error loading listeners") { + let _ = ChannelId(listener.id as u64).say(format!("{}: ~~{}~~ -> **{}**", + player.as_str().unwrap(), + old_server, + key + )); + } + } + } + } + + players = new_players; + } +} + fn main() { // Configure the client with your Discord bot token in the environment. let token = env::var("DISCORD_TOKEN").expect("DISCORD_TOKEN must be set"); + env::var("DATABASE_URL") + .expect("DATABASE_URL must be set"); + /* thread::Builder::new() .spawn(|| { loop { @@ -302,6 +388,15 @@ fn main() { } }) .unwrap(); + */ + + thread::Builder::new() + .spawn(|| { + loop { + println!("{:?}", panic::catch_unwind(|| war_livefeed())); + } + }) + .unwrap(); loop { // Create a new instance of the Client, logging in as a bot. This will diff --git a/src/models.rs b/src/models.rs index e332101..a8bbe39 100644 --- a/src/models.rs +++ b/src/models.rs @@ -1,7 +1,13 @@ -use super::schema::livefeedlisteners; +use super::schema::*; #[derive(Queryable, Insertable)] #[table_name="livefeedlisteners"] pub struct LivefeedListener { pub id: i64 +} + +#[derive(Queryable, Insertable)] +#[table_name="warfeedlisteners"] +pub struct WarfeedListener { + pub id: i64 } \ No newline at end of file diff --git a/src/schema.rs b/src/schema.rs index 270327c..710f178 100644 --- a/src/schema.rs +++ b/src/schema.rs @@ -3,3 +3,14 @@ table! { id -> Int8, } } + +table! { + warfeedlisteners (id) { + id -> Int8, + } +} + +allow_tables_to_appear_in_same_query!( + livefeedlisteners, + warfeedlisteners, +);