1
0
This repository has been archived on 2026-05-25. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
pancakz-stickerboard/env/Database.go
T

76 lines
2.0 KiB
Go
Raw Normal View History

2026-05-24 19:58:20 -07:00
package env
import (
"context"
"encoding/json"
"errors"
"log"
"os"
"path"
"sync"
"time"
)
type DatabaseRoot struct {
Stickers []DatabaseSticker `json:"stickers"`
}
type DatabaseSticker struct {
Created time.Time `json:"created"` // Sticker Created
UserAddress string `json:"user_address"` // User IP Address (For Manual Bans)
UserName string `json:"user_name"` // User Name
UserURL string `json:"user_url"` // User URL (Optional)
Message string `json:"message"` // Sticker Message
Visible bool `json:"visible"` // Sticker Visible?
OffsetX int `json:"offset_x"` // Placement X
OffsetY int `json:"offset_y"` // Placement Y
ImageScale float64 `json:"image_scale"` // Image Scale
ImageHeight int `json:"image_height"` // Image Height
ImageWidth int `json:"image_width"` // Image Width
ImageType ImageType `json:"image_type"` // Original Image File Type
ImageHash string `json:"image_hash"` // Original Image File Hash
}
var (
Database DatabaseRoot
DatabaseMtx sync.RWMutex
)
func SetupDatabase(stop context.Context, await *sync.WaitGroup) {
t := time.Now()
p := path.Join(DATA_DIRECTORY, "database.json")
// Decode File
b, err := os.ReadFile(p)
if err != nil {
if !errors.Is(err, os.ErrNotExist) {
log.Fatalln("[db] Read Database Error:", err)
}
Database.Stickers = make([]DatabaseSticker, 0)
}
if err == nil {
if err := json.Unmarshal(b, &Database); err != nil {
log.Fatalln("[db] Parse Database Error:", err)
}
}
// Shutdown Logic
await.Add(1)
go func() {
defer await.Done()
<-stop.Done()
// Write Database To Disk
b, err := json.MarshalIndent(&Database, "", " ")
if err != nil {
log.Fatalln("[db] Cannot Marshal Database:", err)
}
if err := os.WriteFile(p, b, FILE_MODE); err != nil {
log.Fatalln("[db] Cannot Write Database:", err)
}
log.Println("[db] Database Saved")
}()
log.Println("[db] Ready in", time.Since(t))
}