From 0737e10bc849f5bc0c9bfcaad3c49e32c638cfa2 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Fri, 15 Jul 2016 03:08:20 +0200 Subject: wip tracker --- cmd/btcheck/main.go | 14 ++++++++++++++ query/query.go | 12 ++++++++++-- tracker/messages.go | 39 ++++++++++++++++++++++++++++++++++++++- 3 files changed, 62 insertions(+), 3 deletions(-) diff --git a/cmd/btcheck/main.go b/cmd/btcheck/main.go index 8fef04d..7ed1997 100644 --- a/cmd/btcheck/main.go +++ b/cmd/btcheck/main.go @@ -6,6 +6,8 @@ import ( "os" "dim13.org/btget/meta" + "dim13.org/btget/peer" + "dim13.org/btget/tracker" ) func main() { @@ -28,4 +30,16 @@ func main() { } fmt.Println("good pieces:", pieces.Good()) fmt.Println("bit field:", pieces.BitField()) + + id, _ := peer.NewID() + req := tracker.Request{ + InfoHash: tor.InfoHash, + PeerID: []byte(id), + Compact: true, + } + resp, err := req.Get(tor.Announce) + if err != nil { + log.Fatal(err) + } + fmt.Printf("%+v\n", resp) } diff --git a/query/query.go b/query/query.go index 83214b8..b12a8ab 100644 --- a/query/query.go +++ b/query/query.go @@ -22,10 +22,12 @@ func parseTag(tag string) (string, string) { func isZero(v reflect.Value) bool { switch v.Kind() { - case reflect.String: - return v.String() == "" + case reflect.String, reflect.Slice: + return v.Len() == 0 case reflect.Int: return v.Int() == 0 + case reflect.Bool: + return v.Bool() == false } return false } @@ -47,6 +49,12 @@ func marshalQuery(v reflect.Value) (string, error) { continue } switch f.Kind() { + case reflect.Bool: + if f.Bool() == true { + q.Add(name, "1") + } else { + q.Add(name, "0") + } case reflect.Int: q.Add(name, strconv.Itoa(int(f.Int()))) case reflect.String: diff --git a/tracker/messages.go b/tracker/messages.go index 8062eaf..70719dc 100644 --- a/tracker/messages.go +++ b/tracker/messages.go @@ -1,6 +1,14 @@ package tracker -import "net" +import ( + "io/ioutil" + "log" + "net" + "net/http" + + "dim13.org/btget/bencode" + "dim13.org/btget/query" +) type Event string @@ -39,3 +47,32 @@ type Response struct { TrackerId string `bencode:"tracker id"` WarningMessage string `bencode:"warning message"` } + +func (r Request) Get(announce string) (Response, error) { + fail := func(err error) (Response, error) { + return Response{}, err + } + q, err := query.Marshal(r) + if err != nil { + return fail(err) + } + log.Println(announce + q) + resp, err := http.Get(announce + q) + if err != nil { + return fail(err) + } + defer resp.Body.Close() + + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return fail(err) + } + log.Println(string(body)) + + var res Response + err = bencode.Unmarshal(body, &res) + if err != nil { + return fail(err) + } + return res, nil +} -- cgit v1.2.3