2018-03-22 17:54:49 -04:00
|
|
|
use std::io::Result;
|
|
|
|
use connection::Connection;
|
2018-03-23 17:24:06 -04:00
|
|
|
use models::{Handshake, OpCode};
|
2018-03-22 10:35:48 -04:00
|
|
|
#[cfg(feature = "rich_presence")]
|
|
|
|
use models::{SetActivityArgs, SetActivity};
|
|
|
|
|
|
|
|
#[derive(Debug)]
|
2018-03-22 17:54:49 -04:00
|
|
|
pub struct Client<T>
|
|
|
|
where T: Connection
|
|
|
|
{
|
2018-03-22 15:54:18 -04:00
|
|
|
client_id: u64,
|
|
|
|
version: u32,
|
2018-03-22 17:54:49 -04:00
|
|
|
socket: T,
|
2018-03-22 10:35:48 -04:00
|
|
|
}
|
|
|
|
|
2018-03-22 17:54:49 -04:00
|
|
|
impl<T> Client<T>
|
|
|
|
where T: Connection
|
|
|
|
{
|
2018-03-22 10:35:48 -04:00
|
|
|
pub fn new(client_id: u64) -> Result<Self> {
|
2018-03-22 17:54:49 -04:00
|
|
|
let socket = T::connect()?;
|
|
|
|
Ok(Self { version: 1, client_id, socket})
|
2018-03-22 10:35:48 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
pub fn start(mut self) -> Result<Self> {
|
|
|
|
self.handshake()?;
|
|
|
|
Ok(self)
|
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(feature = "rich_presence")]
|
|
|
|
pub fn set_activity<F>(&mut self, f: F) -> Result<()>
|
|
|
|
where F: FnOnce(SetActivity) -> SetActivity
|
|
|
|
{
|
|
|
|
let args = SetActivityArgs::command(f(SetActivity::new()));
|
2018-03-23 17:24:06 -04:00
|
|
|
self.socket.send(OpCode::Frame, args)?;
|
2018-03-22 10:35:48 -04:00
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
|
|
|
|
// private
|
|
|
|
|
|
|
|
fn handshake(&mut self) -> Result<()> {
|
|
|
|
let client_id = self.client_id;
|
|
|
|
let version = self.version;
|
2018-03-23 17:24:06 -04:00
|
|
|
self.socket.send(OpCode::Handshake, Handshake::new(client_id, version))?;
|
2018-03-22 10:35:48 -04:00
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
}
|