aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2016-07-15 03:08:20 +0200
committerDimitri Sokolyuk <demon@dim13.org>2016-07-15 03:08:20 +0200
commit0737e10bc849f5bc0c9bfcaad3c49e32c638cfa2 (patch)
treeab310cf92dd03395825dddc05d202d30484efd89
parent7727cf2f9d64027e05cbd25466a0af6e25f628e0 (diff)
wip tracker
-rw-r--r--cmd/btcheck/main.go14
-rw-r--r--query/query.go12
-rw-r--r--tracker/messages.go39
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
+}