@@ -111,17 +111,16 @@ private static void Clamp(Control control, SharePermsAndLimits? limits)
111111
112112 private async Task < OneOf < Success , ShockerNotFoundOrNoAccess , ShockerPaused , ShockerNoPermission > > ControlInternal ( IReadOnlyList < Control > controls , ControlLogSender sender , IHubClients < IUserHub > hubClients , ControlShockerObj [ ] allowedShockers )
113113 {
114- // Messages grouped by device
115- var messages = new Dictionary < Guid , List < ShockerControlCommand > > ( ) ;
116- var logs = new Dictionary < Guid , List < ControlLog > > ( ) ;
114+ var shockersById = allowedShockers . ToDictionary ( s => s . ShockerId , s => s ) ;
115+
117116 var now = DateTime . UtcNow ;
117+
118+ var messagesByDevice = new Dictionary < Guid , List < ShockerControlCommand > > ( ) ;
119+ var logsByOwner = new Dictionary < Guid , List < ControlLog > > ( ) ;
118120
119- foreach ( var ( control , shocker ) in controls
120- . Select ( c => ( Control : c , Shocker : allowedShockers . FirstOrDefault ( s => s . ShockerId == c . Id ) ) )
121- . GroupBy ( x => ( ShockerId : x . Control . Id , x . Shocker ? . ShockerRfId ) )
122- . Select ( x => x . Last ( ) ) )
121+ foreach ( var control in controls . DistinctBy ( x => x . Id ) )
123122 {
124- if ( shocker is null )
123+ if ( ! shockersById . TryGetValue ( control . Id , out var shocker ) )
125124 return new ShockerNotFoundOrNoAccess ( control . Id ) ;
126125
127126 if ( shocker . Paused )
@@ -132,7 +131,7 @@ private async Task<OneOf<Success, ShockerNotFoundOrNoAccess, ShockerPaused, Shoc
132131
133132 Clamp ( control , shocker . PermsAndLimits ) ;
134133
135- messages . AppendValue ( shocker . DeviceId , new ShockerControlCommand
134+ messagesByDevice . AppendValue ( shocker . DeviceId , new ShockerControlCommand
136135 {
137136 ShockerId = shocker . ShockerId ,
138137 RfId = shocker . ShockerRfId ,
@@ -142,7 +141,7 @@ private async Task<OneOf<Success, ShockerNotFoundOrNoAccess, ShockerPaused, Shoc
142141 Model = shocker . ShockerModel ,
143142 Exclusive = control . Exclusive
144143 } ) ;
145- logs . AppendValue ( shocker . OwnerId , new ControlLog
144+ logsByOwner . AppendValue ( shocker . OwnerId , new ControlLog
146145 {
147146 Shocker = new BasicShockerInfo
148147 {
@@ -173,8 +172,8 @@ private async Task<OneOf<Success, ShockerNotFoundOrNoAccess, ShockerPaused, Shoc
173172
174173 // Then send all network events
175174 await Task . WhenAll ( [
176- ..messages . Select ( kvp => _publisher . SendDeviceControl ( kvp . Key , kvp . Value ) ) ,
177- ..logs . Select ( x => hubClients . User ( x . Key . ToString ( ) ) . Log ( sender , x . Value ) )
175+ ..messagesByDevice . Select ( kvp => _publisher . SendDeviceControl ( kvp . Key , kvp . Value ) ) ,
176+ ..logsByOwner . Select ( x => hubClients . User ( x . Key . ToString ( ) ) . Log ( sender , x . Value ) )
178177 ] ) ;
179178
180179 return new Success ( ) ;
0 commit comments