public AnnounceRequest CreateAnnounce(TorrentEvent clientEvent) { ClientEngine engine = Manager.Engine !; bool requireEncryption = !engine.Settings.AllowedEncryption.Contains(EncryptionType.PlainText); bool supportsEncryption = EncryptionTypes.SupportsRC4(engine.Settings.AllowedEncryption); requireEncryption = requireEncryption && ClientEngine.SupportsEncryption; supportsEncryption = supportsEncryption && ClientEngine.SupportsEncryption; string?ip = null; int port; if (engine.Settings.ReportedAddress != null) { ip = engine.Settings.ReportedAddress.Address.ToString(); port = engine.Settings.ReportedAddress.Port; } else if (engine.PeerListener.LocalEndPoint != null) { port = engine.PeerListener.LocalEndPoint.Port; } else { port = engine.Settings.ListenEndPoint?.Port ?? -1; } // FIXME: In metadata mode we need to pretend we need to download data otherwise // tracker optimisations might result in no peers being sent back. long bytesLeft = 1000; if (Manager.HasMetadata) { bytesLeft = (long)((1 - Manager.Bitfield.PercentComplete / 100.0) * Manager.Torrent !.Size); } return(new AnnounceRequest(Manager.Monitor.DataBytesReceived, Manager.Monitor.DataBytesSent, bytesLeft, clientEvent, Manager.InfoHashes.V1OrV2.Truncate(), requireEncryption, Manager.Engine !.PeerId.AsMemory(), ip, port, supportsEncryption)); }