Skip to content

Commit ef90f8b

Browse files
committed
chore: Make intiface engine device event work with DeviceList
1 parent 7eeac00 commit ef90f8b

File tree

2 files changed

+32
-19
lines changed

2 files changed

+32
-19
lines changed

crates/intiface_engine/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ futures-util = "0.3.31"
6262
url = "2.5.4"
6363
libmdns = "0.9.1"
6464
tokio-stream = "0.1.17"
65+
dashmap = "6.1.0"
6566

6667
[build-dependencies]
6768
vergen-gitcl = {version = "1.0.8", features = ["build"]}

crates/intiface_engine/src/remote_server.rs

Lines changed: 31 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ use buttplug_server_device_config::UserDeviceIdentifier;
1515
use buttplug_server::{
1616
message::{ButtplugClientMessageVariant, ButtplugServerMessageVariant}, ButtplugServer, ButtplugServerBuilder
1717
};
18+
use dashmap::DashSet;
1819
use futures::{future::Future, pin_mut, select, FutureExt, Stream, StreamExt};
1920
use getset::Getters;
2021
use serde::{Deserialize, Serialize};
@@ -59,6 +60,8 @@ async fn run_device_event_stream(
5960
remote_event_sender: broadcast::Sender<ButtplugRemoteServerEvent>,
6061
) {
6162
let server_receiver = server.server_version_event_stream();
63+
let known_indexes = DashSet::<u32>::default();
64+
6265
pin_mut!(server_receiver);
6366
loop {
6467
match server_receiver.next().await {
@@ -67,30 +70,37 @@ async fn run_device_event_stream(
6770
break;
6871
}
6972
Some(msg) => {
70-
if remote_event_sender.receiver_count() > 0 {
71-
match &msg {
72-
ButtplugServerMessageV4::DeviceAdded(da) => {
73-
if let Some(device_info) = server.device_manager().device_info(da.device_index()) {
74-
let added_event = ButtplugRemoteServerEvent::DeviceAdded {
75-
index: da.device_index(),
76-
name: da.device_name().clone(),
77-
identifier: device_info.identifier().clone().into(),
78-
display_name: device_info.display_name().clone(),
79-
};
80-
if remote_event_sender.send(added_event).is_err() {
81-
error!("Cannot send event to owner, dropping and assuming local server thread has exited.");
82-
}
83-
}
73+
if let ButtplugServerMessageV4::DeviceList(dl) = msg && remote_event_sender.receiver_count() > 0 {
74+
for da in dl.devices() {
75+
if known_indexes.contains(&da.device_index()) {
76+
continue;
8477
}
85-
ButtplugServerMessageV4::DeviceRemoved(dr) => {
86-
let removed_event = ButtplugRemoteServerEvent::DeviceRemoved {
87-
index: dr.device_index(),
78+
if let Some(device_info) = server.device_manager().device_info(da.device_index()) {
79+
let added_event = ButtplugRemoteServerEvent::DeviceAdded {
80+
index: da.device_index(),
81+
name: da.device_name().clone(),
82+
identifier: device_info.identifier().clone().into(),
83+
display_name: device_info.display_name().clone(),
8884
};
89-
if remote_event_sender.send(removed_event).is_err() {
85+
if remote_event_sender.send(added_event).is_err() {
9086
error!("Cannot send event to owner, dropping and assuming local server thread has exited.");
9187
}
88+
known_indexes.insert(da.device_index());
89+
}
90+
}
91+
let indexes = known_indexes.clone();
92+
let current_indexes: Vec<u32> = dl.devices().iter().map(|x| x.device_index()).collect();
93+
for dr in indexes {
94+
if current_indexes.contains(&dr) {
95+
continue;
96+
}
97+
let removed_event = ButtplugRemoteServerEvent::DeviceRemoved {
98+
index: dr,
99+
};
100+
if remote_event_sender.send(removed_event).is_err() {
101+
error!("Cannot send event to owner, dropping and assuming local server thread has exited.");
92102
}
93-
_ => {}
103+
known_indexes.remove(&dr);
94104
}
95105
}
96106
}
@@ -164,6 +174,7 @@ async fn run_server<ConnectorType>(
164174
break;
165175
}
166176
Some(msg) => {
177+
/*
167178
if remote_event_sender.receiver_count() > 0 {
168179
match &msg {
169180
ButtplugServerMessageV4::DeviceAdded(da) => {
@@ -183,6 +194,7 @@ async fn run_server<ConnectorType>(
183194
_ => {}
184195
}
185196
}
197+
*/
186198
}
187199
},
188200
client_msg = client_version_receiver.next().fuse() => match client_msg {

0 commit comments

Comments
 (0)