From 817c4fab6133146334d3e608df82552f1f839346 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: Tue, 1 Oct 2024 16:11:37 +0900 Subject: [PATCH] feat(manager): add slow send (#985) --- go.mod | 1 + go.sum | 2 ++ plugin/manager/manager.go | 4 ++-- plugin/manager/slow.go | 40 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 plugin/manager/slow.go diff --git a/go.mod b/go.mod index 2c14f7f3ed..c479f68f15 100644 --- a/go.mod +++ b/go.mod @@ -25,6 +25,7 @@ require ( github.com/fumiama/go-registry v0.2.7 github.com/fumiama/gotracemoe v0.0.3 github.com/fumiama/jieba v0.0.0-20221203025406-36c17a10b565 + github.com/fumiama/slowdo v0.0.0-20241001065001-bc474bd3fb21 github.com/fumiama/terasu v0.0.0-20240507144117-547a591149c0 github.com/fumiama/unibase2n v0.0.0-20240530074540-ec743fd5a6d6 github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 diff --git a/go.sum b/go.sum index aa641bcb61..967e299b8f 100644 --- a/go.sum +++ b/go.sum @@ -76,6 +76,8 @@ github.com/fumiama/jieba v0.0.0-20221203025406-36c17a10b565 h1:sQuR2+N5HurnvsZhi github.com/fumiama/jieba v0.0.0-20221203025406-36c17a10b565/go.mod h1:UUEvyLTJ7yoOA/viKG4wEis4ERydM7+Ny6gZUWgkS80= github.com/fumiama/libc v0.0.0-20240530081950-6f6d8586b5c5 h1:jDxsIupsT84A6WHcs6kWbst+KqrRQ8/o0VyoFMnbBOA= github.com/fumiama/libc v0.0.0-20240530081950-6f6d8586b5c5/go.mod h1:15P6ublJ9FJR8YQCGy8DeQ2Uwur7iW9Hserr/T3OFZE= +github.com/fumiama/slowdo v0.0.0-20241001065001-bc474bd3fb21 h1:sqg6DgXnL7PcArzLnKgaiQbs2nY6xdR21ChA+ciAjz0= +github.com/fumiama/slowdo v0.0.0-20241001065001-bc474bd3fb21/go.mod h1:nFAMdYFZxaTG/HLmRO0mKmvaGJ/vKtgYj06x8q2LusY= 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-20240507144117-547a591149c0 h1:So/3Bg/m2ZcUvqCzzEjjkjHBjcvnV3AN5tCxwsdMwYU= diff --git a/plugin/manager/manager.go b/plugin/manager/manager.go index b7f398f1bc..66667fc0d8 100644 --- a/plugin/manager/manager.go +++ b/plugin/manager/manager.go @@ -496,10 +496,10 @@ func init() { // 插件主体 var w welcome err := db.Find("farewell", &w, "where gid = "+strconv.FormatInt(ctx.Event.GroupID, 10)) if err == nil { - ctx.SendGroupMessage(ctx.Event.GroupID, message.ParseMessageFromString(welcometocq(ctx, w.Msg))) + collectsend(ctx, message.ParseMessageFromString(welcometocq(ctx, w.Msg))...) } else { userid := ctx.Event.UserID - ctx.SendChain(message.Text(ctx.CardOrNickName(userid), "(", userid, ")", "离开了我们...")) + collectsend(ctx, message.Text(ctx.CardOrNickName(userid), "(", userid, ")", "离开了我们...")) } } }) diff --git a/plugin/manager/slow.go b/plugin/manager/slow.go new file mode 100644 index 0000000000..98eec7d7bb --- /dev/null +++ b/plugin/manager/slow.go @@ -0,0 +1,40 @@ +package manager + +import ( + "time" + + "github.com/FloatTech/zbputils/ctxext" + "github.com/RomiChan/syncx" + "github.com/fumiama/slowdo" + zero "github.com/wdvxdr1123/ZeroBot" + "github.com/wdvxdr1123/ZeroBot/message" +) + +var slowsenders = syncx.Map[int64, *syncx.Lazy[*slowdo.Job[message.MessageSegment, *zero.Ctx]]]{} + +func collectsend(ctx *zero.Ctx, msgs ...message.MessageSegment) { + id := ctx.Event.GroupID + if id == 0 { + // only support group + return + } + lazy, _ := slowsenders.LoadOrStore(id, &syncx.Lazy[*slowdo.Job[message.MessageSegment, *zero.Ctx]]{ + Init: func() *slowdo.Job[message.MessageSegment, *zero.Ctx] { + x, err := slowdo.NewJob(time.Second*5, ctx, func(ctx *zero.Ctx, msg []message.MessageSegment) { + m := make(message.Message, len(msg)) + for i, item := range msg { + m[i] = ctxext.FakeSenderForwardNode(ctx, item) + } + ctx.SendGroupForwardMessage(id, m) + }) + if err != nil { + panic(err) + } + return x + }, + }) + job := lazy.Get() + for _, msg := range msgs { + job.Add(msg) + } +}