From bf5a22f345de2ab8d738b834ddae55cdd77c521c Mon Sep 17 00:00:00 2001
From: Matt Joiner <anacrolix@gmail.com>
Date: Mon, 5 Dec 2022 12:50:40 +1100
Subject: [PATCH] Add announce --event flag

---
 cmd/torrent/announce.go      |  3 +++
 tracker/udp/addr-family.go   |  1 +
 tracker/udp/announce.go      | 15 ++++++++++++++-
 tracker/udp/server/server.go |  1 +
 4 files changed, 19 insertions(+), 1 deletion(-)
 create mode 100644 tracker/udp/addr-family.go
 create mode 100644 tracker/udp/server/server.go

diff --git a/cmd/torrent/announce.go b/cmd/torrent/announce.go
index b40120f1..94500d96 100644
--- a/cmd/torrent/announce.go
+++ b/cmd/torrent/announce.go
@@ -7,9 +7,11 @@ import (
 
 	"github.com/anacrolix/torrent"
 	"github.com/anacrolix/torrent/tracker"
+	"github.com/anacrolix/torrent/tracker/udp"
 )
 
 type AnnounceCmd struct {
+	Event    udp.AnnounceEvent
 	Tracker  string           `arg:"positional"`
 	InfoHash torrent.InfoHash `arg:"positional"`
 }
@@ -21,6 +23,7 @@ func announceErr(flags AnnounceCmd) error {
 			InfoHash: flags.InfoHash,
 			Port:     uint16(torrent.NewDefaultClientConfig().ListenPort),
 			NumWant:  -1,
+			Event:    flags.Event,
 		},
 	}.Do()
 	if err != nil {
diff --git a/tracker/udp/addr-family.go b/tracker/udp/addr-family.go
new file mode 100644
index 00000000..0213f41f
--- /dev/null
+++ b/tracker/udp/addr-family.go
@@ -0,0 +1 @@
+package udp
diff --git a/tracker/udp/announce.go b/tracker/udp/announce.go
index 1573c275..59b6c6cf 100644
--- a/tracker/udp/announce.go
+++ b/tracker/udp/announce.go
@@ -2,6 +2,7 @@ package udp
 
 import (
 	"encoding"
+	"fmt"
 
 	"github.com/anacrolix/dht/v2/krpc"
 )
@@ -24,9 +25,21 @@ type AnnounceRequest struct {
 
 type AnnounceEvent int32
 
+func (me *AnnounceEvent) UnmarshalText(text []byte) error {
+	for key, str := range announceEventStrings {
+		if string(text) == str {
+			*me = AnnounceEvent(key)
+			return nil
+		}
+	}
+	return fmt.Errorf("unknown event")
+}
+
+var announceEventStrings = []string{"", "completed", "started", "stopped"}
+
 func (e AnnounceEvent) String() string {
 	// See BEP 3, "event", and https://github.com/anacrolix/torrent/issues/416#issuecomment-751427001.
-	return []string{"", "completed", "started", "stopped"}[e]
+	return announceEventStrings[e]
 }
 
 type AnnounceResponsePeers interface {
diff --git a/tracker/udp/server/server.go b/tracker/udp/server/server.go
new file mode 100644
index 00000000..abb4e431
--- /dev/null
+++ b/tracker/udp/server/server.go
@@ -0,0 +1 @@
+package server
-- 
2.51.0