package main import ( "fmt" "net" "os" "strconv" "strings" e "git.kjao.me/kjao/anitoru/err" ) type SubscriptionManager struct { Subscriptions []string } func NewSubscriptionManager() *SubscriptionManager { var m SubscriptionManager m.Get() return &m } func (m *SubscriptionManager) UpdateSubs(conn net.Conn) { rawData, err := ReadData(conn) e.ExitIf(err, "Unable to read from socket.") m.Subscriptions = strings.Split(string(rawData), "\n") if m.Subscriptions[0] == "" { m.Subscriptions = []string{} } } func (m *SubscriptionManager) Get() { conn, err := net.Dial("unix", SocketPath) e.ExitIf(err, "Unable to open socket. Is the daemon running?") err = SendData(conn, []byte{'V'}) e.ExitIf(err, "Unable to write to socket.") m.UpdateSubs(conn) } func (m *SubscriptionManager) View() { fmt.Println() fmt.Println("Current subscriptions:") for i, sub := range m.Subscriptions { fmt.Println(fmt.Sprintf("\t[%02d] %v", i+1, sub)) } if len(m.Subscriptions) == 0 { fmt.Println("\t...Empty\n") return } fmt.Println() } func (m *SubscriptionManager) Add() { fmt.Println() // Get available subscriptions. fmt.Println("Available subscriptions:") titles, err := GetReleaseSchedule() if err != nil { fmt.Println("Unable to get release schedule.") return } subMap := GetSubMap(&m.Subscriptions) var available []string i := 0 for _, title := range titles { _, exists := subMap[title] if !exists { i++ available = append(available, title) fmt.Println(fmt.Sprintf("\t[%02d] %v", i, title)) } } fmt.Println() // Get comma-separated list of additions. newSubs := []string{} var add string var name string for { fmt.Print("Add subscriptions. (M for manual): ") fmt.Scan(&add) add = strings.ToLower(add) if add == "m" { fmt.Print("Name: ") fmt.Scan(&name) newSubs = append(newSubs, name) } else { addSplit := strings.Split(add, ",") retry := false for _, indexString := range addSplit { index, err := strconv.Atoi(indexString) if err != nil { fmt.Println("Error in indices. Try again.") retry = true break } if index <= 0 || index > len(available) { fmt.Fprintln(os.Stdout, "Error in indices. %v is invalid. Try again", index) retry = true break } newSubs = append(newSubs, available[index-1]) } if retry { continue } } break } // Send addition update to socket data := []byte{'A'} data = append(data, []byte(strings.Join(newSubs, "\n"))...) conn, err := net.Dial("unix", SocketPath) e.ExitIf(err, "Unable to open socket. Is the daemon running?") err = SendData(conn, data) e.ExitIf(err, "Unable to write to socket. Is the daemon running?") m.UpdateSubs(conn) } func (m *SubscriptionManager) Remove() { fmt.Println() m.View() fmt.Println() subMap := GetSubMap(&m.Subscriptions) // Get comma-separated list of removals. var remove string removeSubs := []string{} for { fmt.Print("Remove subscriptions: ") fmt.Scan(&remove) addSplit := strings.Split(remove, ",") skip := false for _, indexString := range addSplit { index, err := strconv.Atoi(indexString) if err != nil { fmt.Println("Error in indices. Try again.") skip = true break } if index <= 0 || index > len(m.Subscriptions) { fmt.Fprintln(os.Stdout, "Error in indices. %v is invalid. Try again", index) skip = true break } removeSubs = append(removeSubs, (m.Subscriptions)[index-1]) delete(subMap, (m.Subscriptions)[index-1]) } if skip { continue } break } // Send removal update to socket data := []byte{'R'} data = append(data, []byte(strings.Join(removeSubs, "\n"))...) conn, err := net.Dial("unix", SocketPath) e.ExitIf(err, "Unable to open socket. Is the daemon running?") err = SendData(conn, data) e.ExitIf(err, "Unable to write to socket. Is the daemon running?") m.UpdateSubs(conn) m.View() } func userCLI() { manager := NewSubscriptionManager() var action string for { fmt.Print("View, Add, Remove subscriptions or Quit: ") fmt.Scan(&action) action = strings.ToLower(action) switch action { case "v": manager.View() break case "a": manager.Add() break case "r": manager.Remove() break case "q": os.Exit(1) default: fmt.Println("Invalid command, try again.") } } }