diff --git a/cmd/eiblog/handler/internal/timer.go b/cmd/eiblog/handler/internal/timer.go index f2e81be..467c8fc 100644 --- a/cmd/eiblog/handler/internal/timer.go +++ b/cmd/eiblog/handler/internal/timer.go @@ -25,79 +25,8 @@ func startTimer() { if err != nil { logrus.Error("startTimer.generateCrossdomain: ", err) } - - ticker := time.NewTicker(time.Hour) - for now := range ticker.C { - // generate feed & sitemap - if now.Hour()%4 == 0 { - err = generateFeed() - if err != nil { - logrus.Error("startTimer.generateFeed: ", err) - } - err = generateSitemap() - if err != nil { - logrus.Error("startTimer.generateSitemap: ", err) - } - } - // clean expired articles - exp := now.Add(-48 * time.Hour) - err := Store.CleanArticles(context.Background(), exp) - if err != nil { - logrus.Error("startTimer.CleanArticles: ", err) - } - // fetch disqus count - if now.Hour()%5 == 0 { - err = DisqusClient.PostsCount(Ei.ArticlesMap) - if err != nil { - logrus.Error("startTimer.PostsCount: ", err) - } - } - } -} - -// generateFeed 定时刷新feed -func generateFeed() error { - tpl := XMLTemplate.Lookup("feedTpl.xml") - if tpl == nil { - return errors.New("not found: feedTpl.xml") - } - - _, _, articles := Ei.PageArticleFE(1, 20) - params := map[string]interface{}{ - "Title": Ei.Blogger.BTitle, - "SubTitle": Ei.Blogger.SubTitle, - "Host": config.Conf.Host, - "FeedrURL": config.Conf.FeedRPC.FeedrURL, - "BuildDate": time.Now().Format(time.RFC1123Z), - "Articles": articles, - } - path := filepath.Join(config.EtcDir, "assets", "feed.xml") - f, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666) - if err != nil { - return err - } - defer f.Close() - return tpl.Execute(f, params) -} - -// generateSitemap 定时刷新sitemap -func generateSitemap() error { - tpl := XMLTemplate.Lookup("sitemapTpl.xml") - if tpl == nil { - return errors.New("not found: sitemapTpl.xml") - } - - params := map[string]interface{}{ - "Articles": Ei.Articles, - "Host": config.Conf.Host, - } - path := filepath.Join(config.EtcDir, "assets", "sitemap.xml") - f, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666) - if err != nil { - return err - } - defer f.Close() - return tpl.Execute(f, params) + // 定时刷新 + refreshFeedAndSitemap() } // generateOpensearch 生成opensearch.xml @@ -158,3 +87,79 @@ func generateCrossdomain() error { defer f.Close() return tpl.Execute(f, params) } + +// refreshFeedAndSitemap 定时刷新feed和sitemap +func refreshFeedAndSitemap() { + defer time.AfterFunc(time.Hour, refreshFeedAndSitemap) + + now := time.Now() + // generate feed & sitemap + if now.Hour()%4 == 0 { + err := generateFeed() + if err != nil { + logrus.Error("startTimer.generateFeed: ", err) + } + err = generateSitemap() + if err != nil { + logrus.Error("startTimer.generateSitemap: ", err) + } + } + // clean expired articles + exp := now.Add(-48 * time.Hour) + err := Store.CleanArticles(context.Background(), exp) + if err != nil { + logrus.Error("startTimer.CleanArticles: ", err) + } + // fetch disqus count + if now.Hour()%5 == 0 { + err = DisqusClient.PostsCount(Ei.ArticlesMap) + if err != nil { + logrus.Error("startTimer.PostsCount: ", err) + } + } +} + +// generateFeed 定时刷新feed +func generateFeed() error { + tpl := XMLTemplate.Lookup("feedTpl.xml") + if tpl == nil { + return errors.New("not found: feedTpl.xml") + } + + _, _, articles := Ei.PageArticleFE(1, 20) + params := map[string]interface{}{ + "Title": Ei.Blogger.BTitle, + "SubTitle": Ei.Blogger.SubTitle, + "Host": config.Conf.Host, + "FeedrURL": config.Conf.FeedRPC.FeedrURL, + "BuildDate": time.Now().Format(time.RFC1123Z), + "Articles": articles, + } + path := filepath.Join(config.EtcDir, "assets", "feed.xml") + f, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666) + if err != nil { + return err + } + defer f.Close() + return tpl.Execute(f, params) +} + +// generateSitemap 定时刷新sitemap +func generateSitemap() error { + tpl := XMLTemplate.Lookup("sitemapTpl.xml") + if tpl == nil { + return errors.New("not found: sitemapTpl.xml") + } + + params := map[string]interface{}{ + "Articles": Ei.Articles, + "Host": config.Conf.Host, + } + path := filepath.Join(config.EtcDir, "assets", "sitemap.xml") + f, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666) + if err != nil { + return err + } + defer f.Close() + return tpl.Execute(f, params) +}