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)); }
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); }