Skip to content

Commit 587d396

Browse files
authored
增加签到预设切换 (#634)
1 parent d693f98 commit 587d396

File tree

3 files changed

+317
-169
lines changed

3 files changed

+317
-169
lines changed

plugin/score/draw.go

Lines changed: 176 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,176 @@
1+
// Package score 签到,答题得分
2+
package score
3+
4+
import (
5+
"bytes"
6+
"fmt"
7+
"image"
8+
"image/color"
9+
"strconv"
10+
"time"
11+
12+
"github.com/FloatTech/ZeroBot-Plugin/kanban/banner"
13+
"github.com/FloatTech/floatbox/file"
14+
"github.com/FloatTech/gg"
15+
"github.com/FloatTech/imgfactory"
16+
"github.com/FloatTech/zbputils/control"
17+
"github.com/FloatTech/zbputils/img/text"
18+
"github.com/disintegration/imaging"
19+
)
20+
21+
func drawScore16(a *scdata) (image.Image, error) {
22+
// 绘图
23+
getAvatar, err := initPic(a.picfile, a.uid)
24+
if err != nil {
25+
return nil, err
26+
}
27+
back, err := gg.LoadImage(a.picfile)
28+
if err != nil {
29+
return nil, err
30+
}
31+
// 避免图片过大,最大 1280*720
32+
back = imgfactory.Limit(back, 1280, 720)
33+
imgDX := back.Bounds().Dx()
34+
imgDY := back.Bounds().Dy()
35+
canvas := gg.NewContext(imgDX, imgDY)
36+
// draw Aero Style
37+
aeroStyle := gg.NewContext(imgDX-202, imgDY-202)
38+
aeroStyle.DrawImage(imaging.Blur(back, 2.5), -100, -100)
39+
// aero draw image.
40+
aeroStyle.DrawRoundedRectangle(0, 0, float64(imgDX-200), float64(imgDY-200), 16)
41+
// SideLine
42+
aeroStyle.SetLineWidth(3)
43+
aeroStyle.SetRGBA255(255, 255, 255, 100)
44+
aeroStyle.StrokePreserve()
45+
aeroStyle.SetRGBA255(255, 255, 255, 140)
46+
// fill
47+
aeroStyle.Fill()
48+
// draw background
49+
canvas.DrawImage(back, 0, 0)
50+
// Aero style combine
51+
canvas.DrawImage(aeroStyle.Image(), 100, 100)
52+
canvas.Fill()
53+
hourWord := getHourWord(time.Now())
54+
avatar, _, err := image.Decode(bytes.NewReader(getAvatar))
55+
if err != nil {
56+
return nil, err
57+
}
58+
avatarf := imgfactory.Size(avatar, 200, 200)
59+
canvas.DrawImage(avatarf.Circle(0).Image(), 120, 120)
60+
// draw info(name,coin,etc)
61+
canvas.SetRGB255(0, 0, 0)
62+
data, err := file.GetLazyData(text.BoldFontFile, control.Md5File, true)
63+
if err != nil {
64+
return nil, err
65+
}
66+
if err = canvas.ParseFontFace(data, 50); err != nil {
67+
return nil, err
68+
}
69+
// draw head
70+
canvas.DrawStringWrapped(a.nickname, 350, 180, 0.5, 0.5, 0.5, 0.5, gg.AlignLeft)
71+
canvas.Fill()
72+
// main draw
73+
data, err = file.GetLazyData(text.FontFile, control.Md5File, true)
74+
if err != nil {
75+
return nil, err
76+
}
77+
if err = canvas.ParseFontFace(data, 30); err != nil {
78+
return nil, err
79+
}
80+
canvas.DrawStringAnchored(hourWord, 350, 280, 0, 0)
81+
canvas.DrawStringAnchored("ATRI币 + "+strconv.Itoa(a.inc), 350, 350, 0, 0)
82+
canvas.DrawStringAnchored("当前ATRI币:"+strconv.Itoa(a.score), 350, 400, 0, 0)
83+
canvas.DrawStringAnchored("LEVEL: "+strconv.Itoa(getrank(a.level)), 350, 450, 0, 0)
84+
// draw Info(Time,etc.)
85+
getTime := time.Now().Format("2006-01-02 15:04:05")
86+
getTimeLengthWidth, getTimeLengthHight := canvas.MeasureString(getTime)
87+
canvas.DrawStringAnchored(getTime, float64(imgDX)-100-20-getTimeLengthWidth/2, float64(imgDY)-100-getTimeLengthHight, 0.5, 0.5) // time
88+
var nextrankScore int
89+
if a.rank < 10 {
90+
nextrankScore = rankArray[a.rank+1]
91+
} else {
92+
nextrankScore = SCOREMAX
93+
}
94+
nextLevelStyle := strconv.Itoa(a.level) + "/" + strconv.Itoa(nextrankScore)
95+
getLevelLength, _ := canvas.MeasureString(nextLevelStyle)
96+
canvas.DrawStringAnchored(nextLevelStyle, 100+getLevelLength, float64(imgDY)-100-getTimeLengthHight, 0.5, 0.5) // time
97+
canvas.Fill()
98+
canvas.SetRGB255(255, 255, 255)
99+
if err = canvas.ParseFontFace(data, 20); err != nil {
100+
return nil, err
101+
}
102+
canvas.DrawStringAnchored("Created By Zerobot-Plugin "+banner.Version, float64(imgDX)/2, float64(imgDY)-20, 0.5, 0.5) // zbp
103+
canvas.SetRGB255(0, 0, 0)
104+
canvas.DrawStringAnchored("Created By Zerobot-Plugin "+banner.Version, float64(imgDX)/2-3, float64(imgDY)-19, 0.5, 0.5) // zbp
105+
canvas.SetRGB255(255, 255, 255)
106+
// Gradient
107+
grad := gg.NewLinearGradient(20, 320, 400, 20)
108+
grad.AddColorStop(0, color.RGBA{G: 255, A: 255})
109+
grad.AddColorStop(1, color.RGBA{B: 255, A: 255})
110+
grad.AddColorStop(0.5, color.RGBA{R: 255, A: 255})
111+
canvas.SetStrokeStyle(grad)
112+
canvas.SetLineWidth(4)
113+
// level array with rectangle work.
114+
gradLineLength := float64(imgDX-120) - 120
115+
renderLine := (float64(a.level) / float64(nextrankScore)) * gradLineLength
116+
canvas.MoveTo(120, float64(imgDY)-102)
117+
canvas.LineTo(120+renderLine, float64(imgDY)-102)
118+
canvas.ClosePath()
119+
canvas.Stroke()
120+
return canvas.Image(), nil
121+
}
122+
123+
func drawScore15(a *scdata) (image.Image, error) {
124+
// 绘图
125+
_, err := initPic(a.picfile, a.uid)
126+
if err != nil {
127+
return nil, err
128+
}
129+
back, err := gg.LoadImage(a.picfile)
130+
if err != nil {
131+
return nil, err
132+
}
133+
// 避免图片过大,最大 1280*720
134+
back = imgfactory.Limit(back, 1280, 720)
135+
canvas := gg.NewContext(back.Bounds().Size().X, int(float64(back.Bounds().Size().Y)*1.7))
136+
canvas.SetRGB(1, 1, 1)
137+
canvas.Clear()
138+
canvas.DrawImage(back, 0, 0)
139+
monthWord := time.Now().Format("01/02")
140+
hourWord := getHourWord(time.Now())
141+
_, err = file.GetLazyData(text.BoldFontFile, control.Md5File, true)
142+
if err != nil {
143+
return nil, err
144+
}
145+
if err = canvas.LoadFontFace(text.BoldFontFile, float64(back.Bounds().Size().X)*0.1); err != nil {
146+
return nil, err
147+
}
148+
canvas.SetRGB(0, 0, 0)
149+
canvas.DrawString(hourWord, float64(back.Bounds().Size().X)*0.1, float64(back.Bounds().Size().Y)*1.2)
150+
canvas.DrawString(monthWord, float64(back.Bounds().Size().X)*0.6, float64(back.Bounds().Size().Y)*1.2)
151+
_, err = file.GetLazyData(text.FontFile, control.Md5File, true)
152+
if err != nil {
153+
return nil, err
154+
}
155+
if err = canvas.LoadFontFace(text.FontFile, float64(back.Bounds().Size().X)*0.04); err != nil {
156+
return nil, err
157+
}
158+
canvas.DrawString(a.nickname+fmt.Sprintf(" ATRI币+%d", a.inc), float64(back.Bounds().Size().X)*0.1, float64(back.Bounds().Size().Y)*1.3)
159+
canvas.DrawString("当前ATRI币:"+strconv.FormatInt(int64(a.score), 10), float64(back.Bounds().Size().X)*0.1, float64(back.Bounds().Size().Y)*1.4)
160+
canvas.DrawString("LEVEL:"+strconv.FormatInt(int64(a.rank), 10), float64(back.Bounds().Size().X)*0.1, float64(back.Bounds().Size().Y)*1.5)
161+
canvas.DrawRectangle(float64(back.Bounds().Size().X)*0.1, float64(back.Bounds().Size().Y)*1.55, float64(back.Bounds().Size().X)*0.6, float64(back.Bounds().Size().Y)*0.1)
162+
canvas.SetRGB255(150, 150, 150)
163+
canvas.Fill()
164+
var nextrankScore int
165+
if a.rank < 10 {
166+
nextrankScore = rankArray[a.rank+1]
167+
} else {
168+
nextrankScore = SCOREMAX
169+
}
170+
canvas.SetRGB255(0, 0, 0)
171+
canvas.DrawRectangle(float64(back.Bounds().Size().X)*0.1, float64(back.Bounds().Size().Y)*1.55, float64(back.Bounds().Size().X)*0.6*float64(a.level)/float64(nextrankScore), float64(back.Bounds().Size().Y)*0.1)
172+
canvas.SetRGB255(102, 102, 102)
173+
canvas.Fill()
174+
canvas.DrawString(fmt.Sprintf("%d/%d", a.level, nextrankScore), float64(back.Bounds().Size().X)*0.75, float64(back.Bounds().Size().Y)*1.62)
175+
return canvas.Image(), nil
176+
}

plugin/score/model.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,3 +122,14 @@ func (sdb *scoredb) GetScoreRankByTopN(n int) (st []scoretable, err error) {
122122
err = db.Model(&scoretable{}).Order("score desc").Limit(n).Find(&st).Error
123123
return
124124
}
125+
126+
type scdata struct {
127+
drawedfile string
128+
picfile string
129+
uid int64
130+
nickname string
131+
inc int //增加币
132+
score int //钱包
133+
level int
134+
rank int
135+
}

0 commit comments

Comments
 (0)