|
| 1 | +package broadcast |
1 | 2 |
|
| 3 | +import ( |
| 4 | + "fmt" |
| 5 | + "strings" |
| 6 | + "time" |
| 7 | + |
| 8 | + ctrl "github.com/FloatTech/zbpctrl" |
| 9 | + "github.com/FloatTech/zbputils/control" |
| 10 | + "github.com/FloatTech/zbputils/ctxext" |
| 11 | + "github.com/wdvxdr1123/ZeroBot" |
| 12 | + "github.com/wdvxdr1123/ZeroBot/message" |
| 13 | +) |
| 14 | + |
| 15 | +// 黑名单群列表 |
| 16 | +var blacklist = map[int64]bool{ |
| 17 | + 123456789: true, |
| 18 | + 987654321: true, |
| 19 | +} |
| 20 | + |
| 21 | +// 限速器 |
| 22 | +var limiter = ctxext.NewLimiterManager(time.Second*10, 1) |
| 23 | + |
| 24 | +func init() { |
| 25 | + engine := control.Register("broadcast", &ctrl.Options[*zero.Ctx]{ |
| 26 | + DisableOnDefault: false, |
| 27 | + Brief: "群广播插件", |
| 28 | + Help: "- 广播(预览) 图片+文本 或纯文本\n- 支持图文混合广播\n- 支持预览模式", |
| 29 | + PublicDataFolder: "Broadcast", |
| 30 | + OnEnable: func(ctx *zero.Ctx) { |
| 31 | + ctx.Send("广播插件已启用") |
| 32 | + }, |
| 33 | + OnDisable: func(ctx *zero.Ctx) { |
| 34 | + ctx.Send("广播插件已禁用") |
| 35 | + }, |
| 36 | + }) |
| 37 | + |
| 38 | + engine.OnRegex(`^广播(预览)?\s+(.+)$`).SetBlock(true).Limit(limiter.LimitByGroup).Handle(func(ctx *zero.Ctx) { |
| 39 | + matches := ctx.State["regex_matched"].([]string) |
| 40 | + isPreview := matches[1] == "预览" |
| 41 | + raw := matches[2] |
| 42 | + |
| 43 | + var msg message.Slice |
| 44 | + parts := strings.Fields(raw) |
| 45 | + |
| 46 | + if len(parts) >= 2 && parts[0] == "图片" { |
| 47 | + for i := 1; i < len(parts); i++ { |
| 48 | + part := parts[i] |
| 49 | + if strings.HasPrefix(part, "http") { |
| 50 | + msg = append(msg, message.Image(part)) |
| 51 | + } else { |
| 52 | + text := strings.Join(parts[i:], " ") |
| 53 | + msg = append(msg, message.Text("\n" + text)) |
| 54 | + break |
| 55 | + } |
| 56 | + } |
| 57 | + } else { |
| 58 | + msg = message.Slice{message.Text(raw)} |
| 59 | + } |
| 60 | + |
| 61 | + var nodes []message.Node |
| 62 | + var successCount, failCount, skipCount int |
| 63 | + |
| 64 | + for _, group := range ctx.Bot.GroupList() { |
| 65 | + if blacklist[group.GroupID] { |
| 66 | + skipCount++ |
| 67 | + continue |
| 68 | + } |
| 69 | + |
| 70 | + status := "(预览中,不会真的发出去哟~)" |
| 71 | + if !isPreview { |
| 72 | + err := ctx.SendGroupMessage(group.GroupID, msg) |
| 73 | + if err != nil { |
| 74 | + status = "呜呜,失败了……" |
| 75 | + failCount++ |
| 76 | + } else { |
| 77 | + status = "发送成功啦!✨" |
| 78 | + successCount++ |
| 79 | + } |
| 80 | + } |
| 81 | + |
| 82 | + nodes = append(nodes, message.Node{ |
| 83 | + SenderID: ctx.SelfID, |
| 84 | + SenderName: ctx.Bot.Nickname, |
| 85 | + Content: message.Text(fmt.Sprintf("群 %d:%s", group.GroupID, status)), |
| 86 | + }) |
| 87 | + } |
| 88 | + |
| 89 | + if ctx.IsGroup { |
| 90 | + if isPreview { |
| 91 | + ctx.Send(message.Text("来看看广播预览吧~不是真的发出去哦!")) |
| 92 | + } |
| 93 | + ctx.SendGroupForwardMessage(ctx.GroupID, nodes) |
| 94 | + } else { |
| 95 | + if isPreview { |
| 96 | + ctx.Send(message.Text("这是广播预览结果哒~")) |
| 97 | + ctx.SendPrivateForwardMessage(ctx.UserID, nodes) |
| 98 | + } else { |
| 99 | + ctx.Send(message.Text(fmt.Sprintf( |
| 100 | + "广播完成啦~\n成功发送 %d 个群\n失败 %d 个群\n跳过 %d 个黑名单群\n辛苦我啦!(๑•̀ㅂ•́)و✧", |
| 101 | + successCount, failCount, skipCount, |
| 102 | + ))) |
| 103 | + } |
| 104 | + } |
| 105 | + }) |
| 106 | +} |
0 commit comments