package lib import ( "log" "os" "strings" "time" ) func getConfig() Config { return Config{ WikiBaseURL: os.Getenv("WIKI_BASE_URL"), WikiToken: os.Getenv("WIKI_TOKEN"), WikiContentLimit: envToInteger("WIKI_CONTENT_LIMIT", 10), RedmineBaseURL: os.Getenv("REDMINE_BASE_URL"), RedmineKey: os.Getenv("REDMINE_KEY"), RedmineContentLimit: envToInteger("REDMINE_CONTENT_LIMIT", 10), GiteaToken: os.Getenv("GITEA_TOKEN"), GiteaBaseURL: os.Getenv("GITEA_BASE_URL"), GiteaRepos: strings.Split(os.Getenv("GITEA_REPOS"), ","), GiteaContentLimit: envToInteger("GITEA_CONTENT_LIMIT", 10), DiscordWebhook: os.Getenv("DISCORD_WEBHOOK"), DiscordFake: os.Getenv("DISCORD_FAKE") == "true", Interval: time.Duration(envToInteger("INTERVAL_MINUTES", 5)) * time.Minute, } } func getFetchers(config *Config, cache *Cache) []Fetcher { return []Fetcher{ &GiteaFetcher{ BaseFetcher: BaseFetcher{ BaseURL: config.GiteaBaseURL, Token: config.GiteaToken, Cache: cache, ContentLimit: config.GiteaContentLimit, }, Repos: config.GiteaRepos, }, &WikiFetcher{ BaseFetcher: BaseFetcher{ BaseURL: config.WikiBaseURL, Token: config.WikiToken, Cache: cache, ContentLimit: config.WikiContentLimit, }, }, &RedmineFetcher{ BaseFetcher: BaseFetcher{ BaseURL: config.RedmineBaseURL, Token: config.RedmineKey, Cache: cache, ContentLimit: config.RedmineContentLimit, }, }, } } func getCache() Cache { cache := *NewCache() cache.Load() return cache } func getMessages(fetchers []Fetcher) []Message { messages := []Message{} for _, fetcher := range fetchers { fetchedMessages := fetcher.Fetch() for _, message := range fetchedMessages { messages = append(messages, message) } } return messages } func sendMessageToDiscord(sender DiscordSender, message Message) { log.Printf("[SCHEDULED] [SEND] (%s) %s\n", message.Channel, message.ToDiscord()) if sender.Fake { return } sender.Send(message.ToDiscord()) } func Runner() { loadEnv() config := getConfig() cache := getCache() fetchers := getFetchers(&config, &cache) default_discord_sender := NewDiscordSender(config.DiscordWebhook, config.DiscordFake) wiki_discord_sender := NewDiscordSender(config.WikiDiscordWebhook, config.DiscordFake) redmine_discord_sender := NewDiscordSender(config.RedmineDiscordWebhook, config.DiscordFake) gita_discord_sender := NewDiscordSender(config.GiteaDiscordWebhook, config.DiscordFake) for { log.Println("[SCHEDULED] Run updater...") messages := getMessages(fetchers) for _, message := range messages { switch message.Channel { case "wiki": sendMessageToDiscord(wiki_discord_sender, message) case "redmine": sendMessageToDiscord(redmine_discord_sender, message) case "gitea": sendMessageToDiscord(gita_discord_sender, message) default: sendMessageToDiscord(default_discord_sender, message) } } cache.Save() time.Sleep(config.Interval) } }