예제 #1
0
        public Task HashFile(LocalFile file)
        {
            if (file.LocalPath == null)
            {
                throw new ArgumentNullException(nameof(file));
            }

            if (!System.IO.File.Exists(file.LocalPath))
            {
                throw new ArgumentException("File does not exist");
            }

            if (this.queue.Any(t => ((LocalFile)t.Task.AsyncState).LocalPath == file.LocalPath))
            {
                throw new InvalidOperationException("File is already in queue");
            }

            var tcs = new TaskCompletionSource <bool>(state: file);

            if (this.queue.TryAdd(tcs, 1000, this.cancellation.Token))
            {
                QueueChanged?.Invoke(this, EventArgs.Empty);
            }

            Start();

            return(tcs.Task);
        }
예제 #2
0
        public void Like(string id, User user)
        {
            var index = Queue.FindIndex(x => x.SongId == id);

            if (Queue[index].LikedBy.Contains(user))
            {
                UnlikeIndexed(index, user);
                return;
            }

            Queue[index].LikeCount++;
            Queue[index].LikedBy.Add(user);
            if (index == 0)
            {
                QueueChanged?.Invoke(this, new QueueChangedEventArgs(QueueChangedEventArgs.EventTypes.SongLiked));
                return;
            }

            var item = Queue[index];

            while (index != 0 && item.LikeCount > Queue[index - 1].LikeCount)
            {
                index--;
            }

            Queue.Remove(item);
            Queue.Insert(index, item);
            QueueChanged?.Invoke(this, new QueueChangedEventArgs(QueueChangedEventArgs.EventTypes.SongLiked));
        }
예제 #3
0
        private async Task ProcessQueue()
        {
            Log.Info("Begin Queue processing");

            QueueItem item;

            while (Queue.TryTake(out item, Timeout.Infinite /*, cts.Token*/))
            {
                QueueChanged?.Invoke(this, new TransformQueueEventArgs(Queue.Count));

                Log.Info($"Process item: {item.Key} ... (count: {Queue.Count})");
                var tcs = item.TaskCompletionSource;

                if (tcs.Task.IsCanceled || tcs.Task.IsCompleted || tcs.Task.IsFaulted)
                {
                    Log.Info($"  canceled: {item.Key}");
                    continue;
                }

                try
                {
                    var result = await item.QueueTransformAsync(item.Key, item.Input);

                    tcs.SetResult(result);
                }
                catch (Exception ex)
                {
                    tcs.TrySetException(ex);
                }
            }

            Log.Info("End Queue processing");
        }
        public void Enqueue(QueueItem item)
        {
            QueueItem queueItem = GetOrAdd(item);

            _queue.Enqueue(queueItem.TweetId);
            QueueChanged?.Invoke(this, new ItemsChangedEventArgs(queueItem, null));
        }
예제 #5
0
        public async Task Add(string id, User user)
        {
            if (Contains(id))
            {
                Like(id, user);
                return;
            }

            var track = await _service.Client.Tracks.Get(id);

            var item = new QueueItem {
                Track = track, AddedBy = user, SongId = track.Id
            };

            item.LikedBy.Add(user);
            if (Queue.Count == 0 && CurrentlyPlaying == null)
            {
                CurrentlyPlaying = item;
                QueueChanged?.Invoke(this, new QueueChangedEventArgs(QueueChangedEventArgs.EventTypes.PlayingSongChanged));
            }
            else
            {
                Queue.Add(item);
                QueueChanged?.Invoke(this, new QueueChangedEventArgs(QueueChangedEventArgs.EventTypes.SongAdded));
            }
        }
        public bool Dequeue(out QueueItem item)
        {
            if (_queue.TryDequeue(out long id))
            {
                item = _items[id];

                QueueChanged?.Invoke(this, new ItemsChangedEventArgs(null, item));
                return(true);
            }

            item = null;
            return(false);
        }
예제 #7
0
        private void UnlikeIndexed(int index, User user)
        {
            if (Queue[index].LikeCount <= 1)
            {
                Queue.RemoveAt(index);
                QueueChanged?.Invoke(this, new QueueChangedEventArgs(QueueChangedEventArgs.EventTypes.SongRemoved));
                return;
            }

            Queue[index].LikeCount--;
            Queue[index].LikedBy.Remove(user);
            QueueChanged?.Invoke(this, new QueueChangedEventArgs(QueueChangedEventArgs.EventTypes.SongLiked));
        }
예제 #8
0
        public void Next()
        {
            if (Queue.Count == 0)
            {
                CurrentlyPlaying = null;
            }
            else
            {
                CurrentlyPlaying = Queue[0];
                Queue.RemoveAt(0);
            }

            QueueChanged?.Invoke(this, new QueueChangedEventArgs(QueueChangedEventArgs.EventTypes.PlayingSongChanged));
        }
예제 #9
0
        public Task <TOutput> EnqueueTransform(TKey key, TInput input, QueueTransformAsync transformAsync)
        {
            foreach (var anItem in Queue)
            {
                if (anItem.Key.Equals(key))
                {
                    Log.Info($"Task with key {key} already present");
                    return(anItem.TaskCompletionSource.Task);
                }
            }

            var item = new QueueItem(key, input, transformAsync);

            Queue.Add(item);

            QueueChanged?.Invoke(this, new TransformQueueEventArgs(Queue.Count));

            return(item.TaskCompletionSource.Task);
        }
예제 #10
0
        private void DoHashing()
        {
            try
            {
                TaskCompletionSource <bool> task;
                while (!this.cancellation.IsCancellationRequested && this.queue.TryTake(out task, -1, this.cancellation.Token))
                {
                    threads[Thread.CurrentThread] = task;
                    QueueChanged?.Invoke(this, EventArgs.Empty);

                    if (!task.Task.IsCanceled && !task.Task.IsCompleted)
                    {
                        try
                        {
                            Hash(task);
                        }
                        catch (ThreadAbortException)
                        {
                            this.loggingService.LogInfo("Aborting hashing of file.");
                        }
                        catch (Exception ex)
                        {
                            // XXX: Do something here!
                            this.loggingService.LogError("Problem while hashing file.", ex);
                        }
                    }

                    threads[Thread.CurrentThread] = null;
                }
            }
            catch (ThreadAbortException)
            {
                // Someone called Stop(), that's OK.
            }
            catch (Exception ex)
            {
                // XXX: Do something here, we've aborted
                // everything!
                this.loggingService.LogError("AAHHHH!!!", ex);
                Stop();
            }
        }
예제 #11
0
 /// <summary>Генерация события, уведомляющего об изменении очереди</summary>
 internal static void OnQueueChanged(QueueChangedEventArgs eventArgs)
 {
     QueueChanged?.Invoke(null, eventArgs);
 }
        public async Task RunAsync(CancellationToken stoppingToken)
        {
            var buffer = new ArraySegment <byte>(new byte[2048]);
            await _webSocket.ConnectAsync(new Uri("ws://localhost:50080/connect"), CancellationToken.None);

            while (!stoppingToken.IsCancellationRequested)
            {
                WebSocketReceiveResult received;
                using MemoryStream data = new MemoryStream();

                do
                {
                    received = await _webSocket.ReceiveAsync(buffer, stoppingToken);

                    Console.WriteLine("Received {0} b ({1})", received.Count, received.EndOfMessage);
                    await data.WriteAsync(buffer.Slice(0, received.Count));
                } while (!received.EndOfMessage);

                var type = GetType(data);

                switch (type)
                {
                case NotificationType.UserChanged:
                {
                    var userNotification = UserChangedNotification.Parser.ParseFrom(data);

                    UsersChanged?.Invoke(this, new UserChangedEventArgs(userNotification));
                    break;
                }

                case NotificationType.QueueChanged:
                {
                    var notification = QueueChangedNotification.Parser.ParseFrom(data);

                    QueueChanged?.Invoke(this, new ItemsChangedEventArgs(notification));
                    break;
                }

                case NotificationType.ItemsChanged:
                {
                    var notification = QueueChangedNotification.Parser.ParseFrom(data);

                    ItemsChanged?.Invoke(this, new ItemsChangedEventArgs(notification));
                    break;
                }

                case NotificationType.ItemPlayed:
                {
                    var notification = ItemPlayedNotification.Parser.ParseFrom(data);

                    ItemPlayed?.Invoke(this, new ItemPlayedEventArgs(notification));
                    break;
                }

                default:
                    Console.WriteLine("Unknown Type \"{0}\"", type);
                    break;
                }
            }

            await _webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Bye", CancellationToken.None);

            NotificationType GetType(MemoryStream data)
            {
                try
                {
                    data.Seek(0, SeekOrigin.Begin);
                    var item = NotificationItem.Parser.ParseFrom(data);
                    Console.WriteLine("Parsed `NotificationItem`: {0}", item != null);

                    data.Seek(0, SeekOrigin.Begin);

                    return(item.Type);
                }
                catch (Exception e)
                {
                    return(NotificationType.None);
                }
            }
        }
예제 #13
0
 private void OnQueueChanged()
 {
     QueueChanged?.Invoke(this, QueueCount);
 }
예제 #14
0
 private void FireQueueChangedEvent()
 {
     QueueChanged?.Invoke(this);
 }
예제 #15
0
 private void Synthesizer_QueueChanged(object sender, int e)
 {
     QueueChanged?.Invoke(sender, e);
 }
예제 #16
0
 protected virtual void OnQueueChanged(object source)
 {
     QueueChanged?.Invoke(source);
 }
 protected void FireQueueChanged()
 {
     QueueChanged?.Invoke(this);
 }