Replace dedicated MagpieClient with methods on ClientMessenger

This commit is contained in:
mars 2022-11-17 15:03:12 -07:00
parent d020caa477
commit a809af7c64
4 changed files with 38 additions and 60 deletions

View File

@ -1,44 +0,0 @@
// Copyright (c) 2022 Marceline Cramer
// SPDX-License-Identifier: AGPL-3.0-or-later
use serde::Serialize;
use std::os::unix::net::UnixStream;
use std::path::Path;
use crate::protocol::{ClientMessenger, MagpieServerMsg, PanelId, SendMessage, MAGPIE_SOCK};
/// A client to a Magpie server.
pub struct MagpieClient {
pub messenger: ClientMessenger<UnixStream>,
}
impl MagpieClient {
pub fn new() -> std::io::Result<Self> {
let sock_dir = std::env::var("XDG_RUNTIME_DIR").expect("XDG_RUNTIME_DIR not set");
let sock_dir = Path::new(&sock_dir);
let sock_path = sock_dir.join(MAGPIE_SOCK);
let socket = UnixStream::connect(sock_path)?;
Ok(Self {
messenger: ClientMessenger::new(socket),
})
}
pub fn send(&mut self, msg: &MagpieServerMsg) {
if let Err(err) = self.messenger.send(msg) {
eprintln!("Message send error: {:?}", err);
}
}
pub fn send_json_message<T: Serialize>(&mut self, id: PanelId, msg: &T) {
let msg = serde_json::to_string(msg).unwrap();
eprintln!("Sending message: {}", msg);
let msg = SendMessage {
id,
msg: msg.into_bytes(),
};
self.send(&MagpieServerMsg::SendMessage(msg));
}
}

View File

@ -1,7 +1,6 @@
// Copyright (c) 2022 Marceline Cramer
// SPDX-License-Identifier: AGPL-3.0-or-later
pub mod client;
pub mod protocol;
#[cfg(feature = "service")]

View File

@ -60,6 +60,18 @@ pub enum MagpieClientMsg {
/// A [Messenger] specialized for Magpie clients.
pub type ClientMessenger<T> = Messenger<T, MagpieClientMsg, MagpieServerMsg>;
impl<T: Read + Write> ClientMessenger<T> {
pub fn send_panel_json<O: Serialize>(&mut self, id: PanelId, msg: &O) {
let msg = serde_json::to_string(msg).unwrap();
eprintln!("Sending message: {:?}", msg);
let _ = self.send(&MagpieServerMsg::SendMessage(SendMessage {
id,
msg: msg.into_bytes(),
}));
}
}
/// A [Messenger] specialized for Magpie servers.
pub type ServerMessenger<T> = Messenger<T, MagpieServerMsg, MagpieClientMsg>;

View File

@ -1,12 +1,14 @@
// Copyright (c) 2022 Marceline Cramer
// SPDX-License-Identifier: AGPL-3.0-or-later
use canary_music_player::*;
use canary_magpie::client::MagpieClient;
use canary_magpie::protocol::{CreatePanel, MagpieServerMsg};
use std::{os::unix::net::UnixStream, path::Path};
use canary_magpie::protocol::{ClientMessenger, CreatePanel, MagpieServerMsg, MAGPIE_SOCK};
use canary_music_player::*;
use mpris::PlayerFinder;
pub type MagpieClient<'a> = ClientMessenger<&'a UnixStream>;
pub struct MetadataTracker {
pub album: AlbumInfo,
pub track: TrackInfo,
@ -42,9 +44,9 @@ impl From<&mpris::Metadata> for MetadataTracker {
impl MetadataTracker {
pub fn new(magpie: &mut MagpieClient, metadata: &mpris::Metadata) -> Self {
let new: Self = metadata.into();
magpie.send_json_message(0, &InMsg::AlbumChanged(new.album.clone()));
magpie.send_json_message(0, &InMsg::TrackChanged(new.track.clone()));
magpie.send_json_message(
magpie.send_panel_json(0, &InMsg::AlbumChanged(new.album.clone()));
magpie.send_panel_json(0, &InMsg::TrackChanged(new.track.clone()));
magpie.send_panel_json(
0,
&InMsg::ProgressChanged(ProgressChanged {
position: 0.0,
@ -58,12 +60,12 @@ impl MetadataTracker {
let new: Self = metadata.into();
if self.album != new.album {
messenger.send_json_message(0, &InMsg::AlbumChanged(new.album.clone()));
messenger.send_panel_json(0, &InMsg::AlbumChanged(new.album.clone()));
}
if self.track != new.track {
messenger.send_json_message(0, &InMsg::TrackChanged(new.track.clone()));
messenger.send_json_message(
messenger.send_panel_json(0, &InMsg::TrackChanged(new.track.clone()));
messenger.send_panel_json(
0,
&InMsg::ProgressChanged(ProgressChanged {
position: 0.0,
@ -85,12 +87,21 @@ fn main() {
let player_finder = PlayerFinder::new().expect("Could not connect to D-Bus");
let mut magpie = MagpieClient::new().unwrap();
let sock_dir = std::env::var("XDG_RUNTIME_DIR").expect("XDG_RUNTIME_DIR not set");
let sock_dir = Path::new(&sock_dir);
let sock_path = sock_dir.join(MAGPIE_SOCK);
let socket = UnixStream::connect(sock_path).unwrap();
let mut magpie = MagpieClient::new(&socket);
let protocol = "tebibyte-media.desktop.music-player-controller".to_string();
let script = std::path::PathBuf::from(&module_path);
let msg = CreatePanel { id: 0, protocol, script };
let msg = CreatePanel {
id: 0,
protocol,
script,
};
let msg = MagpieServerMsg::CreatePanel(msg);
magpie.messenger.send(&msg).unwrap();
magpie.send(&msg).unwrap();
let mut first_loop = true;
let mut connected = false;
@ -106,7 +117,7 @@ fn main() {
if connected {
println!("Disconnected from MPRIS");
let msg = InMsg::Disconnected;
magpie.send_json_message(0, &msg);
magpie.send_panel_json(0, &msg);
connected = false;
}
@ -126,7 +137,7 @@ fn main() {
player.bus_name()
);
connected = true;
magpie.send_json_message(0, &InMsg::Connected);
magpie.send_panel_json(0, &InMsg::Connected);
let metadata = player.get_metadata().unwrap();
let mut metadata_tracker = MetadataTracker::new(&mut magpie, &metadata);
@ -180,7 +191,7 @@ fn main() {
};
if let Some(msg) = in_msg {
magpie.send_json_message(0, &msg);
magpie.send_panel_json(0, &msg);
}
}
}