feat: 添加喜报功能
This commit is contained in:
parent
f5e9b74c5a
commit
c13b7f2068
3
.gitignore
vendored
3
.gitignore
vendored
@ -27,3 +27,6 @@ stable
|
||||
msg.json
|
||||
bindss.db
|
||||
.vscode/launch.json
|
||||
tmp/xibao.png
|
||||
resource/font.ttf
|
||||
resource/xibao_background.png
|
||||
|
6
go.mod
6
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
|
||||
)
|
||||
|
6
go.sum
6
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=
|
||||
|
22
handler/xibao/xibao.go
Normal file
22
handler/xibao/xibao.go
Normal file
@ -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
|
2
main.go
2
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 {
|
||||
|
@ -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"
|
||||
)
|
||||
|
1
service/group_msg.go
Normal file
1
service/group_msg.go
Normal file
@ -0,0 +1 @@
|
||||
package service
|
@ -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}
|
||||
}
|
||||
|
1
service/private_msg.go
Normal file
1
service/private_msg.go
Normal file
@ -0,0 +1 @@
|
||||
package service
|
@ -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
|
||||
}
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
37
service/xibao/image_gen.go
Normal file
37
service/xibao/image_gen.go
Normal file
@ -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)
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user