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 []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 { 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) s.AddProperty("SUMMARY", replaceNameIfUserDefined(&event, icalModel.Mapping)) s.AddProperty("DESCRIPTION", generateDescription(event)) s.AddProperty("LOCATION", event.Rooms) c.AddComponent(s) } return c } func replaceNameIfUserDefined(event *model.Event, mapping []model.FeedCollection) string { for _, mapEntry := range mapping { if mapEntry.Name == event.Name && !functions.OnlyWhitespace(mapEntry.UserDefinedName) { return names.ReplaceTemplateSubStrings(mapEntry.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 }