diff --git a/basic/help/single.go b/basic/help/single.go index f7d0d83..8d9528b 100644 --- a/basic/help/single.go +++ b/basic/help/single.go @@ -9,7 +9,7 @@ import ( "github.com/wdvxdr1123/ZeroBot/message" ) -func formSingleHelpMsg(cmd string, isSuper, isPrimary bool, priority int, blackKeys map[string]struct{}) message.MessageSegment { +func formSingleHelpMsg(cmd string, isSuper, isPrimary bool, priority int, blackKeys map[string]struct{}) message.Segment { plugins := manager.GetAllPluginConditions() // 寻找插件 var selected *manager.PluginCondition diff --git a/basic/help/summary.go b/basic/help/summary.go index 95798ee..605a6b5 100644 --- a/basic/help/summary.go +++ b/basic/help/summary.go @@ -18,7 +18,7 @@ import ( const defaultClassify = "一般功能" const passiveClassify = "被动" -func formSummaryHelpMsg(isSuper, isPrimary bool, priority int, blackKeys map[string]struct{}) message.MessageSegment { +func formSummaryHelpMsg(isSuper, isPrimary bool, priority int, blackKeys map[string]struct{}) message.Segment { plugins := manager.GetAllPluginConditions() // 获取所有插件信息 var helps helpSummaryMap = make(map[string]*blockInfo) diff --git a/basic/invite/super_deal.go b/basic/invite/super_deal.go index b127fa4..6ef11ab 100644 --- a/basic/invite/super_deal.go +++ b/basic/invite/super_deal.go @@ -261,7 +261,7 @@ func formAllGroupRequest(has map[int64]string, ctx *zero.Ctx) (map[int64]string, return data, least } -func formResponse(info string) message.MessageSegment { +func formResponse(info string) message.Segment { w, h := images.MeasureStringDefault(info, 16, 1.3) img := images.NewImageCtxWithBGRGBA255(int(w)+20, int(h), 255, 255, 255, 255) err := img.PasteStringDefault(info, 16, 1.3, 10, 0, w) diff --git a/basic/sc/msg.go b/basic/sc/msg.go index 60e51ea..4536699 100644 --- a/basic/sc/msg.go +++ b/basic/sc/msg.go @@ -127,7 +127,7 @@ func (s signInfo) String() string { RealCoin(s.orgCoin+s.addCoin), RealCoin(s.addCoin), Unit()) } -func genRankMessage(ctx *zero.Ctx, users []dao.UserOwn, key string) (msg message.MessageSegment, err error) { +func genRankMessage(ctx *zero.Ctx, users []dao.UserOwn, key string) (msg message.Segment, err error) { var values []images.UserValue if key == "favor" { // 好感度 for _, user := range users { diff --git a/cmd/main.go b/cmd/main.go index 83b61b6..a90fbb2 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -7,6 +7,7 @@ import ( "github.com/spf13/viper" zero "github.com/wdvxdr1123/ZeroBot" "github.com/wdvxdr1123/ZeroBot/driver" + "strconv" // 可选插件,若要启用,去除注释即可 // _ "github.com/RicheyJang/PaimengBot/plugins/HiOSU" @@ -64,12 +65,21 @@ func main() { } // 启动服务 log.Infof("读取超级管理员列表:%v", viper.GetStringSlice("superuser")) - zero.RunAndBlock(zero.Config{ + config := zero.Config{ NickName: []string{viper.GetString("nickname")}, - CommandPrefix: "", - SuperUsers: viper.GetStringSlice("superuser"), + CommandPrefix: viper.GetString("command_prefix"), Driver: []zero.Driver{ driver.NewWebSocketClient(viper.GetString("server.address"), viper.GetString("server.token")), }, + } + for _, sid := range viper.GetStringSlice("superuser") { + id, err := strconv.ParseInt(sid, 10, 64) + if err != nil { + panic(err) + } + config.SuperUsers = append(config.SuperUsers, id) + } + zero.RunAndBlock(&config, func() { + log.Infoln(zero.BotConfig.NickName[0], "启动成功~") }) } diff --git a/go.mod b/go.mod index 81abf2f..f951f5f 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/RicheyJang/PaimengBot -go 1.17 +go 1.20 require ( github.com/PuerkitoBio/goquery v1.8.0 @@ -13,20 +13,23 @@ require ( github.com/robfig/cron/v3 v3.0.1 github.com/satori/go.uuid v1.2.0 github.com/shirou/gopsutil/v3 v3.21.10 - github.com/sirupsen/logrus v1.8.1 + github.com/sirupsen/logrus v1.9.3 github.com/spf13/cast v1.4.1 github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.10.1 github.com/syndtr/goleveldb v1.0.0 - github.com/tidwall/gjson v1.11.0 + github.com/tidwall/gjson v1.17.3 github.com/wcharczuk/go-chart/v2 v2.1.0 - github.com/wdvxdr1123/ZeroBot v1.4.1 + github.com/wdvxdr1123/ZeroBot v1.8.1-0.20250128033423-46f06a25cb99 + golang.org/x/net v0.21.0 gorm.io/driver/mysql v1.3.2 gorm.io/driver/postgres v1.3.1 gorm.io/gorm v1.23.1 ) require ( + github.com/FloatTech/ttl v0.0.0-20240716161252-965925764562 // indirect + github.com/RomiChan/websocket v1.4.3-0.20220227141055-9b2c6168c9c5 // indirect github.com/StackExchange/wmi v1.2.1 // indirect github.com/andybalholm/cascadia v1.3.1 // indirect github.com/chromedp/cdproto v0.0.0-20211126220118-81fa0469ad77 // indirect @@ -38,8 +41,8 @@ require ( github.com/gobwas/pool v0.2.1 // indirect github.com/gobwas/ws v1.1.0 // indirect github.com/golang/snappy v0.0.3 // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/google/uuid v1.3.0 // indirect - github.com/gorilla/websocket v1.4.2 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/jackc/chunkreader/v2 v2.0.1 // indirect github.com/jackc/pgconn v1.10.1 // indirect @@ -70,11 +73,10 @@ require ( github.com/tidwall/pretty v1.2.0 // indirect github.com/tklauser/go-sysconf v0.3.9 // indirect github.com/tklauser/numcpus v0.3.0 // indirect - golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 // indirect + golang.org/x/crypto v0.32.0 // indirect golang.org/x/image v0.0.0-20200927104501-e162460cd6b5 // indirect - golang.org/x/net v0.0.0-20210916014120-12bc252f5db8 // indirect - golang.org/x/sys v0.0.0-20211210111614-af8b64212486 // indirect - golang.org/x/text v0.3.7 // indirect + golang.org/x/sys v0.29.0 // indirect + golang.org/x/text v0.21.0 // indirect gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect gopkg.in/ini.v1 v1.66.2 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/manager/manager.go b/manager/manager.go index 55f8821..51e9f29 100644 --- a/manager/manager.go +++ b/manager/manager.go @@ -71,7 +71,7 @@ func NewPluginManager() *PluginManager { } // 添加前置Pre Hook m.engine.UsePreHandler(rules.SkipGuildMessage) // TODO 暂时忽略所有频道消息,原因:ZeroBot无法正常发送频道消息 - m.engine.UsePreHandler(m.preHandlerWithHook) + m.engine.UseMidHandler(m.preHandlerWithHook) // 添加后置Post Hook m.engine.UsePostHandler(m.postHandlerWithHook) return m diff --git a/plugins/HiOSU/MyInfo.go b/plugins/HiOSU/MyInfo.go index 8c68805..1d4c197 100644 --- a/plugins/HiOSU/MyInfo.go +++ b/plugins/HiOSU/MyInfo.go @@ -97,17 +97,17 @@ func GetMyInfo(API string) (User, error) { return users[0], nil } -func ToImageUser(user User, Model string) (message.MessageSegment, error) { //生成图片 +func ToImageUser(user User, Model string) (message.Segment, error) { //生成图片 // 读取Logo LogoImage, err := manager.DecodeStaticImage("HiOSU/Logo/Logo_96x97.png") if err != nil { - return message.MessageSegment{}, err + return message.Segment{}, err } //读取各种模式的图标 ModelImage, err := getModelImage(Model) if err != nil { - return message.MessageSegment{}, err + return message.Segment{}, err } width := float64(465) @@ -117,7 +117,7 @@ func ToImageUser(user User, Model string) (message.MessageSegment, error) { // // 标题栏 err = dc.UseDefaultFont(20) if err != nil { - return message.MessageSegment{}, err + return message.Segment{}, err } dc.SetRGB(1, 1, 1) // 设置画笔颜色为白 dc.DrawImage(LogoImage, 10, 10) //贴OSU图标 @@ -125,12 +125,12 @@ func ToImageUser(user User, Model string) (message.MessageSegment, error) { // dc.DrawString("Country :"+user.Country, 130, 40) err = dc.UseDefaultFont(40) //字体设置大一些 if err != nil { - return message.MessageSegment{}, err + return message.Segment{}, err } dc.DrawString(user.UserName, 130, 80) //显示UserName err = dc.UseDefaultFont(20) if err != nil { - return message.MessageSegment{}, err + return message.Segment{}, err } dc.DrawString("Join Date: "+user.JoinDate, 130, 100) dc.DrawString("-----------------------------------------------", 0, 123) diff --git a/plugins/HiOSU/RecentPlay.go b/plugins/HiOSU/RecentPlay.go index e83abc2..01e67f5 100644 --- a/plugins/HiOSU/RecentPlay.go +++ b/plugins/HiOSU/RecentPlay.go @@ -90,11 +90,11 @@ func GetRecentPlay(API string) (Recent, error) { return recents[0], nil } -func ToImageRecent(recent Recent, Model string, OsuId string) (message.MessageSegment, error) { //生成图片 +func ToImageRecent(recent Recent, Model string, OsuId string) (message.Segment, error) { //生成图片 ModelImage, err := getModelImage(Model) if err != nil { - return message.MessageSegment{}, err + return message.Segment{}, err } width := float64(800) diff --git a/plugins/bilibili/public.go b/plugins/bilibili/public.go index 2904515..f643451 100644 --- a/plugins/bilibili/public.go +++ b/plugins/bilibili/public.go @@ -450,7 +450,7 @@ func (l *LiveRoom) Info() (LiveRoomInfo, error) { }, nil } -func DynamicTypeShareMessage(d DynamicInfo) (m []message.MessageSegment) { +func DynamicTypeShareMessage(d DynamicInfo) (m []message.Segment) { //简单的分享处理 r := gjson.Parse(d.Card) shareUrl := "https://t.bilibili.com/" + r.Get("item.orig_dy_id").String() @@ -460,7 +460,7 @@ func DynamicTypeShareMessage(d DynamicInfo) (m []message.MessageSegment) { return m } -func DynamicTypePicMessage(d DynamicInfo) (m []message.MessageSegment) { +func DynamicTypePicMessage(d DynamicInfo) (m []message.Segment) { r := gjson.Parse(d.Card) m = append(m, message.Text(utils.StringLimit(r.Get("item.description").String(), getContentLimit()))) if proxy.GetConfigInt64("picture") == 0 { @@ -479,12 +479,12 @@ func DynamicTypePicMessage(d DynamicInfo) (m []message.MessageSegment) { return m } -func DynamicTypeTextMessage(d DynamicInfo) (m []message.MessageSegment) { +func DynamicTypeTextMessage(d DynamicInfo) (m []message.Segment) { r := gjson.Parse(d.Card) return append(m, message.Text(utils.StringLimit(r.Get("item.content").String(), getContentLimit()))) } -func DynamicTypeReadMessage(d DynamicInfo) (m []message.MessageSegment) { +func DynamicTypeReadMessage(d DynamicInfo) (m []message.Segment) { r := gjson.Parse(d.Card) return append(m, message.Text("标题:"+r.Get("title").String()+ "\n概要:"+utils.StringLimit(r.Get("summary").String(), getContentLimit())+ diff --git a/plugins/bilibili/send.go b/plugins/bilibili/send.go index 1a65882..6e30245 100644 --- a/plugins/bilibili/send.go +++ b/plugins/bilibili/send.go @@ -138,7 +138,7 @@ func checkUpStatus(sub Subscription) (msg []message.Message) { link := fmt.Sprintf("\n主页:https://space.bilibili.com/%v/dynamic", sub.BID) // 按动态类型附加内容 - var appendMsg []message.MessageSegment + var appendMsg []message.Segment switch d.Type { case DynamicTypeShare: // 分享动态 appendMsg = DynamicTypeShareMessage(d) @@ -167,7 +167,7 @@ func checkUpStatus(sub Subscription) (msg []message.Message) { if proxy.GetConfigBool("link") { appendMsg = append(appendMsg, message.Text(link)) } - msg = []message.Message{append([]message.MessageSegment{message.Text(str)}, appendMsg...)} + msg = []message.Message{append([]message.Segment{message.Text(str)}, appendMsg...)} // 更新状态 sub.DynamicLastTime = d.Time diff --git a/plugins/bottle/init.go b/plugins/bottle/init.go index 007e311..7a890cb 100644 --- a/plugins/bottle/init.go +++ b/plugins/bottle/init.go @@ -155,7 +155,7 @@ func deleteAllHandler(ctx *zero.Ctx) { return } -func genBottleMsg(bottle DriftingBottleModel) (msg message.MessageSegment) { +func genBottleMsg(bottle DriftingBottleModel) (msg message.Segment) { var err error defer func() { if err != nil { diff --git a/plugins/emoji_mix/init.go b/plugins/emoji_mix/init.go index 388188f..7cff474 100644 --- a/plugins/emoji_mix/init.go +++ b/plugins/emoji_mix/init.go @@ -90,7 +90,7 @@ func match(ctx *zero.Ctx) bool { } // 获取qq表情 或 emoji对应的索引 -func face2emoji(face message.MessageSegment) rune { +func face2emoji(face message.Segment) rune { if face.Type == "face" { id, err := strconv.Atoi(face.Data["id"]) if err != nil { diff --git a/plugins/genshin/genshin_query/genshin_query.go b/plugins/genshin/genshin_query/genshin_query.go index df44c68..1cf708b 100644 --- a/plugins/genshin/genshin_query/genshin_query.go +++ b/plugins/genshin/genshin_query/genshin_query.go @@ -43,7 +43,7 @@ func Query(uid string, cookie string, showLeft bool) (message.Message, *mihoyo.G } // 生成图片便签消息 -func genNotePicMessage(role *mihoyo.GameRole, note *mihoyo.GenshinDailyNote, showLeft bool) (message.MessageSegment, error) { +func genNotePicMessage(role *mihoyo.GameRole, note *mihoyo.GenshinDailyNote, showLeft bool) (message.Segment, error) { now := time.Now() maxExpedition := "0" for _, r := range note.Expeditions { @@ -55,11 +55,11 @@ func genNotePicMessage(role *mihoyo.GameRole, note *mihoyo.GenshinDailyNote, sho // 角色 err := img.PasteStringDefault(role.NickName, 28, 1, 50, 15, 680) if err != nil { - return message.MessageSegment{}, err + return message.Segment{}, err } // 设置参数 if err = img.UseDefaultFont(24); err != nil { - return message.MessageSegment{}, err + return message.Segment{}, err } height := 60.0 // 计算文字 diff --git a/plugins/genshin/genshin_record/record.go b/plugins/genshin/genshin_record/record.go index 00bd942..f9753ea 100644 --- a/plugins/genshin/genshin_record/record.go +++ b/plugins/genshin/genshin_record/record.go @@ -182,7 +182,7 @@ func getRecord(ctx *zero.Ctx) { } -func getRecordImage(GenShin GenShinInfo, UID string) (message.MessageSegment, error) { +func getRecordImage(GenShin GenShinInfo, UID string) (message.Segment, error) { RecordImage := images.NewImageCtxWithBGColor(1000, 5000, "#363839") @@ -201,7 +201,7 @@ func getRecordImage(GenShin GenShinInfo, UID string) (message.MessageSegment, er UserLevel := strconv.Itoa(GenShin.Data.Role.Level) //玩家等级 if err := RecordImage.UseDefaultFont(25); err != nil { - return message.MessageSegment{}, err + return message.Segment{}, err } RecordImage.SetHexColor("#e5e5e5") @@ -356,13 +356,13 @@ func getRecordImage(GenShin GenShinInfo, UID string) (message.MessageSegment, er //这里计划写一个Goroutine if err = updateWorldICONPicture(GenShin); err != nil { - return message.MessageSegment{}, err + return message.Segment{}, err } if err = updateWorldBackgroundPicture(GenShin); err != nil { - return message.MessageSegment{}, err + return message.Segment{}, err } if err = updateWorldOfferingsPicture(GenShin); err != nil { - return message.MessageSegment{}, err + return message.Segment{}, err } RecordImage.UseDefaultFont(50) //这里应该改为usedefeafont diff --git a/plugins/idioms/guess.go b/plugins/idioms/guess.go index b6503c1..6b077c8 100644 --- a/plugins/idioms/guess.go +++ b/plugins/idioms/guess.go @@ -84,13 +84,13 @@ func guessIdioms(ctx *zero.Ctx) { if e == nil { return } - guess := strings.TrimSpace(e.Message.ExtractPlainText()) + guess := strings.TrimSpace(e.ExtractPlainText()) if guess == key { // 猜对,结束游戏 - ctx.SendChain(message.At(e.UserID), message.Text("猜对啦")) - addSuccess(e.GroupID, e.UserID) + ctx.SendChain(message.At(e.Event.UserID), message.Text("猜对啦")) + addSuccess(e.Event.GroupID, e.Event.UserID) return } else if utils.StringSliceContain(cancelMessage, guess) { // 取消,结束游戏 - ctx.SendChain(message.At(e.UserID), message.Text(fmt.Sprintf("那算啦,其实正确答案是%v哦", key))) + ctx.SendChain(message.At(e.Event.UserID), message.Text(fmt.Sprintf("那算啦,其实正确答案是%v哦", key))) return } else { // 猜错,继续游戏 if ctx.Event.GroupID == 0 { // 只有私聊提示 @@ -106,7 +106,7 @@ func guessIdioms(ctx *zero.Ctx) { // 获取猜成语图片: -func getIdiomsPicture() (msg message.MessageSegment, key string, err error) { +func getIdiomsPicture() (msg message.Segment, key string, err error) { return getIdiomsPictureLocal() //if proxy.GetConfigBool("localFirst") { // msg, key, err = getIdiomsPictureLocal() @@ -122,7 +122,7 @@ func getIdiomsPicture() (msg message.MessageSegment, key string, err error) { //return } -func getIdiomsPictureLocal() (msg message.MessageSegment, key string, err error) { +func getIdiomsPictureLocal() (msg message.Segment, key string, err error) { // 计数 count := 0 _ = filepath.WalkDir(consts.IdiomsImageDir, func(path string, d fs.DirEntry, err error) error { @@ -137,7 +137,7 @@ func getIdiomsPictureLocal() (msg message.MessageSegment, key string, err error) return nil }) if count == 0 { - return message.MessageSegment{}, "", fmt.Errorf("%v目录为空,请及时放置成语图片文件", consts.IdiomsImageDir) + return message.Segment{}, "", fmt.Errorf("%v目录为空,请及时放置成语图片文件", consts.IdiomsImageDir) } // 随机选取 num := rand.Intn(count) @@ -161,10 +161,10 @@ func getIdiomsPictureLocal() (msg message.MessageSegment, key string, err error) return nil }) if err != nil { - return message.MessageSegment{}, "", fmt.Errorf("filepath walk err: %v", err) + return message.Segment{}, "", fmt.Errorf("filepath walk err: %v", err) } if len(key) == 0 { - return message.MessageSegment{}, "", fmt.Errorf("存在无答案图片文件") + return message.Segment{}, "", fmt.Errorf("存在无答案图片文件") } return } diff --git a/plugins/idioms/iyk0.go b/plugins/idioms/iyk0.go index cf352c3..29adf5e 100644 --- a/plugins/idioms/iyk0.go +++ b/plugins/idioms/iyk0.go @@ -14,14 +14,14 @@ import ( const idiomsPictureAPI = "https://api.iyk0.com/ktc/" -func getIdiomsPictureByIYK0() (msg message.MessageSegment, key string, err error) { +func getIdiomsPictureByIYK0() (msg message.Segment, key string, err error) { c := client.NewHttpClient(&client.HttpOptions{TryTime: 2}) rsp, err := c.GetGJson(idiomsPictureAPI) if err != nil { - return message.MessageSegment{}, "", err + return message.Segment{}, "", err } if rsp.Get("code").Int() != 200 { - return message.MessageSegment{}, "", fmt.Errorf("rsp code != 200, msg: %v", rsp.Get("msg")) + return message.Segment{}, "", fmt.Errorf("rsp code != 200, msg: %v", rsp.Get("msg")) } key = rsp.Get("key").String() url := rsp.Get("img").String() diff --git a/plugins/inspection/inspection.go b/plugins/inspection/inspection.go index 64dfe7b..d2cf232 100644 --- a/plugins/inspection/inspection.go +++ b/plugins/inspection/inspection.go @@ -194,7 +194,7 @@ func formatBytesSize(size uint64) string { return strconv.FormatUint(size, 10) } -func formResponse(texts ...string) message.MessageSegment { +func formResponse(texts ...string) message.Segment { var defaultInfo string for i, str := range texts { if i != 0 { diff --git a/plugins/note/init.go b/plugins/note/init.go index bb92b76..6c93334 100644 --- a/plugins/note/init.go +++ b/plugins/note/init.go @@ -259,7 +259,7 @@ func genBriefMessage(msg message.Message) string { return str } // 不含文字,挑选第一个不是@的消息类型 - var selectSeg message.MessageSegment + var selectSeg message.Segment for _, seg := range msg { selectSeg = seg if seg.Type != "at" { diff --git a/plugins/pixiv/download.go b/plugins/pixiv/download.go index e42b4c5..236dfd9 100644 --- a/plugins/pixiv/download.go +++ b/plugins/pixiv/download.go @@ -125,7 +125,7 @@ func (d *downloader) send(ctx *zero.Ctx) { } // 处理图片消息的撤回 -func dealWithdraw(msgID int64) { +func dealWithdraw(msgID message.ID) { withdraw := proxy.GetConfigString("withdraw") if len(withdraw) == 0 || withdraw == "0" { return diff --git a/plugins/statistic/statistic.go b/plugins/statistic/statistic.go index ef31b67..6a6c07f 100644 --- a/plugins/statistic/statistic.go +++ b/plugins/statistic/statistic.go @@ -179,7 +179,7 @@ func globalStatistics(ctx *zero.Ctx) { ctx.Send(dealStatistic(title, prefix)) } -func dealStatistic(title string, prefix string) message.MessageSegment { +func dealStatistic(title string, prefix string) message.Segment { resMap := make(map[string]uint32) iter := proxy.GetLevelDB().NewIterator(levelutil.BytesPrefix([]byte(prefix)), nil) skips := proxy.GetConfigStrings("ignore") @@ -237,7 +237,7 @@ func BytesToUInt32(b []byte) uint32 { return binary.LittleEndian.Uint32(b) } -func drawGraph(title string, mp map[string]uint32) message.MessageSegment { +func drawGraph(title string, mp map[string]uint32) message.Segment { // 初始化 var sum float64 var values []chart.Value diff --git a/plugins/weather/init.go b/plugins/weather/init.go index e222005..f8778cf 100644 --- a/plugins/weather/init.go +++ b/plugins/weather/init.go @@ -92,7 +92,7 @@ func weatherHandler(ctx *zero.Ctx) { ctx.Send(pic) } -func genWeatherPicMsg(weather Weather) (message.MessageSegment, error) { +func genWeatherPicMsg(weather Weather) (message.Segment, error) { // 规整数据 if len(weather.Future) > 7 { weather.Future = weather.Future[:7] @@ -106,12 +106,12 @@ func genWeatherPicMsg(weather Weather) (message.MessageSegment, error) { // 1. 大标题 err := img.PasteStringDefault(weather.City, 34, 1, 60, 10, float64(W)) if err != nil { - return message.MessageSegment{}, err + return message.Segment{}, err } w, h := images.MeasureStringDefault(weather.City, 34, 1) // w, h 用于各面板定位 err = img.PasteStringDefault("更新于"+weather.UpdatedAt.Format("15:04"), 20, 1, 60+w+20, 25, float64(W)) if err != nil { - return message.MessageSegment{}, err + return message.Segment{}, err } h += 30 // 2. 天气面板 @@ -151,7 +151,7 @@ func genWeatherPicMsg(weather Weather) (message.MessageSegment, error) { img.PasteCircle(x, y+18, 5, "black") err = img.PasteStringDefault("小提示:", 28, 1, x+15, y, 370) if err != nil { - return message.MessageSegment{}, err + return message.Segment{}, err } y += 40 for i, tip := range weather.Tips { @@ -161,7 +161,7 @@ func genWeatherPicMsg(weather Weather) (message.MessageSegment, error) { img.PasteCircle(x, y+15, 3, "black") err = img.PasteStringDefault(tip, 24, 1, x+8, y, 370) if err != nil { - return message.MessageSegment{}, err + return message.Segment{}, err } y += 35 } diff --git a/plugins/welcome/welcome.go b/plugins/welcome/welcome.go index 35e5414..6dd00c6 100644 --- a/plugins/welcome/welcome.go +++ b/plugins/welcome/welcome.go @@ -122,7 +122,7 @@ func handleIncrease(ctx *zero.Ctx) { } // 收到的图片消息,存储至本地消息 -func recvImage2Local(groupID, num int64, msg message.MessageSegment) message.MessageSegment { +func recvImage2Local(groupID, num int64, msg message.Segment) message.Segment { url := utils.GetImageURL(msg) if len(url) == 0 { return msg @@ -145,7 +145,7 @@ func recvImage2Local(groupID, num int64, msg message.MessageSegment) message.Mes } // 本地的图片消息,自动转换成可发送消息(若OneBot收发端不在本地,改用Base64) -func localImage2Send(msg message.MessageSegment) message.MessageSegment { +func localImage2Send(msg message.Segment) message.Segment { if utils.IsOneBotLocal() || !strings.HasPrefix(msg.Data["file"], "file:///") { return msg } diff --git a/pre_works.go b/pre_works.go index 8040884..93798c7 100644 --- a/pre_works.go +++ b/pre_works.go @@ -9,6 +9,7 @@ import ( "os/exec" "path/filepath" "runtime" + "strconv" "strings" "time" @@ -172,7 +173,15 @@ func flushMainConfig(configPath string, configFileName string) error { } viper.WatchConfig() viper.OnConfigChange(func(e fsnotify.Event) { // 配置文件发生变更之后会调用的回调函数 - zero.BotConfig.SuperUsers = viper.GetStringSlice("superuser") + zero.BotConfig.SuperUsers = []int64{} + for _, sid := range viper.GetStringSlice("superuser") { + id, err := strconv.ParseInt(sid, 10, 64) + if err != nil { + log.Warnln("读取更新的超级用户出错", err) + } + zero.BotConfig.SuperUsers = append(zero.BotConfig.SuperUsers, id) + } + zero.BotConfig.CommandPrefix = viper.GetString("command_prefix") zero.BotConfig.NickName = []string{viper.GetString("nickname")} _ = setupLogger() log.Infof("reload main config from %v", e.Name) diff --git a/utils/ctx.go b/utils/ctx.go index cb9bf26..8f93851 100644 --- a/utils/ctx.go +++ b/utils/ctx.go @@ -3,7 +3,6 @@ package utils import ( "fmt" "io" - "strconv" "strings" "time" @@ -83,7 +82,7 @@ func WaitNextMessage(ctx *zero.Ctx) *zero.Event { defer cancel() select { case e := <-r: - return e + return e.Event case <-t.C: // 超时取消 return nil } @@ -104,7 +103,7 @@ func GetConfirm(tip string, ctx *zero.Ctx) bool { } // GetImageURL 通过消息获取其中的图片URL -func GetImageURL(msg message.MessageSegment) string { +func GetImageURL(msg message.Segment) string { if msg.Type != "image" { return "" } @@ -257,17 +256,18 @@ func GetBotNickname() string { // GetBotID 获取机器人的登录ID func GetBotID() int64 { - if len(zero.BotConfig.Driver) == 0 { - return 0 - } - return zero.BotConfig.Driver[0].SelfID() + self := int64(0) + zero.RangeBot(func(id int64, ctx *zero.Ctx) bool { + self = id + return false + }) + return self } // IsSuperUser userID是否为超级用户 func IsSuperUser(userID int64) bool { - uid := strconv.FormatInt(userID, 10) for _, su := range GetBotConfig().SuperUsers { - if su == uid { + if su == userID { return true } } @@ -275,15 +275,11 @@ func IsSuperUser(userID int64) bool { } // SendToSuper 将消息发送给所有后端的所有超级用户 -func SendToSuper(message ...message.MessageSegment) { +func SendToSuper(message ...message.Segment) { supers := GetBotConfig().SuperUsers zero.RangeBot(func(id int64, ctx *zero.Ctx) bool { for _, user := range supers { - userID, err := strconv.ParseInt(user, 10, 64) - if err != nil { - continue - } - ctx.SendPrivateMessage(userID, message) + ctx.SendPrivateMessage(user, message) } return true }) diff --git a/utils/file.go b/utils/file.go index 2ff5042..119cae9 100644 --- a/utils/file.go +++ b/utils/file.go @@ -89,7 +89,7 @@ func PathJoin(paths ...string) string { } // GetImageFileMsg 将本地图片文件自动转换为CQ码消息 -func GetImageFileMsg(file string) (message.MessageSegment, error) { +func GetImageFileMsg(file string) (message.Segment, error) { if !FileExists(file) { return message.Text("图片消失了"), os.ErrNotExist } diff --git a/utils/images/images.go b/utils/images/images.go index 268f575..6a1343b 100644 --- a/utils/images/images.go +++ b/utils/images/images.go @@ -142,7 +142,7 @@ func (img *ImageCtx) SaveTempDefault() (string, error) { return img.SaveTemp("tempimg") } -func (img *ImageCtx) GenMessageBase64() (message.MessageSegment, error) { +func (img *ImageCtx) GenMessageBase64() (message.Segment, error) { resultBuff := bytes.NewBuffer(nil) // 结果缓冲区 // 新建Base64编码器(Base64结果写入结果缓冲区resultBuff) encoder := base64.NewEncoder(base64.StdEncoding, resultBuff) @@ -161,7 +161,7 @@ func (img *ImageCtx) GenMessageBase64() (message.MessageSegment, error) { } // GenMessageAuto 自动生成ZeroBot图片消息 -func (img *ImageCtx) GenMessageAuto() (message.MessageSegment, error) { +func (img *ImageCtx) GenMessageAuto() (message.Segment, error) { // 消息收发端不在本地 if !utils.IsOneBotLocal() { return img.GenMessageBase64() diff --git a/utils/images/tools.go b/utils/images/tools.go index 1ed0ce0..411d466 100644 --- a/utils/images/tools.go +++ b/utils/images/tools.go @@ -86,7 +86,7 @@ func MeasureStringDefault(str string, fontSize, lineSpace float64) (float64, flo } // GenStringMsg 以默认方式生成纯文字图片消息,若生成失败,则返回message.Text -func GenStringMsg(str string) message.MessageSegment { +func GenStringMsg(str string) message.Segment { fontSize := 18.0 w, h := MeasureStringDefault(str, fontSize, 1.3) img := NewImageCtxWithBGColor(int(w)+10, int(h)+20, "white") @@ -161,7 +161,7 @@ func ClipImgToCircle(img image.Image) image.Image { } // GenQQListMsgWithAva 生成带QQ头像的用户或群(以isUser参数区分)列表 -func GenQQListMsgWithAva(data map[int64]string, w float64, isUser bool) (msg message.MessageSegment, err error) { +func GenQQListMsgWithAva(data map[int64]string, w float64, isUser bool) (msg message.Segment, err error) { var avaReader io.ReadCloser avaSize, fontSize, height := 100, 24.0, 10 img := NewImageCtxWithBGRGBA255(int(w)+avaSize+30, len(data)*(avaSize+20)+30, 255, 255, 255, 255) @@ -197,7 +197,7 @@ func GenQQListMsgWithAva(data map[int64]string, w float64, isUser bool) (msg mes } // GenQQRankMsgWithValue 生成默认样式用户排行榜,users中可不填nickname,无需任何其它操作 -func GenQQRankMsgWithValue(title string, users []UserValue, unit string) (msg message.MessageSegment, err error) { +func GenQQRankMsgWithValue(title string, users []UserValue, unit string) (msg message.Segment, err error) { defer func() { if err != nil { // 生成图片失败时,生成文字消息 log.Warnf("GenQQRankMsgWithValue err: %v", err)