Merge pull request #24 from fumiama/master

以入参形式指定superusers、增加简易随机图片、分离搜图与涩图
This commit is contained in:
Kanri 2021-06-04 01:07:47 -05:00 committed by GitHub
commit f911b71eee
15 changed files with 159 additions and 95 deletions

26
api/msgext/msgext.go Normal file
View File

@ -0,0 +1,26 @@
package msgext
import (
"github.com/wdvxdr1123/ZeroBot/message"
)
//@全体成员
func AtAll() message.MessageSegment {
return message.MessageSegment{
Type: "at",
Data: map[string]string{
"qq": "all",
},
}
}
//无缓存发送图片
func ImageNoCache(url string) message.MessageSegment {
return message.MessageSegment{
Type: "image",
Data: map[string]string{
"file": url,
"cache": "0",
},
}
}

View File

@ -1,4 +1,4 @@
package utils package pixiv
import ( import (
"crypto/md5" "crypto/md5"

View File

@ -1,4 +1,4 @@
package utils package pixiv
import ( import (
"crypto/tls" "crypto/tls"
@ -92,3 +92,46 @@ func (this *Illust) IllustInfo(id int64) (err error) {
this.UserName = json.Get("userName").Str this.UserName = json.Get("userName").Str
return nil return nil
} }
// BigPic 返回一张XML大图CQ码
func (i *Illust) BigPic(file string) string {
var hash = PicHash(file)
return fmt.Sprintf(`[CQ:xml,data=<?xml version='1.0'
encoding='UTF-8' standalone='yes' ?><msg serviceID="5"
templateID="12345" action="" brief="不够涩!"
sourceMsgId="0" url="" flag="0" adverSign="0" multiMsgFlag="0">
<item layout="0" advertiser_id="0" aid="0"><image uuid="%s.jpg" md5="%s"
GroupFiledid="2235033681" filesize="81322" local_path="%s.jpg"
minWidth="200" minHeight="200" maxWidth="500" maxHeight="1000" />
</item><source name="%s⭐(id:%d author:%s)" icon=""
action="" appid="-1" /></msg>]`,
hash,
hash,
hash,
i.Title,
i.Pid,
i.UserName,
)
}
// NormalPic 返回一张普通图CQ码
func (i *Illust) NormalPic(file string) string {
return fmt.Sprintf(`[CQ:image,file=file:///%s]`, file)
}
// DetailPic 返回一张带详细信息的图片CQ码
func (i *Illust) DetailPic(file string) string {
return fmt.Sprintf(`[SetuTime] %s
标题%s
插画ID%d
画师%s
画师ID%d
直链https://pixivel.moe/detail?id=%d`,
i.NormalPic(file),
i.Title,
i.Pid,
i.UserName,
i.UserId,
i.Pid,
)
}

View File

@ -1,4 +1,4 @@
package utils package pixiv
import ( import (
"os" "os"
@ -39,7 +39,7 @@ func CreatePath(path string) {
// //
} }
if !PathExists(path) { if !PathExists(path) {
err := os.MkdirAll(path, 0644) err := os.MkdirAll(path, 0755)
if err != nil { if err != nil {
panic(err) panic(err)
} }

7
build_mips.sh Executable file
View File

@ -0,0 +1,7 @@
go version
go env -w GOPROXY=https://goproxy.cn,direct
go env -w GO111MODULE=auto
go mod tidy
export CCBIN=~/openwrt_with_lean_packages/staging_dir/toolchain-mips_24kc_gcc-8.4.0_musl/bin/mips-openwrt-linux-musl-gcc
export CXXBIN=~/openwrt_with_lean_packages/staging_dir/toolchain-mips_24kc_gcc-8.4.0_musl/bin/mips-openwrt-linux-musl-g++
GOOS=linux GOARCH=mips GOMIPS=softfloat CGO_ENABLED=0 CC=${CCBIN} CXX=${CXXBIN} go build -ldflags "-s -w" -o zerobot

11
main.go
View File

@ -2,6 +2,7 @@ package main
import ( import (
"fmt" "fmt"
"os"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
easy "github.com/t-tomalak/logrus-easy-formatter" easy "github.com/t-tomalak/logrus-easy-formatter"
@ -22,9 +23,11 @@ import (
_ "github.com/Yiwen-Chan/ZeroBot-Plugin/runcode" // 在线运行代码 _ "github.com/Yiwen-Chan/ZeroBot-Plugin/runcode" // 在线运行代码
// 娱乐类 // 娱乐类
_ "github.com/Yiwen-Chan/ZeroBot-Plugin/music" // 点歌 _ "github.com/Yiwen-Chan/ZeroBot-Plugin/music" // 点歌
_ "github.com/Yiwen-Chan/ZeroBot-Plugin/setutime" // 涩图 _ "github.com/Yiwen-Chan/ZeroBot-Plugin/picsearcher" // 搜图
_ "github.com/Yiwen-Chan/ZeroBot-Plugin/shindan" // 测定 _ "github.com/Yiwen-Chan/ZeroBot-Plugin/randimg" //简易随机图片
_ "github.com/Yiwen-Chan/ZeroBot-Plugin/setutime" // 涩图
_ "github.com/Yiwen-Chan/ZeroBot-Plugin/shindan" // 测定
) )
func init() { func init() {
@ -47,7 +50,7 @@ func main() {
zero.Run(zero.Config{ zero.Run(zero.Config{
NickName: []string{"椛椛", "ATRI", "atri", "亚托莉", "アトリ"}, NickName: []string{"椛椛", "ATRI", "atri", "亚托莉", "アトリ"},
CommandPrefix: "/", CommandPrefix: "/",
SuperUsers: []string{"825111790", "213864964"}, // 必须修改,否则无权限 SuperUsers: os.Args[1:], // 必须修改,否则无权限
Driver: []zero.Driver{ Driver: []zero.Driver{
driver.NewWebSocketClient("127.0.0.1", "6700", ""), driver.NewWebSocketClient("127.0.0.1", "6700", ""),
}, },

View File

@ -4,6 +4,7 @@ import (
"strconv" "strconv"
"strings" "strings"
"github.com/Yiwen-Chan/ZeroBot-Plugin/api/msgext"
zero "github.com/wdvxdr1123/ZeroBot" zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message" "github.com/wdvxdr1123/ZeroBot/message"
) )
@ -238,9 +239,9 @@ func init() { // 插件主体
if ts.enable { if ts.enable {
go timer(ts, func() { go timer(ts, func() {
if ts.url == "" { if ts.url == "" {
ctx.SendChain(AtAll(), message.Text(ts.alert)) ctx.SendChain(msgext.AtAll(), message.Text(ts.alert))
} else { } else {
ctx.SendChain(AtAll(), message.Text(ts.alert), ImageNoCache(ts.url)) ctx.SendChain(msgext.AtAll(), message.Text(ts.alert), msgext.ImageNoCache(ts.url))
} }
}) })
ctx.Send("记住了~") ctx.Send("记住了~")

View File

@ -6,8 +6,6 @@ import (
"strings" "strings"
"time" "time"
"unicode" "unicode"
"github.com/wdvxdr1123/ZeroBot/message"
) )
type TimeStamp struct { type TimeStamp struct {
@ -175,24 +173,3 @@ func chineseChar2Int(c rune) int {
return 0 return 0
} }
} }
//@全体成员
func AtAll() message.MessageSegment {
return message.MessageSegment{
Type: "at",
Data: map[string]string{
"qq": "all",
},
}
}
//无缓存发送图片
func ImageNoCache(url string) message.MessageSegment {
return message.MessageSegment{
Type: "image",
Data: map[string]string{
"file": url,
"cache": "0",
},
}
}

View File

@ -1,4 +1,4 @@
package setutime package picsearcher
import ( import (
"fmt" "fmt"
@ -9,17 +9,24 @@ import (
zero "github.com/wdvxdr1123/ZeroBot" zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message" "github.com/wdvxdr1123/ZeroBot/message"
utils "github.com/Yiwen-Chan/ZeroBot-Plugin/setutime/utils" "github.com/Yiwen-Chan/ZeroBot-Plugin/api/pixiv"
utils "github.com/Yiwen-Chan/ZeroBot-Plugin/picsearcher/utils"
)
var (
BOTPATH = pixiv.PathExecute() // 当前bot运行目录
DATAPATH = BOTPATH + "data/SetuTime/" // 数据目录
CACHEPATH = DATAPATH + "cache/" // 缓冲图片路径
) )
func init() { // 插件主体 func init() { // 插件主体
// 根据PID搜图 // 根据PID搜图
zero.OnRegex(`^搜图(\d+)$`).SetBlock(true).SetPriority(30). zero.OnRegex(`^搜图(\d+)$`).SetBlock(true).SetPriority(30).
Handle(func(ctx *zero.Ctx) { Handle(func(ctx *zero.Ctx) {
id := utils.Str2Int(ctx.State["regex_matched"].([]string)[1]) id := pixiv.Str2Int(ctx.State["regex_matched"].([]string)[1])
ctx.Send("少女祈祷中......") ctx.Send("少女祈祷中......")
// 获取P站插图信息 // 获取P站插图信息
illust := &utils.Illust{} illust := &pixiv.Illust{}
if err := illust.IllustInfo(id); err != nil { if err := illust.IllustInfo(id); err != nil {
ctx.Send(fmt.Sprintf("ERROR: %v", err)) ctx.Send(fmt.Sprintf("ERROR: %v", err))
return return

View File

@ -6,6 +6,7 @@ import (
"net/url" "net/url"
"strings" "strings"
"github.com/Yiwen-Chan/ZeroBot-Plugin/api/pixiv"
xpath "github.com/antchfx/htmlquery" xpath "github.com/antchfx/htmlquery"
"github.com/wdvxdr1123/ZeroBot/message" "github.com/wdvxdr1123/ZeroBot/message"
) )
@ -71,12 +72,12 @@ func Ascii2dSearch(pic string) (message.Message, error) {
if link == "" || index == -1 { if link == "" || index == -1 {
return nil, fmt.Errorf("Ascii2d not found") return nil, fmt.Errorf("Ascii2d not found")
} }
var id = Str2Int(link[index+1:]) var id = pixiv.Str2Int(link[index+1:])
if id == 0 { if id == 0 {
return nil, fmt.Errorf("convert to pid error") return nil, fmt.Errorf("convert to pid error")
} }
// 根据PID查询插图信息 // 根据PID查询插图信息
var illust = &Illust{} var illust = &pixiv.Illust{}
if err := illust.IllustInfo(id); err != nil { if err := illust.IllustInfo(id); err != nil {
return nil, err return nil, err
} }

36
randimg/setu_geter.go Normal file
View File

@ -0,0 +1,36 @@
package randimg
import (
"strings"
"github.com/Yiwen-Chan/ZeroBot-Plugin/api/msgext"
zero "github.com/wdvxdr1123/ZeroBot"
)
var RANDOM_API_URL = "https://api.pixivweb.com/anime18r.php?return=img"
var BLOCK_REQUEST = false
func init() { // 插件主体
zero.OnRegex(`^设置随机图片网址(.*)$`, zero.SuperUserPermission).SetBlock(true).SetPriority(20).
Handle(func(ctx *zero.Ctx) {
url := ctx.State["regex_matched"].([]string)[1]
if !strings.HasPrefix(url, "http") {
ctx.Send("URL非法!")
} else {
RANDOM_API_URL = url
}
return
})
// 随机图片
zero.OnFullMatchGroup([]string{"随机图片"}).SetBlock(true).SetPriority(24).
Handle(func(ctx *zero.Ctx) {
if BLOCK_REQUEST {
ctx.Send("请稍后再试哦")
} else {
BLOCK_REQUEST = true
ctx.Send(msgext.ImageNoCache(RANDOM_API_URL))
BLOCK_REQUEST = false
}
return
})
}

View File

@ -9,13 +9,14 @@ import (
zero "github.com/wdvxdr1123/ZeroBot" zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/extension/rate" "github.com/wdvxdr1123/ZeroBot/extension/rate"
"github.com/Yiwen-Chan/ZeroBot-Plugin/api/pixiv"
"github.com/Yiwen-Chan/ZeroBot-Plugin/setutime/utils" "github.com/Yiwen-Chan/ZeroBot-Plugin/setutime/utils"
) )
var limit = rate.NewManager(time.Minute*1, 5) var limit = rate.NewManager(time.Minute*1, 5)
var ( var (
BOTPATH = utils.PathExecute() // 当前bot运行目录 BOTPATH = pixiv.PathExecute() // 当前bot运行目录
DATAPATH = BOTPATH + "data/SetuTime/" // 数据目录 DATAPATH = BOTPATH + "data/SetuTime/" // 数据目录
DBPATH = DATAPATH + "SetuTime.db" // 数据库路径 DBPATH = DATAPATH + "SetuTime.db" // 数据库路径
@ -33,11 +34,11 @@ func init() {
PoolsCache.Group = CACHEGROUP // 图片缓冲群 PoolsCache.Group = CACHEGROUP // 图片缓冲群
PoolsCache.Path = CACHEPATH // 缓冲图片路径 PoolsCache.Path = CACHEPATH // 缓冲图片路径
utils.CreatePath(DBPATH) pixiv.CreatePath(DBPATH)
utils.CreatePath(CACHEPATH) pixiv.CreatePath(CACHEPATH)
for i := range PoolList { for i := range PoolList {
if err := DB.Create(PoolList[i], &utils.Illust{}); err != nil { if err := DB.Create(PoolList[i], &pixiv.Illust{}); err != nil {
panic(err) panic(err)
} }
} }
@ -53,9 +54,9 @@ func init() { // 插件主体
var type_ = ctx.State["regex_matched"].([]string)[1] var type_ = ctx.State["regex_matched"].([]string)[1]
// 补充池子 // 补充池子
go func() { go func() {
times := utils.Min(PoolsCache.Max-PoolsCache.Size(type_), 2) times := pixiv.Min(PoolsCache.Max-PoolsCache.Size(type_), 2)
for i := 0; i < times; i++ { for i := 0; i < times; i++ {
illust := &utils.Illust{} illust := &pixiv.Illust{}
// 查询出一张图片 // 查询出一张图片
if err := DB.Select(type_, illust, "ORDER BY RANDOM() limit 1"); err != nil { if err := DB.Select(type_, illust, "ORDER BY RANDOM() limit 1"); err != nil {
ctx.Send(fmt.Sprintf("ERROR: %v", err)) ctx.Send(fmt.Sprintf("ERROR: %v", err))
@ -96,8 +97,8 @@ func init() { // 插件主体
Handle(func(ctx *zero.Ctx) { Handle(func(ctx *zero.Ctx) {
var ( var (
type_ = ctx.State["regex_matched"].([]string)[1] type_ = ctx.State["regex_matched"].([]string)[1]
id = utils.Str2Int(ctx.State["regex_matched"].([]string)[2]) id = pixiv.Str2Int(ctx.State["regex_matched"].([]string)[2])
illust = &utils.Illust{} illust = &pixiv.Illust{}
) )
ctx.Send("少女祈祷中......") ctx.Send("少女祈祷中......")
// 查询P站插图信息 // 查询P站插图信息
@ -129,7 +130,7 @@ func init() { // 插件主体
Handle(func(ctx *zero.Ctx) { Handle(func(ctx *zero.Ctx) {
var ( var (
type_ = ctx.State["regex_matched"].([]string)[1] type_ = ctx.State["regex_matched"].([]string)[1]
id = utils.Str2Int(ctx.State["regex_matched"].([]string)[2]) id = pixiv.Str2Int(ctx.State["regex_matched"].([]string)[2])
) )
// 查询数据库 // 查询数据库
if err := DB.Delete(type_, fmt.Sprintf("WHERE pid=%d", id)); err != nil { if err := DB.Delete(type_, fmt.Sprintf("WHERE pid=%d", id)); err != nil {

View File

@ -3,6 +3,8 @@ package utils
import ( import (
"fmt" "fmt"
"sync" "sync"
"github.com/Yiwen-Chan/ZeroBot-Plugin/api/pixiv"
) )
// PoolsCache 图片缓冲池 // PoolsCache 图片缓冲池
@ -11,7 +13,7 @@ type PoolsCache struct {
Max int Max int
Path string Path string
Group int64 Group int64
Pool map[string][]*Illust Pool map[string][]*pixiv.Illust
} }
// NewPoolsCache 返回一个缓冲池对象 // NewPoolsCache 返回一个缓冲池对象
@ -20,7 +22,7 @@ func NewPoolsCache() *PoolsCache {
Max: 10, Max: 10,
Path: "./data/SetuTime/cache/", Path: "./data/SetuTime/cache/",
Group: 1048452984, Group: 1048452984,
Pool: map[string][]*Illust{}, Pool: map[string][]*pixiv.Illust{},
} }
} }
@ -35,7 +37,7 @@ func (p *PoolsCache) IsFull(type_ string) bool {
} }
// Push 向缓冲池插入一张图片,返回错误 // Push 向缓冲池插入一张图片,返回错误
func (p *PoolsCache) Push(type_ string, illust *Illust) (err error) { func (p *PoolsCache) Push(type_ string, illust *pixiv.Illust) (err error) {
p.Lock.Lock() p.Lock.Lock()
defer p.Lock.Unlock() defer p.Lock.Unlock()
p.Pool[type_] = append(p.Pool[type_], illust) p.Pool[type_] = append(p.Pool[type_], illust)
@ -43,7 +45,7 @@ func (p *PoolsCache) Push(type_ string, illust *Illust) (err error) {
} }
// Push 在缓冲池拿出一张图片,返回错误 // Push 在缓冲池拿出一张图片,返回错误
func (p *PoolsCache) Pop(type_ string) (illust *Illust) { func (p *PoolsCache) Pop(type_ string) (illust *pixiv.Illust) {
p.Lock.Lock() p.Lock.Lock()
defer p.Lock.Unlock() defer p.Lock.Unlock()
if p.Size(type_) == 0 { if p.Size(type_) == 0 {
@ -69,46 +71,3 @@ func (p *PoolsCache) GetOnePic(type_ string, form string) string {
return illust.NormalPic(file) return illust.NormalPic(file)
} }
} }
// BigPic 返回一张XML大图CQ码
func (i *Illust) BigPic(file string) string {
var hash = PicHash(file)
return fmt.Sprintf(`[CQ:xml,data=<?xml version='1.0'
encoding='UTF-8' standalone='yes' ?><msg serviceID="5"
templateID="12345" action="" brief="不够涩!"
sourceMsgId="0" url="" flag="0" adverSign="0" multiMsgFlag="0">
<item layout="0" advertiser_id="0" aid="0"><image uuid="%s.jpg" md5="%s"
GroupFiledid="2235033681" filesize="81322" local_path="%s.jpg"
minWidth="200" minHeight="200" maxWidth="500" maxHeight="1000" />
</item><source name="%s⭐(id:%d author:%s)" icon=""
action="" appid="-1" /></msg>]`,
hash,
hash,
hash,
i.Title,
i.Pid,
i.UserName,
)
}
// NormalPic 返回一张普通图CQ码
func (i *Illust) NormalPic(file string) string {
return fmt.Sprintf(`[CQ:image,file=file:///%s]`, file)
}
// DetailPic 返回一张带详细信息的图片CQ码
func (i *Illust) DetailPic(file string) string {
return fmt.Sprintf(`[SetuTime] %s
标题%s
插画ID%d
画师%s
画师ID%d
直链https://pixivel.moe/detail?id=%d`,
i.NormalPic(file),
i.Title,
i.Pid,
i.UserName,
i.UserId,
i.Pid,
)
}

View File

@ -119,6 +119,9 @@ func shindanmaker(id, name string) (string, error) {
return "", err return "", err
} }
defer resp.Body.Close() defer resp.Body.Close()
if resp.ContentLength <= 0 {
return "出错啦", nil
}
// 解析XPATH // 解析XPATH
doc, err := xpath.Parse(resp.Body) doc, err := xpath.Parse(resp.Body)
if err != nil { if err != nil {