mirror of
https://github.com/FloatTech/ZeroBot-Plugin.git
synced 2025-12-18 20:50:12 +08:00
135 lines
4.2 KiB
Go
135 lines
4.2 KiB
Go
// Package airecord 群应用:AI声聊
|
||
package airecord
|
||
|
||
import (
|
||
"strconv"
|
||
"strings"
|
||
"time"
|
||
|
||
"github.com/tidwall/gjson"
|
||
|
||
zero "github.com/wdvxdr1123/ZeroBot"
|
||
"github.com/wdvxdr1123/ZeroBot/message"
|
||
|
||
"github.com/FloatTech/AnimeAPI/airecord"
|
||
ctrl "github.com/FloatTech/zbpctrl"
|
||
"github.com/FloatTech/zbputils/control"
|
||
)
|
||
|
||
func init() {
|
||
en := control.AutoRegister(&ctrl.Options[*zero.Ctx]{
|
||
DisableOnDefault: false,
|
||
Extra: control.ExtraFromString("airecord"),
|
||
Brief: "群应用:AI声聊",
|
||
Help: "- 设置AI语音群号1048452984(tips:机器人任意所在群聊即可)\n" +
|
||
"- 设置AI语音模型\n" +
|
||
"- 查看AI语音配置\n" +
|
||
"- 发送AI语音xxx",
|
||
PrivateDataFolder: "airecord",
|
||
})
|
||
|
||
en.OnPrefix("设置AI语音群号", zero.OnlyPrivate, zero.SuperUserPermission).SetBlock(true).
|
||
Handle(func(ctx *zero.Ctx) {
|
||
u := strings.TrimSpace(ctx.State["args"].(string))
|
||
num, err := strconv.ParseInt(u, 10, 64)
|
||
if err != nil {
|
||
ctx.SendChain(message.Text("ERROR: parse gid err: ", err))
|
||
return
|
||
}
|
||
err = airecord.SetCustomGID(num)
|
||
if err != nil {
|
||
ctx.SendChain(message.Text("ERROR: set gid err: ", err))
|
||
return
|
||
}
|
||
ctx.SendChain(message.Text("设置AI语音群号为", num))
|
||
})
|
||
en.OnFullMatch("设置AI语音模型", zero.OnlyPrivate, zero.SuperUserPermission).SetBlock(true).
|
||
Handle(func(ctx *zero.Ctx) {
|
||
next := zero.NewFutureEvent("message", 999, false, ctx.CheckSession())
|
||
recv, cancel := next.Repeat()
|
||
defer cancel()
|
||
jsonData := ctx.GetAICharacters(0, 1)
|
||
|
||
// 转换为字符串数组
|
||
var names []string
|
||
// 初始化两个映射表
|
||
nameToID := make(map[string]string)
|
||
nameToURL := make(map[string]string)
|
||
characters := jsonData.Get("#.characters")
|
||
|
||
// 遍历每个角色对象
|
||
characters.ForEach(func(_, group gjson.Result) bool {
|
||
group.ForEach(func(_, character gjson.Result) bool {
|
||
// 提取当前角色的三个字段
|
||
name := character.Get("character_name").String()
|
||
names = append(names, name)
|
||
// 存入映射表(重复名称会覆盖,保留最后出现的条目)
|
||
nameToID[name] = character.Get("character_id").String()
|
||
nameToURL[name] = character.Get("preview_url").String()
|
||
return true // 继续遍历
|
||
})
|
||
return true // 继续遍历
|
||
})
|
||
var builder strings.Builder
|
||
// 写入开头文本
|
||
builder.WriteString("请选择语音模型序号:\n")
|
||
|
||
// 遍历names数组,拼接序号和名称
|
||
for i, v := range names {
|
||
// 将数字转换为字符串(不依赖fmt)
|
||
numStr := strconv.Itoa(i)
|
||
// 拼接格式:"序号. 名称\n"
|
||
builder.WriteString(numStr)
|
||
builder.WriteString(". ")
|
||
builder.WriteString(v)
|
||
builder.WriteString("\n")
|
||
}
|
||
// 获取最终字符串
|
||
ctx.SendChain(message.Text(builder.String()))
|
||
for {
|
||
select {
|
||
case <-time.After(time.Second * 120):
|
||
ctx.SendChain(message.Text("设置AI语音模型指令过期"))
|
||
return
|
||
case ct := <-recv:
|
||
msg := ct.Event.Message.ExtractPlainText()
|
||
num, err := strconv.Atoi(msg)
|
||
if err != nil {
|
||
ctx.SendChain(message.Text("请输入数字!"))
|
||
continue
|
||
}
|
||
if num < 0 || num >= len(names) {
|
||
ctx.SendChain(message.Text("序号非法!"))
|
||
continue
|
||
}
|
||
err = airecord.SetRecordModel(names[num], nameToID[names[num]])
|
||
if err != nil {
|
||
ctx.SendChain(message.Text("ERROR: set model err: ", err))
|
||
continue
|
||
}
|
||
ctx.SendChain(message.Text("已选择语音模型: ", names[num]))
|
||
ctx.SendChain(message.Record(nameToURL[names[num]]))
|
||
return
|
||
}
|
||
}
|
||
})
|
||
en.OnFullMatch("查看AI语音配置", zero.OnlyPrivate, zero.SuperUserPermission).SetBlock(true).
|
||
Handle(func(ctx *zero.Ctx) {
|
||
ctx.SendChain(message.Text(airecord.PrintRecordConfig()))
|
||
})
|
||
en.OnPrefix("发送AI语音", zero.UserOrGrpAdmin).SetBlock(true).
|
||
Handle(func(ctx *zero.Ctx) {
|
||
u := strings.TrimSpace(ctx.State["args"].(string))
|
||
recCfg := airecord.GetConfig()
|
||
record := ctx.GetAIRecord(recCfg.ModelID, recCfg.Customgid, u)
|
||
if record == "" {
|
||
id := ctx.SendGroupAIRecord(recCfg.ModelID, ctx.Event.GroupID, u)
|
||
if id == "" {
|
||
ctx.SendChain(message.Text("ERROR: get record err: empty record"))
|
||
return
|
||
}
|
||
}
|
||
ctx.SendChain(message.Record(record))
|
||
})
|
||
}
|