mod event_handlers;
mod event_wrappers;
mod join_request;
mod presence;
pub use crate::event_handlers::EventHandlers;
pub use crate::join_request::{JoinRequestReply, User};
pub use crate::presence::RichPresence;
use rustcord_sys as sys;
use std::ffi::{CString, NulError};
use std::ptr;
pub struct Rustcord;
impl Rustcord {
pub fn init<EH: EventHandlers>(app_id: &str, auto_register: bool, steam_id: Option<&str>) -> Result<Rustcord, NulError> {
let mut sys_handlers = event_handlers::wrap::<EH>();
unsafe {
sys::Discord_Initialize(
CString::new(app_id)?.into_raw(),
&mut sys_handlers,
auto_register as libc::c_int,
match steam_id {
None => ptr::null(),
Some(id) => CString::new(id)?.into_raw(),
},
);
}
Ok(Rustcord)
}
pub fn update_handlers<EH: EventHandlers>(&self) {
let mut sys_handlers = event_handlers::wrap::<EH>();
unsafe {
sys::Discord_UpdateHandlers(&mut sys_handlers);
}
}
pub fn update_presence(&self, presence: RichPresence) -> Result<(), NulError> {
let sys_presence = presence.wrap()?;
unsafe {
sys::Discord_UpdatePresence(&sys_presence);
}
Ok(())
}
pub fn clear_presence(&self) {
unsafe {
sys::Discord_ClearPresence();
}
}
pub fn run_callbacks(&self) {
unsafe {
sys::Discord_RunCallbacks();
}
}
}
impl Drop for Rustcord {
fn drop(&mut self) {
unsafe {
sys::Discord_Shutdown();
}
}
}