package ical import ( "htwkalender/model" "htwkalender/service/functions" "htwkalender/service/names" "time" "github.com/jordic/goics" ) // IcalModel local type for EmitICal function type IcalModel struct { Events model.Events Mapping map[string]model.FeedCollection } // EmitICal implements the interface for goics func (icalModel IcalModel) EmitICal() goics.Componenter { europeTime, _ := time.LoadLocation("Europe/Berlin") c := goics.NewComponent() c.SetType("VCALENDAR") c.AddProperty("VERSION", "2.0") c.AddProperty("CALSCAL", "GREGORIAN") c.AddProperty("TZID", "Europe/Berlin") c.AddProperty("X-WR-CALNAME", "HTWK Kalender") c.AddProperty("X-WR-TIMEZONE", "Europe/Berlin") c.AddProperty("X-LIC-LOCATION", "Europe/Berlin") for _, event := range icalModel.Events { mapEntry, mappingFound := icalModel.Mapping[event.UUID] s := goics.NewComponent() s.SetType("VEVENT") k, v := goics.FormatDateTime("DTEND;TZID=Europe/Berlin", event.End.Time().Local().In(europeTime)) s.AddProperty(k, v) k, v = goics.FormatDateTime("DTSTART;TZID=Europe/Berlin", event.Start.Time().Local().In(europeTime)) s.AddProperty(k, v) if mappingFound { s.AddProperty("SUMMARY", replaceNameIfUserDefined(&event, mapEntry)) addAlarmIfSpecified(s, event, mapEntry) } else { s.AddProperty("SUMMARY", event.Name) } s.AddProperty("DESCRIPTION", generateDescription(event)) s.AddProperty("LOCATION", event.Rooms) c.AddComponent(s) } return c } func addAlarmIfSpecified(s *goics.Component, event model.Event, mapping model.FeedCollection) { if mapping.Reminder { a := goics.NewComponent() a.SetType("VALARM") a.AddProperty("TRIGGER", "-PT15M") a.AddProperty("ACTION", "DISPLAY") a.AddProperty("DESCRIPTION", "Next course: "+replaceNameIfUserDefined(&event, mapping)+" in "+event.Rooms) s.AddComponent(a) } } func replaceNameIfUserDefined(event *model.Event, mapping model.FeedCollection) string { if !functions.OnlyWhitespace(mapping.UserDefinedName) { return names.ReplaceTemplateSubStrings(mapping.UserDefinedName, *event) } return event.Name } func generateDescription(event model.Event) string { var description string if !functions.OnlyWhitespace(event.Notes) { description += "Notizen: " + event.Notes + "\n" } if !functions.OnlyWhitespace(event.Prof) { description += "Prof: " + event.Prof + "\n" } if !functions.OnlyWhitespace(event.Course) { description += "Gruppe: " + event.Course + "\n" } if !functions.OnlyWhitespace(event.EventType) { description += "Typ: " + event.EventType + event.Compulsory + "\n" } return description }