From 02b55fab92dfd9fe3a8e13239ecc25fbd7272903 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E9=94=85=E9=A5=AD?= <1156544355@qq.com> Date: Wed, 2 Jul 2025 00:02:49 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=F0=9F=90=9B=20=E4=BF=AE=E6=94=B9=E5=90=AC?= =?UTF-8?q?=E6=AD=8C=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++++ console/console_windows.go | 8 +++++++- plugin/music/selecter.go | 7 +++++-- plugin/score/model.go | 32 ++++++++++++++++++++++++-------- 4 files changed, 40 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index f48d83effb..5279927cd6 100644 --- a/README.md +++ b/README.md @@ -1026,6 +1026,10 @@ print("run[CQ:image,file="+j["img"]+"]") - [x] 酷我点歌[xxx] - [x] 酷狗点歌[xxx] + + - [x] qq点歌[xxx] + + - [x] 咪咕点歌[xxx]
diff --git a/console/console_windows.go b/console/console_windows.go index e4b5ed1b34..4b93161ec1 100644 --- a/console/console_windows.go +++ b/console/console_windows.go @@ -38,12 +38,18 @@ func setConsoleTitle(title string) (err error) { } func init() { + debugMode := os.Getenv("DEBUG_MODE") == "1" stdin := windows.Handle(os.Stdin.Fd()) var mode uint32 err := windows.GetConsoleMode(stdin, &mode) if err != nil { - panic(err) + if debugMode { + logrus.Warnf("调试模式下忽略控制台模式获取失败: %v", err) + return // 调试模式下直接返回,跳过后续配置 + } else { + panic(err) // 非调试模式下 panic + } } mode &^= windows.ENABLE_QUICK_EDIT_MODE // 禁用快速编辑模式 diff --git a/plugin/music/selecter.go b/plugin/music/selecter.go index 592438359e..d69de81e48 100644 --- a/plugin/music/selecter.go +++ b/plugin/music/selecter.go @@ -29,7 +29,8 @@ func init() { "- 网易点歌[xxx]\n" + "- 酷我点歌[xxx]\n" + "- 酷狗点歌[xxx]\n" + - "- 咪咕点歌[xxx]", + "- 咪咕点歌[xxx]\n" + + "- qq点歌[xxx]\n", }).OnRegex(`^(.{0,2})点歌\s?(.{1,25})$`).SetBlock(true).Limit(ctxext.LimitByUser). Handle(func(ctx *zero.Ctx) { // switch 平台 @@ -42,8 +43,10 @@ func init() { ctx.SendChain(kugou(ctx.State["regex_matched"].([]string)[2])) case "网易": ctx.SendChain(cloud163(ctx.State["regex_matched"].([]string)[2])) - default: // 默认 QQ音乐 + case "qq": ctx.SendChain(qqmusic(ctx.State["regex_matched"].([]string)[2])) + default: // 默认咪咕点歌 + ctx.SendChain(migu(ctx.State["regex_matched"].([]string)[2])) } }) } diff --git a/plugin/score/model.go b/plugin/score/model.go index e0e21d8a4f..95eaadb57d 100644 --- a/plugin/score/model.go +++ b/plugin/score/model.go @@ -2,6 +2,7 @@ package score import ( "os" + "sync" "time" "github.com/jinzhu/gorm" @@ -11,7 +12,10 @@ import ( var sdb *scoredb // scoredb 分数数据库 -type scoredb gorm.DB +type scoredb struct { + db *gorm.DB + scoremu sync.Mutex +} // scoretable 分数结构体 type scoretable struct { @@ -52,25 +56,31 @@ func initialize(dbpath string) *scoredb { panic(err) } gdb.AutoMigrate(&scoretable{}).AutoMigrate(&signintable{}) - return (*scoredb)(gdb) + return &scoredb{ + db: gdb, + } } // Close ... func (sdb *scoredb) Close() error { - db := (*gorm.DB)(sdb) + db := sdb.db return db.Close() } // GetScoreByUID 取得分数 func (sdb *scoredb) GetScoreByUID(uid int64) (s scoretable) { - db := (*gorm.DB)(sdb) + sdb.scoremu.Lock() + defer sdb.scoremu.Unlock() + db := sdb.db db.Model(&scoretable{}).FirstOrCreate(&s, "uid = ? ", uid) return s } // InsertOrUpdateScoreByUID 插入或更新分数 func (sdb *scoredb) InsertOrUpdateScoreByUID(uid int64, score int) (err error) { - db := (*gorm.DB)(sdb) + sdb.scoremu.Lock() + defer sdb.scoremu.Unlock() + db := sdb.db s := scoretable{ UID: uid, Score: score, @@ -91,14 +101,18 @@ func (sdb *scoredb) InsertOrUpdateScoreByUID(uid int64, score int) (err error) { // GetSignInByUID 取得签到次数 func (sdb *scoredb) GetSignInByUID(uid int64) (si signintable) { - db := (*gorm.DB)(sdb) + sdb.scoremu.Lock() + defer sdb.scoremu.Unlock() + db := sdb.db db.Model(&signintable{}).FirstOrCreate(&si, "uid = ? ", uid) return si } // InsertOrUpdateSignInCountByUID 插入或更新签到次数 func (sdb *scoredb) InsertOrUpdateSignInCountByUID(uid int64, count int) (err error) { - db := (*gorm.DB)(sdb) + sdb.scoremu.Lock() + defer sdb.scoremu.Unlock() + db := sdb.db si := signintable{ UID: uid, Count: count, @@ -118,7 +132,9 @@ func (sdb *scoredb) InsertOrUpdateSignInCountByUID(uid int64, count int) (err er } func (sdb *scoredb) GetScoreRankByTopN(n int) (st []scoretable, err error) { - db := (*gorm.DB)(sdb) + sdb.scoremu.Lock() + defer sdb.scoremu.Unlock() + db := sdb.db err = db.Model(&scoretable{}).Order("score desc").Limit(n).Find(&st).Error return } From 2ad3da7f0421e172f0fa98568b27b18831341a35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E9=94=85=E9=A5=AD?= <1156544355@qq.com> Date: Wed, 2 Jul 2025 13:04:50 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E2=9C=A8=20=E6=B7=BB=E5=8A=A0=E9=BE=99?= =?UTF-8?q?=E7=8F=A0=E8=81=9A=E5=90=88=E6=90=9C=E7=B4=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugin/music/selecter.go | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/plugin/music/selecter.go b/plugin/music/selecter.go index d69de81e48..9e6eea84be 100644 --- a/plugin/music/selecter.go +++ b/plugin/music/selecter.go @@ -21,6 +21,10 @@ import ( "github.com/wdvxdr1123/ZeroBot/message" ) +var ( + longZhuURL = "https://www.hhlqilongzhu.cn/api/joox/juhe_music.php?msg=%v" +) + func init() { control.AutoRegister(&ctrl.Options[*zero.Ctx]{ DisableOnDefault: false, @@ -45,12 +49,22 @@ func init() { ctx.SendChain(cloud163(ctx.State["regex_matched"].([]string)[2])) case "qq": ctx.SendChain(qqmusic(ctx.State["regex_matched"].([]string)[2])) - default: // 默认咪咕点歌 - ctx.SendChain(migu(ctx.State["regex_matched"].([]string)[2])) + default: // 默认聚合点歌 + ctx.SendChain(longzhu(ctx.State["regex_matched"].([]string)[2])) } }) } +// longzhu 聚合平台 +func longzhu(keyword string) message.Segment { + data, _ := web.GetData(fmt.Sprintf(longZhuURL, url.QueryEscape(keyword))) + // 假设 data 是包含整个 JSON 数组的字节切片 + result := gjson.GetBytes(data, "#.full_track") + // 取第一个非空的 full_track 链接 + firstFullTrack := result.Array()[0].String() + return message.Record(firstFullTrack) +} + // migu 返回咪咕音乐卡片 func migu(keyword string) message.Segment { headers := http.Header{ From ca596c19ffe555eca27b912e88681b83b56bf807 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E9=94=85=E9=A5=AD?= <1156544355@qq.com> Date: Wed, 2 Jul 2025 23:33:37 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=F0=9F=8E=A8=20=E4=BC=98=E5=8C=96=E8=81=9A?= =?UTF-8?q?=E5=90=88=E6=90=9C=E7=B4=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugin/music/selecter.go | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/plugin/music/selecter.go b/plugin/music/selecter.go index 9e6eea84be..21634292bd 100644 --- a/plugin/music/selecter.go +++ b/plugin/music/selecter.go @@ -59,10 +59,22 @@ func init() { func longzhu(keyword string) message.Segment { data, _ := web.GetData(fmt.Sprintf(longZhuURL, url.QueryEscape(keyword))) // 假设 data 是包含整个 JSON 数组的字节切片 - result := gjson.GetBytes(data, "#.full_track") - // 取第一个非空的 full_track 链接 - firstFullTrack := result.Array()[0].String() - return message.Record(firstFullTrack) + results := gjson.ParseBytes(data).Array() + for _, result := range results { + if strings.Contains(strings.ToLower(result.Get("title").String()), strings.ToLower(keyword)) { + if musicURL := result.Get("full_track").String(); musicURL != "" { + return message.Record(musicURL) + } + } + } + + if len(results) > 0 { + if musicURL := results[0].Get("full_track").String(); musicURL != "" { + return message.Record(musicURL) + } + } + + return message.Text("点歌失败, 找不到 ", keyword, " 的相关结果") } // migu 返回咪咕音乐卡片 From dd9bd13754570ef225a1b3b5fe5832702208eca3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E9=94=85=E9=A5=AD?= <1156544355@qq.com> Date: Thu, 3 Jul 2025 01:13:49 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=F0=9F=90=9B=20=E4=B8=80=E5=AE=9A=E8=83=BD?= =?UTF-8?q?=E7=82=B9=E5=87=BA=E6=AD=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugin/music/selecter.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plugin/music/selecter.go b/plugin/music/selecter.go index 21634292bd..e6fd1cd124 100644 --- a/plugin/music/selecter.go +++ b/plugin/music/selecter.go @@ -61,6 +61,7 @@ func longzhu(keyword string) message.Segment { // 假设 data 是包含整个 JSON 数组的字节切片 results := gjson.ParseBytes(data).Array() for _, result := range results { + fmt.Print(result) if strings.Contains(strings.ToLower(result.Get("title").String()), strings.ToLower(keyword)) { if musicURL := result.Get("full_track").String(); musicURL != "" { return message.Record(musicURL) @@ -68,8 +69,9 @@ func longzhu(keyword string) message.Segment { } } + results = gjson.GetBytes(data, "#.full_track").Array() if len(results) > 0 { - if musicURL := results[0].Get("full_track").String(); musicURL != "" { + if musicURL := results[0].String(); musicURL != "" { return message.Record(musicURL) } } From 39715023add923a6a60d7d1738a35e732a9b25ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E9=94=85=E9=A5=AD?= <1156544355@qq.com> Date: Thu, 3 Jul 2025 01:20:16 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=F0=9F=8E=A8=20=E5=88=A0=E9=99=A4=E8=B0=83?= =?UTF-8?q?=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugin/music/selecter.go | 1 - 1 file changed, 1 deletion(-) diff --git a/plugin/music/selecter.go b/plugin/music/selecter.go index e6fd1cd124..5f43844404 100644 --- a/plugin/music/selecter.go +++ b/plugin/music/selecter.go @@ -61,7 +61,6 @@ func longzhu(keyword string) message.Segment { // 假设 data 是包含整个 JSON 数组的字节切片 results := gjson.ParseBytes(data).Array() for _, result := range results { - fmt.Print(result) if strings.Contains(strings.ToLower(result.Get("title").String()), strings.ToLower(keyword)) { if musicURL := result.Get("full_track").String(); musicURL != "" { return message.Record(musicURL)