veloren/voxygen/src/discord.rs

136 lines
4.8 KiB
Rust
Raw Normal View History

2019-06-19 19:25:08 +00:00
use discord_rpc_sdk::{DiscordUser, EventHandlers, RichPresence, RPC};
use std::time::SystemTime;
2019-06-04 20:12:32 +00:00
use std::sync::mpsc::Sender;
use std::sync::{mpsc, Mutex, MutexGuard};
use std::thread;
use std::thread::JoinHandle;
2019-06-05 14:37:55 +00:00
/// Connects to the discord application where Images and more resides
/// can be viewed at https://discordapp.com/developers/applications/583662036194689035/rich-presence/assets
/// but requires an invitation.
2019-06-19 19:25:08 +00:00
const DISCORD_APPLICATION_ID: &str = "583662036194689035";
2019-06-04 20:12:32 +00:00
/// Represents an update of the game which should be reflected in Discord
pub enum DiscordUpdate {
Details(String),
State(String),
SmallImg(String),
SmallImgDesc(String),
LargeImg(String),
LargeImgDesc(String),
Shutdown,
}
pub struct DiscordState {
pub tx: Sender<DiscordUpdate>,
pub thread: Option<JoinHandle<()>>,
}
pub fn run() -> Mutex<DiscordState> {
let (tx, rx) = mpsc::channel();
Mutex::new(DiscordState {
tx,
thread: Some(thread::spawn(move || {
2019-06-19 19:25:08 +00:00
let rpc = RPC::init::<Handlers>(DISCORD_APPLICATION_ID, true, None)
.expect("failed to initiate discord_game_sdk");
2019-06-04 20:12:32 +00:00
//Set initial Status
2019-06-19 19:25:08 +00:00
let mut current_presence = RichPresence {
details: Some("In Menu".to_string()),
state: Some("Idling".to_string()),
start_time: Some(SystemTime::now()),
//end_time: Some(SystemTime::now().checked_add(Duration::from_secs(360)).unwrap()),
large_image_key: Some("snow_background".to_string()),
large_image_text: Some("Veloren.net".to_string()),
small_image_key: Some("veloren_logo_1024".to_string()),
small_image_text: Some("*insert joke here*".to_string()),
//party_id: Some("randompartyid".to_owned()),
//party_size: Some(4),
//party_max: Some(13),
//spectate_secret: Some("randomhash".to_string()),
//join_secret: Some("anotherrandomhash".to_string()),
..Default::default()
};
match rpc.update_presence(current_presence.clone()) {
Ok(_) => {}
Err(e) => log::error!("Failed to update discord presence: {}", e),
}
2019-06-04 20:12:32 +00:00
'outer: loop {
2019-06-19 19:25:08 +00:00
rpc.run_callbacks();
2019-06-04 20:12:32 +00:00
let msg = rx.try_recv();
match msg {
Ok(update) => {
match update {
2019-06-19 19:25:08 +00:00
DiscordUpdate::Details(x) => current_presence.details = Some(x),
DiscordUpdate::State(x) => current_presence.state = Some(x),
DiscordUpdate::SmallImg(x) => {
current_presence.small_image_key = Some(x)
}
DiscordUpdate::SmallImgDesc(x) => {
current_presence.small_image_text = Some(x)
}
DiscordUpdate::LargeImg(x) => {
current_presence.large_image_key = Some(x)
}
DiscordUpdate::LargeImgDesc(x) => {
current_presence.large_image_text = Some(x)
}
2019-06-04 20:12:32 +00:00
DiscordUpdate::Shutdown => break 'outer,
};
2019-06-19 19:25:08 +00:00
match rpc.update_presence(current_presence.clone()) {
Ok(_) => {}
Err(e) => log::error!("Failed to update discord presence: {}", e),
}
2019-06-04 20:12:32 +00:00
}
Err(_) => {}
}
}
})),
})
}
2019-06-19 19:25:08 +00:00
struct Handlers;
impl EventHandlers for Handlers {
fn ready(user: DiscordUser) {
log::debug!("We're ready! {:?}", user);
}
fn errored(errcode: i32, message: &str) {
log::debug!("Error {}: {}", errcode, message);
}
fn disconnected(errcode: i32, message: &str) {
log::debug!("Disconnected {}: {}", errcode, message);
}
fn join_game(secret: &str) {
log::debug!("Joining {}", secret);
}
fn spectate_game(secret: &str) {
log::debug!("Spectating {}", secret);
}
fn join_request(from: DiscordUser) {
log::debug!("Join request from {:?}", from);
}
}
2019-06-04 20:12:32 +00:00
/* Some helpers */
pub fn send_menu(disc: &mut MutexGuard<DiscordState>) {
disc.tx.send(DiscordUpdate::Details("Menu".into()));
disc.tx.send(DiscordUpdate::State("Idling".into()));
disc.tx.send(DiscordUpdate::LargeImg("bg_main".into()));
}
pub fn send_singleplayer(disc: &mut MutexGuard<DiscordState>) {
disc.tx.send(DiscordUpdate::Details("Singleplayer".into()));
disc.tx.send(DiscordUpdate::State("Playing...".into()));
2019-06-19 19:25:08 +00:00
}