internal Uri GetUri(Uri announceUri, string key, string trackerID) { var parameters = new Dictionary <string, object>(13); parameters.Add("info_hash", infoHash.ToUrlEncodedString()); parameters.Add("peer_id", peerID.ToUrlEncodedString()); parameters.Add("port", port); parameters.Add("uploaded", bytesUploaded); parameters.Add("downloaded", bytesDownloaded); parameters.Add("left", bytesLeft); parameters.Add("compact", "1"); // TODO: Uncomment this line when we actually support crypto //parameters.Add("supportcrypto", "1"); // TODO: Add support for "requirecrypto"? if (trackerEvent != TrackerEvent.None) { parameters.Add("event", trackerEvent.ToString().ToLowerInvariant()); } if (ip != null) { parameters.Add("ip", UriHelper.UrlEncodeText(ip.ToString())); if (ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) { parameters.Add("ipv4", UriHelper.UrlEncodeText(ip.ToString())); } else if (ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetworkV6) { parameters.Add("ipv6", UriHelper.UrlEncodeText(ip.ToString())); } } if (desiredPeerCount > 0) { parameters.Add("numwant", desiredPeerCount); } if (!string.IsNullOrEmpty(key)) { parameters.Add("key", key); } if (!string.IsNullOrEmpty(trackerID)) { parameters.Add("trackerid", trackerID); } return(UriHelper.AppendQueryString(announceUri, parameters)); }