コード例 #1
0
        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);
        }