diff --git a/Cargo.toml b/Cargo.toml index 35ec4a3..ed7da5f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,4 +10,4 @@ teloxide = { version = "0.5", features = ["auto-send", "macros"] } log = "0.4" pretty_env_logger = "0.4.0" tokio = { version = "1.8", features = ["rt-multi-thread", "macros"] } -rspotify = "0.10.0" \ No newline at end of file +rspotify = { version = "0.10.0", features = ["blocking"] } \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 75e8ac2..88809db 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,27 +1,44 @@ +use crate::SpotifyURL::Track; +use rspotify::blocking::client::Spotify; +use rspotify::blocking::oauth2::SpotifyClientCredentials; use teloxide::prelude::*; -use crate::Spotify::Track; -enum Spotify { - Track(String) +enum SpotifyURL { + Track(String), } -fn get_spotify_entry(url : &str) -> Option { +fn get_spotify_entry(url: &str) -> Option { if url.contains("https://open.spotify.com/track/") { let track_id = url.rsplit('/').next().and_then(|x| x.split('?').next()); return match track_id { - Some(id) => Some(Spotify::Track(id.to_string())), - None => None - } + Some(id) => Some(SpotifyURL::Track(id.to_string())), + None => None, + }; } - return None + return None; } -fn is_spotify_url(url : &str) -> Option<&str> { +fn is_spotify_url(url: &str) -> Option<&str> { // https://open.spotify.com/track/0VffaI2jwQknRrxpECYHsF?si=1e16c64779744375 if url.contains("https://open.spotify.com/") { - return Some(url) + return Some(url); + } + return None; +} + +struct TrackInfo { + name: String, + artist: Vec, +} + +fn get_spotify_track(spotify: Box, id: &String) -> Option { + match spotify.track(id.as_str()) { + Ok(track) => Some(TrackInfo { + name: track.name, + artist: track.artists.iter().map(|x| x.name.clone()).collect(), + }), + Err(_e) => None, } - return None } #[tokio::main] @@ -30,18 +47,38 @@ async fn main() { log::info!("Starting Songlify..."); let bot = Bot::from_env().auto_send(); - teloxide::repl(bot, |message| async move { - let text = message.update.text().and_then(get_spotify_entry); + let spotify_creds = SpotifyClientCredentials::default().build(); + let spotify_client = Box::new( + Spotify::default() + .client_credentials_manager(spotify_creds) + .build(), + ); + + log::info!("Connected to Spotify"); + let text = message.update.text().and_then(get_spotify_entry); match text { - Some(spotify) => { - match spotify { - Track(id) => Some(message.reply_to(id).await?) + Some(spotify) => match spotify { + Track(id) => { + let track_info = get_spotify_track(spotify_client, &id); + match track_info { + Some(info) => { + let reply = format!( + "Track information:\n\ + Track name: {}\n\ + Artists: {}", + info.name, + info.artist.join(", ") + ); + Some(message.reply_to(reply).await?) + } + None => None, + } } - } - None => None + }, + None => None, }; respond(()) }) - .await; -} \ No newline at end of file + .await; +}