@@ -15,6 +15,7 @@ use buttplug_server_device_config::UserDeviceIdentifier;
1515use buttplug_server:: {
1616 message:: { ButtplugClientMessageVariant , ButtplugServerMessageVariant } , ButtplugServer , ButtplugServerBuilder
1717} ;
18+ use dashmap:: DashSet ;
1819use futures:: { future:: Future , pin_mut, select, FutureExt , Stream , StreamExt } ;
1920use getset:: Getters ;
2021use 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