-# A bittorrent client.
+# A command line BitTorrent client.
-[![Join the chat at https://gitter.im/vu3rdd/functorrent](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/vu3rdd/functorrent?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
+I started writing a BitTorrent client because it seemed like fun and I am learning Haskell and wanted to see if I can write something real with Haskell than just heat the room. It is turning out to be a lot of fun.
-[![Build Status](https://travis-ci.org/vu3rdd/functorrent.svg?branch=master)](https://travis-ci.org/vu3rdd/functorrent)
+[![Join the chat at https://gitter.im/vu3rdd/functorrent](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/vu3rdd/functorrent?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
## Building
Functorrent can be build with [Stack](https://github.com/commercialhaskell/stack) or
-[Nix](https://nixos.org/nix/).
+[Nix](https://nixos.org/nix/). I personally test the build with Debian GNU/Linux and
+OS X using FP Complete's stack.
### Stack
If you invoke functorrent without any options, it expects the contents of a torrent file
to be given in stdin. So
-$ cat ubuntu-14.10-desktop-amd64.iso.torrent | functorrent
-[....]
+ $ cat ubuntu-14.10-desktop-amd64.iso.torrent | functorrent
+ [....]
Or one can explicitly specify the torrent file as input.
-$ functorrent ubuntu-14.10-desktop-amd64.iso.torrent
-[...]
+ $ functorrent ubuntu-14.10-desktop-amd64.iso.torrent
+ [...]
## Goals
## Current Status
-- can decode torrent files (bencoding)
-- talk to the tracker and get the peer list
-- the `main' program takes a torrent file (in the local file system) as input and
- prints the {ip,port} for each peer, after talking to the tracker.
-- can handshake with the peer.
-- peer wire protocol (in progress)
+- most of the peer wire protocol works.
+- talks only to one peer at the moment. Single threaded.
+- can download files. But needs every piece to be served by the peer it connected to.
+
+## WARNING
+
+- this client is not usable as your daily BitTorrent client yet. You may get corrupted files and end up wasting a lot of bandwidth. So, until we achieve some robustness, consider this as a programmer-friendly project to learn about a bunch of stuff.
## TODO
* Test suite.
-* Peer protocol (in progress).
-* Get the file download working in the simplest possible way.
+* Talk to multiple peers.
+* Piece download algorithms.
* Concurrency (threads per peer)
-* other advanced features of Bit Torrent (like DHT).
+* Multifile torrent support.
+* other advanced features of BitTorrent (like DHT).