From dde5d2df5432b3c49c220a97d51eb79bfd86fcec 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: Wed, 18 Oct 2023 14:12:51 +0900 Subject: [PATCH] feat: more zb- like apis --- bot.go | 34 ++++++++++++++++++++++++++++++++++ context.go | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+) diff --git a/bot.go b/bot.go index 25f04e9..e1d46d3 100644 --- a/bot.go +++ b/bot.go @@ -394,3 +394,37 @@ func (bot *Bot) Listen() { } } } + +// GetBot 获取指定的bot (Ctx)实例 +func GetBot(id string) *Ctx { + caller, ok := clients.Load(id) + if !ok { + return nil + } + return &Ctx{caller: caller} +} + +// RangeBot 遍历所有bot (Ctx)实例 +// +// 单次操作返回 true 则继续遍历,否则退出 +func RangeBot(iter func(id string, ctx *Ctx) bool) { + clients.Range(func(key string, value *Bot) bool { + return iter(key, &Ctx{caller: value}) + }) +} + +// GetFirstSuperUser 在 ids 中获得 SuperUsers 列表的首个 qq +// +// 找不到返回 nil +func (bot *Bot) GetFirstSuperUser(ids ...string) string { + m := make(map[string]struct{}, len(ids)*4) + for _, qq := range ids { + m[qq] = struct{}{} + } + for _, qq := range bot.SuperUsers { + if _, ok := m[qq]; ok { + return qq + } + } + return "" +} diff --git a/context.go b/context.go index 918d18c..c0296be 100644 --- a/context.go +++ b/context.go @@ -123,6 +123,40 @@ func (ctx *Ctx) SendImage(file string, replytosender bool, caption ...any) (*Mes return ctx.Send(replytosender, post) } +// Echo 向自身分发虚拟事件 +func (ctx *Ctx) Echo(payload *WebsocketPayload) { + ctx.caller.processEvent(payload) +} + +// FutureEvent ... +func (ctx *Ctx) FutureEvent(Type string, rule ...Rule) *FutureEvent { + return ctx.ma.FutureEvent(Type, rule...) +} + +// Get 从 promt 获得回复 +func (ctx *Ctx) Get(prompt string) string { + if prompt != "" { + _, _ = ctx.SendPlainMessage(false, prompt) + } + return (<-ctx.FutureEvent("Message", ctx.CheckSession()).Next()).Event.Value.(*Message).Content +} + +// ExtractPlainText 提取消息中的纯文本 +func (ctx *Ctx) ExtractPlainText() string { + if ctx == nil || ctx.Value == nil { + return "" + } + if msg, ok := ctx.Value.(*Message); ok { + return msg.Content + } + return "" +} + +// MessageString 字符串消息便于Regex +func (ctx *Ctx) MessageString() string { + return ctx.ExtractPlainText() +} + // Block 匹配成功后阻止后续触发 func (ctx *Ctx) Block() { ctx.ma.SetBlock(true)