async Task Announce(TorrentEvent clientEvent, ITracker referenceTracker)
        {
            // If the user initiates an Announce we need to go to the correct thread to process it.
            await ClientEngine.MainLoop;

            LastAnnounce.Restart();
            LastUpdated = DateTime.UtcNow;

            var p = RequestFactory.CreateAnnounce(clientEvent);

            foreach (var tuple in GetNextTracker(referenceTracker))
            {
                try {
                    // If we have not announced to this Tracker tier yet then we should replace the ClientEvent.
                    // But if we end up announcing to a different Tracker tier we may want to send the
                    // original/unmodified args.
                    var actualArgs = p;
                    if (!tuple.Item1.SentStartedEvent)
                    {
                        actualArgs = actualArgs.WithClientEvent(TorrentEvent.Started);
                    }

                    var peers = await tuple.Item2.AnnounceAsync(actualArgs);

                    LastAnnounceSucceeded = true;
                    AnnounceComplete?.InvokeAsync(this, new AnnounceResponseEventArgs(tuple.Item2, true, peers.AsReadOnly()));
                    return;
                } catch {
                }
            }

            LastAnnounceSucceeded = false;
            AnnounceComplete?.InvokeAsync(this, new AnnounceResponseEventArgs(null, false));
        }
Beispiel #2
0
        async Task <bool> Announce(TorrentEvent clientEvent, ITracker tracker)
        {
            var trackerTier = Tiers.First(t => t.Trackers.Contains(tracker));

            try {
                // If we have not announced to this Tracker tier yet then we should replace the ClientEvent.
                // But if we end up announcing to a different Tracker tier we may want to send the
                // original/unmodified args.
                AnnounceParameters actualArgs = RequestFactory.CreateAnnounce(clientEvent);
                if (!trackerTier.SentStartedEvent)
                {
                    actualArgs = actualArgs.WithClientEvent(TorrentEvent.Started);
                }

                List <Peer> peers = await tracker.AnnounceAsync(actualArgs);

                trackerTier.LastAnnounceSucceeded = true;

                trackerTier.ActiveTrackerIndex = trackerTier.Trackers.IndexOf(tracker);
                trackerTier.SentStartedEvent  |= actualArgs.ClientEvent == TorrentEvent.Started;
                trackerTier.LastAnnounce       = ValueStopwatch.StartNew();
                AnnounceComplete?.InvokeAsync(this, new AnnounceResponseEventArgs(tracker, true, peers.AsReadOnly()));
                return(true);
            } catch {
            }

            trackerTier.LastAnnounceSucceeded = false;
            AnnounceComplete?.InvokeAsync(this, new AnnounceResponseEventArgs(tracker, false));
            return(false);
        }
Beispiel #3
0
 public void RaiseAnnounceComplete(ITracker tracker, bool successful, IList <Peer> peers)
 => AnnounceComplete?.Invoke(this, new AnnounceResponseEventArgs(tracker, successful, peers));
Beispiel #4
0
 protected virtual void RaiseAnnounceComplete(AnnounceResponseEventArgs e)
 {
     AnnounceComplete?.Invoke(this, e);
 }
Beispiel #5
0
 void RaiseAnnounceComplete(object sender, AnnounceResponseEventArgs args)
 => AnnounceComplete?.InvokeAsync(this, args);