2022-02-03 15:56:37 -05:00
|
|
|
use std::{env, path::PathBuf};
|
|
|
|
|
|
|
|
use tokio::{io::AsyncWriteExt, net::UnixStream};
|
2018-03-22 17:54:49 -04:00
|
|
|
|
|
|
|
use super::base::Connection;
|
2022-02-03 15:56:37 -05:00
|
|
|
use crate::error::Result;
|
2018-03-29 17:40:56 -04:00
|
|
|
|
2022-02-03 09:52:53 -05:00
|
|
|
#[derive(Debug)]
|
2018-03-22 17:54:49 -04:00
|
|
|
pub struct UnixConnection {
|
|
|
|
socket: UnixStream,
|
|
|
|
}
|
|
|
|
|
2022-02-03 15:56:37 -05:00
|
|
|
#[async_trait::async_trait]
|
2018-04-03 06:03:08 -04:00
|
|
|
impl Connection for UnixConnection {
|
|
|
|
type Socket = UnixStream;
|
|
|
|
|
2022-02-03 15:56:37 -05:00
|
|
|
fn socket(&mut self) -> &mut Self::Socket {
|
|
|
|
&mut self.socket
|
2018-04-03 06:03:08 -04:00
|
|
|
}
|
|
|
|
|
2018-03-22 17:54:49 -04:00
|
|
|
fn ipc_path() -> PathBuf {
|
2022-02-03 09:52:53 -05:00
|
|
|
env::var_os("XDG_RUNTIME_DIR")
|
|
|
|
.map(PathBuf::from)
|
|
|
|
.map(|mut p| {
|
|
|
|
// try flatpak dir
|
|
|
|
p.push("app/com.discordapp.Discord");
|
|
|
|
if !p.exists() {
|
|
|
|
p.pop();
|
|
|
|
p.pop();
|
2018-03-22 17:54:49 -04:00
|
|
|
}
|
2022-02-03 09:52:53 -05:00
|
|
|
p
|
|
|
|
})
|
|
|
|
.or_else(|| env::var_os("TMPDIR").map(PathBuf::from))
|
|
|
|
.or_else(|| match env::temp_dir().to_str() {
|
|
|
|
None => None,
|
|
|
|
Some(tmp) => Some(PathBuf::from(tmp)),
|
2018-03-22 17:54:49 -04:00
|
|
|
})
|
2022-02-03 09:52:53 -05:00
|
|
|
.unwrap_or_else(|| PathBuf::from("/tmp"))
|
2018-03-22 17:54:49 -04:00
|
|
|
}
|
|
|
|
|
2022-02-03 15:56:37 -05:00
|
|
|
async fn connect() -> Result<Self> {
|
|
|
|
let connection_name = Self::socket_path(0);
|
|
|
|
let socket = UnixStream::connect(connection_name).await?;
|
|
|
|
Ok(Self { socket })
|
2018-03-22 17:54:49 -04:00
|
|
|
}
|
2018-12-05 18:49:23 -05:00
|
|
|
|
2022-02-03 15:56:37 -05:00
|
|
|
async fn disconnect(mut self) -> Result<()> {
|
|
|
|
self.socket.shutdown().await?;
|
|
|
|
Ok(())
|
2018-12-05 18:49:23 -05:00
|
|
|
}
|
|
|
|
}
|