public static bool TryParse(BDictionary message, out FindNodeQuery query) { if (message.Contains("q", new BString("find_node")) && message.TryGetValue("t", out BString transactionId) && transactionId.Length > 0 && message.TryGetValue("a", out BDictionary arguments) && arguments.TryGetValue("id", out BString nodeId) && nodeId.Length == NodeID.Size && arguments.TryGetValue("target", out BString targetId) && targetId.Length == NodeID.Size) { query = new FindNodeQuery(new TransactionID(transactionId), new NodeID(nodeId), new NodeID(targetId)); if (arguments.TryGetValue("want", out BList wantList)) { if (wantList.Contains(new BString("n4"))) { query.Want |= Want.IPv4Nodes; } if (wantList.Contains(new BString("n6"))) { query.Want |= Want.IPv6Nodes; } } return(true); } query = null; return(false); }
public static bool TryParse(BDictionary message, out PingQuery query) { if (message.Contains("q", new BString("ping")) && message.TryGetValue("t", out BString transactionId) && transactionId.Length > 0 && message.TryGetValue("a", out BDictionary arguments) && arguments.TryGetValue("id", out BString nodeId) && nodeId.Length == NodeID.Size) { query = new PingQuery(new TransactionID(transactionId), new NodeID(nodeId)); return(true); } query = null; return(false); }
public static bool TryParse(BDictionary message, out GetPeersQuery query) { if (message.Contains("q", new BString("get_peers")) && message.TryGetValue("t", out BString transactionId) && transactionId.Length > 0 && message.TryGetValue("a", out BDictionary arguments) && arguments.TryGetValue("id", out BString nodeId) && nodeId.Length == NodeID.Size && arguments.TryGetValue("info_hash", out BString infoHash) && infoHash.Length == InfoHash.Size) { query = new GetPeersQuery(new TransactionID(transactionId), new NodeID(nodeId), new InfoHash(infoHash)); if (arguments.TryGetValue("want", out BList wantList)) { if (wantList.Contains(new BString("n4"))) query.Want |= Want.IPv4Nodes; if (wantList.Contains(new BString("n6"))) query.Want |= Want.IPv6Nodes; } return true; } query = null; return false; }
public static bool TryParse(BDictionary message, out AnnouncePeerQuery query) { if (message.Contains("q", new BString("announce_peer")) && message.TryGetValue("t", out BString transactionId) && transactionId.Length > 0 && message.TryGetValue("a", out BDictionary arguments) && arguments.TryGetValue("id", out BString nodeId) && nodeId.Length == NodeID.Size && arguments.TryGetValue("info_hash", out BString infoHash) && infoHash.Length == InfoHash.Size && arguments.TryGetValue("token", out BString token) && token.Length > 0 && arguments.TryGetValue("port", out BInteger port) && port.Value >= 0 && port.Value < 65536) { bool impliedPort = false; if (arguments.TryGetValue("implied_port", out BInteger impliedPortValue)) { impliedPort = impliedPortValue.Value == 1; } query = new AnnouncePeerQuery( new TransactionID(transactionId), new NodeID(nodeId), new InfoHash(infoHash), new PeerToken(token), (int)port.Value, impliedPort); return(true); } query = null; return(false); }