package main import ( "flag" "fmt" "io/ioutil" "log" "time" "golang.org/x/oauth2/google" "google.golang.org/api/calendar/v3" ) var calName = flag.String("calendar", "", "name of calendar") var days = flag.Int("days", 0, "number of days in the future") var allStudents = []string{ "oliver.park@heliosns.org", } var greenStudents = []string{ "oliver.park@heliosns.org", } var weekDays = []time.Weekday{time.Monday, time.Tuesday, time.Wednesday, time.Thursday, time.Friday} var weekDaysButFriday = []time.Weekday{time.Monday, time.Tuesday, time.Wednesday, time.Thursday} var classes = []Class { Class{ Summary: "Morning Circle", Start: "08:30", End: "09:00", Days: weekDaysButFriday, Zoom: "https://us02web.zoom.us/j/2274643506?pwd=Nm5NUXMwOVJKbEUzNE5VSkZCQzJ2UT09", }, Class{ Summary: "Community Meeting", Start: "08:30", End: "09:00", Days: []time.Weekday{time.Friday}, Zoom: "https://zoom.us/j/96371462107", }, Class{ Summary: "Math (Claudia & Rachel)", Start: "09:00", End: "09:40", Days: weekDays, Zoom: "https://us02web.zoom.us/j/2274643506?pwd=Nm5NUXMwOVJKbEUzNE5VSkZCQzJ2UT09", Students: []string{ "oliver.park@heliosns.org", }, }, Class{ Summary: "Dreambox", Start: "09:40", End: "10:00", Days: weekDays, }, Class{ Summary: "Theme", Start: "10:30", End: "11:30", Days: weekDaysButFriday, Zoom: "https://us02web.zoom.us/j/2274643506?pwd=Nm5NUXMwOVJKbEUzNE5VSkZCQzJ2UT09", }, Class{ Summary: "SEL", Start: "10:30", End: "11:15", Days: []time.Weekday{time.Friday}, Zoom: "https://us02web.zoom.us/j/2274643506?pwd=Nm5NUXMwOVJKbEUzNE5VSkZCQzJ2UT09", }, Class{ Summary: "Literacy (Green)", Start: "11:30", End: "12:00", Days: []time.Weekday{time.Monday, time.Wednesday}, Zoom: "https://us02web.zoom.us/j/2274643506?pwd=Nm5NUXMwOVJKbEUzNE5VSkZCQzJ2UT09", Students: greenStudents, }, Class{ Summary: "PE (Yellow/Green)", Start: "11:30", End: "12:00", Days: []time.Weekday{time.Tuesday}, Zoom: "https://zoom.us/j/97472507748?pwd=cW5vUFhyUjNTS2toWlZGN254U1ZqZz09", Students: greenStudents, }, Class{ Summary: "iLab (Yellow/Green)", Start: "11:30", End: "12:00", Days: []time.Weekday{time.Thursday}, Zoom: "https://us02web.zoom.us/j/86403635026?pwd=S2t1WkN2dnNJZlFkejdEbjRsUmNNUT09", Students: greenStudents, }, Class{ Summary: "Library", Start: "11:30", End: "12:00", Days: []time.Weekday{time.Friday}, Zoom: "https://us02web.zoom.us/my/helioslibrary?pwd=cWd4RjNqNXZXNjRjM2dYQVhYeS9Xdz09", }, Class{ Summary: "Spanish", Start: "12:45", End: "13:30", Days: []time.Weekday{time.Monday, time.Tuesday, time.Wednesday}, Zoom: "https://zoom.us/j/95144364579?pwd=cGdwNTZIOE42Y0syeVcwVEFhZ1JxZz09", Students: []string{ "oliver.park@heliosns.org", }, }, Class{ Summary: "Music & Movement (Blue/Green)", Start: "12:45", End: "13:30", Days: []time.Weekday{time.Friday}, Zoom: "https://zoom.us/j/96449009866?pwd=dlBHYUwxaDRReFhjVmRKZ0Vhdjdkdz09", Students: greenStudents, }, Class{ Summary: "Art (Blue/Green)", Start: "14:00", End: "14:45", Days: []time.Weekday{time.Friday}, Zoom: "https://us02web.zoom.us/j/85434303018?pwd=c3EzQVNCMmk0L0o4bVF4QW85RTZHZz09", Students: greenStudents, }, Class{ Summary: "Closing Circle", Start: "15:00", End: "15:15", Days: []time.Weekday{time.Friday}, Zoom: "https://us02web.zoom.us/j/2274643506?pwd=Nm5NUXMwOVJKbEUzNE5VSkZCQzJ2UT09", }, } type Class struct { Summary string Start string End string Students []string Days []time.Weekday Zoom string } func main() { flag.Parse() b, err := ioutil.ReadFile("credentials.json") if err != nil { log.Fatal(err) } // If modifying these scopes, delete your previously saved token.json. config, err := google.ConfigFromJSON(b, calendar.CalendarScope) if err != nil { log.Fatal(err) } client, err := getClient(config) if err != nil { log.Fatal(err) } srv, err := calendar.New(client) if err != nil { log.Fatal(err) } calendars, err := srv.CalendarList.List().Do() if err != nil { log.Fatal(err) } var myCal *calendar.CalendarListEntry for _, item := range calendars.Items { if item.Summary == *calName { myCal = item break } } if myCal == nil { log.Fatalf("calendar '%s' not found", *calName) } loc, err := time.LoadLocation("US/Pacific") if err != nil { log.Fatal(err) } now := time.Now().In(loc) for i := 0; i < *days; i++ { date := now.Add(time.Duration(i * 24) * time.Hour) dateStr := date.Format("2006-01-02") for _, class := range classes { found := false for _, day := range class.Days { if day == date.Weekday() { found = true break } } if !found { continue } ev := &calendar.Event{ Summary: class.Summary, Start: &calendar.EventDateTime{ DateTime: fmt.Sprintf("%sT%s:00", dateStr, class.Start), TimeZone: "US/Pacific", }, End: &calendar.EventDateTime{ DateTime: fmt.Sprintf("%sT%s:00", dateStr, class.End), TimeZone: "US/Pacific", }, Attendees: []*calendar.EventAttendee{}, } attendees := class.Students if len(attendees) == 0 { attendees = allStudents } for _, student := range attendees { ev.Attendees = append( ev.Attendees, &calendar.EventAttendee{ Email: student, }, ) } if class.Zoom != "" { ev.Description = fmt.Sprintf(`Zoom: %s`, class.Zoom) } _, err := srv.Events.Insert(myCal.Id, ev).Do() if err != nil { log.Fatal(err) } } } /* ev := &calendar.Event{ Summary: "Test event", Start: &calendar.EventDateTime{ DateTime: "2020-09-09T16:00:00", TimeZone: "US/Pacific", }, End: &calendar.EventDateTime{ DateTime: "2020-09-09T17:00:00", TimeZone: "US/Pacific", }, Attendees: []*calendar.EventAttendee{ &calendar.EventAttendee{ Email: "oliver.park@heliosns.org", }, }, } res, err := srv.Events.Insert(myCal.Id, ev).Do() if err != nil { log.Fatal(err) } log.Printf("%#v", res) */ /* t := time.Now().Format(time.RFC3339) events, err := srv.Events.List(myCal.Id).ShowDeleted(false). SingleEvents(true).TimeMin(t).MaxResults(250).OrderBy("startTime").Do() if err != nil { log.Fatal(err) } for _, item := range events.Items { date := item.Start.DateTime if date == "" { date = item.Start.Date } log.Printf("%v (%v)", item.Summary, date) } */ }