aboutsummaryrefslogtreecommitdiff
path: root/cmd
diff options
context:
space:
mode:
authorXe Iaso <me@xeiaso.net>2023-08-13 10:25:53 -0400
committerXe Iaso <me@xeiaso.net>2023-08-13 10:25:53 -0400
commit07cd5a82210a34ed71ca40057d4bf68cd2d70459 (patch)
tree6f4de93386040264d7acf4daff28a2d19fc655d2 /cmd
parentf940520e74d2ac589f231d3386346534035effd3 (diff)
downloadx-07cd5a82210a34ed71ca40057d4bf68cd2d70459.tar.xz
x-07cd5a82210a34ed71ca40057d4bf68cd2d70459.zip
cmd/sanguisuga: fix lock hang
Signed-off-by: Xe Iaso <me@xeiaso.net>
Diffstat (limited to 'cmd')
-rw-r--r--cmd/sanguisuga/main.go5
-rw-r--r--cmd/x/main.go22
-rw-r--r--cmd/x/sanguisuga.go60
3 files changed, 85 insertions, 2 deletions
diff --git a/cmd/sanguisuga/main.go b/cmd/sanguisuga/main.go
index 1f6a630..88d0906 100644
--- a/cmd/sanguisuga/main.go
+++ b/cmd/sanguisuga/main.go
@@ -290,9 +290,10 @@ func (s *Sanguisuga) HandleIRCMessage(ev *irc.Event) {
stateKey := fmt.Sprintf("%s %s", ti.Title, id)
+ s.dbLock.Lock()
+ defer s.dbLock.Unlock()
+
for _, show := range s.Config.Shows {
- s.dbLock.Lock()
- defer s.dbLock.Unlock()
if s.db.Data == nil {
s.db.Data = &State{
Seen: map[string]TorrentAnnouncement{},
diff --git a/cmd/x/main.go b/cmd/x/main.go
new file mode 100644
index 0000000..706cd9c
--- /dev/null
+++ b/cmd/x/main.go
@@ -0,0 +1,22 @@
+package main
+
+import (
+ "context"
+ "os"
+
+ "github.com/google/subcommands"
+ "within.website/x/internal"
+)
+
+func main() {
+ subcommands.Register(subcommands.HelpCommand(), "")
+ subcommands.Register(subcommands.FlagsCommand(), "")
+ subcommands.Register(subcommands.CommandsCommand(), "")
+
+ subcommands.Register(&sanguisugaAnimeList{}, "sanguisuga")
+
+ internal.HandleStartup()
+ ctx := context.Background()
+
+ os.Exit(int(subcommands.Execute(ctx)))
+}
diff --git a/cmd/x/sanguisuga.go b/cmd/x/sanguisuga.go
new file mode 100644
index 0000000..667412c
--- /dev/null
+++ b/cmd/x/sanguisuga.go
@@ -0,0 +1,60 @@
+package main
+
+import (
+ "context"
+ "encoding/json"
+ "flag"
+ "fmt"
+ "log"
+ "net/http"
+
+ "github.com/google/subcommands"
+ "github.com/rodaine/table"
+)
+
+var (
+ sanguisugaURL = flag.String("url", "http://sanguisuga", "Base sanguisuga URL")
+)
+
+type Show struct {
+ Title string `json:"title"`
+ DiskPath string `json:"diskPath"`
+ Quality string `json:"quality"`
+}
+
+type sanguisugaAnimeList struct {
+ URL string
+}
+
+func (*sanguisugaAnimeList) Name() string { return "anime-list" }
+func (*sanguisugaAnimeList) Synopsis() string { return "Print list of anime tracked by sanguisuga." }
+func (*sanguisugaAnimeList) Usage() string {
+ return `anime-list [--url]:
+ Print list of anime tracked by sanguisuga.`
+}
+
+func (sal *sanguisugaAnimeList) SetFlags(f *flag.FlagSet) {}
+
+func (sal *sanguisugaAnimeList) Execute(ctx context.Context, f *flag.FlagSet, _ ...interface{}) subcommands.ExitStatus {
+ resp, err := http.Get(fmt.Sprintf("%s/api/anime/list", *sanguisugaURL))
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ var shows []Show
+
+ defer resp.Body.Close()
+ if err := json.NewDecoder(resp.Body).Decode(&shows); err != nil {
+ log.Fatal(err)
+ }
+
+ tbl := table.New("Name", "Disk Path", "Quality")
+
+ for _, show := range shows {
+ tbl.AddRow(show.Title, show.DiskPath, show.Quality)
+ }
+
+ tbl.Print()
+
+ return subcommands.ExitSuccess
+}