diff options
| author | jet2tlf <jet2tlf@gmail.com> | 2024-06-03 18:14:24 +0000 |
|---|---|---|
| committer | jet2tlf <jet2tlf@gmail.com> | 2024-06-03 18:14:24 +0000 |
| commit | 853be358804a6e30e857035ffda81a06df3f6b74 (patch) | |
| tree | eae9b736261ef6887c4070c7bf1e5a441ccb5319 /cmd/mybittorrent/main.go | |
| parent | adf38a1dbd085c19c4c87ad242e0b340f1655fcb (diff) | |
| download | bittorrent-go-853be358804a6e30e857035ffda81a06df3f6b74.tar.gz bittorrent-go-853be358804a6e30e857035ffda81a06df3f6b74.zip | |
codecrafters submit [skip ci]
Diffstat (limited to 'cmd/mybittorrent/main.go')
| -rw-r--r-- | cmd/mybittorrent/main.go | 54 |
1 files changed, 45 insertions, 9 deletions
diff --git a/cmd/mybittorrent/main.go b/cmd/mybittorrent/main.go index f000aa5..80a9b7d 100644 --- a/cmd/mybittorrent/main.go +++ b/cmd/mybittorrent/main.go @@ -4,17 +4,16 @@ import ( "encoding/json" "fmt" "os" + "strconv" "strings" bencode "github.com/jackpal/bencode-go" // Available if you need it! ) -func createClient() *Client { - fn := os.Args[2] +func createClient(fn string) *Client { c := NewClient("00112233445566778899", 6881) - _, err := c.AddTorrentFile(fn) - if err != nil { + if err := c.AddTorrentFile(fn); err != nil { panic(err) } @@ -38,7 +37,7 @@ func main() { case "info": fn := os.Args[2] - c := createClient() + c := createClient(fn) meta := c.Torrents[fn].Meta fmt.Printf("Tracker URL: %s\n", meta.Announce) fmt.Printf("Length: %d\n", meta.Info.Length) @@ -59,7 +58,7 @@ func main() { case "peers": fn := os.Args[2] - c := createClient() + c := createClient(fn) pr, err := c.GetPeers(fn) if err != nil { @@ -72,15 +71,52 @@ func main() { case "handshake": fn := os.Args[2] - c := createClient() + c := createClient(fn) peerAddr := os.Args[3] - hs, err := c.Handshake(fn, peerAddr) + peer, err := c.Handshake(fn, peerAddr) if err != nil { panic(err) } - fmt.Printf("Peer ID: %s\n", hs.PeerIdHex()) + fmt.Printf("Peer ID: %s\n", peer.PeerIdHexString()) + + case "download_piece": + out := os.Args[3] + fn := os.Args[4] + + index, err := strconv.Atoi(os.Args[5]) + if err != nil { + panic(err) + } + + c := createClient(fn) + pr, err := c.GetPeers(fn) + if err != nil { + panic(err) + } + + var peer *Peer + + for _, peerAddr := range pr.Peers { + peer, err = c.Handshake(fn, peerAddr) + if err != nil { + continue + } + } + + if peer == nil { + panic(fmt.Errorf("no peers found for file: %s", out)) + } + + defer peer.Close() + + err = peer.DownloadPiece(out, index) + if err != nil { + panic(err) + } + + fmt.Printf("Piece %d downloaded to %s.", index, out) default: fmt.Println("Unknown command: " + command) |