116 lines
2.5 KiB
Go
116 lines
2.5 KiB
Go
package main
|
|
|
|
import (
|
|
"encoding/json"
|
|
"math/rand"
|
|
"os"
|
|
"time"
|
|
|
|
"github.com/aquilax/go-perlin"
|
|
"github.com/charmbracelet/log"
|
|
)
|
|
|
|
const (
|
|
bannersDir = "./banners" // mountable
|
|
fontPath = "./fonts/PixelOperator-Bold.ttf"
|
|
configFile = "./config.json" // mountable
|
|
)
|
|
|
|
var (
|
|
config Config
|
|
perlinNoise perlin.Perlin
|
|
)
|
|
|
|
type Config struct {
|
|
ClearwebURL string `json:"clearweb_url"`
|
|
OnionURL string `json:"onion_url"`
|
|
ColorThemes []string `json:"color_themes"`
|
|
MaxBanners uint `json:"max_banners"`
|
|
BannerWidth int `json:"banner_width"`
|
|
BannerHeight int `json:"banner_height"`
|
|
LogLevel log.Level `json:"log_level"` // -4=DBG, 0=INFO, 4=WARN, 8=ERR, 12=FATAL
|
|
}
|
|
|
|
type BannerInfo struct {
|
|
Filename string
|
|
CreatedAt time.Time
|
|
}
|
|
|
|
func init() {
|
|
config = Config{
|
|
ClearwebURL: "https://example.com",
|
|
OnionURL: "http://example.onion",
|
|
ColorThemes: []string{
|
|
"vibrant",
|
|
"sunset",
|
|
"ocean",
|
|
"neon",
|
|
"cosmic",
|
|
"midnight",
|
|
"fire",
|
|
"pastel",
|
|
"earth",
|
|
"ice",
|
|
"autumn",
|
|
"cyberpunk",
|
|
"retro",
|
|
"monochrome",
|
|
"tropical",
|
|
"volcanic",
|
|
"aurora",
|
|
"desert",
|
|
"matrix",
|
|
},
|
|
MaxBanners: 50,
|
|
BannerWidth: 600,
|
|
BannerHeight: 120,
|
|
LogLevel: log.InfoLevel,
|
|
}
|
|
|
|
if data, err := os.ReadFile(configFile); err == nil {
|
|
if err := json.Unmarshal(data, &config); err != nil {
|
|
log.Fatalf("Error parsing config: %s", err)
|
|
os.Exit(1)
|
|
}
|
|
} else {
|
|
data, _ := json.MarshalIndent(config, "", " ")
|
|
os.WriteFile(configFile, data, 0644)
|
|
log.Info("Created default config - please update your URLs into it")
|
|
os.Exit(0)
|
|
}
|
|
|
|
log.SetLevel(config.LogLevel)
|
|
|
|
if err := os.MkdirAll(bannersDir, 0755); err != nil {
|
|
log.Fatalf("Error creating banner output directory: %s", err)
|
|
os.Exit(1)
|
|
}
|
|
|
|
if err := initFontManager(); err != nil {
|
|
log.Fatalf("Error initializing font manager: %s", err)
|
|
os.Exit(1)
|
|
}
|
|
|
|
// perlin input params: alpha, beta, octaves, seed
|
|
perlinNoise = *perlin.NewPerlin(2.0, 2.0, 3, rand.Int63())
|
|
}
|
|
|
|
func main() {
|
|
// TODO: cli param `--portable <n>` for instant generation of n banners
|
|
|
|
// TODO: ticker setup for banner rotation
|
|
|
|
// NOTE: makes the life a lot easier to draw the bigger element first,
|
|
// then find a place for the smaller one
|
|
textData := []*TextData{
|
|
NewTextData(config.OnionURL, defaultFontSize, true),
|
|
NewTextData(config.ClearwebURL, defaultFontSize+4.0, false),
|
|
}
|
|
|
|
for range 25 {
|
|
if err := genBanner(textData); err != nil {
|
|
log.Errorf("Error generating banner: %s", err)
|
|
}
|
|
}
|
|
}
|