From f7c0f4df9837b7149d625426693b5527bf7d29dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Fri, 26 Sep 2025 00:37:44 +0800 Subject: [PATCH 01/12] feat(aichat): add terminus --- go.mod | 2 +- go.sum | 4 ++-- plugin/aichat/main.go | 7 +++++++ 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index d6e1fb10..ad887654 100644 --- a/go.mod +++ b/go.mod @@ -24,7 +24,7 @@ require ( github.com/fumiama/cron v1.3.0 github.com/fumiama/deepinfra v0.0.0-20250924162107-cf156d49a0fa github.com/fumiama/go-base16384 v1.7.0 - github.com/fumiama/go-onebot-agent v0.0.0-20250925150209-46ace7c2b17a + github.com/fumiama/go-onebot-agent v0.0.0-20250925163239-0ede409f6187 github.com/fumiama/go-registry v0.2.7 github.com/fumiama/gotracemoe v0.0.3 github.com/fumiama/jieba v0.0.0-20221203025406-36c17a10b565 diff --git a/go.sum b/go.sum index bcb5e1fe..20871f2e 100644 --- a/go.sum +++ b/go.sum @@ -63,8 +63,8 @@ github.com/fumiama/deepinfra v0.0.0-20250924162107-cf156d49a0fa h1:UMMNejpPp8dn9 github.com/fumiama/deepinfra v0.0.0-20250924162107-cf156d49a0fa/go.mod h1:uqsWK/GM9OvKV0pXZOQB63rWugBbiXInY8E1JoRKhkg= github.com/fumiama/go-base16384 v1.7.0 h1:6fep7XPQWxRlh4Hu+KsdH+6+YdUp+w6CwRXtMWSsXCA= github.com/fumiama/go-base16384 v1.7.0/go.mod h1:OEn+947GV5gsbTAnyuUW/SrfxJYUdYupSIQXOuGOcXM= -github.com/fumiama/go-onebot-agent v0.0.0-20250925150209-46ace7c2b17a h1:PapkA1fkFCzBbcmFaxRQvRAHbRig3NIgstzG7OFcXjQ= -github.com/fumiama/go-onebot-agent v0.0.0-20250925150209-46ace7c2b17a/go.mod h1:FIhZxVeFAs201W06EgXxx/6b/l/ETSmu2sQOj10kjdk= +github.com/fumiama/go-onebot-agent v0.0.0-20250925163239-0ede409f6187 h1:kO+Ye7JdQLiUXpDqcBFOMeg5wmPovemTS/khlN+n+tU= +github.com/fumiama/go-onebot-agent v0.0.0-20250925163239-0ede409f6187/go.mod h1:FIhZxVeFAs201W06EgXxx/6b/l/ETSmu2sQOj10kjdk= github.com/fumiama/go-registry v0.2.7 h1:tLEqgEpsiybQMqBv0dLHm5leia/z1DhajMupwnOHeNs= github.com/fumiama/go-registry v0.2.7/go.mod h1:m+wp5fF8dYgVoFkBPZl+vlK90loymaJE0JCtocVQLEs= github.com/fumiama/go-simple-protobuf v0.2.0 h1:ACyN1MAlu7pDR3EszWgzUeNP+IRsSHwH6V9JCJA5R5o= diff --git a/plugin/aichat/main.go b/plugin/aichat/main.go index 98ac2f39..d7eead7d 100644 --- a/plugin/aichat/main.go +++ b/plugin/aichat/main.go @@ -122,11 +122,18 @@ func init() { ag.SetViewImageAPI(deepinfra.NewAPI(cfg.ImageAPI, string(cfg.ImageKey)), mod) } ctx.NoTimeout() + hasresp := false + defer func() { + if hasresp { + ag.AddTerminus(gid) + } + }() for i := 0; i < 8; i++ { // 最大运行 8 轮因为问答上下文只有 16 reqs := chat.CallAgent(ag, zero.SuperUserPermission(ctx), x, mod, gid, role) if len(reqs) == 0 { return } + hasresp = true for _, req := range reqs { resp := ctx.CallAction(req.Action, req.Params) logrus.Infoln("[aichat] agent get resp:", reqs) From 109395a6af34638da0fe5cc00665e932a1e2915d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Fri, 26 Sep 2025 00:48:28 +0800 Subject: [PATCH 02/12] fix(aichat): terminus --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index ad887654..cdd83476 100644 --- a/go.mod +++ b/go.mod @@ -24,7 +24,7 @@ require ( github.com/fumiama/cron v1.3.0 github.com/fumiama/deepinfra v0.0.0-20250924162107-cf156d49a0fa github.com/fumiama/go-base16384 v1.7.0 - github.com/fumiama/go-onebot-agent v0.0.0-20250925163239-0ede409f6187 + github.com/fumiama/go-onebot-agent v0.0.0-20250925164527-8abc7b1c3876 github.com/fumiama/go-registry v0.2.7 github.com/fumiama/gotracemoe v0.0.3 github.com/fumiama/jieba v0.0.0-20221203025406-36c17a10b565 diff --git a/go.sum b/go.sum index 20871f2e..48a8a106 100644 --- a/go.sum +++ b/go.sum @@ -65,6 +65,8 @@ github.com/fumiama/go-base16384 v1.7.0 h1:6fep7XPQWxRlh4Hu+KsdH+6+YdUp+w6CwRXtMW github.com/fumiama/go-base16384 v1.7.0/go.mod h1:OEn+947GV5gsbTAnyuUW/SrfxJYUdYupSIQXOuGOcXM= github.com/fumiama/go-onebot-agent v0.0.0-20250925163239-0ede409f6187 h1:kO+Ye7JdQLiUXpDqcBFOMeg5wmPovemTS/khlN+n+tU= github.com/fumiama/go-onebot-agent v0.0.0-20250925163239-0ede409f6187/go.mod h1:FIhZxVeFAs201W06EgXxx/6b/l/ETSmu2sQOj10kjdk= +github.com/fumiama/go-onebot-agent v0.0.0-20250925164527-8abc7b1c3876 h1:+4qyHAJv2bts52YWqeVPRd2WRciF78hH7H71SKkTY18= +github.com/fumiama/go-onebot-agent v0.0.0-20250925164527-8abc7b1c3876/go.mod h1:FIhZxVeFAs201W06EgXxx/6b/l/ETSmu2sQOj10kjdk= github.com/fumiama/go-registry v0.2.7 h1:tLEqgEpsiybQMqBv0dLHm5leia/z1DhajMupwnOHeNs= github.com/fumiama/go-registry v0.2.7/go.mod h1:m+wp5fF8dYgVoFkBPZl+vlK90loymaJE0JCtocVQLEs= github.com/fumiama/go-simple-protobuf v0.2.0 h1:ACyN1MAlu7pDR3EszWgzUeNP+IRsSHwH6V9JCJA5R5o= From d304cda7f041232e1e4eb746d46efa125d71c065 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Fri, 26 Sep 2025 01:37:23 +0800 Subject: [PATCH 03/12] fix(aichat): terminus --- go.mod | 2 +- go.sum | 6 ++---- plugin/aichat/storage.go | 8 ++++---- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index cdd83476..fdd95de0 100644 --- a/go.mod +++ b/go.mod @@ -24,7 +24,7 @@ require ( github.com/fumiama/cron v1.3.0 github.com/fumiama/deepinfra v0.0.0-20250924162107-cf156d49a0fa github.com/fumiama/go-base16384 v1.7.0 - github.com/fumiama/go-onebot-agent v0.0.0-20250925164527-8abc7b1c3876 + github.com/fumiama/go-onebot-agent v0.0.0-20250925171858-9c2cb926ec95 github.com/fumiama/go-registry v0.2.7 github.com/fumiama/gotracemoe v0.0.3 github.com/fumiama/jieba v0.0.0-20221203025406-36c17a10b565 diff --git a/go.sum b/go.sum index 48a8a106..7d537bba 100644 --- a/go.sum +++ b/go.sum @@ -63,10 +63,8 @@ github.com/fumiama/deepinfra v0.0.0-20250924162107-cf156d49a0fa h1:UMMNejpPp8dn9 github.com/fumiama/deepinfra v0.0.0-20250924162107-cf156d49a0fa/go.mod h1:uqsWK/GM9OvKV0pXZOQB63rWugBbiXInY8E1JoRKhkg= github.com/fumiama/go-base16384 v1.7.0 h1:6fep7XPQWxRlh4Hu+KsdH+6+YdUp+w6CwRXtMWSsXCA= github.com/fumiama/go-base16384 v1.7.0/go.mod h1:OEn+947GV5gsbTAnyuUW/SrfxJYUdYupSIQXOuGOcXM= -github.com/fumiama/go-onebot-agent v0.0.0-20250925163239-0ede409f6187 h1:kO+Ye7JdQLiUXpDqcBFOMeg5wmPovemTS/khlN+n+tU= -github.com/fumiama/go-onebot-agent v0.0.0-20250925163239-0ede409f6187/go.mod h1:FIhZxVeFAs201W06EgXxx/6b/l/ETSmu2sQOj10kjdk= -github.com/fumiama/go-onebot-agent v0.0.0-20250925164527-8abc7b1c3876 h1:+4qyHAJv2bts52YWqeVPRd2WRciF78hH7H71SKkTY18= -github.com/fumiama/go-onebot-agent v0.0.0-20250925164527-8abc7b1c3876/go.mod h1:FIhZxVeFAs201W06EgXxx/6b/l/ETSmu2sQOj10kjdk= +github.com/fumiama/go-onebot-agent v0.0.0-20250925171858-9c2cb926ec95 h1:ZIS5BF51BkRhwfxmEVdn5mdoH1AKKFodwqpRJWl4mWs= +github.com/fumiama/go-onebot-agent v0.0.0-20250925171858-9c2cb926ec95/go.mod h1:FIhZxVeFAs201W06EgXxx/6b/l/ETSmu2sQOj10kjdk= github.com/fumiama/go-registry v0.2.7 h1:tLEqgEpsiybQMqBv0dLHm5leia/z1DhajMupwnOHeNs= github.com/fumiama/go-registry v0.2.7/go.mod h1:m+wp5fF8dYgVoFkBPZl+vlK90loymaJE0JCtocVQLEs= github.com/fumiama/go-simple-protobuf v0.2.0 h1:ACyN1MAlu7pDR3EszWgzUeNP+IRsSHwH6V9JCJA5R5o= diff --git a/plugin/aichat/storage.go b/plugin/aichat/storage.go index 7195a941..0e7f79e2 100644 --- a/plugin/aichat/storage.go +++ b/plugin/aichat/storage.go @@ -116,7 +116,7 @@ func newstoragebool(bmp int64) func(ctx *zero.Ctx) { } return func(ctx *zero.Ctx) { args := ctx.State["regex_matched"].([]string) - iszero := args[1] == "不" + isone := args[1] == "不" gid := ctx.Event.GroupID if gid == 0 { gid = -ctx.Event.UserID @@ -126,9 +126,9 @@ func newstoragebool(bmp int64) func(ctx *zero.Ctx) { ctx.SendChain(message.Text("ERROR: ", err)) return } - v := 1 - if iszero { - v = 0 + v := 0 + if isone { + v = 1 } stor.setbybmp(int64(v), bmp) err = stor.saveto(ctx, gid) From dd328afae83956ba2a160e345b9e23f13279f6ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=B9=E6=9F=B3=E7=85=9C?= <101934327+fangliuyu@users.noreply.github.com> Date: Fri, 26 Sep 2025 23:11:10 +0800 Subject: [PATCH 04/12] fix: wifegame (#1225) --- plugin/wife/main.go | 29 +++++------ plugin/wife/wifegame.go | 103 ++++++++++++---------------------------- 2 files changed, 46 insertions(+), 86 deletions(-) diff --git a/plugin/wife/main.go b/plugin/wife/main.go index 75bd1e89..dd60d863 100644 --- a/plugin/wife/main.go +++ b/plugin/wife/main.go @@ -25,19 +25,7 @@ var ( Brief: "从老婆库抽每日老婆", PublicDataFolder: "Wife", }).ApplySingle(ctxext.DefaultSingle) -) - -func card2name(card string) (string, string) { - match := re.FindStringSubmatch(card) - if len(match) >= 3 { - return match[1], match[2] - } - return "", "" -} - -func init() { - _ = os.MkdirAll(engine.DataFolder()+"wives", 0755) - engine.OnFullMatch("抽老婆", fcext.DoOnceOnSuccess( + getJSON = fcext.DoOnceOnSuccess( func(ctx *zero.Ctx) bool { data, err := engine.GetLazyData("wife.json", true) if err != nil { @@ -52,7 +40,20 @@ func init() { logrus.Infof("[wife]加载%d个老婆", len(cards)) return true }, - )).SetBlock(true). + ) +) + +func card2name(card string) (string, string) { + match := re.FindStringSubmatch(card) + if len(match) >= 3 { + return match[1], match[2] + } + return "", "" +} + +func init() { + _ = os.MkdirAll(engine.DataFolder()+"wives", 0755) + engine.OnFullMatch("抽老婆", getJSON).SetBlock(true). Handle(func(ctx *zero.Ctx) { card := cards[fcext.RandSenderPerDayN(ctx.Event.UserID, len(cards))] data, err := engine.GetLazyData("wives/"+card, true) diff --git a/plugin/wife/wifegame.go b/plugin/wife/wifegame.go index f2b1c286..d8051e52 100644 --- a/plugin/wife/wifegame.go +++ b/plugin/wife/wifegame.go @@ -2,16 +2,13 @@ package wife import ( - "errors" + "bytes" + "image" "image/color" - "io/fs" "math/rand" - "os" "strings" "time" - "github.com/FloatTech/floatbox/file" - "github.com/FloatTech/gg" ctrl "github.com/FloatTech/zbpctrl" "github.com/FloatTech/zbputils/control" "github.com/FloatTech/zbputils/ctxext" @@ -32,25 +29,18 @@ var ( ) func init() { - // _ = os.MkdirAll(engine.DataFolder()+"wives", 0755) - enguess.OnFullMatch("猜老婆").SetBlock(true).Limit(ctxext.LimitByUser).Handle(func(ctx *zero.Ctx) { - var err error + enguess.OnFullMatch("猜老婆", getJSON).SetBlock(true).Limit(ctxext.LimitByUser).Handle(func(ctx *zero.Ctx) { class := 3 - fileName, err := lottery() + card := cards[rand.Intn(len(cards))] + pic, err := engine.GetLazyData("wives/"+card, true) if err != nil { ctx.SendChain(message.Text("[猜老婆]error:\n", err)) return } - - work, name := card2name(fileName) - picFile := file.BOTPATH + "/" + engine.DataFolder() + "wives/" + fileName - pic, err := os.ReadFile(picFile) - if err != nil { - ctx.SendChain(message.Text("[猜老婆]error:\n", err)) - return - } - img, err := gg.LoadImage(picFile) + work, name := card2name(card) + name = strings.ToLower(name) + img, _, err := image.Decode(bytes.NewReader(pic)) if err != nil { ctx.SendChain(message.Text("[猜老婆]error:\n", err)) return @@ -67,13 +57,13 @@ func init() { if id := ctx.SendChain( message.ImageBytes(q), ); id.ID() != 0 { - ctx.SendChain(message.Text("请回答该二次元角色名字\n以“xxx酱”格式回答")) + ctx.SendChain(message.Text("请回答该二次元角色名字\n以“xxx酱”格式回答\n发送“跳过”结束猜题")) } var next *zero.FutureEvent if ctx.Event.GroupID == 0 { - next = zero.NewFutureEvent("message", 999, false, zero.RegexRule(`(·)?.+酱$`), ctx.CheckSession()) + next = zero.NewFutureEvent("message", 999, false, zero.RegexRule(`^(·)?[^酱]+酱|^跳过$`), ctx.CheckSession()) } else { - next = zero.NewFutureEvent("message", 999, false, zero.RegexRule(`(·)?.+酱$`), zero.CheckGroup(ctx.Event.GroupID)) + next = zero.NewFutureEvent("message", 999, false, zero.RegexRule(`^(·)?[^酱]+酱|^跳过$`), zero.CheckGroup(ctx.Event.GroupID)) } recv, cancel := next.Repeat() defer cancel() @@ -92,12 +82,22 @@ func init() { ) return case c := <-recv: - tick.Reset(105 * time.Second) - after.Reset(120 * time.Second) - msg := c.Event.Message.String() - msg, _, _ = strings.Cut(msg, "酱") + // tick.Reset(105 * time.Second) + // after.Reset(120 * time.Second) + msg := strings.ReplaceAll(c.Event.Message.String(), "酱", "") + if msg == "" { + continue + } + if msg == "跳过" { + if msgID := ctx.Send(message.ReplyWithMessage(c.Event.MessageID, + message.Text("已跳过猜题\n角色是:\n", name, "\n出自《", work, "》\n"), + message.ImageBytes(pic))); msgID.ID() == 0 { + ctx.SendChain(message.Text("太棒了,你猜对了!\n图片发送失败,可能被风控\n角色是:\n", name, "\n出自《", work, "》")) + } + return + } class-- - if strings.Contains(name, msg) { + if strings.Contains(name, strings.ToLower(msg)) { if msgID := ctx.Send(message.ReplyWithMessage(c.Event.MessageID, message.Text("太棒了,你猜对了!\n角色是:\n", name, "\n出自《", work, "》\n"), message.ImageBytes(pic))); msgID.ID() == 0 { @@ -120,8 +120,12 @@ func init() { ) continue } + msg = "" + if class == 2 { + msg = "(提示:" + work + ")\n" + } ctx.SendChain( - message.Text("回答错误,你还有", class, "次机会\n请继续作答(难度降低)\n"), + message.Text("回答错误,你还有", class, "次机会\n", msg, "请继续作答(难度降低)\n"), message.ImageBytes(q), ) continue @@ -130,51 +134,6 @@ func init() { }) } -// 从本地图库随机抽取,规避网络问题 -func lottery() (fileName string, err error) { - path := engine.DataFolder() + "wives" + "/" - if file.IsNotExist(path) { - err = errors.New("图库文件夹不存在,请先发送“抽老婆”扩展图库") - return - } - files, err := os.ReadDir(path) - if err != nil { - return - } - // 如果本地列表为空 - if len(files) == 0 { - err = errors.New("本地数据为0,请先发送“抽老婆”扩展图库") - return - } - fileName = randPicture(files, 10) - if fileName == "" { - err = errors.New("抽取图库轮空了,请重试") - } - return -} - -func randPicture(files []fs.DirEntry, indexMax int) (fileName string) { - if len(files) > 1 { - picture := files[rand.Intn(len(files))] - // 如果是文件夹就递归 - if picture.IsDir() { - indexMax-- - if indexMax <= 0 { - return - } - fileName = randPicture(files, indexMax) - } else { - fileName = picture.Name() - } - } else { - music := files[0] - if !music.IsDir() { - fileName = files[0].Name() - } - } - return -} - // 马赛克生成 func mosaic(dst *imgfactory.Factory, level int) ([]byte, error) { b := dst.Image().Bounds() From 3302d8d2957bcbcd86c4d3cee58ee57687c9755a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Fri, 26 Sep 2025 23:50:44 +0800 Subject: [PATCH 05/12] feat(aichat): agent support fallback to normal chat --- README.md | 8 +-- go.mod | 4 +- go.sum | 8 +-- plugin/aichat/cfg.go | 33 +++++++++- plugin/aichat/main.go | 127 ++++++++++++++++----------------------- plugin/aichat/storage.go | 114 ++++------------------------------- 6 files changed, 104 insertions(+), 190 deletions(-) diff --git a/README.md b/README.md index 70361326..480fb0b6 100644 --- a/README.md +++ b/README.md @@ -1633,12 +1633,12 @@ print("run[CQ:image,file="+j["img"]+"]") - [x] 设置AI聊天触发概率10 - [x] 设置AI聊天温度80 - - [x] 设置AI聊天(识图)接口类型[OpenAI|OLLaMA|GenAI] + - [x] 设置AI聊天(识图|Agent)接口类型[OpenAI|OLLaMA|GenAI] - [x] 设置AI聊天(不)使用Agent模式 - [x] 设置AI聊天(不)支持系统提示词 - - [x] 设置AI聊天(识图)接口地址https://api.siliconflow.cn/v1/chat/completions - - [x] 设置AI聊天(识图)密钥xxx - - [x] 设置AI聊天(识图)模型名Qwen/Qwen3-8B + - [x] 设置AI聊天(识图|Agent)接口地址https://api.siliconflow.cn/v1/chat/completions + - [x] 设置AI聊天(识图|Agent)密钥xxx + - [x] 设置AI聊天(识图|Agent)模型名Qwen/Qwen3-8B - [x] 查看AI聊天系统提示词 - [x] 重置AI聊天系统提示词 - [x] 设置AI聊天系统提示词xxx diff --git a/go.mod b/go.mod index fdd95de0..c06fe32e 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,7 @@ require ( github.com/FloatTech/sqlite v1.7.1 github.com/FloatTech/ttl v0.0.0-20240716161252-965925764562 github.com/FloatTech/zbpctrl v1.7.0 - github.com/FloatTech/zbputils v1.7.2-0.20250925155009-638ed762e15e + github.com/FloatTech/zbputils v1.7.2-0.20250926153026-d616e2b87477 github.com/RomiChan/syncx v0.0.0-20240418144900-b7402ffdebc7 github.com/RomiChan/websocket v1.4.3-0.20220227141055-9b2c6168c9c5 github.com/Tnze/go-mc v1.20.2 @@ -24,7 +24,7 @@ require ( github.com/fumiama/cron v1.3.0 github.com/fumiama/deepinfra v0.0.0-20250924162107-cf156d49a0fa github.com/fumiama/go-base16384 v1.7.0 - github.com/fumiama/go-onebot-agent v0.0.0-20250925171858-9c2cb926ec95 + github.com/fumiama/go-onebot-agent v0.0.0-20250926145606-37ebfa6131c8 github.com/fumiama/go-registry v0.2.7 github.com/fumiama/gotracemoe v0.0.3 github.com/fumiama/jieba v0.0.0-20221203025406-36c17a10b565 diff --git a/go.sum b/go.sum index 7d537bba..dd1a66e1 100644 --- a/go.sum +++ b/go.sum @@ -17,8 +17,8 @@ github.com/FloatTech/ttl v0.0.0-20240716161252-965925764562 h1:snfw7FNFym1eNnLrQ github.com/FloatTech/ttl v0.0.0-20240716161252-965925764562/go.mod h1:fHZFWGquNXuHttu9dUYoKuNbm3dzLETnIOnm1muSfDs= github.com/FloatTech/zbpctrl v1.7.0 h1:Hxo6EIhJo+pHjcQP9QgIJgluaT1pHH99zkk3njqTNMo= github.com/FloatTech/zbpctrl v1.7.0/go.mod h1:xmM4dSwHA02Gei3ogCRiG+RTrw/7Z69PfrN5NYf8BPE= -github.com/FloatTech/zbputils v1.7.2-0.20250925155009-638ed762e15e h1:M+pIxQFztHqrtUVmfctSs/D5ytn0ag6twP6iJg3gdEk= -github.com/FloatTech/zbputils v1.7.2-0.20250925155009-638ed762e15e/go.mod h1:AUDxqs7liBF2H7TpSs+OXZj1Akyh0moUN/J/j8iNFxc= +github.com/FloatTech/zbputils v1.7.2-0.20250926153026-d616e2b87477 h1:T1ugPphuYnLUWvJOw0S200p2tjM2rzVdwIz76rtGt8E= +github.com/FloatTech/zbputils v1.7.2-0.20250926153026-d616e2b87477/go.mod h1:hIXcVZ3CFiL3dnM1QcZUMCjKhVryYY0EnJVN0kicB9A= github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc= github.com/RomiChan/syncx v0.0.0-20240418144900-b7402ffdebc7 h1:S/ferNiehVjNaBMNNBxUjLtVmP/YWD6Yh79RfPv4ehU= github.com/RomiChan/syncx v0.0.0-20240418144900-b7402ffdebc7/go.mod h1:vD7Ra3Q9onRtojoY5sMCLQ7JBgjUsrXDnDKyFxqpf9w= @@ -63,8 +63,8 @@ github.com/fumiama/deepinfra v0.0.0-20250924162107-cf156d49a0fa h1:UMMNejpPp8dn9 github.com/fumiama/deepinfra v0.0.0-20250924162107-cf156d49a0fa/go.mod h1:uqsWK/GM9OvKV0pXZOQB63rWugBbiXInY8E1JoRKhkg= github.com/fumiama/go-base16384 v1.7.0 h1:6fep7XPQWxRlh4Hu+KsdH+6+YdUp+w6CwRXtMWSsXCA= github.com/fumiama/go-base16384 v1.7.0/go.mod h1:OEn+947GV5gsbTAnyuUW/SrfxJYUdYupSIQXOuGOcXM= -github.com/fumiama/go-onebot-agent v0.0.0-20250925171858-9c2cb926ec95 h1:ZIS5BF51BkRhwfxmEVdn5mdoH1AKKFodwqpRJWl4mWs= -github.com/fumiama/go-onebot-agent v0.0.0-20250925171858-9c2cb926ec95/go.mod h1:FIhZxVeFAs201W06EgXxx/6b/l/ETSmu2sQOj10kjdk= +github.com/fumiama/go-onebot-agent v0.0.0-20250926145606-37ebfa6131c8 h1:aXk5IVXvPy2IfajL6gH+V/6ZOVV1BBVKjnFISLvyw60= +github.com/fumiama/go-onebot-agent v0.0.0-20250926145606-37ebfa6131c8/go.mod h1:oH8DGDpRPjUAu8Fd/K+RxsB+z0Yis+BHeJAh+ZkO5EM= github.com/fumiama/go-registry v0.2.7 h1:tLEqgEpsiybQMqBv0dLHm5leia/z1DhajMupwnOHeNs= github.com/fumiama/go-registry v0.2.7/go.mod h1:m+wp5fF8dYgVoFkBPZl+vlK90loymaJE0JCtocVQLEs= github.com/fumiama/go-simple-protobuf v0.2.0 h1:ACyN1MAlu7pDR3EszWgzUeNP+IRsSHwH6V9JCJA5R5o= diff --git a/plugin/aichat/cfg.go b/plugin/aichat/cfg.go index 14b2bc0f..be34967b 100644 --- a/plugin/aichat/cfg.go +++ b/plugin/aichat/cfg.go @@ -93,17 +93,20 @@ func (mk ModelKey) String() string { type config struct { ModelName string ImageModelName string + AgentModelName string Type ModelType ImageType ModelType + AgentType ModelType MaxN uint TopP float32 SystemP string API string ImageAPI string + AgentAPI string Key ModelKey ImageKey ModelKey + AgentKey ModelKey Separator string - NoReplyAT ModelBool NoSystemP ModelBool } @@ -130,7 +133,6 @@ func (c *config) String() string { sb.WriteString(fmt.Sprintf("• 密钥:%v\n", c.Key)) sb.WriteString(fmt.Sprintf("• 图像密钥:%v\n", c.ImageKey)) sb.WriteString(fmt.Sprintf("• 分隔符:%s\n", c.Separator)) - sb.WriteString(fmt.Sprintf("• 响应@:%v\n", !c.NoReplyAT)) sb.WriteString(fmt.Sprintf("• 支持系统提示词:%v\n", !c.NoSystemP)) return sb.String() } @@ -267,3 +269,30 @@ func newextrasetfloat32(ptr *float32) func(ctx *zero.Ctx) { ctx.SendChain(message.Text("成功")) } } + +func newextrasetmodeltype(ptr *ModelType) func(ctx *zero.Ctx) { + return func(ctx *zero.Ctx) { + args := strings.TrimSpace(ctx.State["args"].(string)) + if args == "" { + ctx.SendChain(message.Text("ERROR: empty args")) + return + } + c, ok := ctx.State["manager"].(*ctrl.Control[*zero.Ctx]) + if !ok { + ctx.SendChain(message.Text("ERROR: no such plugin")) + return + } + typ, err := newModelType(args) + if err != nil { + ctx.SendChain(message.Text("ERROR: ", err)) + return + } + *ptr = typ + err = c.SetExtra(&cfg) + if err != nil { + ctx.SendChain(message.Text("ERROR: set extra err: ", err)) + return + } + ctx.SendChain(message.Text("成功")) + } +} diff --git a/plugin/aichat/main.go b/plugin/aichat/main.go index d7eead7d..49cc8a79 100644 --- a/plugin/aichat/main.go +++ b/plugin/aichat/main.go @@ -34,12 +34,12 @@ var ( Brief: "OpenAI聊天", Help: "- 设置AI聊天触发概率10\n" + "- 设置AI聊天温度80\n" + - "- 设置AI聊天(识图)接口类型[OpenAI|OLLaMA|GenAI]\n" + + "- 设置AI聊天(识图|Agent)接口类型[OpenAI|OLLaMA|GenAI]\n" + "- 设置AI聊天(不)使用Agent模式\n" + "- 设置AI聊天(不)支持系统提示词\n" + - "- 设置AI聊天(识图)接口地址https://api.siliconflow.cn/v1/chat/completions\n" + - "- 设置AI聊天(识图)密钥xxx\n" + - "- 设置AI聊天(识图)模型名Qwen/Qwen3-8B\n" + + "- 设置AI聊天(识图|Agent)接口地址https://api.siliconflow.cn/v1/chat/completions\n" + + "- 设置AI聊天(识图|Agent)密钥xxx\n" + + "- 设置AI聊天(识图|Agent)模型名Qwen/Qwen3-8B\n" + "- 查看AI聊天系统提示词\n" + "- 重置AI聊天系统提示词\n" + "- 设置AI聊天系统提示词xxx\n" + @@ -71,9 +71,6 @@ var ( func init() { en.OnMessage(ensureconfig, func(ctx *zero.Ctx) bool { - return ctx.ExtractPlainText() != "" && - (bool(!cfg.NoReplyAT) || (bool(cfg.NoReplyAT) && !ctx.Event.IsToMe)) - }).SetBlock(false).Handle(func(ctx *zero.Ctx) { gid := ctx.Event.GroupID if gid == 0 { gid = -ctx.Event.UserID @@ -81,8 +78,17 @@ func init() { stor, err := newstorage(ctx, gid) if err != nil { logrus.Warnln("ERROR: ", err) - return + return false } + ctx.State["__aichat_stor__"] = stor + return ctx.ExtractPlainText() != "" && + (bool(!stor.noreplyat()) || (bool(stor.noreplyat()) && !ctx.Event.IsToMe)) + }).SetBlock(false).Handle(func(ctx *zero.Ctx) { + gid := ctx.Event.GroupID + if gid == 0 { + gid = -ctx.Event.UserID + } + stor := ctx.State["__aichat_stor__"].(storage) rate := stor.rate() if !ctx.Event.IsToMe && rand.Intn(100) >= int(rate) { return @@ -97,14 +103,13 @@ func init() { temperature := stor.temp() topp, maxn := cfg.mparams() - x := deepinfra.NewAPI(cfg.API, string(cfg.Key)) - mod, err := cfg.Type.protocol(cfg.ModelName, temperature, topp, maxn) - if err != nil { - logrus.Warnln("ERROR: ", err) - return - } - if !stor.noagent() { + x := deepinfra.NewAPI(cfg.AgentAPI, string(cfg.AgentKey)) + mod, err := cfg.Type.protocol(cfg.AgentModelName, temperature, topp, maxn) + if err != nil { + logrus.Warnln("ERROR: ", err) + return + } role := goba.PermRoleUser if zero.AdminPermission(ctx) { role = goba.PermRoleAdmin @@ -123,15 +128,10 @@ func init() { } ctx.NoTimeout() hasresp := false - defer func() { - if hasresp { - ag.AddTerminus(gid) - } - }() for i := 0; i < 8; i++ { // 最大运行 8 轮因为问答上下文只有 16 reqs := chat.CallAgent(ag, zero.SuperUserPermission(ctx), x, mod, gid, role) if len(reqs) == 0 { - return + break } hasresp = true for _, req := range reqs { @@ -146,9 +146,19 @@ func init() { }) } } - return + if hasresp { + ag.AddTerminus(gid) + return + } + // no response, fall back to normal chat } + x := deepinfra.NewAPI(cfg.API, string(cfg.Key)) + mod, err := cfg.Type.protocol(cfg.ModelName, temperature, topp, maxn) + if err != nil { + logrus.Warnln("ERROR: ", err) + return + } data, err := x.Request(chat.GetChatContext(mod, gid, cfg.SystemP, bool(cfg.NoSystemP))) if err != nil { logrus.Warnln("[aichat] post err:", err) @@ -188,68 +198,34 @@ func init() { } } }) - en.OnPrefix("设置AI聊天触发概率", zero.AdminPermission).SetBlock(true).Handle(newstoragebitmap(bitmaprate, 0, 100)) - en.OnPrefix("设置AI聊天温度", zero.AdminPermission).SetBlock(true).Handle(newstoragebitmap(bitmaptemp, 0, 100)) - en.OnPrefix("设置AI聊天接口类型", ensureconfig, zero.OnlyPrivate, zero.SuperUserPermission).SetBlock(true).Handle(func(ctx *zero.Ctx) { - args := strings.TrimSpace(ctx.State["args"].(string)) - if args == "" { - ctx.SendChain(message.Text("ERROR: empty args")) - return - } - c, ok := ctx.State["manager"].(*ctrl.Control[*zero.Ctx]) - if !ok { - ctx.SendChain(message.Text("ERROR: no such plugin")) - return - } - typ, err := newModelType(args) - if err != nil { - ctx.SendChain(message.Text("ERROR: ", err)) - return - } - cfg.Type = typ - err = c.SetExtra(&cfg) - if err != nil { - ctx.SendChain(message.Text("ERROR: set extra err: ", err)) - return - } - ctx.SendChain(message.Text("成功")) - }) - en.OnPrefix("设置AI聊天识图接口类型", ensureconfig, zero.OnlyPrivate, zero.SuperUserPermission).SetBlock(true).Handle(func(ctx *zero.Ctx) { - args := strings.TrimSpace(ctx.State["args"].(string)) - if args == "" { - ctx.SendChain(message.Text("ERROR: empty args")) - return - } - c, ok := ctx.State["manager"].(*ctrl.Control[*zero.Ctx]) - if !ok { - ctx.SendChain(message.Text("ERROR: no such plugin")) - return - } - typ, err := newModelType(args) - if err != nil { - ctx.SendChain(message.Text("ERROR: ", err)) - return - } - cfg.ImageType = typ - err = c.SetExtra(&cfg) - if err != nil { - ctx.SendChain(message.Text("ERROR: set extra err: ", err)) - return - } - ctx.SendChain(message.Text("成功")) - }) + en.OnPrefix("设置AI聊天触发概率", zero.AdminPermission).SetBlock(true). + Handle(ctxext.NewStorageSaveBitmapHandler(bitmaprate, 0, 100)) + en.OnPrefix("设置AI聊天温度", zero.AdminPermission).SetBlock(true). + Handle(ctxext.NewStorageSaveBitmapHandler(bitmaptemp, 0, 100)) + en.OnPrefix("设置AI聊天接口类型", ensureconfig, zero.OnlyPrivate, zero.SuperUserPermission).SetBlock(true). + Handle(newextrasetmodeltype(&cfg.Type)) + en.OnPrefix("设置AI聊天识图接口类型", ensureconfig, zero.OnlyPrivate, zero.SuperUserPermission).SetBlock(true). + Handle(newextrasetmodeltype(&cfg.ImageType)) + en.OnPrefix("设置AI聊天Agent接口类型", ensureconfig, zero.OnlyPrivate, zero.SuperUserPermission).SetBlock(true). + Handle(newextrasetmodeltype(&cfg.AgentType)) en.OnPrefix("设置AI聊天接口地址", ensureconfig, zero.OnlyPrivate, zero.SuperUserPermission).SetBlock(true). Handle(newextrasetstr(&cfg.API)) en.OnPrefix("设置AI聊天识图接口地址", ensureconfig, zero.OnlyPrivate, zero.SuperUserPermission).SetBlock(true). Handle(newextrasetstr(&cfg.ImageAPI)) + en.OnPrefix("设置AI聊天Agent接口地址", ensureconfig, zero.OnlyPrivate, zero.SuperUserPermission).SetBlock(true). + Handle(newextrasetstr(&cfg.AgentAPI)) en.OnPrefix("设置AI聊天密钥", ensureconfig, zero.OnlyPrivate, zero.SuperUserPermission).SetBlock(true). Handle(newextrasetstr(&cfg.Key)) en.OnPrefix("设置AI聊天识图密钥", ensureconfig, zero.OnlyPrivate, zero.SuperUserPermission).SetBlock(true). Handle(newextrasetstr(&cfg.ImageKey)) + en.OnPrefix("设置AI聊天Agent密钥", ensureconfig, zero.OnlyPrivate, zero.SuperUserPermission).SetBlock(true). + Handle(newextrasetstr(&cfg.ImageKey)) en.OnPrefix("设置AI聊天模型名", ensureconfig, zero.OnlyPrivate, zero.SuperUserPermission).SetBlock(true). Handle(newextrasetstr(&cfg.ModelName)) en.OnPrefix("设置AI聊天识图模型名", ensureconfig, zero.OnlyPrivate, zero.SuperUserPermission).SetBlock(true). Handle(newextrasetstr(&cfg.ImageModelName)) + en.OnPrefix("设置AI聊天Agent模型名", ensureconfig, zero.OnlyPrivate, zero.SuperUserPermission).SetBlock(true). + Handle(newextrasetstr(&cfg.ImageModelName)) en.OnPrefix("设置AI聊天系统提示词", ensureconfig, zero.OnlyPrivate, zero.SuperUserPermission).SetBlock(true). Handle(newextrasetstr(&cfg.SystemP)) en.OnFullMatch("查看AI聊天系统提示词", ensureconfig, zero.OnlyPrivate, zero.SuperUserPermission).SetBlock(true).Handle(func(ctx *zero.Ctx) { @@ -272,17 +248,17 @@ func init() { en.OnPrefix("设置AI聊天分隔符", ensureconfig, zero.OnlyPrivate, zero.SuperUserPermission).SetBlock(true). Handle(newextrasetstr(&cfg.Separator)) en.OnRegex("^设置AI聊天(不)?响应AT$", ensureconfig, zero.OnlyPrivate, zero.SuperUserPermission).SetBlock(true). - Handle(newextrasetbool(&cfg.NoReplyAT)) + Handle(ctxext.NewStorageSaveBoolHandler(bitmapnrat)) en.OnRegex("^设置AI聊天(不)?支持系统提示词$", ensureconfig, zero.OnlyPrivate, zero.SuperUserPermission).SetBlock(true). Handle(newextrasetbool(&cfg.NoSystemP)) en.OnRegex("^设置AI聊天(不)?使用Agent模式$", ensureconfig, zero.SuperUserPermission).SetBlock(true). - Handle(newstoragebool(bitmapnagt)) + Handle(ctxext.NewStorageSaveBoolHandler(bitmapnagt)) en.OnPrefix("设置AI聊天最大长度", ensureconfig, zero.OnlyPrivate, zero.SuperUserPermission).SetBlock(true). Handle(newextrasetuint(&cfg.MaxN)) en.OnPrefix("设置AI聊天TopP", ensureconfig, zero.OnlyPrivate, zero.SuperUserPermission).SetBlock(true). Handle(newextrasetfloat32(&cfg.TopP)) en.OnRegex("^设置AI聊天(不)?以AI语音输出$", ensureconfig, zero.AdminPermission).SetBlock(true). - Handle(newstoragebool(bitmapnrec)) + Handle(ctxext.NewStorageSaveBoolHandler(bitmapnrec)) en.OnFullMatch("查看AI聊天配置", ensureconfig, zero.OnlyPrivate, zero.SuperUserPermission).SetBlock(true). Handle(func(ctx *zero.Ctx) { gid := ctx.Event.GroupID @@ -298,6 +274,7 @@ func init() { "• 温度:", stor.temp(), "\n", "• 以AI语音输出:", ModelBool(!stor.norecord()), "\n", "• 使用Agent:", ModelBool(!stor.noagent()), "\n", + "• 响应@:", ModelBool(!stor.noreplyat()), "\n", ), message.Text("【当前AI聊天全局配置】\n", &cfg), ) diff --git a/plugin/aichat/storage.go b/plugin/aichat/storage.go index 0e7f79e2..c12a9587 100644 --- a/plugin/aichat/storage.go +++ b/plugin/aichat/storage.go @@ -1,14 +1,8 @@ package aichat import ( - "errors" - "math/bits" - "strconv" - "strings" - - ctrl "github.com/FloatTech/zbpctrl" + "github.com/FloatTech/zbputils/ctxext" zero "github.com/wdvxdr1123/ZeroBot" - "github.com/wdvxdr1123/ZeroBot/message" ) const ( @@ -16,46 +10,22 @@ const ( bitmaptemp = 0x00ff00 bitmapnagt = 0x010000 bitmapnrec = 0x020000 + bitmapnrat = 0x040000 ) -type storage int64 +type storage ctxext.Storage func newstorage(ctx *zero.Ctx, gid int64) (storage, error) { - c, ok := ctx.State["manager"].(*ctrl.Control[*zero.Ctx]) - if !ok { - return 0, errors.New("找不到 manager") - } - x := c.GetData(gid) - return storage(x), nil -} - -func (s storage) saveto(ctx *zero.Ctx, gid int64) error { - c, ok := ctx.State["manager"].(*ctrl.Control[*zero.Ctx]) - if !ok { - return errors.New("找不到 manager") - } - return c.SetData(int64(s), gid) -} - -func (s storage) getbybmp(bmp int64) int64 { - sft := bits.TrailingZeros64(uint64(bmp)) - return (int64(s) & bmp) >> int64(sft) -} - -func (s *storage) setbybmp(x int64, bmp int64) { - if bmp == 0 { - panic("cannot use bmp == 0") - } - sft := bits.TrailingZeros64(uint64(bmp)) - *s = storage((int64(*s) & (^bmp)) | ((x & bmp) << int64(sft))) + s, err := ctxext.NewStorage(ctx, gid) + return storage(s), err } func (s storage) rate() uint8 { - return uint8(s.getbybmp(bitmaprate)) + return uint8((ctxext.Storage)(s).Get(bitmaprate)) } func (s storage) temp() float32 { - temp := s.getbybmp(bitmaptemp) + temp := (ctxext.Storage)(s).Get(bitmaptemp) // 处理温度参数 if temp <= 0 { temp = 70 // default setting @@ -67,75 +37,13 @@ func (s storage) temp() float32 { } func (s storage) noagent() bool { - return s.getbybmp(bitmapnagt) != 0 + return (ctxext.Storage)(s).GetBool(bitmapnagt) } func (s storage) norecord() bool { - return s.getbybmp(bitmapnrec) != 0 + return (ctxext.Storage)(s).GetBool(bitmapnrec) } -func newstoragebitmap(bmp int64, minv, maxv int64) func(ctx *zero.Ctx) { - return func(ctx *zero.Ctx) { - args := strings.TrimSpace(ctx.State["args"].(string)) - if args == "" { - ctx.SendChain(message.Text("ERROR: empty args")) - return - } - r, err := strconv.ParseInt(args, 10, 64) - if err != nil { - ctx.SendChain(message.Text("ERROR: parse int64 err: ", err)) - return - } - if r > maxv { - r = maxv - } else if r < minv { - r = minv - } - gid := ctx.Event.GroupID - if gid == 0 { - gid = -ctx.Event.UserID - } - stor, err := newstorage(ctx, gid) - if err != nil { - ctx.SendChain(message.Text("ERROR: ", err)) - return - } - stor.setbybmp(r, bmp) - err = stor.saveto(ctx, gid) - if err != nil { - ctx.SendChain(message.Text("ERROR: set data err: ", err)) - return - } - ctx.SendChain(message.Text("成功")) - } -} - -func newstoragebool(bmp int64) func(ctx *zero.Ctx) { - if bits.OnesCount64(uint64(bmp)) != 1 { - panic("bool bmp must be 1-bit-long") - } - return func(ctx *zero.Ctx) { - args := ctx.State["regex_matched"].([]string) - isone := args[1] == "不" - gid := ctx.Event.GroupID - if gid == 0 { - gid = -ctx.Event.UserID - } - stor, err := newstorage(ctx, gid) - if err != nil { - ctx.SendChain(message.Text("ERROR: ", err)) - return - } - v := 0 - if isone { - v = 1 - } - stor.setbybmp(int64(v), bmp) - err = stor.saveto(ctx, gid) - if err != nil { - ctx.SendChain(message.Text("ERROR: set data err: ", err)) - return - } - ctx.SendChain(message.Text("成功")) - } +func (s storage) noreplyat() bool { + return (ctxext.Storage)(s).GetBool(bitmapnrat) } From 13aaaba8f32379bc420f551913591344fbad46ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Fri, 26 Sep 2025 23:52:16 +0800 Subject: [PATCH 06/12] fix(aichat): rate print error --- plugin/aichat/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin/aichat/main.go b/plugin/aichat/main.go index 49cc8a79..18901e8f 100644 --- a/plugin/aichat/main.go +++ b/plugin/aichat/main.go @@ -270,7 +270,7 @@ func init() { ctx.SendChain( message.Text( "【当前AI聊天本群配置】\n", - "• 触发概率:", stor.rate(), "\n", + "• 触发概率:", int(stor.rate()), "\n", "• 温度:", stor.temp(), "\n", "• 以AI语音输出:", ModelBool(!stor.norecord()), "\n", "• 使用Agent:", ModelBool(!stor.noagent()), "\n", From d0f4d296d9502e9a4f933019fd5979a4e03538b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Fri, 26 Sep 2025 23:55:01 +0800 Subject: [PATCH 07/12] feat(aichat): fill missing print --- plugin/aichat/cfg.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plugin/aichat/cfg.go b/plugin/aichat/cfg.go index be34967b..bf6dc7c7 100644 --- a/plugin/aichat/cfg.go +++ b/plugin/aichat/cfg.go @@ -123,15 +123,19 @@ func (c *config) String() string { sb := strings.Builder{} sb.WriteString(fmt.Sprintf("• 模型名:%s\n", c.ModelName)) sb.WriteString(fmt.Sprintf("• 图像模型名:%s\n", c.ImageModelName)) + sb.WriteString(fmt.Sprintf("• Agent模型名:%s\n", c.AgentModelName)) sb.WriteString(fmt.Sprintf("• 接口类型:%v\n", c.Type)) sb.WriteString(fmt.Sprintf("• 图像接口类型:%v\n", c.ImageType)) + sb.WriteString(fmt.Sprintf("• Agent接口类型:%v\n", c.AgentType)) sb.WriteString(fmt.Sprintf("• 最大长度:%d\n", maxn)) sb.WriteString(fmt.Sprintf("• TopP:%.1f\n", topp)) sb.WriteString(fmt.Sprintf("• 系统提示词:%s\n", c.SystemP)) sb.WriteString(fmt.Sprintf("• 接口地址:%s\n", c.API)) sb.WriteString(fmt.Sprintf("• 图像接口地址:%s\n", c.ImageAPI)) + sb.WriteString(fmt.Sprintf("• Agent接口地址:%s\n", c.AgentAPI)) sb.WriteString(fmt.Sprintf("• 密钥:%v\n", c.Key)) sb.WriteString(fmt.Sprintf("• 图像密钥:%v\n", c.ImageKey)) + sb.WriteString(fmt.Sprintf("• Agent密钥:%v\n", c.AgentKey)) sb.WriteString(fmt.Sprintf("• 分隔符:%s\n", c.Separator)) sb.WriteString(fmt.Sprintf("• 支持系统提示词:%v\n", !c.NoSystemP)) return sb.String() From d6eb3ba28cefbae88f013d1f9594c08576e4cda7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Fri, 26 Sep 2025 23:57:59 +0800 Subject: [PATCH 08/12] feat(aichat): agent add more trigger conds --- plugin/aichat/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin/aichat/main.go b/plugin/aichat/main.go index 18901e8f..09851701 100644 --- a/plugin/aichat/main.go +++ b/plugin/aichat/main.go @@ -103,7 +103,7 @@ func init() { temperature := stor.temp() topp, maxn := cfg.mparams() - if !stor.noagent() { + if !stor.noagent() && cfg.AgentAPI != "" && cfg.AgentModelName != "" { x := deepinfra.NewAPI(cfg.AgentAPI, string(cfg.AgentKey)) mod, err := cfg.Type.protocol(cfg.AgentModelName, temperature, topp, maxn) if err != nil { From 4434a617edda3a6b13aa715ecc9547e2d281c7c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Sat, 27 Sep 2025 00:05:04 +0800 Subject: [PATCH 09/12] fix(aichat): mis setting --- plugin/aichat/main.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugin/aichat/main.go b/plugin/aichat/main.go index 09851701..d27bdaf8 100644 --- a/plugin/aichat/main.go +++ b/plugin/aichat/main.go @@ -219,13 +219,13 @@ func init() { en.OnPrefix("设置AI聊天识图密钥", ensureconfig, zero.OnlyPrivate, zero.SuperUserPermission).SetBlock(true). Handle(newextrasetstr(&cfg.ImageKey)) en.OnPrefix("设置AI聊天Agent密钥", ensureconfig, zero.OnlyPrivate, zero.SuperUserPermission).SetBlock(true). - Handle(newextrasetstr(&cfg.ImageKey)) + Handle(newextrasetstr(&cfg.AgentKey)) en.OnPrefix("设置AI聊天模型名", ensureconfig, zero.OnlyPrivate, zero.SuperUserPermission).SetBlock(true). Handle(newextrasetstr(&cfg.ModelName)) en.OnPrefix("设置AI聊天识图模型名", ensureconfig, zero.OnlyPrivate, zero.SuperUserPermission).SetBlock(true). Handle(newextrasetstr(&cfg.ImageModelName)) en.OnPrefix("设置AI聊天Agent模型名", ensureconfig, zero.OnlyPrivate, zero.SuperUserPermission).SetBlock(true). - Handle(newextrasetstr(&cfg.ImageModelName)) + Handle(newextrasetstr(&cfg.AgentModelName)) en.OnPrefix("设置AI聊天系统提示词", ensureconfig, zero.OnlyPrivate, zero.SuperUserPermission).SetBlock(true). Handle(newextrasetstr(&cfg.SystemP)) en.OnFullMatch("查看AI聊天系统提示词", ensureconfig, zero.OnlyPrivate, zero.SuperUserPermission).SetBlock(true).Handle(func(ctx *zero.Ctx) { From c22e4b543c26e2e1fa58ba0c0bb8b14f98c60164 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Sat, 27 Sep 2025 00:21:02 +0800 Subject: [PATCH 10/12] chore: make lint happy --- plugin/aichat/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin/aichat/main.go b/plugin/aichat/main.go index d27bdaf8..49ebd7af 100644 --- a/plugin/aichat/main.go +++ b/plugin/aichat/main.go @@ -82,7 +82,7 @@ func init() { } ctx.State["__aichat_stor__"] = stor return ctx.ExtractPlainText() != "" && - (bool(!stor.noreplyat()) || (bool(stor.noreplyat()) && !ctx.Event.IsToMe)) + (!stor.noreplyat() || (stor.noreplyat() && !ctx.Event.IsToMe)) }).SetBlock(false).Handle(func(ctx *zero.Ctx) { gid := ctx.Event.GroupID if gid == 0 { From 1e2d425cf45e2a60928a599f26f50ddbccbe350f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Sat, 27 Sep 2025 01:02:53 +0800 Subject: [PATCH 11/12] optimize(bilibili): separate packages --- README.md | 4 +- go.mod | 10 +- go.sum | 30 +- main.go | 2 + plugin/animetrace/main.go | 2 +- plugin/bilibili/bilibili.go | 60 +-- plugin/bilibili/card2msg.go | 342 ------------------ plugin/bilibili/card2msg_test.go | 55 --- .../bilibili/{bilibilimodel.go => model.go} | 0 .../parse.go} | 16 +- .../bilibilipush.go | 17 +- .../model.go} | 2 +- 12 files changed, 49 insertions(+), 491 deletions(-) delete mode 100644 plugin/bilibili/card2msg.go delete mode 100644 plugin/bilibili/card2msg_test.go rename plugin/bilibili/{bilibilimodel.go => model.go} (100%) rename plugin/{bilibili/bilibili_parse.go => bilibiliparse/parse.go} (94%) rename plugin/{bilibili => bilibilipush}/bilibilipush.go (95%) rename plugin/{bilibili/bilibilipushmodel.go => bilibilipush/model.go} (99%) diff --git a/README.md b/README.md index 480fb0b6..c1a450af 100644 --- a/README.md +++ b/README.md @@ -571,7 +571,7 @@ print("run[CQ:image,file="+j["img"]+"]")
b站动态、专栏、视频、直播解析 - `import _ "github.com/FloatTech/ZeroBot-Plugin/plugin/bilibili"` + `import _ "github.com/FloatTech/ZeroBot-Plugin/plugin/bilibiliparse"` - [x] t.bilibili.com/642277677329285174 | bilibili.com/read/cv17134450 | bilibili.com/video/BV13B4y1x7pS | live.bilibili.com/22603245 @@ -579,7 +579,7 @@ print("run[CQ:image,file="+j["img"]+"]")
b站动态、直播推送,需要配合job一起使用 - `import _ "github.com/FloatTech/ZeroBot-Plugin/plugin/bilibili"` + `import _ "github.com/FloatTech/ZeroBot-Plugin/plugin/bilibilipush"` - [x] 添加b站订阅[uid|name] diff --git a/go.mod b/go.mod index c06fe32e..985451e6 100644 --- a/go.mod +++ b/go.mod @@ -4,12 +4,12 @@ go 1.20 require ( github.com/Baidu-AIP/golang-sdk v1.1.1 - github.com/FloatTech/AnimeAPI v1.7.1-0.20250901143505-180d33844860 + github.com/FloatTech/AnimeAPI v1.7.1-0.20250926165541-8ae591d47008 github.com/FloatTech/floatbox v0.0.0-20250513111443-adba80e84e80 github.com/FloatTech/gg v1.1.3 github.com/FloatTech/imgfactory v0.2.2-0.20230413152719-e101cc3606ef github.com/FloatTech/rendercard v0.2.0 - github.com/FloatTech/sqlite v1.7.1 + github.com/FloatTech/sqlite v1.7.2 github.com/FloatTech/ttl v0.0.0-20240716161252-965925764562 github.com/FloatTech/zbpctrl v1.7.0 github.com/FloatTech/zbputils v1.7.2-0.20250926153026-d616e2b87477 @@ -29,7 +29,7 @@ require ( github.com/fumiama/gotracemoe v0.0.3 github.com/fumiama/jieba v0.0.0-20221203025406-36c17a10b565 github.com/fumiama/slowdo v0.0.0-20241001074058-27c4fe5259a4 - github.com/fumiama/terasu v0.0.0-20241027183601-987ab91031ce + github.com/fumiama/terasu v0.0.0-20250409134005-3ac40e382e6c github.com/fumiama/unibase2n v0.0.0-20240530074540-ec743fd5a6d6 github.com/go-ego/gse v0.80.3 github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 @@ -48,9 +48,9 @@ require ( github.com/wcharczuk/go-chart/v2 v2.1.2 github.com/wdvxdr1123/ZeroBot v1.8.2-0.20250921063512-13752a73d444 gitlab.com/gomidi/midi/v2 v2.1.7 - golang.org/x/image v0.24.0 + golang.org/x/image v0.31.0 golang.org/x/sys v0.30.0 - golang.org/x/text v0.22.0 + golang.org/x/text v0.29.0 gopkg.in/yaml.v3 v3.0.1 ) diff --git a/go.sum b/go.sum index dd1a66e1..3377af1d 100644 --- a/go.sum +++ b/go.sum @@ -1,8 +1,8 @@ github.com/Baidu-AIP/golang-sdk v1.1.1 h1:RQsAmgDSAkiq22I6n7XJ2t3afgzFeqjY46FGhvrx4cw= github.com/Baidu-AIP/golang-sdk v1.1.1/go.mod h1:bXnGw7xPeKt8aF7UCELKrV6UZ/46spItONK1RQBQj1Y= github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= -github.com/FloatTech/AnimeAPI v1.7.1-0.20250901143505-180d33844860 h1:ddthsMzYC2LZ517/71W//9VsXT82CSBALVt3sQY5vfA= -github.com/FloatTech/AnimeAPI v1.7.1-0.20250901143505-180d33844860/go.mod h1:CzpSeo5Pvslnq7Ho14E438Yn/flFMKzjGeX2nbC1mzk= +github.com/FloatTech/AnimeAPI v1.7.1-0.20250926165541-8ae591d47008 h1:YK29qIO+Iun8YbMoPNN/KHLzv1N0q93RD0sC60pj83g= +github.com/FloatTech/AnimeAPI v1.7.1-0.20250926165541-8ae591d47008/go.mod h1:yairaELY4W1TmRFjNy7HXGW4qLNhCkrXCZEBgmWQ/Sc= github.com/FloatTech/floatbox v0.0.0-20250513111443-adba80e84e80 h1:lFD1pd8NkYCrw0QpTX/T5pJ67I7AL5eGxQ4v0r9f81Q= github.com/FloatTech/floatbox v0.0.0-20250513111443-adba80e84e80/go.mod h1:IWoFFqu+0FeaHHQdddyiTRL5z7gJME6qHC96qh0R2sc= github.com/FloatTech/gg v1.1.3 h1:+GlL02lTKsxJQr4WCuNwVxC1/eBZrCvypCIBtxuOFb4= @@ -11,8 +11,8 @@ github.com/FloatTech/imgfactory v0.2.2-0.20230413152719-e101cc3606ef h1:CJbK/2FR github.com/FloatTech/imgfactory v0.2.2-0.20230413152719-e101cc3606ef/go.mod h1:el5hGpj1C1bDRxcTXYRwEivDCr40zZeJpcrLrB1fajs= github.com/FloatTech/rendercard v0.2.0 h1:PBTZ2gCEy/dAEGSfWecrGTrWDYpiBJD1dVzNDDaOxh4= github.com/FloatTech/rendercard v0.2.0/go.mod h1:Sbojcy1t3NfFz7/WicZRmR/uKFxNMYkKF8qHx69dxY0= -github.com/FloatTech/sqlite v1.7.1 h1:XKUY0+MNaRmvEIgRv7QLbl7PFVpUfQ72+XQg+no2Vq0= -github.com/FloatTech/sqlite v1.7.1/go.mod h1:/4tzfCGhrZnnjC1U8vcfwGQeF6eR649fhOsS3+Le0+s= +github.com/FloatTech/sqlite v1.7.2 h1:b8COegNLSzofzOyARsVwSbz9OOzWEa8IElsTlx1TBLw= +github.com/FloatTech/sqlite v1.7.2/go.mod h1:/4tzfCGhrZnnjC1U8vcfwGQeF6eR649fhOsS3+Le0+s= github.com/FloatTech/ttl v0.0.0-20240716161252-965925764562 h1:snfw7FNFym1eNnLrQ/VCf80LiQo9C7jHgrunZDwiRcY= github.com/FloatTech/ttl v0.0.0-20240716161252-965925764562/go.mod h1:fHZFWGquNXuHttu9dUYoKuNbm3dzLETnIOnm1muSfDs= github.com/FloatTech/zbpctrl v1.7.0 h1:Hxo6EIhJo+pHjcQP9QgIJgluaT1pHH99zkk3njqTNMo= @@ -83,8 +83,8 @@ github.com/fumiama/slowdo v0.0.0-20241001074058-27c4fe5259a4 h1:zN9e09TYKXI1mNku github.com/fumiama/slowdo v0.0.0-20241001074058-27c4fe5259a4/go.mod h1:iZf1H/Jcw5gjOOFb4C5nlweJtViWc7uwUxRCe14pbYk= github.com/fumiama/sqlite3 v1.29.10-simp h1:c5y3uKyU0q9t0/SyfynzYyuslQ5zP+5CD8e0yYY554A= github.com/fumiama/sqlite3 v1.29.10-simp/go.mod h1:ItX2a1OVGgNsFh6Dv60JQvGfJfTPHPVpV6DF59akYOA= -github.com/fumiama/terasu v0.0.0-20241027183601-987ab91031ce h1:T6iDDU16rFyxV/FwfJJR6qcgkIlXJEIFlUTSmTD1h6s= -github.com/fumiama/terasu v0.0.0-20241027183601-987ab91031ce/go.mod h1:UVx8YP1jKKL1Cj+uy+OnQRM2Ih6U36Mqy9GSf7jabsI= +github.com/fumiama/terasu v0.0.0-20250409134005-3ac40e382e6c h1:GXEfVjTQ2xLHmrHYwGY3W9orcbDPUarfQCC3SjKHeEw= +github.com/fumiama/terasu v0.0.0-20250409134005-3ac40e382e6c/go.mod h1:UVx8YP1jKKL1Cj+uy+OnQRM2Ih6U36Mqy9GSf7jabsI= github.com/fumiama/unibase2n v0.0.0-20240530074540-ec743fd5a6d6 h1:LtDgr628eji8jRpjPCxsk7ibjcfi97QieZVCTjxLCBw= github.com/fumiama/unibase2n v0.0.0-20240530074540-ec743fd5a6d6/go.mod h1:lEaZsT4FRSqcjnQ5q8y+mkenkzR/r1D3BJmfdp0vqDg= github.com/gabriel-vasile/mimetype v1.0.4 h1:uBejfH8l3/2f+5vjl1e4xIaSyNEhRBZ5N/ij7ohpNd8= @@ -126,8 +126,8 @@ github.com/jinzhu/gorm v1.9.16 h1:+IyIjPEABKRpsu/F8OvDPy9fyQlgsg2luMV2ZIH5i5o= github.com/jinzhu/gorm v1.9.16/go.mod h1:G3LB3wezTOWM2ITLzPxEXgSkOXAntiLHS7UdBefADcs= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.0.1 h1:HjfetcXq097iXP0uoPCdnM4Efp5/9MsM0/M+XOTeR3M= github.com/jinzhu/now v1.0.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= -github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= github.com/jozsefsallai/gophersauce v1.0.1 h1:BA3ovtQRrAb1qYU9JoRLbDHpxnDunlNcEkEfhCvDDCM= github.com/jozsefsallai/gophersauce v1.0.1/go.mod h1:YVEI7djliMTmZ1Vh01YPF8bUHi+oKhe3yXgKf1T49vg= github.com/kanrichan/resvg-go v0.0.2-0.20231001163256-63db194ca9f5 h1:BXnB1Gz4y/zwQh+ZFNy7rgd+ZfMOrwRr4uZSHEI+ieY= @@ -183,7 +183,7 @@ github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVs github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/tetratelabs/wazero v1.5.0 h1:Yz3fZHivfDiZFUXnWMPUoiW7s8tC1sjdBtlJn08qYa0= github.com/tetratelabs/wazero v1.5.0/go.mod h1:0U0G41+ochRKoPKCJlh0jMg1CHkyfK8kDqiirMmKY8A= github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= @@ -224,8 +224,8 @@ golang.org/x/image v0.0.0-20190220214146-31aff87c08e9/go.mod h1:kZ7UVZpmo3dzQBMx golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.18.0/go.mod h1:4yyo5vMFQjVjUcVk4jEQcU9MGy/rulF5WvUILseCM2E= -golang.org/x/image v0.24.0 h1:AN7zRgVsbvmTfNyqIbbOraYL8mSwcKncEj8ofjgzcMQ= -golang.org/x/image v0.24.0/go.mod h1:4b/ITuLfqYq1hqZcjofwctIhi7sZh2WaCjvsBNjjya8= +golang.org/x/image v0.31.0 h1:mLChjE2MV6g1S7oqbXC0/UcKijjm5fnJLUYKIYrLESA= +golang.org/x/image v0.31.0/go.mod h1:R9ec5Lcp96v9FTF+ajwaH3uGxPH4fKfHHAVbUILxghA= golang.org/x/mobile v0.0.0-20190415191353-3e0bab5405d6/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mobile v0.0.0-20231127183840-76ac6878050a h1:sYbmY3FwUWCBTodZL1S3JUuOvaW6kM2o+clDzzDNBWg= golang.org/x/mobile v0.0.0-20231127183840-76ac6878050a/go.mod h1:Ede7gF0KGoHlj822RtphAHK1jLdrcuRBZg0sF1Q+SPc= @@ -233,8 +233,8 @@ golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91 golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.27.0 h1:kb+q2PyFnEADO2IEF935ehFUXlWiNjJWtRNgBLSfbxQ= golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -257,7 +257,7 @@ golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= +golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -300,15 +300,15 @@ golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= -golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= -golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= +golang.org/x/text v0.29.0 h1:1neNs90w9YzJ9BocxfsQNHKuAT4pkghyXc4nhZ6sJvk= +golang.org/x/text v0.29.0/go.mod h1:7MhJOA9CD2qZyOKYazxdYMF85OwPdEr9jTtBpO7ydH4= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= -golang.org/x/tools v0.23.0 h1:SGsXPZ+2l4JsgaCKkx+FQ9YZ5XEtA1GZYuoDjenLjvg= +golang.org/x/tools v0.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= diff --git a/main.go b/main.go index 4de143cf..b874df7e 100644 --- a/main.go +++ b/main.go @@ -77,6 +77,8 @@ import ( _ "github.com/FloatTech/ZeroBot-Plugin/plugin/base64gua" // base64卦加解密 _ "github.com/FloatTech/ZeroBot-Plugin/plugin/baseamasiro" // base天城文加解密 _ "github.com/FloatTech/ZeroBot-Plugin/plugin/bilibili" // b站相关 + _ "github.com/FloatTech/ZeroBot-Plugin/plugin/bilibiliparse" // b站相关 + _ "github.com/FloatTech/ZeroBot-Plugin/plugin/bilibilipush" // b站相关 _ "github.com/FloatTech/ZeroBot-Plugin/plugin/bookreview" // 哀伤雪刃吧推书记录 _ "github.com/FloatTech/ZeroBot-Plugin/plugin/chess" // 国际象棋 _ "github.com/FloatTech/ZeroBot-Plugin/plugin/choose" // 选择困难症帮手 diff --git a/plugin/animetrace/main.go b/plugin/animetrace/main.go index e738d18f..a02ec6f5 100644 --- a/plugin/animetrace/main.go +++ b/plugin/animetrace/main.go @@ -23,7 +23,7 @@ import ( ) func init() { - engine := control.Register("animetrace", &ctrl.Options[*zero.Ctx]{ + engine := control.AutoRegister(&ctrl.Options[*zero.Ctx]{ DisableOnDefault: false, Brief: "AnimeTrace 动画/Galgame识别插件", Help: "- Gal识图\n- 动漫识图\n- 动漫识图 2\n- 动漫识图 [模型名]\n- Gal识图 [模型名]", diff --git a/plugin/bilibili/bilibili.go b/plugin/bilibili/bilibili.go index f7f93358..187e7719 100644 --- a/plugin/bilibili/bilibili.go +++ b/plugin/bilibili/bilibili.go @@ -11,7 +11,6 @@ import ( "net/http" "os" "path" - "regexp" "sort" "strconv" "time" @@ -31,7 +30,6 @@ import ( ) var ( - re = regexp.MustCompile(`^\d+$`) danmakuTypeMap = map[int64]string{ 0: "普通消息", 1: "礼物", @@ -73,7 +71,7 @@ func init() { } return true }) - engine.OnRegex(`^>user info\s?(.{1,25})$`, getPara).SetBlock(true). + engine.OnRegex(`^>user info\s?(.{1,25})$`, bz.RequireUser(cfg)).SetBlock(true). Handle(func(ctx *zero.Ctx) { id := ctx.State["uid"].(string) card, err := bz.GetMemberCard(id) @@ -91,7 +89,7 @@ func init() { )) }) - engine.OnRegex(`^>vup info\s?(.{1,25})$`, getPara).SetBlock(true). + engine.OnRegex(`^>vup info\s?(.{1,25})$`, bz.RequireUser(cfg)).SetBlock(true). Handle(func(ctx *zero.Ctx) { id := ctx.State["uid"].(string) // 获取详情 @@ -114,7 +112,7 @@ func init() { )) }) - engine.OnRegex(`^查成分\s?(.{1,25})$`, getPara, getdb).SetBlock(true). + engine.OnRegex(`^查成分\s?(.{1,25})$`, bz.RequireUser(cfg), getdb).SetBlock(true). Handle(func(ctx *zero.Ctx) { id := ctx.State["uid"].(string) today := time.Now().Format("20060102") @@ -134,7 +132,7 @@ func init() { return } vupLen := len(vups) - medals, err := bz.GetMedalWall(cfg, id) + medals, err := cfg.GetMedalWall(id) sort.Sort(bz.MedalSorter(medals)) if err != nil { ctx.SendChain(message.Text("ERROR: ", err)) @@ -275,7 +273,7 @@ func init() { ctx.SendChain(message.Image("file:///" + file.BOTPATH + "/" + drawedFile)) }) - engine.OnRegex(`^查弹幕\s?(\S{1,25})\s?(\d*)$`, getPara).SetBlock(true).Handle(func(ctx *zero.Ctx) { + engine.OnRegex(`^查弹幕\s?(\S{1,25})\s?(\d*)$`, bz.RequireUser(cfg)).SetBlock(true).Handle(func(ctx *zero.Ctx) { id := ctx.State["uid"].(string) pagenum := ctx.State["regex_matched"].([]string)[2] if pagenum == "" { @@ -582,51 +580,3 @@ func int2rbg(t int64) (int64, int64, int64) { b, g, r := int64(buf[0]), int64(buf[1]), int64(buf[2]) return r, g, b } - -func getPara(ctx *zero.Ctx) bool { - keyword := ctx.State["regex_matched"].([]string)[1] - if !re.MatchString(keyword) { - searchRes, err := bz.SearchUser(cfg, keyword) - if err != nil { - ctx.SendChain(message.Text("ERROR: ", err)) - return false - } - ctx.State["uid"] = strconv.FormatInt(searchRes[0].Mid, 10) - return true - } - next := zero.NewFutureEvent("message", 999, false, ctx.CheckSession()) - recv, cancel := next.Repeat() - defer cancel() - ctx.SendChain(message.Text("输入为纯数字, 请选择查询uid还是用户名, 输入对应序号:\n0. 查询uid\n1. 查询用户名")) - for { - select { - case <-time.After(time.Second * 10): - ctx.SendChain(message.Text("时间太久啦!", zero.BotConfig.NickName[0], "帮你选择查询uid")) - ctx.State["uid"] = keyword - return true - case c := <-recv: - msg := c.Event.Message.ExtractPlainText() - num, err := strconv.Atoi(msg) - if err != nil { - ctx.SendChain(message.Text("请输入数字!")) - continue - } - if num < 0 || num > 1 { - ctx.SendChain(message.Text("序号非法!")) - continue - } - if num == 0 { - ctx.State["uid"] = keyword - return true - } else if num == 1 { - searchRes, err := bz.SearchUser(cfg, keyword) - if err != nil { - ctx.SendChain(message.Text("ERROR: ", err)) - return false - } - ctx.State["uid"] = strconv.FormatInt(searchRes[0].Mid, 10) - return true - } - } - } -} diff --git a/plugin/bilibili/card2msg.go b/plugin/bilibili/card2msg.go deleted file mode 100644 index d2dcc5fe..00000000 --- a/plugin/bilibili/card2msg.go +++ /dev/null @@ -1,342 +0,0 @@ -package bilibili - -import ( - "encoding/json" - "fmt" - "time" - - bz "github.com/FloatTech/AnimeAPI/bilibili" - "github.com/FloatTech/floatbox/binary" - "github.com/FloatTech/floatbox/web" - "github.com/wdvxdr1123/ZeroBot/message" -) - -var ( - msgType = map[int]string{ - 1: "转发了动态", - 2: "有图营业", - 4: "无图营业", - 8: "投稿了视频", - 16: "投稿了短视频", - 64: "投稿了文章", - 256: "投稿了音频", - 2048: "发布了简报", - 4200: "发布了直播", - 4308: "发布了直播", - } -) - -// dynamicCard2msg 处理DynCard -func dynamicCard2msg(dynamicCard *bz.DynamicCard) (msg []message.Segment, err error) { - var ( - card bz.Card - vote bz.Vote - cType int - ) - msg = make([]message.Segment, 0, 16) - // 初始化结构体 - err = json.Unmarshal(binary.StringToBytes(dynamicCard.Card), &card) - if err != nil { - return - } - if dynamicCard.Extension.Vote != "" { - err = json.Unmarshal(binary.StringToBytes(dynamicCard.Extension.Vote), &vote) - if err != nil { - return - } - } - cType = dynamicCard.Desc.Type - // 生成消息 - switch cType { - case 1: - msg = append(msg, message.Text(card.User.Uname, msgType[cType], "\n", - card.Item.Content, "\n", - "转发的内容: \n")) - var originMsg []message.Segment - var co bz.Card - co, err = bz.LoadCardDetail(card.Origin) - if err != nil { - return - } - originMsg, err = card2msg(dynamicCard, &co, card.Item.OrigType) - if err != nil { - return - } - msg = append(msg, originMsg...) - case 2: - msg = append(msg, message.Text(card.User.Name, "在", time.Unix(int64(card.Item.UploadTime), 0).Format("2006-01-02 15:04:05"), msgType[cType], "\n", - card.Item.Description)) - for i := 0; i < len(card.Item.Pictures); i++ { - msg = append(msg, message.Image(card.Item.Pictures[i].ImgSrc)) - } - case 4: - msg = append(msg, message.Text(card.User.Uname, "在", time.Unix(int64(card.Item.Timestamp), 0).Format("2006-01-02 15:04:05"), msgType[cType], "\n", - card.Item.Content, "\n")) - if dynamicCard.Extension.Vote != "" { - msg = append(msg, message.Text("【投票】", vote.Desc, "\n", - "截止日期: ", time.Unix(int64(vote.Endtime), 0).Format("2006-01-02 15:04:05"), "\n", - "参与人数: ", bz.HumanNum(vote.JoinNum), "\n", - "投票选项( 最多选择", vote.ChoiceCnt, "项 )\n")) - for i := 0; i < len(vote.Options); i++ { - msg = append(msg, message.Text("- ", vote.Options[i].Idx, ". ", vote.Options[i].Desc, "\n")) - if vote.Options[i].ImgURL != "" { - msg = append(msg, message.Image(vote.Options[i].ImgURL)) - } - } - } - case 8: - msg = append(msg, message.Text(card.Owner.Name, "在", time.Unix(int64(card.Pubdate), 0).Format("2006-01-02 15:04:05"), msgType[cType], "\n", - card.Title)) - msg = append(msg, message.Image(card.Pic)) - msg = append(msg, message.Text(card.Desc, "\n", - card.ShareSubtitle, "\n", - "视频链接: ", card.ShortLink, "\n")) - case 16: - msg = append(msg, message.Text(card.User.Name, "在", time.Unix(int64(card.Item.UploadTime), 0).Format("2006-01-02 15:04:05"), msgType[cType], "\n", - card.Item.Description)) - msg = append(msg, message.Image(card.Item.Cover.Default)) - case 64: - msg = append(msg, message.Text(card.Author.(map[string]any)["name"], "在", time.Unix(int64(card.PublishTime), 0).Format("2006-01-02 15:04:05"), msgType[cType], "\n", - card.Title, "\n", - card.Summary)) - for i := 0; i < len(card.ImageUrls); i++ { - msg = append(msg, message.Image(card.ImageUrls[i])) - } - if card.ID != 0 { - msg = append(msg, message.Text("文章链接: https://www.bilibili.com/read/cv", card.ID, "\n")) - } - case 256: - msg = append(msg, message.Text(card.Upper, "在", time.Unix(int64(card.Ctime), 0).Format("2006-01-02 15:04:05"), msgType[cType], "\n", - card.Title)) - msg = append(msg, message.Image(card.Cover)) - msg = append(msg, message.Text(card.Intro, "\n")) - if card.ID != 0 { - msg = append(msg, message.Text("音频链接: https://www.bilibili.com/audio/au", card.ID, "\n")) - } - - case 2048: - msg = append(msg, message.Text(card.User.Uname, msgType[cType], "\n", - card.Vest.Content, "\n", - card.Sketch.Title, "\n", - card.Sketch.DescText, "\n")) - msg = append(msg, message.Image(card.Sketch.CoverURL)) - msg = append(msg, message.Text("分享链接: ", card.Sketch.TargetURL, "\n")) - case 4308: - if dynamicCard.Desc.UserProfile.Info.Uname != "" { - msg = append(msg, message.Text(dynamicCard.Desc.UserProfile.Info.Uname, msgType[cType], "\n")) - } - msg = append(msg, message.Image(card.LivePlayInfo.Cover)) - msg = append(msg, message.Text("\n", card.LivePlayInfo.Title, "\n", - "房间号: ", card.LivePlayInfo.RoomID, "\n", - "分区: ", card.LivePlayInfo.ParentAreaName)) - if card.LivePlayInfo.ParentAreaName != card.LivePlayInfo.AreaName { - msg = append(msg, message.Text("-", card.LivePlayInfo.AreaName)) - } - if card.LivePlayInfo.LiveStatus == 0 { - msg = append(msg, message.Text("未开播 \n")) - } else { - msg = append(msg, message.Text("直播中 ", card.LivePlayInfo.WatchedShow, "\n")) - } - msg = append(msg, message.Text("直播链接: ", card.LivePlayInfo.Link)) - default: - msg = append(msg, message.Text("动态id: ", dynamicCard.Desc.DynamicIDStr, "未知动态类型: ", cType, "\n")) - } - if dynamicCard.Desc.DynamicIDStr != "" { - msg = append(msg, message.Text("动态链接: ", bz.TURL, dynamicCard.Desc.DynamicIDStr)) - } - return -} - -// card2msg cType=1, 2, 4, 8, 16, 64, 256, 2048, 4200, 4308时,处理Card字符串,cType为card类型 -func card2msg(dynamicCard *bz.DynamicCard, card *bz.Card, cType int) (msg []message.Segment, err error) { - var ( - vote bz.Vote - ) - msg = make([]message.Segment, 0, 16) - // 生成消息 - switch cType { - case 1: - msg = append(msg, message.Text(card.User.Uname, msgType[cType], "\n", - card.Item.Content, "\n", - "转发的内容: \n")) - var originMsg []message.Segment - var co bz.Card - co, err = bz.LoadCardDetail(card.Origin) - if err != nil { - return - } - originMsg, err = card2msg(dynamicCard, &co, card.Item.OrigType) - if err != nil { - return - } - msg = append(msg, originMsg...) - case 2: - msg = append(msg, message.Text(card.User.Name, "在", time.Unix(int64(card.Item.UploadTime), 0).Format("2006-01-02 15:04:05"), msgType[cType], "\n", - card.Item.Description)) - for i := 0; i < len(card.Item.Pictures); i++ { - msg = append(msg, message.Image(card.Item.Pictures[i].ImgSrc)) - } - case 4: - msg = append(msg, message.Text(card.User.Uname, "在", time.Unix(int64(card.Item.Timestamp), 0).Format("2006-01-02 15:04:05"), msgType[cType], "\n", - card.Item.Content, "\n")) - if dynamicCard.Extension.Vote != "" { - msg = append(msg, message.Text("【投票】", vote.Desc, "\n", - "截止日期: ", time.Unix(int64(vote.Endtime), 0).Format("2006-01-02 15:04:05"), "\n", - "参与人数: ", bz.HumanNum(vote.JoinNum), "\n", - "投票选项( 最多选择", vote.ChoiceCnt, "项 )\n")) - for i := 0; i < len(vote.Options); i++ { - msg = append(msg, message.Text("- ", vote.Options[i].Idx, ". ", vote.Options[i].Desc, "\n")) - if vote.Options[i].ImgURL != "" { - msg = append(msg, message.Image(vote.Options[i].ImgURL)) - } - } - } - case 8: - msg = append(msg, message.Text(card.Owner.Name, "在", time.Unix(int64(card.Pubdate), 0).Format("2006-01-02 15:04:05"), msgType[cType], "\n", - card.Title)) - msg = append(msg, message.Image(card.Pic)) - msg = append(msg, message.Text(card.Desc, "\n", - card.ShareSubtitle, "\n", - "视频链接: ", card.ShortLink, "\n")) - case 16: - msg = append(msg, message.Text(card.User.Name, "在", time.Unix(int64(card.Item.UploadTime), 0).Format("2006-01-02 15:04:05"), msgType[cType], "\n", - card.Item.Description)) - msg = append(msg, message.Image(card.Item.Cover.Default)) - case 64: - msg = append(msg, message.Text(card.Author.(map[string]any)["name"], "在", time.Unix(int64(card.PublishTime), 0).Format("2006-01-02 15:04:05"), msgType[cType], "\n", - card.Title, "\n", - card.Summary)) - for i := 0; i < len(card.ImageUrls); i++ { - msg = append(msg, message.Image(card.ImageUrls[i])) - } - if card.ID != 0 { - msg = append(msg, message.Text("文章链接: https://www.bilibili.com/read/cv", card.ID, "\n")) - } - case 256: - msg = append(msg, message.Text(card.Upper, "在", time.Unix(int64(card.Ctime), 0).Format("2006-01-02 15:04:05"), msgType[cType], "\n", - card.Title)) - msg = append(msg, message.Image(card.Cover)) - msg = append(msg, message.Text(card.Intro, "\n")) - if card.ID != 0 { - msg = append(msg, message.Text("音频链接: https://www.bilibili.com/audio/au", card.ID, "\n")) - } - - case 2048: - msg = append(msg, message.Text(card.User.Uname, msgType[cType], "\n", - card.Vest.Content, "\n", - card.Sketch.Title, "\n", - card.Sketch.DescText, "\n")) - msg = append(msg, message.Image(card.Sketch.CoverURL)) - msg = append(msg, message.Text("分享链接: ", card.Sketch.TargetURL, "\n")) - case 4308: - if dynamicCard.Desc.UserProfile.Info.Uname != "" { - msg = append(msg, message.Text(dynamicCard.Desc.UserProfile.Info.Uname, msgType[cType], "\n")) - } - msg = append(msg, message.Image(card.LivePlayInfo.Cover)) - msg = append(msg, message.Text("\n", card.LivePlayInfo.Title, "\n", - "房间号: ", card.LivePlayInfo.RoomID, "\n", - "分区: ", card.LivePlayInfo.ParentAreaName)) - if card.LivePlayInfo.ParentAreaName != card.LivePlayInfo.AreaName { - msg = append(msg, message.Text("-", card.LivePlayInfo.AreaName)) - } - if card.LivePlayInfo.LiveStatus == 0 { - msg = append(msg, message.Text("未开播 \n")) - } else { - msg = append(msg, message.Text("直播中 ", card.LivePlayInfo.WatchedShow, "\n")) - } - msg = append(msg, message.Text("直播链接: ", card.LivePlayInfo.Link)) - default: - msg = append(msg, message.Text("动态id: ", dynamicCard.Desc.DynamicIDStr, "未知动态类型: ", cType, "\n")) - } - if dynamicCard.Desc.DynamicIDStr != "" { - msg = append(msg, message.Text("动态链接: ", bz.TURL, dynamicCard.Desc.DynamicIDStr)) - } - return -} - -// dynamicDetail 用动态id查动态信息 -func dynamicDetail(cookiecfg *bz.CookieConfig, dynamicIDStr string) (msg []message.Segment, err error) { - dyc, err := bz.GetDynamicDetail(cookiecfg, dynamicIDStr) - if err != nil { - return - } - return dynamicCard2msg(&dyc) -} - -// articleCard2msg 专栏转消息 -func articleCard2msg(card bz.Card, defaultID string) (msg []message.Segment) { - msg = make([]message.Segment, 0, 16) - for i := 0; i < len(card.OriginImageUrls); i++ { - msg = append(msg, message.Image(card.OriginImageUrls[i])) - } - msg = append(msg, message.Text("\n", card.Title, "\n", "UP主: ", card.AuthorName, "\n", - "阅读: ", bz.HumanNum(card.Stats.View), " 评论: ", bz.HumanNum(card.Stats.Reply), "\n", - bz.CVURL, defaultID)) - return -} - -// liveCard2msg 直播卡片转消息 -func liveCard2msg(card bz.RoomCard) (msg []message.Segment) { - msg = make([]message.Segment, 0, 16) - msg = append(msg, message.Image(card.RoomInfo.Keyframe)) - msg = append(msg, message.Text("\n", card.RoomInfo.Title, "\n", - "主播: ", card.AnchorInfo.BaseInfo.Uname, "\n", - "房间号: ", card.RoomInfo.RoomID, "\n")) - if card.RoomInfo.ShortID != 0 { - msg = append(msg, message.Text("短号: ", card.RoomInfo.ShortID, "\n")) - } - msg = append(msg, message.Text("分区: ", card.RoomInfo.ParentAreaName)) - if card.RoomInfo.ParentAreaName != card.RoomInfo.AreaName { - msg = append(msg, message.Text("-", card.RoomInfo.AreaName)) - } - if card.RoomInfo.LiveStatus == 0 { - msg = append(msg, message.Text("未开播 \n")) - } else { - msg = append(msg, message.Text("直播中 ", bz.HumanNum(card.RoomInfo.Online), "人气\n")) - } - if card.RoomInfo.ShortID != 0 { - msg = append(msg, message.Text("直播间链接: ", bz.LURL, card.RoomInfo.ShortID)) - } else { - msg = append(msg, message.Text("直播间链接: ", bz.LURL, card.RoomInfo.RoomID)) - } - - return -} - -// videoCard2msg 视频卡片转消息 -func videoCard2msg(card bz.Card) (msg []message.Segment, err error) { - var ( - mCard bz.MemberCard - onlineTotal bz.OnlineTotal - ) - msg = make([]message.Segment, 0, 16) - mCard, err = bz.GetMemberCard(card.Owner.Mid) - msg = append(msg, message.Text("标题: ", card.Title, "\n")) - if card.Rights.IsCooperation == 1 { - for i := 0; i < len(card.Staff); i++ { - msg = append(msg, message.Text(card.Staff[i].Title, ": ", card.Staff[i].Name, " 粉丝: ", bz.HumanNum(card.Staff[i].Follower), "\n")) - } - } else { - if err != nil { - msg = append(msg, message.Text("UP主: ", card.Owner.Name, "\n")) - } else { - msg = append(msg, message.Text("UP主: ", card.Owner.Name, " 粉丝: ", bz.HumanNum(mCard.Fans), "\n")) - } - } - msg = append(msg, message.Image(card.Pic)) - data, err := web.GetData(fmt.Sprintf(bz.OnlineTotalURL, card.BvID, card.CID)) - if err != nil { - return - } - err = json.Unmarshal(data, &onlineTotal) - if err != nil { - return - } - msg = append(msg, message.Text("👀播放: ", bz.HumanNum(card.Stat.View), " 💬弹幕: ", bz.HumanNum(card.Stat.Danmaku), - "\n👍点赞: ", bz.HumanNum(card.Stat.Like), " 💰投币: ", bz.HumanNum(card.Stat.Coin), - "\n📁收藏: ", bz.HumanNum(card.Stat.Favorite), " 🔗分享: ", bz.HumanNum(card.Stat.Share), - "\n📝简介: ", card.Desc, - "\n🏄‍♂️ 总共 ", onlineTotal.Data.Total, " 人在观看,", onlineTotal.Data.Count, " 人在网页端观看\n", - bz.VURL, card.BvID, "\n\n")) - return -} diff --git a/plugin/bilibili/card2msg_test.go b/plugin/bilibili/card2msg_test.go deleted file mode 100644 index 5d85d775..00000000 --- a/plugin/bilibili/card2msg_test.go +++ /dev/null @@ -1,55 +0,0 @@ -package bilibili - -import ( - "testing" - - bz "github.com/FloatTech/AnimeAPI/bilibili" -) - -func TestArticleInfo(t *testing.T) { - card, err := bz.GetArticleInfo("17279244") - if err != nil { - t.Fatal(err) - } - t.Log(articleCard2msg(card, "17279244")) - -} - -func TestMemberCard(t *testing.T) { - card, err := bz.GetMemberCard(2) - if err != nil { - t.Fatal(err) - } - t.Logf("%+v\n", card) -} - -func TestVideoInfo(t *testing.T) { - card, err := bz.GetVideoInfo("10007") - if err != nil { - t.Fatal(err) - } - t.Log(videoCard2msg(card)) - card, err = bz.GetVideoInfo("BV1xx411c7mD") - if err != nil { - t.Fatal(err) - } - t.Log(videoCard2msg(card)) - card, err = bz.GetVideoInfo("bv1xx411c7mD") - if err != nil { - t.Fatal(err) - } - t.Log(videoCard2msg(card)) - card, err = bz.GetVideoInfo("BV1mF411j7iU") - if err != nil { - t.Fatal(err) - } - t.Log(videoCard2msg(card)) -} - -func TestLiveRoomInfo(t *testing.T) { - card, err := bz.GetLiveRoomInfo("83171", "b_ut=7;buvid3=0;i-wanna-go-back=-1;innersign=0;") - if err != nil { - t.Fatal(err) - } - t.Log(liveCard2msg(card)) -} diff --git a/plugin/bilibili/bilibilimodel.go b/plugin/bilibili/model.go similarity index 100% rename from plugin/bilibili/bilibilimodel.go rename to plugin/bilibili/model.go diff --git a/plugin/bilibili/bilibili_parse.go b/plugin/bilibiliparse/parse.go similarity index 94% rename from plugin/bilibili/bilibili_parse.go rename to plugin/bilibiliparse/parse.go index 81dd03bd..ab8a9bde 100644 --- a/plugin/bilibili/bilibili_parse.go +++ b/plugin/bilibiliparse/parse.go @@ -1,5 +1,5 @@ -// Package bilibili bilibili卡片解析 -package bilibili +// Package bilibiliparse bilibili卡片解析 +package bilibiliparse import ( "bytes" @@ -29,6 +29,7 @@ const ( enableVideoDownload = int64(0x20) disableVideoDownload = ^enableVideoDownload bilibiliparseReferer = "https://www.bilibili.com" + ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36" ) var ( @@ -42,11 +43,12 @@ var ( searchArticleRe = regexp.MustCompile(searchArticle) searchLiveRoomRe = regexp.MustCompile(searchLiveRoom) cachePath string + cfg = bz.NewCookieConfig("data/Bilibili/config.json") ) // 插件主体 func init() { - en := control.Register("bilibiliparse", &ctrl.Options[*zero.Ctx]{ + en := control.AutoRegister(&ctrl.Options[*zero.Ctx]{ DisableOnDefault: false, Brief: "b站链接解析", Help: "例:- t.bilibili.com/642277677329285174\n- bilibili.com/read/cv17134450\n- bilibili.com/video/BV13B4y1x7pS\n- live.bilibili.com/22603245 ", @@ -152,7 +154,7 @@ func handleVideo(ctx *zero.Ctx) { ctx.SendChain(message.Text("ERROR: ", err)) return } - msg, err := videoCard2msg(card) + msg, err := card.ToVideoMessage() if err != nil { ctx.SendChain(message.Text("ERROR: ", err)) return @@ -178,7 +180,7 @@ func handleVideo(ctx *zero.Ctx) { } func handleDynamic(ctx *zero.Ctx) { - msg, err := dynamicDetail(cfg, ctx.State["regex_matched"].([]string)[2]) + msg, err := cfg.GetDetailMessage(ctx.State["regex_matched"].([]string)[2]) if err != nil { ctx.SendChain(message.Text("ERROR: ", err)) return @@ -192,7 +194,7 @@ func handleArticle(ctx *zero.Ctx) { ctx.SendChain(message.Text("ERROR: ", err)) return } - ctx.SendChain(articleCard2msg(card, ctx.State["regex_matched"].([]string)[1])...) + ctx.SendChain(card.ToArticleMessage(ctx.State["regex_matched"].([]string)[1])...) } func handleLive(ctx *zero.Ctx) { @@ -206,7 +208,7 @@ func handleLive(ctx *zero.Ctx) { ctx.SendChain(message.Text("ERROR: ", err)) return } - ctx.SendChain(liveCard2msg(card)...) + ctx.SendChain(card.ToMessage()...) } // getVideoSummary AI视频总结 diff --git a/plugin/bilibili/bilibilipush.go b/plugin/bilibilipush/bilibilipush.go similarity index 95% rename from plugin/bilibili/bilibilipush.go rename to plugin/bilibilipush/bilibilipush.go index 52310db2..b0dcef01 100644 --- a/plugin/bilibili/bilibilipush.go +++ b/plugin/bilibilipush/bilibilipush.go @@ -1,5 +1,5 @@ -// Package bilibili b站推送 -package bilibili +// Package bilibilipush b站推送 +package bilibilipush import ( "bytes" @@ -34,10 +34,11 @@ var ( lastTime = map[int64]int64{} liveStatus = map[int64]int{} upMap = map[int64]string{} + cfg = bz.NewCookieConfig("data/Bilibili/config.json") ) func init() { - en := control.Register("bilibilipush", &ctrl.Options[*zero.Ctx]{ + en := control.AutoRegister(&ctrl.Options[*zero.Ctx]{ DisableOnDefault: false, Brief: "b站推送", Help: "- 添加b站订阅[uid|name]\n" + @@ -75,7 +76,7 @@ func init() { ctx.SendChain(message.Text("已关闭艾特全体Oo")) }) - en.OnRegex(`^添加[B|b]站订阅\s?(.{1,25})$`, zero.UserOrGrpAdmin, getPara).SetBlock(true).Handle(func(ctx *zero.Ctx) { + en.OnRegex(`^添加[B|b]站订阅\s?(.{1,25})$`, zero.UserOrGrpAdmin, bz.RequireUser(cfg)).SetBlock(true).Handle(func(ctx *zero.Ctx) { buid, _ := strconv.ParseInt(ctx.State["uid"].(string), 10, 64) name, err := getName(buid, cfg) if err != nil || name == "" { @@ -93,7 +94,7 @@ func init() { ctx.SendChain(message.Text("已添加" + name + "的订阅")) }) - en.OnRegex(`^取消[B|b]站订阅\s?(.{1,25})$`, zero.UserOrGrpAdmin, getPara).SetBlock(true).Handle(func(ctx *zero.Ctx) { + en.OnRegex(`^取消[B|b]站订阅\s?(.{1,25})$`, zero.UserOrGrpAdmin, bz.RequireUser(cfg)).SetBlock(true).Handle(func(ctx *zero.Ctx) { buid, _ := strconv.ParseInt(ctx.State["uid"].(string), 10, 64) name, err := getName(buid, cfg) if err != nil { @@ -110,7 +111,7 @@ func init() { } ctx.SendChain(message.Text("已取消" + name + "的订阅")) }) - en.OnRegex(`^取消[B|b]站动态订阅\s?(.{1,25})$`, zero.UserOrGrpAdmin, getPara).SetBlock(true).Handle(func(ctx *zero.Ctx) { + en.OnRegex(`^取消[B|b]站动态订阅\s?(.{1,25})$`, zero.UserOrGrpAdmin, bz.RequireUser(cfg)).SetBlock(true).Handle(func(ctx *zero.Ctx) { buid, _ := strconv.ParseInt(ctx.State["uid"].(string), 10, 64) name, err := getName(buid, cfg) if err != nil { @@ -127,7 +128,7 @@ func init() { } ctx.SendChain(message.Text("已取消" + name + "的动态订阅")) }) - en.OnRegex(`^取消[B|b]站直播订阅\s?(.{1,25})$`, zero.UserOrGrpAdmin, getPara).SetBlock(true).Handle(func(ctx *zero.Ctx) { + en.OnRegex(`^取消[B|b]站直播订阅\s?(.{1,25})$`, zero.UserOrGrpAdmin, bz.RequireUser(cfg)).SetBlock(true).Handle(func(ctx *zero.Ctx) { buid, _ := strconv.ParseInt(ctx.State["uid"].(string), 10, 64) gid := ctx.Event.GroupID if gid == 0 { @@ -333,7 +334,7 @@ func sendDynamic(ctx *zero.Ctx) error { err = errors.Errorf("动态%v的解析有问题,%v", cardList[i].Get("desc.dynamic_id_str"), err) return err } - msg, err := dynamicCard2msg(&dc) + msg, err := dc.ToMessage() if err != nil { err = errors.Errorf("动态%v的解析有问题,%v", cardList[i].Get("desc.dynamic_id_str"), err) return err diff --git a/plugin/bilibili/bilibilipushmodel.go b/plugin/bilibilipush/model.go similarity index 99% rename from plugin/bilibili/bilibilipushmodel.go rename to plugin/bilibilipush/model.go index 8e79a402..db2e4027 100644 --- a/plugin/bilibili/bilibilipushmodel.go +++ b/plugin/bilibilipush/model.go @@ -1,4 +1,4 @@ -package bilibili +package bilibilipush import ( "encoding/json" From 57c95178d889c0e404829f5ce0a1255965788fe7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Sat, 27 Sep 2025 01:23:31 +0800 Subject: [PATCH 12/12] chore: make lint happy --- go.mod | 8 +++----- go.sum | 18 +++++++++++------- plugin/crypter/main.go | 2 +- 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/go.mod b/go.mod index 985451e6..936102a0 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.20 require ( github.com/Baidu-AIP/golang-sdk v1.1.1 - github.com/FloatTech/AnimeAPI v1.7.1-0.20250926165541-8ae591d47008 + github.com/FloatTech/AnimeAPI v1.7.1-0.20250926171956-ba37dfebfc4a github.com/FloatTech/floatbox v0.0.0-20250513111443-adba80e84e80 github.com/FloatTech/gg v1.1.3 github.com/FloatTech/imgfactory v0.2.2-0.20230413152719-e101cc3606ef @@ -48,9 +48,9 @@ require ( github.com/wcharczuk/go-chart/v2 v2.1.2 github.com/wdvxdr1123/ZeroBot v1.8.2-0.20250921063512-13752a73d444 gitlab.com/gomidi/midi/v2 v2.1.7 - golang.org/x/image v0.31.0 + golang.org/x/image v0.24.0 golang.org/x/sys v0.30.0 - golang.org/x/text v0.29.0 + golang.org/x/text v0.22.0 gopkg.in/yaml.v3 v3.0.1 ) @@ -89,8 +89,6 @@ require ( github.com/tklauser/numcpus v0.6.1 // indirect github.com/vcaesar/cedar v0.20.2 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect - golang.org/x/exp/shiny v0.0.0-20250305212735-054e65f0b394 // indirect - golang.org/x/mobile v0.0.0-20231127183840-76ac6878050a // indirect golang.org/x/net v0.33.0 // indirect modernc.org/libc v1.61.0 // indirect modernc.org/mathutil v1.6.0 // indirect diff --git a/go.sum b/go.sum index 3377af1d..f4241b5a 100644 --- a/go.sum +++ b/go.sum @@ -1,8 +1,8 @@ github.com/Baidu-AIP/golang-sdk v1.1.1 h1:RQsAmgDSAkiq22I6n7XJ2t3afgzFeqjY46FGhvrx4cw= github.com/Baidu-AIP/golang-sdk v1.1.1/go.mod h1:bXnGw7xPeKt8aF7UCELKrV6UZ/46spItONK1RQBQj1Y= github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= -github.com/FloatTech/AnimeAPI v1.7.1-0.20250926165541-8ae591d47008 h1:YK29qIO+Iun8YbMoPNN/KHLzv1N0q93RD0sC60pj83g= -github.com/FloatTech/AnimeAPI v1.7.1-0.20250926165541-8ae591d47008/go.mod h1:yairaELY4W1TmRFjNy7HXGW4qLNhCkrXCZEBgmWQ/Sc= +github.com/FloatTech/AnimeAPI v1.7.1-0.20250926171956-ba37dfebfc4a h1:D/+ni0hzmfC+5TVQyGuq/AReGrSNKWTSMqU+lNG60rc= +github.com/FloatTech/AnimeAPI v1.7.1-0.20250926171956-ba37dfebfc4a/go.mod h1:cuDd67B23xmICSmFBhWzXN51blod2BlM1liN9Ux0pSc= github.com/FloatTech/floatbox v0.0.0-20250513111443-adba80e84e80 h1:lFD1pd8NkYCrw0QpTX/T5pJ67I7AL5eGxQ4v0r9f81Q= github.com/FloatTech/floatbox v0.0.0-20250513111443-adba80e84e80/go.mod h1:IWoFFqu+0FeaHHQdddyiTRL5z7gJME6qHC96qh0R2sc= github.com/FloatTech/gg v1.1.3 h1:+GlL02lTKsxJQr4WCuNwVxC1/eBZrCvypCIBtxuOFb4= @@ -183,7 +183,7 @@ github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVs github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/tetratelabs/wazero v1.5.0 h1:Yz3fZHivfDiZFUXnWMPUoiW7s8tC1sjdBtlJn08qYa0= github.com/tetratelabs/wazero v1.5.0/go.mod h1:0U0G41+ochRKoPKCJlh0jMg1CHkyfK8kDqiirMmKY8A= github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= @@ -218,17 +218,19 @@ golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp/shiny v0.0.0-20250305212735-054e65f0b394 h1:bFYqOIMdeiCEdzPJkLiOoMDzW/v3tjW4AA/RmUZYsL8= -golang.org/x/exp/shiny v0.0.0-20250305212735-054e65f0b394/go.mod h1:ygj7T6vSGhhm/9yTpOQQNvuAUFziTH7RUiH74EoE2C8= +golang.org/x/exp/shiny v0.0.0-20250911091902-df9299821621 h1:mNBlTy+K7iiLiyE5Dmn6E/VUdpmHrojPwdKU1v81UJ8= +golang.org/x/exp/shiny v0.0.0-20250911091902-df9299821621/go.mod h1:tEo/L/YxpzKrqv+r35dZPMsKHUm5BliNihYkgdxAUX4= golang.org/x/image v0.0.0-20190220214146-31aff87c08e9/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.18.0/go.mod h1:4yyo5vMFQjVjUcVk4jEQcU9MGy/rulF5WvUILseCM2E= +golang.org/x/image v0.24.0 h1:AN7zRgVsbvmTfNyqIbbOraYL8mSwcKncEj8ofjgzcMQ= +golang.org/x/image v0.24.0/go.mod h1:4b/ITuLfqYq1hqZcjofwctIhi7sZh2WaCjvsBNjjya8= golang.org/x/image v0.31.0 h1:mLChjE2MV6g1S7oqbXC0/UcKijjm5fnJLUYKIYrLESA= golang.org/x/image v0.31.0/go.mod h1:R9ec5Lcp96v9FTF+ajwaH3uGxPH4fKfHHAVbUILxghA= golang.org/x/mobile v0.0.0-20190415191353-3e0bab5405d6/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mobile v0.0.0-20231127183840-76ac6878050a h1:sYbmY3FwUWCBTodZL1S3JUuOvaW6kM2o+clDzzDNBWg= -golang.org/x/mobile v0.0.0-20231127183840-76ac6878050a/go.mod h1:Ede7gF0KGoHlj822RtphAHK1jLdrcuRBZg0sF1Q+SPc= +golang.org/x/mobile v0.0.0-20250813145510-f12310a0cfd9 h1:tf0OY/FXi1sPkoNVKP4w+GStqIfqbFUqDoDDm4B+iCg= +golang.org/x/mobile v0.0.0-20250813145510-f12310a0cfd9/go.mod h1:wNiuiJfmmgv45sw8EHpNeVWqpxLeEwQ8bkUIhuOYUh8= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= @@ -300,6 +302,8 @@ golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= +golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= golang.org/x/text v0.29.0 h1:1neNs90w9YzJ9BocxfsQNHKuAT4pkghyXc4nhZ6sJvk= golang.org/x/text v0.29.0/go.mod h1:7MhJOA9CD2qZyOKYazxdYMF85OwPdEr9jTtBpO7ydH4= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/plugin/crypter/main.go b/plugin/crypter/main.go index 4a94ffca..caf38668 100644 --- a/plugin/crypter/main.go +++ b/plugin/crypter/main.go @@ -8,7 +8,7 @@ import ( ) func init() { - engine := control.Register("crypter", &ctrl.Options[*zero.Ctx]{ + engine := control.AutoRegister(&ctrl.Options[*zero.Ctx]{ DisableOnDefault: false, Brief: "奇怪语言加解密", Help: "多种语言加解密插件\n" +