use std::{env, path::PathBuf}; use tokio::{io::AsyncWriteExt, net::UnixStream}; use super::base::Connection; use crate::error::Result; #[derive(Debug)] pub struct UnixConnection { socket: UnixStream, } #[async_trait::async_trait] impl Connection for UnixConnection { type Socket = UnixStream; fn socket(&mut self) -> &mut Self::Socket { &mut self.socket } fn ipc_path() -> PathBuf { 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(); } 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)), }) .unwrap_or_else(|| PathBuf::from("/tmp")) } async fn connect() -> Result { let connection_name = Self::socket_path(0); let socket = UnixStream::connect(connection_name).await?; Ok(Self { socket }) } async fn disconnect(mut self) -> Result<()> { self.socket.shutdown().await?; Ok(()) } }