ZeroBot-Plugin/picsearcher/pic_searcher.go
2021-06-19 14:37:13 +08:00

92 lines
2.4 KiB
Go

package picsearcher
import (
"fmt"
"os"
"strings"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message"
"github.com/Yiwen-Chan/ZeroBot-Plugin/api/context"
"github.com/Yiwen-Chan/ZeroBot-Plugin/api/pixiv"
apiutils "github.com/Yiwen-Chan/ZeroBot-Plugin/api/utils"
utils "github.com/Yiwen-Chan/ZeroBot-Plugin/picsearcher/utils"
)
var (
CACHEPATH = os.TempDir() // 缓冲图片路径
)
func init() { // 插件主体
if strings.Contains(CACHEPATH, "\\") {
CACHEPATH += "\\picsch\\"
} else {
CACHEPATH += "/picsch/"
}
apiutils.CreatePath(CACHEPATH)
// 根据PID搜图
zero.OnRegex(`^搜图(\d+)$`).SetBlock(true).SetPriority(30).
Handle(func(ctx *zero.Ctx) {
id := apiutils.Str2Int(ctx.State["regex_matched"].([]string)[1])
ctx.Send("少女祈祷中......")
// 获取P站插图信息
illust := &pixiv.Illust{}
if err := illust.IllustInfo(id); err != nil {
ctx.Send(fmt.Sprintf("ERROR: %v", err))
return
}
// 下载P站插图
savePath, err := illust.PixivPicDown(CACHEPATH)
if err != nil {
ctx.Send(fmt.Sprintf("ERROR: %v", err))
return
}
// 发送搜索结果
ctx.Send(illust.DetailPic(savePath))
illust.RmPic(CACHEPATH)
})
// 以图搜图
zero.OnMessage(FullMatchText("以图搜图", "搜索图片", "以图识图"), context.MustHasPicture()).SetBlock(true).SetPriority(999).
Handle(func(ctx *zero.Ctx) {
// 开始搜索图片
ctx.Send("少女祈祷中......")
for _, pic := range ctx.State["image_url"].([]string) {
fmt.Println(pic)
if m, err := utils.SauceNaoSearch(pic); err == nil {
ctx.SendChain(m...) // 返回SauceNAO的结果
continue
} else {
ctx.SendChain(message.Text("ERROR: ", err))
}
if m, err := utils.Ascii2dSearch(pic); err == nil {
ctx.SendChain(m...) // 返回Ascii2d的结果
continue
} else {
ctx.SendChain(message.Text("ERROR: ", err))
}
}
})
}
// FullMatchText 如果信息中文本完全匹配则返回 true
func FullMatchText(src ...string) zero.Rule {
return func(ctx *zero.Ctx) bool {
msg := ctx.Event.Message
for _, elem := range msg {
if elem.Type == "text" {
text := elem.Data["text"]
text = strings.ReplaceAll(text, " ", "")
text = strings.ReplaceAll(text, "\r", "")
text = strings.ReplaceAll(text, "\n", "")
for _, s := range src {
if text == s {
return true
}
}
}
}
return false
}
}