From ea4e93f01d9e4ef17effae1e9a807bb1977865fe Mon Sep 17 00:00:00 2001 From: Andy Wortman Date: Mon, 2 Oct 2017 01:27:08 -0700 Subject: move everything to src/ --- src/commands/del.rs | 0 src/commands/fav.rs | 35 +++++++++ src/commands/look_up.rs | 32 ++++++++ src/commands/mod.rs | 46 ++++++++++++ src/commands/quit.rs | 18 +++++ src/commands/show_cache.rs | 31 ++++++++ src/commands/twete.rs | 184 +++++++++++++++++++++++++++++++++++++++++++++ src/commands/view.rs | 22 ++++++ 8 files changed, 368 insertions(+) create mode 100644 src/commands/del.rs create mode 100644 src/commands/fav.rs create mode 100644 src/commands/look_up.rs create mode 100644 src/commands/mod.rs create mode 100644 src/commands/quit.rs create mode 100644 src/commands/show_cache.rs create mode 100644 src/commands/twete.rs create mode 100644 src/commands/view.rs (limited to 'src/commands') diff --git a/src/commands/del.rs b/src/commands/del.rs new file mode 100644 index 0000000..e69de29 diff --git a/src/commands/fav.rs b/src/commands/fav.rs new file mode 100644 index 0000000..3e2b00d --- /dev/null +++ b/src/commands/fav.rs @@ -0,0 +1,35 @@ +use tw; +use ::Queryer; + +use commands::Command; + +use std::str::FromStr; + +static FAV_TWEET_URL: &str = "https://api.twitter.com/1.1/favorites/create.json"; +static UNFAV_TWEET_URL: &str = "https://api.twitter.com/1.1/favorites/destroy.json"; + +pub static UNFAV: Command = Command { + keyword: "unfav", + params: 1, + exec: unfav +}; + +fn unfav(line: String, tweeter: &mut tw::TwitterCache, queryer: &mut Queryer) { + // TODO handle this unwrap + let inner_twid = u64::from_str(&line).unwrap(); + let twete = tweeter.tweet_by_innerid(inner_twid).unwrap(); + queryer.do_api_post(&format!("{}?id={}", UNFAV_TWEET_URL, twete.id)); +} + +pub static FAV: Command = Command { + keyword: "fav", + params: 1, + exec: fav +}; + +fn fav(line: String, tweeter: &mut tw::TwitterCache, queryer: &mut Queryer) { + // TODO handle this unwrap + let inner_twid = u64::from_str(&line).unwrap(); + let twete = tweeter.tweet_by_innerid(inner_twid).unwrap(); + queryer.do_api_post(&format!("{}?id={}", FAV_TWEET_URL, twete.id)); +} diff --git a/src/commands/look_up.rs b/src/commands/look_up.rs new file mode 100644 index 0000000..d04f984 --- /dev/null +++ b/src/commands/look_up.rs @@ -0,0 +1,32 @@ +use tw; +use ::Queryer; + +use commands::Command; + +pub static LOOK_UP_USER: Command = Command { + keyword: "look_up_user", + params: 1, + exec: look_up_user +}; + +fn look_up_user(line: String, tweeter: &mut tw::TwitterCache, mut queryer: &mut Queryer) { + if let Some(user) = tweeter.fetch_user(&line, &mut queryer) { + println!("{:?}", user); + } else { +// println!("Couldn't retrieve {}", userid); + } +} + +pub static LOOK_UP_TWEET: Command = Command { + keyword: "look_up_tweet", + params: 1, + exec: look_up_tweet +}; + +fn look_up_tweet(line: String, tweeter: &mut tw::TwitterCache, mut queryer: &mut Queryer) { + if let Some(tweet) = tweeter.fetch_tweet(&line, &mut queryer) { + println!("{:?}", tweet); + } else { +// println!("Couldn't retrieve {}", tweetid); + } +} diff --git a/src/commands/mod.rs b/src/commands/mod.rs new file mode 100644 index 0000000..fc66bec --- /dev/null +++ b/src/commands/mod.rs @@ -0,0 +1,46 @@ +use tw; +use ::Queryer; + +pub struct Command { + pub keyword: &'static str, + pub params: u8, + pub exec: fn(line: String, tweeter: &mut tw::TwitterCache, queryer: &mut Queryer) +} + +mod show_cache; +mod twete; +mod look_up; +mod view; +mod quit; +mod fav; + +pub static COMMANDS: &[&Command] = &[ + &show_cache::SHOW_CACHE, + &quit::QUIT, + &look_up::LOOK_UP_USER, + &look_up::LOOK_UP_TWEET, + &view::VIEW, + &fav::UNFAV, + &fav::FAV, + &twete::DEL, + &twete::TWETE, + &twete::QUOTE, + &twete::RETWETE, + &twete::REP, + &twete::THREAD + /* + &QUIT, + &LOOK_UP_USER, + &LOOK_UP_TWEET, + &VIEW, + &UNFAV, + &FAV, + &DEL, + &TWETE, + "E, + &RETWETE, + &REP, + &THREAD + ]; + */ +]; diff --git a/src/commands/quit.rs b/src/commands/quit.rs new file mode 100644 index 0000000..982c48f --- /dev/null +++ b/src/commands/quit.rs @@ -0,0 +1,18 @@ +use tw; +use ::Queryer; + +use commands::Command; + +use std::process::exit; + +pub static QUIT: Command = Command { + keyword: "q", + params: 0, + exec: quit +}; + +fn quit(_line: String, tweeter: &mut tw::TwitterCache, _queryer: &mut Queryer) { + println!("Bye bye!"); + tweeter.store_cache(); + exit(0); +} diff --git a/src/commands/show_cache.rs b/src/commands/show_cache.rs new file mode 100644 index 0000000..3c31697 --- /dev/null +++ b/src/commands/show_cache.rs @@ -0,0 +1,31 @@ +use tw; +use ::Queryer; + +use commands::Command; + +pub static SHOW_CACHE: Command = Command { + keyword: "show_cache", + params: 0, + exec: show_cache +}; + +fn show_cache(line: String, tweeter: &mut tw::TwitterCache, mut queryer: &mut Queryer) { + println!("----* USERS *----"); + for (uid, user) in &tweeter.users { + println!("User: {} -> {:?}", uid, user); + } + println!("----* TWEETS *----"); + for (tid, tweet) in &tweeter.tweets { + println!("Tweet: {} -> {:?}", tid, tweet); + } + println!("----* FOLLOWERS *----"); + for uid in &tweeter.followers.clone() { + let user_res = tweeter.fetch_user(uid, &mut queryer); + match user_res { + Some(user) => { + println!("Follower: {} - {:?}", uid, user); + } + None => { println!(" ..."); } + } + } +} diff --git a/src/commands/twete.rs b/src/commands/twete.rs new file mode 100644 index 0000000..ecc3f98 --- /dev/null +++ b/src/commands/twete.rs @@ -0,0 +1,184 @@ +use tw; +use ::Queryer; + +use commands::Command; + +use std::str::FromStr; + +static DEL_TWEET_URL: &str = "https://api.twitter.com/1.1/statuses/destroy"; +static RT_TWEET_URL: &str = "https://api.twitter.com/1.1/statuses/retweet"; +static CREATE_TWEET_URL: &str = "https://api.twitter.com/1.1/statuses/update.json"; + +pub static DEL: Command = Command { + keyword: "del", + params: 1, + exec: del +}; + +fn del(line: String, tweeter: &mut tw::TwitterCache, queryer: &mut Queryer) { + let inner_twid = u64::from_str(&line).unwrap(); + let twete = tweeter.tweet_by_innerid(inner_twid).unwrap(); + queryer.do_api_post(&format!("{}/{}.json", DEL_TWEET_URL, twete.id)); +} + +pub static TWETE: Command = Command { + keyword: "t", + params: 1, + exec: twete +}; + +fn twete(line: String, _tweeter: &mut tw::TwitterCache, queryer: &mut Queryer) { + let text = line.trim(); + let substituted = ::url_encode(text); + println!("msg len: {}", text.len()); + println!("excessively long? {}", text.len() > 140); + if text.len() > 140 { + queryer.do_api_post(&format!("{}?status={}", CREATE_TWEET_URL, substituted)); + } else { + queryer.do_api_post(&format!("{}?status={}&weighted_character_count=true", CREATE_TWEET_URL, substituted)); + } +// println!("{}", &format!("{}?status={}", CREATE_TWEET_URL, substituted)); +} + +pub static THREAD: Command = Command { + keyword: "thread", + params: 2, + exec: thread +}; + +fn thread(line: String, tweeter: &mut tw::TwitterCache, queryer: &mut Queryer) { + let mut text: String = line.trim().to_string(); + if let Some(id_end_idx) = text.find(" ") { + let reply_bare = text.split_off(id_end_idx + 1); + let reply = reply_bare.trim(); + let id_str = text.trim(); + if reply.len() > 0 { + if let Some(inner_twid) = u64::from_str(&id_str).ok() { + if let Some(twete) = tweeter.tweet_by_innerid(inner_twid) { + let handle = &tweeter.retrieve_user(&twete.author_id).unwrap().handle; + // TODO: definitely breaks if you change your handle right now + if handle == &tweeter.current_user.handle { + let substituted = ::url_encode(reply); + queryer.do_api_post(&format!("{}?status={}&in_reply_to_status_id={}", CREATE_TWEET_URL, substituted, twete.id)); + } else { + println!("you can only thread your own tweets"); + // ask if it should .@ instead? + } + let substituted = ::url_encode(reply); + queryer.do_api_post(&format!("{}?status={}&in_reply_to_status_id={}", CREATE_TWEET_URL, substituted, twete.id)); + } + } + } else { + println!("thread your sik reply"); + } + } else { + println!("thread your sik reply"); + } +} + +pub static REP: Command = Command { + keyword: "rep", + params: 2, + exec: rep +}; + +fn rep(line: String, tweeter: &mut tw::TwitterCache, queryer: &mut Queryer) { + let mut text: String = line.trim().to_string(); + if let Some(id_end_idx) = text.find(" ") { + let reply_bare = text.split_off(id_end_idx + 1); + let reply = reply_bare.trim(); + let id_str = text.trim(); + if reply.len() > 0 { + if let Some(inner_twid) = u64::from_str(&id_str).ok() { + if let Some(twete) = tweeter.tweet_by_innerid(inner_twid) { + // get handles to reply to... + let author_handle = tweeter.retrieve_user(&twete.author_id).unwrap().handle.to_owned(); + let mut ats: Vec = twete.get_mentions().into_iter().map(|x| x.to_owned()).collect(); //std::collections::HashSet::new(); + /* + for handle in twete.get_mentions() { + ats.insert(handle); + } + */ + ats.remove_item(&author_handle); + ats.insert(0, author_handle); + // no idea why i have to .to_owned() here --v-- what about twete.rt_tweet is a move? + if let Some(rt_tweet) = twete.rt_tweet.to_owned().and_then(|id| tweeter.retrieve_tweet(&id)) { + let rt_author_handle = tweeter.retrieve_user(&rt_tweet.author_id).unwrap().handle.to_owned(); + ats.remove_item(&rt_author_handle); + ats.insert(1, rt_author_handle); + } + if let Some(qt_tweet) = twete.quoted_tweet_id.to_owned().and_then(|id| tweeter.retrieve_tweet(&id)) { + let qt_author_handle = tweeter.retrieve_user(&qt_tweet.author_id).unwrap().handle.to_owned(); + ats.remove_item(&qt_author_handle); + ats.insert(1, qt_author_handle); + } + //let ats_vec: Vec<&str> = ats.into_iter().collect(); + //let full_reply = format!("{} {}", ats_vec.join(" "), reply); + let decorated_ats: Vec = ats.into_iter().map(|x| format!("@{}", x)).collect(); + let full_reply = format!("{} {}", decorated_ats.join(" "), reply); + let substituted = ::url_encode(&full_reply); +// println!("{}", (&format!("{}?status={}&in_reply_to_status_id={}", CREATE_TWEET_URL, substituted, twete.id))); + queryer.do_api_post(&format!("{}?status={}&in_reply_to_status_id={}", CREATE_TWEET_URL, substituted, twete.id)); + } + } + } else { + println!("rep your sik reply"); + } + } else { + println!("rep your sik reply"); + } +} + +pub static QUOTE: Command = Command { + keyword: "qt", + params: 2, + exec: quote +}; + +fn quote(line: String, tweeter: &mut tw::TwitterCache, queryer: &mut Queryer) { + let mut text: String = line.trim().to_string(); + if let Some(id_end_idx) = text.find(" ") { + let reply_bare = text.split_off(id_end_idx + 1); + let reply = reply_bare.trim(); + let id_str = text.trim(); + if reply.len() > 0 { + if let Some(inner_twid) = u64::from_str(&id_str).ok() { + if let Some(twete) = tweeter.tweet_by_innerid(inner_twid) { + let substituted = ::url_encode(reply); + let attachment_url = ::url_encode( + &format!( + "https://www.twitter.com/{}/status/{}", + tweeter.retrieve_user(&twete.author_id).unwrap().handle, + twete.id + ) + ); + println!("{}", substituted); + queryer.do_api_post( + &format!("{}?status={}&attachment_url={}", + CREATE_TWEET_URL, + substituted, + attachment_url + ) + ); + } + } + } else { + println!("rep your sik reply"); + } + } else { + println!("rep your sik reply"); + } +} + +pub static RETWETE: Command = Command { + keyword: "rt", + params: 1, + exec: retwete +}; + +fn retwete(line: String, tweeter: &mut tw::TwitterCache, queryer: &mut Queryer) { + let inner_twid = u64::from_str(&line).unwrap(); + let twete = tweeter.tweet_by_innerid(inner_twid).unwrap(); + queryer.do_api_post(&format!("{}/{}.json", RT_TWEET_URL, twete.id)); +} + diff --git a/src/commands/view.rs b/src/commands/view.rs new file mode 100644 index 0000000..d01ff1b --- /dev/null +++ b/src/commands/view.rs @@ -0,0 +1,22 @@ +use tw; +use ::Queryer; + +use commands::Command; + +use std::str::FromStr; + +use display; + +pub static VIEW: Command = Command { + keyword: "view", + params: 1, + exec: view +}; + +fn view(line: String, tweeter: &mut tw::TwitterCache, _queryer: &mut Queryer) { + // TODO handle this unwrap + let inner_twid = u64::from_str(&line).unwrap(); + let twete = tweeter.tweet_by_innerid(inner_twid).unwrap(); + display::render_twete(&twete.id, tweeter); + println!("link: https://twitter.com/i/web/status/{}", twete.id); +} -- cgit v1.1