package main import ( "fmt" "io/ioutil" "log" "os" "sort" "strings" "github.com/br0xen/user-config" ) const ( AppName = "gocal" AppVersion = 1 ) type AppState struct { Name string Version int ClientSecret []byte cfg *userConfig.Config account *Account } var state *AppState func main() { var err error var op string state = &AppState{Name: AppName, Version: AppVersion} state.cfg, err = userConfig.NewConfig(state.Name) if err != nil { panic(err) } if len(os.Args) > 1 { op = os.Args[1] switch os.Args[1] { case "--reinit": } } else { op = "today" } DoVersionCheck() switch op { case "--reinit": // Reset all config for _, v := range state.cfg.GetKeyList() { fmt.Println("Deleting Key: " + v) state.cfg.DeleteKey(v) } case "today": // Show everything on the calendar for today InitComm() // TODO: Get calendars flagged as default list := state.account.GetCalendarList() var todayEvents []Event if len(list) > 0 { for i := range list { if list[i].Deleted { // Deleted calendar, next please continue } todayEvents = append(todayEvents, list[i].GetTodaysEvents()...) } sort.Sort(ByStartTime(todayEvents)) for _, e := range todayEvents { if e.GetStartTime() == "00:00:00" { fmt.Println("[All Day ] " + e.Summary) } else { fmt.Println("[" + e.GetStartTime() + "] " + e.Summary) } } } else { fmt.Printf("No calendars found.\n") } case "defaults": // Show Defaults InitComm() case "add": // Quick event add to primary calendar quickAddText := strings.Join(os.Args[2:], " ") e, err := state.account.GetDefaultCalendar().QuickAdd(quickAddText) if err != nil { fmt.Println(err.Error()) } else { fmt.Println(e.ToCLIString()) } case "bail": // Just initialize communications and bail InitComm() } //fmt.Println("\n-====-\n") /* t := time.Now().Format(time.RFC3339) events, err := srv.Events.List("primary").ShowDeleted(false). SingleEvents(true).TimeMin(t).MaxResults(10).OrderBy("startTime").Do() if err != nil { log.Fatalf("Unable to retrieve next ten of the user's events. %v", err) } fmt.Println("Upcoming events:") if len(events.Items) > 0 { for _, i := range events.Items { var when string // If the DateTime is an empty string the Event is an all-day Event. // So only Date is available. if i.Start.DateTime != "" { when = i.Start.DateTime } else { when = i.Start.Date } fmt.Printf("%s (%s)\n", i.Summary, when) } } else { fmt.Printf("No upcoming events found.\n") } */ } func InitComm() { var err error sec := state.cfg.GetBytes("ClientSecret") tkn := state.cfg.GetBytes("Token") state.account, err = GetAccount(sec, tkn) if err != nil { log.Fatalf("Unable to get Account: %v", err) } // Save the Raw Token state.cfg.SetBytes("Token", state.account.CC.GetRawToken()) // If the 'defaultCalendars' cfg is set to 'primary', we need to actually but the primary cal id in there var defCal []string defCal, err = state.cfg.GetArray("defaultCalendars") if len(defCal) == 0 || (len(defCal) == 1 && defCal[0] == "primary") { gCal, err := state.account.Service.CalendarList.Get("primary").Do() if err == nil { state.cfg.SetArray("defaultCalendars", []string{gCal.Id}) } } } func DoVersionCheck() { confVer, _ := state.cfg.GetInt("version") for confVer < state.Version { // Update from confVer to state.Version switch confVer { case 0: // Initializing the app fmt.Println("Initializing gocal") for { fmt.Println("Client Secret Filename (Ctrl-C to exit): ") var fn string if _, err := fmt.Scan(&fn); err == nil { var b []byte b, err = ioutil.ReadFile(fn) if len(b) > 0 && err == nil { state.cfg.SetBytes("ClientSecret", b) break } } } state.cfg.SetInt("version", 1) state.cfg.SetArray("defaultCalendars", []string{"primary"}) } state.ClientSecret = state.cfg.GetBytes("ClientSecret") // Refetch the version from the config confVer, _ = state.cfg.GetInt("version") } }