diff --git a/frontend/html/admin/home.html b/frontend/html/admin/home.html
index 42f65f3..b524c7e 100644
--- a/frontend/html/admin/home.html
+++ b/frontend/html/admin/home.html
@@ -13,6 +13,13 @@
{{ define "admin-content" }}
Active Contests
diff --git a/server/admin/home.go b/server/admin/home.go
index 1d91aab..f522c2b 100644
--- a/server/admin/home.go
+++ b/server/admin/home.go
@@ -1,8 +1,10 @@
package admin
import (
+ "log"
"net/http"
+ "git.nkagami.me/natsukagami/kjudge/db"
"git.nkagami.me/natsukagami/kjudge/models"
"github.com/labstack/echo/v4"
)
@@ -11,17 +13,37 @@ import (
type HomeCtx struct {
Contests []*models.Contest
Queue *models.QueueOverview
+
+ NewVersionMessage string
}
-// Home renders the home page.
-func (g *Group) Home(c echo.Context) error {
- contests, err := models.GetContestsUnfinished(g.db)
+func getHomeCtx(db db.DBContext, c echo.Context) (*HomeCtx, error) {
+ contests, err := models.GetContestsUnfinished(db)
if err != nil {
- return err
+ return nil, err
+ }
+ queue, err := models.GetQueueOverview(db)
+ if err != nil {
+ return nil, err
+ }
+ message, err := NewVersionMessageGet()
+ if err != nil {
+ log.Printf("Falied to get kjudge's release version: %+v", err)
+ message = ""
}
- queue, err := models.GetQueueOverview(g.db)
+ return &HomeCtx{Contests: contests, Queue: queue, NewVersionMessage: message}, nil
+}
+
+// Render renders the context.
+func (h *HomeCtx) Render(c echo.Context) error {
+ return c.Render(http.StatusOK, "admin/home", h)
+}
+
+// Home renders the home page.
+func (g *Group) Home(c echo.Context) error {
+ ctx, err := getHomeCtx(g.db, c)
if err != nil {
return err
}
- return c.Render(http.StatusOK, "admin/home", &HomeCtx{Contests: contests, Queue: queue})
+ return ctx.Render(c)
}
diff --git a/server/admin/message_dev.go b/server/admin/message_dev.go
new file mode 100644
index 0000000..cd5deb6
--- /dev/null
+++ b/server/admin/message_dev.go
@@ -0,0 +1,8 @@
+// +build !production
+
+package admin
+
+// NewVersionMessageGet checks if there is a new version of kjudge
+func NewVersionMessageGet() (string, error) {
+ return "", nil
+}
diff --git a/server/admin/message_prod.go b/server/admin/message_prod.go
new file mode 100644
index 0000000..d0db779
--- /dev/null
+++ b/server/admin/message_prod.go
@@ -0,0 +1,50 @@
+// +build production
+
+package admin
+
+import (
+ "encoding/json"
+ "fmt"
+ "net/http"
+ "time"
+
+ "git.nkagami.me/natsukagami/kjudge"
+ "github.com/pkg/errors"
+)
+
+type jsonRelease struct {
+ TagName string `json:"tag_name"`
+}
+
+type version struct {
+ TagName string
+ LastUpdate time.Time
+}
+
+var currentVersion version
+
+// NewVersionMessageGet checks if there is a new version of kjudge
+func NewVersionMessageGet() (string, error) {
+ if currentVersion.TagName == "" || time.Now().After(currentVersion.LastUpdate.Add(time.Hour)) {
+ response, err := http.Get("https://git.nkagami.me/api/v1/repos/natsukagami/kjudge/releases?page=1&per_page=1")
+ if err != nil {
+ return "", errors.WithStack(err)
+ }
+ defer response.Body.Close()
+ var x []jsonRelease
+ decode := json.NewDecoder(response.Body)
+ if err := decode.Decode(&x); err != nil {
+ return "", errors.WithStack(err)
+ }
+ if len(x) == 0 {
+ return "", errors.New("Found no relase")
+ }
+ currentVersion.TagName = x[0].TagName[1:]
+ currentVersion.LastUpdate = time.Now()
+ }
+ if kjudge.Version != currentVersion.TagName {
+ return fmt.Sprintf("Please update kjudge to the newest version (%s)", currentVersion.TagName), nil
+ } else {
+ return "", nil
+ }
+}