diff --git a/README.md b/README.md index 71a2266ad6..523eddb1a8 100644 --- a/README.md +++ b/README.md @@ -345,6 +345,7 @@ print("run[CQ:image,file="+j["img"]+"]") - **签到得分** `import _ "github.com/FloatTech/ZeroBot-Plugin/plugin/score"` - [x] 签到 - [x] 获得签到背景[@xxx] | 获得签到背景 + - [x] 查看分数排名 - **骂人** `import _ "github.com/FloatTech/ZeroBot-Plugin/plugin/curse"` - [x] 骂我 - [x] 大力骂我 diff --git a/go.mod b/go.mod index 122e147ddb..108938a52e 100644 --- a/go.mod +++ b/go.mod @@ -22,6 +22,7 @@ require ( github.com/shirou/gopsutil/v3 v3.22.2 github.com/sirupsen/logrus v1.8.1 github.com/tidwall/gjson v1.14.0 + github.com/wcharczuk/go-chart/v2 v2.1.0 github.com/wdvxdr1123/ZeroBot v1.4.2-0.20220330050111-d962c23b4f4d golang.org/x/image v0.0.0-20220321031419-a8550c1d254a ) diff --git a/go.sum b/go.sum index d9164eb5fa..f211069e69 100644 --- a/go.sum +++ b/go.sum @@ -123,6 +123,8 @@ github.com/tklauser/go-sysconf v0.3.10/go.mod h1:C8XykCvCb+Gn0oNCWPIlcb0RuglQTYa github.com/tklauser/numcpus v0.3.0/go.mod h1:yFGUr7TUHQRAhyqBcEg0Ge34zDBAsIvJJcyE6boqnA8= github.com/tklauser/numcpus v0.4.0 h1:E53Dm1HjH1/R2/aoCtXtPgzmElmn51aOkhCFSuZq//o= github.com/tklauser/numcpus v0.4.0/go.mod h1:1+UI3pD8NW14VMwdgJNJ1ESk2UnwhAnz5hMwiKKqXCQ= +github.com/wcharczuk/go-chart/v2 v2.1.0 h1:tY2slqVQ6bN+yHSnDYwZebLQFkphK4WNrVwnt7CJZ2I= +github.com/wcharczuk/go-chart/v2 v2.1.0/go.mod h1:yx7MvAVNcP/kN9lKXM/NTce4au4DFN99j6i1OwDclNA= github.com/wdvxdr1123/ZeroBot v1.4.2-0.20220330050111-d962c23b4f4d h1:NGea1vhhGuvv7E6sPeUyPyTxCtCkEVn8ShNniZY9bQA= github.com/wdvxdr1123/ZeroBot v1.4.2-0.20220330050111-d962c23b4f4d/go.mod h1:NwXIp7PgjV+kUALMXJ4v4/3QcsRSOodtjhLekuPXFog= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -135,6 +137,7 @@ golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20220321153916-2c7772ba3064 h1:S25/rfnfsMVgORT4/J61MJ7rdyseOZOyvLIrZEZ7s6s= golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200927104501-e162460cd6b5/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20220321031419-a8550c1d254a h1:LnH9RNcpPv5Kzi15lXg42lYMPUf0x8CuPv1YnvBWZAg= golang.org/x/image v0.0.0-20220321031419-a8550c1d254a/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= diff --git a/plugin/bilibili/info.go b/plugin/bilibili/info.go index 3be9a914ea..a92b6fb402 100644 --- a/plugin/bilibili/info.go +++ b/plugin/bilibili/info.go @@ -171,6 +171,10 @@ func init() { canvas.DrawImage(back, 0, 0) } canvas.SetColor(color.Black) + _, err = file.GetLazyData(text.BoldFontFile, false, true) + if err != nil { + ctx.SendChain(message.Text("ERROR:", err)) + } if err = canvas.LoadFontFace(text.BoldFontFile, fontSize); err != nil { ctx.SendChain(message.Text("ERROR:", err)) return diff --git a/plugin/score/model.go b/plugin/score/model.go index 920e311333..daa69b1f59 100644 --- a/plugin/score/model.go +++ b/plugin/score/model.go @@ -117,3 +117,9 @@ func (sdb *scoredb) InsertOrUpdateSignInCountByUID(uid int64, count int) (err er } return } + +func (sdb *scoredb) GetScoreRankByTopN(n int) (st []scoretable, err error) { + db := (*gorm.DB)(sdb) + err = db.Debug().Model(&scoretable{}).Order("score desc").Limit(n).Find(&st).Error + return +} diff --git a/plugin/score/sign_in.go b/plugin/score/sign_in.go index ebdd21956c..59667ad669 100644 --- a/plugin/score/sign_in.go +++ b/plugin/score/sign_in.go @@ -8,8 +8,10 @@ import ( "time" "github.com/fogleman/gg" + "github.com/golang/freetype" log "github.com/sirupsen/logrus" "github.com/tidwall/gjson" + "github.com/wcharczuk/go-chart/v2" zero "github.com/wdvxdr1123/ZeroBot" "github.com/wdvxdr1123/ZeroBot/message" @@ -35,7 +37,7 @@ var levelArray = [...]int{0, 1, 2, 5, 10, 20, 35, 55, 75, 100, 120} func init() { engine := control.Register("score", &control.Options{ DisableOnDefault: false, - Help: "签到得分\n- 签到\n- 获得签到背景[@xxx] | 获得签到背景", + Help: "签到得分\n- 签到\n- 获得签到背景[@xxx] | 获得签到背景\n- 查看分数排名", PrivateDataFolder: "score", }) cachePath := engine.DataFolder() + "cache/" @@ -173,6 +175,71 @@ func init() { } ctx.SendChain(message.Image("file:///" + file.BOTPATH + "/" + picFile)) }) + engine.OnFullMatch("查看分数排名", zero.OnlyGroup).SetBlock(true). + Handle(func(ctx *zero.Ctx) { + today := time.Now().Format("20060102") + drawedFile := cachePath + today + "scoreRank.png" + if file.IsExist(drawedFile) { + ctx.SendChain(message.Image("file:///" + file.BOTPATH + "/" + drawedFile)) + return + } + st, err := sdb.GetScoreRankByTopN(10) + if err != nil { + ctx.SendChain(message.Text("ERROR:", err)) + return + } + if len(st) == 0 { + ctx.SendChain(message.Text("ERROR:目前还没有人签到过")) + return + } + _, err = file.GetLazyData(text.FontFile, false, true) + if err != nil { + ctx.SendChain(message.Text("ERROR:", err)) + return + } + b, err := os.ReadFile(text.FontFile) + if err != nil { + ctx.SendChain(message.Text("ERROR:", err)) + return + } + font, err := freetype.ParseFont(b) + if err != nil { + ctx.SendChain(message.Text("ERROR:", err)) + return + } + bars := make([]chart.Value, len(st)) + for i, v := range st { + bars[i] = chart.Value{ + Value: float64(v.Score), + Label: ctx.CardOrNickName(v.UID), + } + } + graph := chart.BarChart{ + Font: font, + Title: "饼干排名", + Background: chart.Style{ + Padding: chart.Box{ + Top: 40, + }, + }, + Height: 500, + BarWidth: 50, + Bars: bars, + } + f, err := os.Create(drawedFile) + if err != nil { + ctx.SendChain(message.Text("ERROR:", err)) + return + } + err = graph.Render(chart.PNG, f) + _ = f.Close() + if err != nil { + os.Remove(drawedFile) + ctx.SendChain(message.Text("ERROR:", err)) + return + } + ctx.SendChain(message.Image("file:///" + file.BOTPATH + "/" + drawedFile)) + }) } func getHourWord(t time.Time) string {