2018-03-29 17:40:56 -04:00
|
|
|
use std::{
|
|
|
|
marker::Sized,
|
2018-04-03 06:03:08 -04:00
|
|
|
path::PathBuf,
|
2018-03-29 17:40:56 -04:00
|
|
|
};
|
|
|
|
|
2018-12-05 18:47:18 -05:00
|
|
|
use bytes::BytesMut;
|
2022-02-03 15:56:37 -05:00
|
|
|
use tokio::io::{AsyncWrite, AsyncRead, AsyncWriteExt, AsyncReadExt};
|
2018-12-05 18:47:18 -05:00
|
|
|
|
2022-02-03 15:56:37 -05:00
|
|
|
use crate::error::{Error, Result};
|
|
|
|
use crate::models::message::{Message, OpCode};
|
|
|
|
use crate::utils;
|
2018-03-29 17:40:56 -04:00
|
|
|
|
2022-02-03 15:56:37 -05:00
|
|
|
#[async_trait::async_trait]
|
|
|
|
pub trait Connection: Sized + Send {
|
|
|
|
type Socket: AsyncWrite + AsyncRead + Unpin + Send;
|
2018-04-03 06:03:08 -04:00
|
|
|
|
|
|
|
fn socket(&mut self) -> &mut Self::Socket;
|
|
|
|
|
|
|
|
fn ipc_path() -> PathBuf;
|
|
|
|
|
2022-02-03 15:56:37 -05:00
|
|
|
async fn connect() -> Result<Self>;
|
|
|
|
|
|
|
|
async fn disconnect(self) -> Result<()>;
|
2018-03-22 17:54:49 -04:00
|
|
|
|
2018-04-03 06:03:08 -04:00
|
|
|
fn socket_path(n: u8) -> PathBuf {
|
|
|
|
Self::ipc_path().join(format!("discord-ipc-{}", n))
|
|
|
|
}
|
|
|
|
|
2022-02-03 15:56:37 -05:00
|
|
|
async fn handshake(&mut self, client_id: u64) -> Result<()> {
|
2018-12-05 18:47:18 -05:00
|
|
|
let hs = json![{
|
|
|
|
"client_id": client_id.to_string(),
|
|
|
|
"v": 1,
|
|
|
|
"nonce": utils::nonce()
|
|
|
|
}];
|
|
|
|
|
2022-02-03 15:56:37 -05:00
|
|
|
self.send(Message::new(OpCode::Handshake, hs.clone())).await?;
|
|
|
|
self.recv().await?;
|
2018-12-05 18:47:18 -05:00
|
|
|
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
|
2022-02-03 15:56:37 -05:00
|
|
|
async fn ping(&mut self) -> Result<OpCode> {
|
2018-12-05 18:47:18 -05:00
|
|
|
let message = Message::new(OpCode::Ping, json![{}]);
|
2022-02-03 15:56:37 -05:00
|
|
|
self.send(message).await?;
|
|
|
|
let response = self.recv().await?;
|
2018-12-05 18:47:18 -05:00
|
|
|
Ok(response.opcode)
|
|
|
|
}
|
|
|
|
|
2022-02-03 15:56:37 -05:00
|
|
|
async fn send(&mut self, message: Message) -> Result<()> {
|
2018-04-05 20:12:59 -04:00
|
|
|
match message.encode() {
|
2018-04-03 06:03:08 -04:00
|
|
|
Err(why) => error!("{:?}", why),
|
|
|
|
Ok(bytes) => {
|
2022-02-03 15:56:37 -05:00
|
|
|
self.socket().write_all(bytes.as_ref()).await?;
|
2018-04-03 06:03:08 -04:00
|
|
|
}
|
|
|
|
};
|
2018-04-07 07:22:50 -04:00
|
|
|
debug!("-> {:?}", message);
|
2018-04-03 06:03:08 -04:00
|
|
|
Ok(())
|
|
|
|
}
|
2018-03-22 17:54:49 -04:00
|
|
|
|
2022-02-03 15:56:37 -05:00
|
|
|
async fn recv(&mut self) -> Result<Message> {
|
2018-12-05 18:47:18 -05:00
|
|
|
let mut buf = BytesMut::new();
|
|
|
|
buf.resize(1024, 0);
|
2022-02-03 15:56:37 -05:00
|
|
|
let n = self.socket().read(&mut buf).await?;
|
2018-12-05 18:47:18 -05:00
|
|
|
debug!("Received {} bytes", n);
|
|
|
|
|
|
|
|
if n == 0 {
|
|
|
|
return Err(Error::ConnectionClosed);
|
|
|
|
}
|
|
|
|
|
|
|
|
buf = buf.split_to(n);
|
2018-04-05 20:12:59 -04:00
|
|
|
let message = Message::decode(&buf)?;
|
2018-04-07 07:22:50 -04:00
|
|
|
debug!("<- {:?}", message);
|
2018-12-05 18:47:18 -05:00
|
|
|
|
2018-04-05 20:12:59 -04:00
|
|
|
Ok(message)
|
2018-04-03 06:03:08 -04:00
|
|
|
}
|
2018-03-22 17:54:49 -04:00
|
|
|
}
|