hanayo/profbackground.go

88 lines
2.1 KiB
Go

package main
import (
"fmt"
"image"
"image/jpeg"
"os"
"regexp"
"strings"
"time"
"github.com/gin-gonic/gin"
"github.com/nfnt/resize"
)
var hexColourRegex = regexp.MustCompile("^#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$")
func profBackground(c *gin.Context) {
ctx := getContext(c)
if ctx.User.ID == 0 {
resp403(c)
return
}
var m message = successMessage{T(c, "Your profile background has been saved.")}
defer func() {
addMessage(c, m)
getSession(c).Save()
c.Redirect(302, "/settings/profbackground")
}()
if ok, _ := CSRF.Validate(ctx.User.ID, c.PostForm("csrf")); !ok {
m = errorMessage{T(c, "Your session has expired. Please try redoing what you were trying to do.")}
return
}
t := c.Param("type")
switch t {
case "0":
db.Exec("DELETE FROM profile_backgrounds WHERE uid = ?", ctx.User.ID)
case "1":
// image
file, _, err := c.Request.FormFile("value")
if err != nil {
m = errorMessage{T(c, "An error occurred.")}
return
}
img, _, err := image.Decode(file)
if err != nil {
m = errorMessage{T(c, "An error occurred.")}
return
}
img = resize.Thumbnail(2496, 1404, img, resize.Bilinear)
f, err := os.Create(fmt.Sprintf("static/profbackgrounds/%d.jpg", ctx.User.ID))
defer f.Close()
if err != nil {
m = errorMessage{T(c, "An error occurred.")}
c.Error(err)
return
}
err = jpeg.Encode(f, img, &jpeg.Options{
Quality: 88,
})
if err != nil {
m = errorMessage{T(c, "We were not able to save your profile background.")}
c.Error(err)
return
}
saveProfileBackground(ctx, 1, fmt.Sprintf("%d.jpg?%d", ctx.User.ID, time.Now().Unix()))
case "2":
// solid colour
col := strings.ToLower(c.PostForm("value"))
// verify it's valid
if !hexColourRegex.MatchString(col) {
m = errorMessage{T(c, "Colour is invalid")}
return
}
saveProfileBackground(ctx, 2, col)
}
}
func saveProfileBackground(ctx context, t int, val string) {
db.Exec(`INSERT INTO profile_backgrounds(uid, time, type, value)
VALUES (?, ?, ?, ?)
ON DUPLICATE KEY UPDATE
time = VALUES(time),
type = VALUES(type),
value = VALUES(value)
`, ctx.User.ID, time.Now().Unix(), t, val)
}