diff --git a/env-example b/env-example index e2ac377..cbb4a08 100644 --- a/env-example +++ b/env-example @@ -15,6 +15,10 @@ GITEA_REPOS=org/repo1,org/repo2 GITEA_CONTENT_LIMIT=10 GITEA_DISCORD_WEBHOOK= +GRAV_BASE_URL= +GRAV_CONTENT_LIMIT=10 +GRAV_DISCORD_WEBHOOK= + DISCORD_WEBHOOK= diff --git a/lib/config.go b/lib/config.go index 6496e87..1b418e1 100644 --- a/lib/config.go +++ b/lib/config.go @@ -23,6 +23,9 @@ type Config struct { GiteaRepos []string GiteaContentLimit int GiteaDiscordWebhook string + GravBaseURL string + GravContentLimit int + GravDiscordWebhook string DiscordWebhook string DiscordFake bool Interval time.Duration diff --git a/lib/fetcher.grav.go b/lib/fetcher.grav.go new file mode 100644 index 0000000..5355b55 --- /dev/null +++ b/lib/fetcher.grav.go @@ -0,0 +1,58 @@ +package lib + +import ( + "fmt" + "net/http" + "strconv" +) + +type GravResponse struct { + Pages []struct { + Route string `json:"route"` + Title string `json:"title"` + Modified int64 `json:"modified"` + } `json:"pages"` +} + +type GravFetcher struct { + BaseFetcher +} + +func (f *GravFetcher) Name() string { + return "Grav" +} + +func (f *GravFetcher) Fetch() []Message { + var messages []Message + + req := FetcherRequest{ + BaseURL: f.BaseURL, + Path: fmt.Sprintf("/api/updates.json?limit=%d", f.ContentLimit), + Method: http.MethodGet, + } + + var response GravResponse + if err := req.Run(&response); err != nil { + return nil + } + + if len(response.Pages) == 0 { + return nil + } + + for _, content := range response.Pages { + message := f.TryCreateMessage( + "grav", + "grav_"+content.Route, + strconv.FormatInt(content.Modified, 10), + fmt.Sprintf("📖 [%s] - %s", f.Name(), content.Title), + fmt.Sprintf("%s%s", f.BaseURL, content.Route), + ) + + if message != nil { + messages = append(messages, *message) + } + } + + return messages +} diff --git a/lib/runner.go b/lib/runner.go index f8c9032..da246a1 100644 --- a/lib/runner.go +++ b/lib/runner.go @@ -22,6 +22,9 @@ func getConfig() Config { GiteaRepos: strings.Split(os.Getenv("GITEA_REPOS"), ","), GiteaContentLimit: envToInteger("GITEA_CONTENT_LIMIT", 10), GiteaDiscordWebhook: os.Getenv("GITEA_DISCORD_WEBHOOK"), + GravBaseURL: os.Getenv("GRAV_BASE_URL"), + GravContentLimit: envToInteger("GRAV_CONTENT_LIMIT", 10), + GravDiscordWebhook: os.Getenv("GRAV_DISCORD_WEBHOOK"), DiscordWebhook: os.Getenv("DISCORD_WEBHOOK"), DiscordFake: os.Getenv("DISCORD_FAKE") == "true", Interval: time.Duration(envToInteger("INTERVAL_MINUTES", 5)) * time.Minute, @@ -55,6 +58,13 @@ func getFetchers(config *Config, cache *Cache) []Fetcher { ContentLimit: config.RedmineContentLimit, }, }, + &GravFetcher{ + BaseFetcher: BaseFetcher{ + BaseURL: config.GravBaseURL, + Cache: cache, + ContentLimit: config.GravContentLimit, + }, + }, } } @@ -93,6 +103,7 @@ func Runner() { wiki_discord_sender := NewDiscordSender(config.WikiDiscordWebhook, config.DiscordFake) redmine_discord_sender := NewDiscordSender(config.RedmineDiscordWebhook, config.DiscordFake) gita_discord_sender := NewDiscordSender(config.GiteaDiscordWebhook, config.DiscordFake) + grav_discord_sender := NewDiscordSender(config.GravDiscordWebhook, config.DiscordFake) for { log.Println("[SCHEDULED] Run updater...") messages := getMessages(fetchers) @@ -104,6 +115,8 @@ func Runner() { sendMessageToDiscord(redmine_discord_sender, message) case "gitea": sendMessageToDiscord(gita_discord_sender, message) + case "grav": + sendMessageToDiscord(grav_discord_sender, message) default: sendMessageToDiscord(default_discord_sender, message) }