- Skip release check in dev builds β Added
AppVersion != "0.0"guard to the update check inmain.go. - Add Telegram bot support, configurable like Slack β Created
telegram/telegram.gopackage mirroring the Slack pattern (DB-queue-backed, ticker processor, HTTP POST to Bot API). AddedTelegramtype totypes/config.go, YAML parsing inconfig/config.go, DB migration003.sqlfortelegram_notificationtable,QueueTelegramNotification/ConsumeTelegramNotificationQueueindb/db.go. Wired intotasks/notify.go,tasks/context.go, andmain.go. Added example config inconfig.yaml. - Increase unit test coverage β Added 18 new tests across
utils/string_test.go,utils/time_test.go, and newdb/db_test.go. Coverage: utils 63%, db 65%, crypto 80%. Coverage reports already generated bytest.sh. - Fix typos in function names β Renamed
ParseDuarionFromStringβParseDurationFromStringinutils/time.goandconfig/config.go. RenamedcheckDfferenceβcheckDifferenceintasks/site_changes.go. Fixed"Invalid duation"β"Invalid duration"error message. - Cap
processedHasheswith a bounded set β Replaced[]stringwithmap[string]struct{}for O(1) lookups. Capped at 1000 entries; clears when full. - Fix nil pointer panic on
item.PublishedParsedin RSS β Added nil check before dereferencingitem.PublishedParsedintasks/rss.goisIgnored(). Feeds without a date are no longer skipped as old. - Fix race conditions β Used
TryLock()in task scheduler to skip if already running instead of piling up goroutines. Addedsync.MutexforprocessedHashesinsite_changes.go. Replaced bareboolflags withsync.Onceinrss.goandcountdown.go. - Close HTTP response bodies properly everywhere β Added
defer resp.Body.Close()inversion_check.go,tasks/rss.go,tasks/site_changes.go. Addedresponse.Body.Close()inslack/slack.go. - Replace
log.Panicwithlog.Print+ return in non-fatal paths β Changeddb/db.go(all runtime methods return safe defaults on error, onlyNewDBpanics),utils/http.go,slack/slack.go,tasks/rss.go,tasks/site_changes.go. - Fix SQL bug in RSS cleanup query β Changed
>to<and+to-in date comparison so it deletes old rows not future ones. AddedDB.Exec()method and switched fromDB.Query()toDB.Exec()for the DELETE statement.