From c13b7f206855973ea1f4a26ce707b711ad2971d2 Mon Sep 17 00:00:00 2001 From: lixiangwuxian Date: Wed, 9 Oct 2024 01:30:50 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E5=96=9C=E6=8A=A5?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 +++ go.mod | 6 ++++++ go.sum | 6 ++++++ handler/xibao/xibao.go | 22 +++++++++++++++++++++ main.go | 2 +- register.go | 1 + service/group_msg.go | 1 + service/jrrp/jrrp.go | 6 +++--- service/private_msg.go | 1 + service/scoresaber/bind_ss.go | 26 ++++++++++++------------ service/scoresaber/hot.go | 2 +- service/xibao/image_gen.go | 37 +++++++++++++++++++++++++++++++++++ 12 files changed, 95 insertions(+), 18 deletions(-) create mode 100644 handler/xibao/xibao.go create mode 100644 service/group_msg.go create mode 100644 service/private_msg.go create mode 100644 service/xibao/image_gen.go diff --git a/.gitignore b/.gitignore index d99f0b4..71c04c0 100644 --- a/.gitignore +++ b/.gitignore @@ -27,3 +27,6 @@ stable msg.json bindss.db .vscode/launch.json +tmp/xibao.png +resource/font.ttf +resource/xibao_background.png diff --git a/go.mod b/go.mod index 9e93a68..3f6224b 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,13 @@ module git.lxtend.com/qqbot go 1.22.6 require ( + github.com/fogleman/gg v1.3.0 github.com/gorilla/websocket v1.5.3 github.com/mattn/go-sqlite3 v1.14.23 github.com/sashabaranov/go-openai v1.30.3 ) + +require ( + github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect + golang.org/x/image v0.21.0 // indirect +) diff --git a/go.sum b/go.sum index 0beeaee..467f856 100644 --- a/go.sum +++ b/go.sum @@ -1,6 +1,12 @@ +github.com/fogleman/gg v1.3.0 h1:/7zJX8F6AaYQc57WQCyN9cAIz+4bCJGO9B+dyW29am8= +github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/sashabaranov/go-openai v1.30.3 h1:TEdRP3otRXX2A7vLoU+kI5XpoSo7VUUlM/rEttUqgek= github.com/sashabaranov/go-openai v1.30.3/go.mod h1:lj5b/K+zjTSFxVLijLSTDZuP7adOgerWeFyZLUhAKRg= +golang.org/x/image v0.21.0 h1:c5qV36ajHpdj4Qi0GnE0jUc/yuo33OLFaa0d+crTD5s= +golang.org/x/image v0.21.0/go.mod h1:vUbsLavqK/W303ZroQQVKQ+Af3Yl6Uz1Ppu5J/cLz78= diff --git a/handler/xibao/xibao.go b/handler/xibao/xibao.go new file mode 100644 index 0000000..e8123ae --- /dev/null +++ b/handler/xibao/xibao.go @@ -0,0 +1,22 @@ +package xibao + +import ( + "git.lxtend.com/qqbot/handler" + "git.lxtend.com/qqbot/model" + "git.lxtend.com/qqbot/service/xibao" +) + +func init() { + handler.RegisterHandler("喜报", xiBao) +} + +func xiBao(msg model.Message) (reply model.Reply) { + xibao.GenerateCongratulationImage(msg.Msg[len("喜报 "):], "./tmp/xibao.png") + return model.Reply{ + ReplyMsg: "[CQ:image,file=file:///root/qqbot/tmp/xibao.png]", + ReferOriginMsg: true, + FromMsg: msg, + } +} + +//docker run -d --name qqbot -v /root/qqbot:/root/qqbot -v /etc/localtime:/etc/localtime:ro -v /etc/timezone:/etc/timezone:ro --restart=always qqbot diff --git a/main.go b/main.go index 6a2621d..598b223 100644 --- a/main.go +++ b/main.go @@ -11,7 +11,7 @@ func main() { // 创建 WebSocket 客户端 client, err := wsclient.NewWebSocketClient("ws", "localhost:3001", "") if err != nil { - log.Fatal("Error creating WebSocket client:", err) + log.Print("Error creating WebSocket client:", err) } defer client.Close() for { diff --git a/register.go b/register.go index 3b2d041..6d38dc2 100644 --- a/register.go +++ b/register.go @@ -5,4 +5,5 @@ import ( _ "git.lxtend.com/qqbot/handler/headmaster" _ "git.lxtend.com/qqbot/handler/jrrp" _ "git.lxtend.com/qqbot/handler/scoresaber" + _ "git.lxtend.com/qqbot/handler/xibao" ) diff --git a/service/group_msg.go b/service/group_msg.go new file mode 100644 index 0000000..6d43c33 --- /dev/null +++ b/service/group_msg.go @@ -0,0 +1 @@ +package service diff --git a/service/jrrp/jrrp.go b/service/jrrp/jrrp.go index f2cb360..cff79c8 100644 --- a/service/jrrp/jrrp.go +++ b/service/jrrp/jrrp.go @@ -15,7 +15,7 @@ import ( func initDB() { db, err := sql.Open("sqlite3", "./jrrp.db") if err != nil { - log.Fatal(err) + log.Print(err) } defer db.Close() @@ -28,7 +28,7 @@ func initDB() { _, err = db.Exec(createTableSQL) if err != nil { - log.Fatal(err) + log.Print(err) } } @@ -58,7 +58,7 @@ func NewJrrp() *Jrrp { initDB() db, err := sql.Open("sqlite3", "./jrrp.db") if err != nil { - log.Fatal(err) + log.Print(err) } return &Jrrp{db: db} } diff --git a/service/private_msg.go b/service/private_msg.go new file mode 100644 index 0000000..6d43c33 --- /dev/null +++ b/service/private_msg.go @@ -0,0 +1 @@ +package service diff --git a/service/scoresaber/bind_ss.go b/service/scoresaber/bind_ss.go index 818f392..98216ba 100644 --- a/service/scoresaber/bind_ss.go +++ b/service/scoresaber/bind_ss.go @@ -13,7 +13,7 @@ import ( func initDB() { db, err := sql.Open("sqlite3", "./bindss.db") if err != nil { - log.Fatal(err) + log.Print(err) } defer db.Close() @@ -69,15 +69,15 @@ func initDB() { _, err = db.Exec(createBindTableSQL) if err != nil { - log.Fatal(err) + log.Print(err) } _, err = db.Exec(createScoreTableSQL) if err != nil { - log.Fatal(err) + log.Print(err) } _, err = db.Exec(createRecordTableSQL) if err != nil { - log.Fatal(err) + log.Print(err) } } @@ -91,7 +91,7 @@ func init() { initDB() db, err := sql.Open("sqlite3", "./bindss.db") if err != nil { - log.Fatal(err) + log.Print(err) } SSQuery = &ssQuery{db: db} } @@ -99,7 +99,7 @@ func init() { func (ss *ssQuery) BindSS(qqId string, ssId string) (reply string) { tx, err := ss.db.Begin() if err != nil { - log.Fatal(err) + log.Print(err) } defer tx.Rollback() // ssId为数字 @@ -131,7 +131,7 @@ func (ss *ssQuery) BindSS(qqId string, ssId string) (reply string) { func (ss *ssQuery) UnbindSS(qqId string) (reply string) { tx, err := ss.db.Begin() if err != nil { - log.Fatal(err) + log.Print(err) } defer tx.Rollback() //是否已绑定 @@ -155,7 +155,7 @@ func (ss *ssQuery) UnbindSS(qqId string) (reply string) { func (ss *ssQuery) GetScore(qqId string) (reply string) { tx, err := ss.db.Begin() if err != nil { - log.Fatal(err) + log.Print(err) } defer tx.Rollback() //是否已绑定 @@ -205,7 +205,7 @@ func (ss *ssQuery) GetScore(qqId string) (reply string) { func (ss *ssQuery) SaveRecord(cmdData CommandData) { tx, err := ss.db.Begin() if err != nil { - log.Fatal(err) + log.Print(err) } defer tx.Rollback() dataLite := RecordDataLite{ @@ -244,18 +244,18 @@ func (ss *ssQuery) SaveRecord(cmdData CommandData) { dataLite.DeviceControllerRight = *cmdData.Score.DeviceControllerRight } if _, err = tx.Exec("INSERT INTO ssRecordData(score_id, ss_id, name, country, song_name, song_sub_name, song_author_name, song_hash, cover_image, difficulty_raw, pp, stars, weight, modifiers, multiplier, bad_cuts, missed_notes, max_combo,score, full_combo, device_hmd, device_controller_left, device_controller_right, generated_time) VALUES(?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12, ?13, ?14, ?15, ?16, ?17, ?18, ?19, ?20, ?21, ?22, ?23,?24)", dataLite.ScoreID, dataLite.SsID, dataLite.Name, dataLite.Country, dataLite.SongName, dataLite.SongSubName, dataLite.SongAuthorName, dataLite.SongHash, dataLite.CoverImage, dataLite.DifficultyRaw, dataLite.PP, dataLite.Stars, dataLite.Weight, dataLite.Modifiers, dataLite.Multiplier, dataLite.BadCuts, dataLite.MissedNotes, dataLite.MaxCombo, dataLite.Score, dataLite.FullCombo, dataLite.DeviceHmd, dataLite.DeviceControllerLeft, dataLite.DeviceControllerRight, dataLite.GeneratedTime); err != nil { - log.Fatal(err) + log.Print(err) } err = tx.Commit() if err != nil { - log.Fatal(err) + log.Print(err) } } func (ss *ssQuery) GetRecentScores(count int, qqId string) ([]RecordDataLite, error) { tx, err := ss.db.Begin() if err != nil { - log.Fatal(err) + log.Print(err) } defer tx.Rollback() var ssId string @@ -283,7 +283,7 @@ func (ss *ssQuery) GetRecentScores(count int, qqId string) ([]RecordDataLite, er } err = tx.Commit() if err != nil { - log.Fatal(err) + log.Print(err) } return records, nil } diff --git a/service/scoresaber/hot.go b/service/scoresaber/hot.go index 0329c78..9f60928 100644 --- a/service/scoresaber/hot.go +++ b/service/scoresaber/hot.go @@ -21,7 +21,7 @@ type scoresManager struct { func init() { for err := ScoresManager.connect(); err != nil; err = ScoresManager.connect() { - log.Fatal("连接 WebSocket 失败:", err) + log.Print("连接 WebSocket 失败:", err) time.Sleep(time.Second) } } diff --git a/service/xibao/image_gen.go b/service/xibao/image_gen.go new file mode 100644 index 0000000..8ac5ad1 --- /dev/null +++ b/service/xibao/image_gen.go @@ -0,0 +1,37 @@ +package xibao + +import ( + "log" + + "github.com/fogleman/gg" +) + +func GenerateCongratulationImage(text string, outputFile string) { + // 加载喜报背景图片 + im, err := gg.LoadImage("./resource/xibao_background.png") // 需要提前准备的背景图片 + if err != nil { + log.Print("无法加载喜报图片:", err) + } + + // 创建与背景图片大小相同的画布 + width := im.Bounds().Dx() + height := im.Bounds().Dy() + dc := gg.NewContext(width, height) + + // 将背景图片绘制到画布上 + dc.DrawImage(im, 0, 0) + + // 设置字体和大小,字体文件需要自备,放在合适的路径 + if err := dc.LoadFontFace("./resource/font.ttf", 96); err != nil { + log.Print("无法加载字体:", err) + } + + dc.SetRGB(1, 0, 0) + + dc.DrawStringAnchored(text, float64(width)/2, float64(height)/2, 0.5, 0.5) + + err = dc.SavePNG(outputFile) + if err != nil { + log.Print("无法保存生成的图片:", err) + } +}