gal/main.go

181 lines
4.0 KiB
Go
Raw Normal View History

2017-02-02 17:03:02 +00:00
package main
import (
"fmt"
"io/ioutil"
"log"
"os"
2017-02-16 15:59:33 +00:00
"sort"
"strings"
2017-02-02 17:03:02 +00:00
"github.com/br0xen/user-config"
)
const (
AppName = "gocal"
AppVersion = 1
)
type AppState struct {
Name string
Version int
ClientSecret []byte
cfg *userConfig.Config
2017-02-16 15:59:33 +00:00
account *Account
2017-02-02 17:03:02 +00:00
}
var state *AppState
func main() {
var err error
2017-02-16 15:59:33 +00:00
var op string
2017-02-02 17:03:02 +00:00
state = &AppState{Name: AppName, Version: AppVersion}
state.cfg, err = userConfig.NewConfig(state.Name)
if err != nil {
panic(err)
}
2017-02-16 15:59:33 +00:00
if len(os.Args) > 1 {
op = os.Args[1]
switch os.Args[1] {
case "--reinit":
2017-02-02 17:03:02 +00:00
}
2017-02-16 15:59:33 +00:00
} else {
op = "today"
2017-02-02 17:03:02 +00:00
}
DoVersionCheck()
2017-02-16 15:59:33 +00:00
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")
}
2017-02-02 17:03:02 +00:00
2017-02-16 15:59:33 +00:00
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()
}
2017-02-02 17:03:02 +00:00
2017-02-16 15:59:33 +00:00
//fmt.Println("\n-====-\n")
2017-02-02 17:03:02 +00:00
2017-02-16 15:59:33 +00:00
/*
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)
}
2017-02-02 17:03:02 +00:00
2017-02-16 15:59:33 +00:00
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)
2017-02-02 17:03:02 +00:00
}
2017-02-16 15:59:33 +00:00
} else {
fmt.Printf("No upcoming events found.\n")
2017-02-02 17:03:02 +00:00
}
2017-02-16 15:59:33 +00:00
*/
}
2017-02-02 17:03:02 +00:00
2017-02-16 15:59:33 +00:00
func InitComm() {
var err error
sec := state.cfg.GetBytes("ClientSecret")
tkn := state.cfg.GetBytes("Token")
2017-02-02 17:03:02 +00:00
2017-02-16 15:59:33 +00:00
state.account, err = GetAccount(sec, tkn)
2017-02-02 17:03:02 +00:00
if err != nil {
2017-02-16 15:59:33 +00:00
log.Fatalf("Unable to get Account: %v", err)
2017-02-02 17:03:02 +00:00
}
2017-02-16 15:59:33 +00:00
// 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})
2017-02-02 17:03:02 +00:00
}
}
}
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)
2017-02-16 15:59:33 +00:00
state.cfg.SetArray("defaultCalendars", []string{"primary"})
2017-02-02 17:03:02 +00:00
}
state.ClientSecret = state.cfg.GetBytes("ClientSecret")
// Refetch the version from the config
confVer, _ = state.cfg.GetInt("version")
}
}