Initial commit
This commit is contained in:
		
							
								
								
									
										3
									
								
								.env.sample
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								.env.sample
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| DISCORD_APP_ID= | ||||
| LASTFM_USERNAME= | ||||
| LASTFM_API_KEY= | ||||
							
								
								
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| /target | ||||
|  | ||||
| .env | ||||
							
								
								
									
										1300
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										1300
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										12
									
								
								Cargo.toml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								Cargo.toml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | ||||
| [package] | ||||
| name = "lfm-discord-presence" | ||||
| version = "0.1.0" | ||||
| edition = "2021" | ||||
|  | ||||
| # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html | ||||
|  | ||||
| [dependencies] | ||||
| tokio = { version = "1", features = ["full"] } | ||||
| discord-rich-presence = "0.2.3" | ||||
| chrono = "0.4.23" | ||||
| lastfm-rs = "0.5.0" | ||||
							
								
								
									
										82
									
								
								src/main.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								src/main.rs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,82 @@ | ||||
| use chrono::Duration; | ||||
| use discord_rich_presence::{ | ||||
|     activity::{Activity, Assets, Button}, | ||||
|     DiscordIpc, DiscordIpcClient, | ||||
| }; | ||||
| use std::{ | ||||
|     env, | ||||
|     sync::{Arc, Mutex}, | ||||
|     thread, | ||||
| }; | ||||
| use tokio::signal; | ||||
|  | ||||
| #[tokio::main] | ||||
| async fn main() -> Result<(), Box<dyn std::error::Error>> { | ||||
|     let discord_app_id = | ||||
|         env::var("DISCORD_APP_ID").expect("could not find `DISCORD_APP_ID` in env"); | ||||
|     let lfm_username = | ||||
|         env::var("LASTFM_USERNAME").expect("could not find `LASTFM_USERNAME` in env"); | ||||
|     let lfm_api_key = env::var("LASTFM_API_KEY").expect("could not find `LASTFM_API_KEY` in env"); | ||||
|  | ||||
|     let _ipc_client = Arc::new(Mutex::new( | ||||
|         DiscordIpcClient::new(discord_app_id.as_str()) | ||||
|             .expect("failed to create Discord IPC-client"), | ||||
|     )); | ||||
|     let _ipc_client2 = Arc::clone(&_ipc_client); | ||||
|  | ||||
|     let mut lfm = lastfm_rs::Client::new(lfm_api_key.as_str()); | ||||
|     let user_url = format!("https://www.last.fm/user/{}", lfm_username); | ||||
|  | ||||
|     { | ||||
|         let mut ipc_client = _ipc_client.lock().unwrap(); | ||||
|         ipc_client.connect().unwrap(); | ||||
|     } | ||||
|  | ||||
|     tokio::spawn(async move { | ||||
|         loop { | ||||
|             let tracks = lfm | ||||
|                 .recent_tracks(&lfm_username) | ||||
|                 .await | ||||
|                 .with_limit(1) | ||||
|                 .send() | ||||
|                 .await | ||||
|                 .expect("no recent track found"); | ||||
|  | ||||
|             let last_track = &tracks.tracks[0]; | ||||
|             match &last_track.attrs { | ||||
|                 Some(_) => { | ||||
|                     let details = format!("{} - {}", last_track.artist.name, last_track.name); | ||||
|                     println!("Currently playing: {:#?}", details); | ||||
|                     let state = format!("on {}", last_track.album.name); | ||||
|                     let activity = Activity::new() | ||||
|                         .assets(Assets::new().large_image(last_track.images[2].image_url.as_str())) | ||||
|                         .details(details.as_str()) | ||||
|                         .state(state.as_str()) | ||||
|                         .buttons(vec![Button::new("Profile", &user_url)]); | ||||
|  | ||||
|                     { | ||||
|                         let mut ipc_client = _ipc_client2.lock().unwrap(); | ||||
|                         ipc_client.set_activity(activity).unwrap(); | ||||
|                     } | ||||
|                 } | ||||
|                 None => { | ||||
|                     println!("Current not playing...") | ||||
|                 } | ||||
|             } | ||||
|             thread::sleep(Duration::seconds(5).to_std().unwrap()); | ||||
|         } | ||||
|     }); | ||||
|  | ||||
|     match signal::ctrl_c().await { | ||||
|         Ok(()) => { | ||||
|             println!("Shutting down..."); | ||||
|             let mut ipc_client = _ipc_client.lock().unwrap(); | ||||
|             ipc_client.close().unwrap(); | ||||
|         } | ||||
|         Err(err) => { | ||||
|             eprintln!("Unable to listen for shutdown signal: {}", err); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     Ok(()) | ||||
| } | ||||
		Reference in New Issue
	
	Block a user