private void OnApplicationMessageInterception(MqttApplicationMessageInterceptorContext context) { if (context.ClientId == null) { return; } messageInterceptingTopics.Add(context.ApplicationMessage.Topic); ByteQueue queue = context.ApplicationMessage.Payload; try { switch (context.ApplicationMessage.Topic) { case nameof(AllSongsShuffled): Reload(); queue = new ByteQueue(); queue.Enqueue(AllSongsShuffled); context.ApplicationMessage.Payload = queue; break; case nameof(CurrentSong): CurrentSong = queue.Any() ? (Song?)queue.DequeueSong() : null; break; case nameof(IsAllShuffle): IsAllShuffle = queue.DequeueBool(); break; case nameof(IsOnlySearch): IsOnlySearch = queue.DequeueBool(); break; case nameof(IsSearchShuffle): IsSearchShuffle = queue.DequeueBool(); break; case nameof(MediaSources): MediaSources = queue.Any() ? queue.DequeueStrings() : null; break; case nameof(PlayState): PlayState = queue.DequeuePlayState(); break; case nameof(Position): Position = queue.DequeueTimeSpan(); break; case nameof(SearchKey): SearchKey = queue.Any() ? queue.DequeueString() : null; break; case nameof(Volume): Volume = queue.DequeueFloat(); break; default: context.AcceptPublish = false; break; } } catch (Exception e) { context.AcceptPublish = false; try { MqttApplicationMessage message = new MqttApplicationMessage() { Topic = "Debug", Payload = Encoding.UTF8.GetBytes(Utils.GetTypeMessageAndStack(e)), QualityOfServiceLevel = MqttQualityOfServiceLevel.AtLeastOnce, Retain = true }; server.PublishAsync(message); } catch { } } messageInterceptingTopics.Remove(context.ApplicationMessage.Topic); }