Fix #2: ical calendar: take 'cancelled' status into account #4
@ -129,7 +129,22 @@ func (cal *RemoteCalendar) LoadNextMeetingTime(ctx context.Context) (time.Time,
|
||||
var nextStartTime time.Time
|
||||
|
||||
for eventIndex, event := range events {
|
||||
uid := event.GetProperty(ical.ComponentPropertyUniqueId)
|
||||
if uid == nil {
|
||||
log.Warn("calendar: ignoring entry without UID property")
|
||||
continue
|
||||
}
|
||||
|
||||
// Skip cancelled meetings.
|
||||
if isCancelled(event) {
|
||||
continue
|
||||
}
|
||||
|
||||
dtStart := event.GetProperty(ical.ComponentPropertyDtStart)
|
||||
if dtStart == nil {
|
||||
log.Warn("calendar: ignoring entry without DTSTART property", "uid", uid.Value)
|
||||
continue
|
||||
}
|
||||
parsedDtStart, err := time.Parse(icalTimeFormat, dtStart.Value)
|
||||
if err != nil {
|
||||
log.Warn("calendar: could not parse DTSTART property", "value", dtStart.Value, "cause", err)
|
||||
@ -146,17 +161,22 @@ func (cal *RemoteCalendar) LoadNextMeetingTime(ctx context.Context) (time.Time,
|
||||
return nextStartTime, nil
|
||||
}
|
||||
|
||||
func (cal *RemoteCalendar) MeetingsOnMonth(ctx context.Context, timeInMonth time.Time) []time.Time {
|
||||
type MeetingInfo struct {
|
||||
StartTime time.Time
|
||||
IsCancelled bool
|
||||
}
|
||||
|
||||
func (cal *RemoteCalendar) MeetingsOnMonth(ctx context.Context, timeInMonth time.Time) []MeetingInfo {
|
||||
log := GetBotLog(ctx)
|
||||
|
||||
calendar, err := cal.LoadFromDisk(ctx)
|
||||
if err != nil {
|
||||
log.Warn("could not load calendar from disk, pretending there are no meetings", "cause", err)
|
||||
return []time.Time{}
|
||||
return []MeetingInfo{}
|
||||
}
|
||||
|
||||
events := calendar.Events()
|
||||
inMonth := []time.Time{}
|
||||
inMonth := []MeetingInfo{}
|
||||
|
||||
year := timeInMonth.Year()
|
||||
month := timeInMonth.Month()
|
||||
@ -173,7 +193,12 @@ func (cal *RemoteCalendar) MeetingsOnMonth(ctx context.Context, timeInMonth time
|
||||
if parsedDtStart.Year() != year || parsedDtStart.Month() != month {
|
||||
continue
|
||||
}
|
||||
inMonth = append(inMonth, parsedDtStart.In(location))
|
||||
|
||||
meetingInfo := MeetingInfo{
|
||||
StartTime: parsedDtStart.In(location),
|
||||
IsCancelled: isCancelled(event),
|
||||
}
|
||||
inMonth = append(inMonth, meetingInfo)
|
||||
}
|
||||
|
||||
return inMonth
|
||||
@ -294,3 +319,11 @@ func fileExists(path string) bool {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
func isCancelled(event *ical.VEvent) bool {
|
||||
status := event.GetProperty(ical.ComponentPropertyStatus)
|
||||
if status == nil {
|
||||
return false
|
||||
}
|
||||
return status.Value == string(ical.ObjectStatusCancelled)
|
||||
}
|
||||
|
@ -23,9 +23,11 @@ var _ EventConsumer = (*CallAndReponse)(nil)
|
||||
// MeetingTimer provides the next meeting time.
|
||||
type MeetingTimer interface {
|
||||
NextMeetingTime() time.Time
|
||||
MeetingsOnMonth(ctx context.Context, timeInMonth time.Time) []time.Time
|
||||
MeetingsOnMonth(ctx context.Context, timeInMonth time.Time) []MeetingInfo
|
||||
}
|
||||
|
||||
var _ MeetingTimer = (*RemoteCalendar)(nil)
|
||||
|
||||
type CallAndResponseCommand interface {
|
||||
CmdTag() string
|
||||
CmdDescription() string
|
||||
|
@ -51,10 +51,10 @@ func (c *CmdCalendar) Handle(ctx context.Context, car *CallAndReponse, evt *even
|
||||
car.sendReplyInThread(ctx, evt, calendarMD)
|
||||
}
|
||||
|
||||
func MeetingCalendar(ctx context.Context, meetingTimes []time.Time) string {
|
||||
func MeetingCalendar(ctx context.Context, meetings []MeetingInfo) string {
|
||||
log := GetBotLog(ctx)
|
||||
|
||||
dateInMonth := meetingTimes[0]
|
||||
dateInMonth := meetings[0].StartTime
|
||||
firstOfMonth := time.Date(dateInMonth.Year(), dateInMonth.Month(), 1, 0, 0, 0, 0, dateInMonth.Location())
|
||||
lastOfMonth := firstOfMonth.AddDate(0, 1, -1)
|
||||
|
||||
@ -70,10 +70,14 @@ func MeetingCalendar(ctx context.Context, meetingTimes []time.Time) string {
|
||||
meetingCal[weekIndex][weekdayIndex] = fmt.Sprintf("%2d", dayNum)
|
||||
}
|
||||
|
||||
for _, meetingTime := range meetingTimes {
|
||||
weekIndex, weekdayIndex := calendarIndex(meetingTime, firstOfMonth)
|
||||
// dayNum := strings.TrimSpace(meetingCal[weekIndex][weekdayIndex])
|
||||
entry := "<strong><u>" + meetingTime.Format("15:04") + "</u></strong>"
|
||||
for _, meeting := range meetings {
|
||||
weekIndex, weekdayIndex := calendarIndex(meeting.StartTime, firstOfMonth)
|
||||
var entry string
|
||||
if meeting.IsCancelled {
|
||||
entry = "❌"
|
||||
} else {
|
||||
entry = "<strong>" + meeting.StartTime.Format("15:04") + "</strong>"
|
||||
}
|
||||
meetingCal[weekIndex][weekdayIndex] = entry
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user