KickerBot/captchagen/captchagen.go

98 lines
1.9 KiB
Go

package captchagen
import (
"fmt"
"image"
"image/color"
"io/ioutil"
"log"
"math/rand"
"strings"
"time"
"github.com/fogleman/gg"
)
type Logo struct {
Image image.Image
IsCorrect bool
}
type Captcha struct {
Image image.Image
CorrectAnswer int
}
var Logos []Logo = []Logo{}
func initImage() *gg.Context {
dc := gg.NewContext(600, 400)
if err := dc.LoadFontFace("./assets/font.ttf", 24); err != nil {
panic(err)
}
grad := gg.NewLinearGradient(0, 0, 600, 400)
grad.AddColorStop(0, color.RGBA{71, 100, 106, 255})
grad.AddColorStop(1, color.RGBA{44, 43, 51, 255})
dc.SetFillStyle(grad)
dc.DrawRectangle(0, 0, 600, 400)
dc.Fill()
return dc
}
func GenCaptcha() Captcha {
dc := initImage()
rand.Seed(time.Now().UnixNano())
rand.Shuffle(len(Logos), func(i, j int) { Logos[i], Logos[j] = Logos[j], Logos[i] })
correct_answer := 0
count := len(Logos)
for i, logo := range Logos {
x := i*600/count + 50
y := rand.Intn(400 - logo.Image.Bounds().Dy())
dc.DrawImage(logo.Image, x, y)
if logo.IsCorrect {
correct_answer = i + 1
}
var tx float64 = float64(x) + 50.0
var ty float64 = float64(y) + 120.0
text := fmt.Sprintf("%d", i+1)
dc.SetRGB(1, 1, 1)
dc.DrawStringAnchored(text, tx, ty, 0.5, 0.5)
}
img := dc.Image()
captcha := Captcha{
Image: img,
CorrectAnswer: correct_answer,
}
return captcha
}
func InitImages() error {
images := []Logo{}
files, err := ioutil.ReadDir("./assets")
if err != nil {
return err
}
for _, file := range files {
name := file.Name()
if !strings.HasSuffix(name, ".png") {
continue
}
log.Printf("%s", name)
path := fmt.Sprintf("./assets/%s", name)
im, err := gg.LoadPNG(path)
if err != nil {
log.Print(err)
return err
}
is_correct := strings.HasPrefix(name, "godot")
logo := Logo{Image: im, IsCorrect: is_correct}
images = append(images, logo)
}
Logos = images
log.Printf("%v", Logos)
return nil
}