Umgebungsvariable EVENT_YEARS für konfigurierbaren Event-Horizont hinzugefügt
Build Test Docker Image / docker-test (pull_request) Successful in 1m30s
Run Tests / test (pull_request) Successful in 4m46s

This commit is contained in:
2026-03-29 22:47:56 +02:00
parent c1514330e3
commit ea598a979b
4 changed files with 33 additions and 4 deletions
+3 -3
View File
@@ -133,7 +133,7 @@ func (d *Daemon) syncBirthdaysToCal(ctx context.Context, httpClient webdav.HTTPC
return err
}
slog.DebugContext(ctx, "queried existing calendar events", "user", user, "count", len(events))
bevs := generateBirthdayEvents(birthdays)
bevs := generateBirthdayEvents(birthdays, d.eventYears)
slog.DebugContext(ctx, "generated birthday events", "user", user, "count", len(bevs))
bevsInSync := make([]int, 0)
driftedEvents := make([]string, 0)
@@ -185,11 +185,11 @@ type birthdayEvent struct {
DateTimeEnd string
}
func generateBirthdayEvents(birthdays []BirthdayContact) []birthdayEvent {
func generateBirthdayEvents(birthdays []BirthdayContact, eventYears int) []birthdayEvent {
cyear := time.Now().Year()
bb := make([]birthdayEvent, 0)
for _, v := range birthdays {
for year := cyear; year <= 10+cyear; year++ {
for year := cyear; year <= eventYears+cyear; year++ {
yearshift := year - v.Date.Year()
prefix := "\U0001F382 " // 🎂
if v.Type == ContactTypeAnniversary {
+27
View File
@@ -8,6 +8,7 @@ import (
"net/http"
"os"
"os/signal"
"strconv"
"strings"
"sync"
"syscall"
@@ -39,6 +40,7 @@ type Daemon struct {
oldCalendarName string
notificationEnabled bool
notificationTrigger string
eventYears int
syncInterval time.Duration
excludeMailboxes map[string]bool
health *healthState
@@ -120,6 +122,11 @@ func run() error {
calendarName = "Birthdays"
}
notificationEnabled := strings.EqualFold(os.Getenv("NOTIFICATION_ENABLED"), "true")
eventYears, err := parseEventYears()
if err != nil {
return err
}
slog.Info("event horizon configured", "years", eventYears)
syncInterval, err := parseSyncInterval()
if err != nil {
return err
@@ -129,6 +136,7 @@ func run() error {
"MAILCOW_BASE", mailcowBase,
"CALENDAR_NAME", calendarName,
"NOTIFICATION_ENABLED", notificationEnabled,
"EVENT_YEARS", eventYears,
"MAILCOW_RESOLVE_HOST", os.Getenv("MAILCOW_RESOLVE_HOST"),
"STATEFILE", os.Getenv("STATEFILE"),
"MAILBOX_EXCLUDE", os.Getenv("MAILBOX_EXCLUDE"),
@@ -166,6 +174,7 @@ func run() error {
calendarName: calendarName,
notificationEnabled: notificationEnabled,
notificationTrigger: notificationTrigger,
eventYears: eventYears,
syncInterval: syncInterval,
excludeMailboxes: excludeMailboxes,
}
@@ -420,6 +429,24 @@ func parseSyncInterval() (time.Duration, error) {
return d, nil
}
// parseEventYears liest EVENT_YEARS aus der Umgebung und gibt die Anzahl
// der Jahre zurück, für die Geburtstags-Events im Voraus erzeugt werden.
// Standard: 10. Gültige Werte: 130.
func parseEventYears() (int, error) {
raw := os.Getenv("EVENT_YEARS")
if raw == "" {
return 10, nil
}
n, err := strconv.Atoi(raw)
if err != nil {
return 0, fmt.Errorf("invalid EVENT_YEARS %q: %w", raw, err)
}
if n < 1 || n > 30 {
return 0, fmt.Errorf("EVENT_YEARS must be between 1 and 30, got %d", n)
}
return n, nil
}
// buildTransport erstellt einen http.Transport.
// Wenn MAILCOW_RESOLVE_HOST gesetzt ist (z. B. "nginx-mailcow"), wird der
// tatsächliche TCP-Connect auf diesen Host umgeleitet, während TLS-SNI und