Ejemplo n.º 1
0
        private static void StatusDeleted(long statusId)
        {
            // registered as removed status
            _removes[statusId] = DateTime.Now;
            Task.Run(async() =>
            {
                // find removed statuses
                var removeds = await StatusProxy.RemoveStatusAsync(statusId).ConfigureAwait(false);

                // notify removed ids
                foreach (var removed in removeds)
                {
                    _removes[removed] = DateTime.Now;
                    StatusBroadcaster.Enqueue(new StatusNotification(removed));
                }

                // check cleanup cycle
                var stamp = DateTime.Now;
                if (stamp - _cleanupPeriod > _threshold)
                {
                    // update period stamp
                    _cleanupPeriod = stamp;

                    // remove expireds
                    _removes.Where(t => (stamp - t.Value) > _threshold)
                    .ForEach(t =>
                    {
                        // remove expired
                        DateTime value;
                        _removes.TryRemove(t.Key, out value);
                    });
                }
            });
        }
Ejemplo n.º 2
0
        private static async void StatusPump()
        {
            StatusNotification n;

            while (true)
            {
                _signal.Reset();
                while (_queue.TryDequeue(out n) && !_isHaltRequested)
                {
                    var status = n.Status;
                    if (n.IsAdded && status != null)
                    {
                        if (Setting.UseLightweightMute.Value && MuteBlockManager.IsUnwanted(status))
                        {
                            // muted
                            continue;
                        }
                        // check registered as removed or not
                        var removed = IsRegisteredAsRemoved(status.Id) ||
                                      (status.RetweetedStatus != null &&
                                       IsRegisteredAsRemoved(status.RetweetedStatus.Id));
                        // check status is registered as removed or already received
                        if (removed || !await StatusReceived(status).ConfigureAwait(false))
                        {
                            continue;
                        }
                        StatusBroadcaster.Enqueue(n);
                    }
                    else
                    {
                        StatusDeleted(n.StatusId);
                    }
                    // post next
                    _signal.Reset();
                }
                if (_isHaltRequested)
                {
                    break;
                }
                _signal.Wait();
            }
            _signal.Dispose();
        }