Skip to content

Commit

Permalink
增加二次元图片评价功能
Browse files Browse the repository at this point in the history
  • Loading branch information
fumiama committed Jun 19, 2021
1 parent 686c946 commit 754057f
Show file tree
Hide file tree
Showing 7 changed files with 215 additions and 149 deletions.
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,10 @@
- [x] 搜图[P站图片ID]
- 简易随机图片(调用url) `import _ "github.com/Yiwen-Chan/ZeroBot-Plugin/randimg"`
- [x] 随机图片
- [x] 直接随机(无r18检测,后果自负)
- [x] 设置随机图片网址[url]
- [x] 太涩了(撤回最近发的图)
- [x] 评价图片:发送一张图片进行评分
- 点歌 `import _ "github.com/Yiwen-Chan/ZeroBot-Plugin/music"`
- [x] 点歌[xxx]
- [x] 网易点歌[xxx]
Expand Down
114 changes: 114 additions & 0 deletions api/classify/classify.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
package classify

import (
"fmt"
"io/ioutil"
"net/http"
"net/url"
"os"
"strconv"

"github.com/Yiwen-Chan/ZeroBot-Plugin/api/msgext"
"github.com/tidwall/gjson"
zero "github.com/wdvxdr1123/ZeroBot"
)

var (
BLOCK_REQUEST_CLASS = false
CACHE_IMG_FILE = "/tmp/setugt"
CACHE_URI = "file:///" + CACHE_IMG_FILE
VOTE_API_URL = "http://saki.fumiama.top/vote?uuid=零号&img=%s&class=%d"
CLASSIFY_HEAD = "http://saki.fumiama.top:62002/dice?url="
msgofgrp = make(map[int64]int64)
dhashofmsg = make(map[int64]string)
)

func Classify(ctx *zero.Ctx, targeturl string, noimg bool) {
if BLOCK_REQUEST_CLASS {
ctx.Send("请稍后再试哦")
} else {
BLOCK_REQUEST_CLASS = true
get_url := CLASSIFY_HEAD + url.QueryEscape(targeturl)
if noimg {
get_url += "&noimg=true"
}
resp, err := http.Get(get_url)
if err != nil {
ctx.Send(fmt.Sprintf("ERROR: %v", err))
} else {
if noimg {
data, err1 := ioutil.ReadAll(resp.Body)
if err1 == nil {
dhash := gjson.GetBytes(data, "img").String()
class := int(gjson.GetBytes(data, "class").Int())
replyClass(ctx, dhash, class, noimg)
} else {
ctx.Send(fmt.Sprintf("ERROR: %v", err1))
}
} else {
class, err1 := strconv.Atoi(resp.Header.Get("Class"))
dhash := resp.Header.Get("DHash")
if err1 != nil {
ctx.Send(fmt.Sprintf("ERROR: %v", err1))
}
defer resp.Body.Close()
// 写入文件
data, _ := ioutil.ReadAll(resp.Body)
f, _ := os.OpenFile(CACHE_IMG_FILE, os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0644)
defer f.Close()
f.Write(data)
replyClass(ctx, dhash, class, noimg)
}
}
BLOCK_REQUEST_CLASS = false
}
}

func Vote(ctx *zero.Ctx, class int) {
msg, ok := msgofgrp[ctx.Event.GroupID]
if ok {
ctx.DeleteMessage(msg)
delete(msgofgrp, ctx.Event.GroupID)
dhash, ok2 := dhashofmsg[msg]
if ok2 {
http.Get(fmt.Sprintf(VOTE_API_URL, dhash, class))
delete(dhashofmsg, msg)
}
}
}

func replyClass(ctx *zero.Ctx, dhash string, class int, noimg bool) {
if class > 4 {
switch class {
case 5:
ctx.Send("[5]影响不好啦!")
case 6:
ctx.Send("[6]太涩啦,🐛了!")
}
if dhash != "" {
b14, err3 := url.QueryUnescape(dhash)
if err3 == nil {
ctx.Send("给你点提示哦:" + b14)
}
}
} else {
if !noimg {
last_message_id := ctx.Send(msgext.ImageNoCache(CACHE_URI))
last_group_id := ctx.Event.GroupID
msgofgrp[last_group_id] = last_message_id
dhashofmsg[last_message_id] = dhash
}
switch class {
case 0:
ctx.Send("[0]一堆像素点")
case 1:
ctx.Send("[1]普通")
case 2:
ctx.Send("[2]有点意思")
case 3:
ctx.Send("[3]不错")
case 4:
ctx.Send("[4]我好啦!")
}
}
}
58 changes: 58 additions & 0 deletions api/context/pic.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package context

import (
"strconv"
"time"

zero "github.com/wdvxdr1123/ZeroBot"
)

// HasPicture 消息含有图片返回 true
func HasPicture() zero.Rule {
return func(ctx *zero.Ctx) bool {
msg := ctx.Event.Message
url := []string{}
// 如果是回复信息则将信息替换成被回复的那条
if msg[0].Type == "reply" {
id, _ := strconv.Atoi(msg[0].Data["id"])
msg = ctx.GetMessage(int64(id)).Elements
}
// 遍历信息中所有图片
for _, elem := range msg {
if elem.Type == "image" {
url = append(url, elem.Data["url"])
}
}
// 如果有图片就返回true
if len(url) > 0 {
ctx.State["image_url"] = url
return true
}
return false
}
}

// MustHasPicture 消息不存在图片阻塞60秒至有图片,超时返回 false
func MustHasPicture() zero.Rule {
return func(ctx *zero.Ctx) bool {
if HasPicture()(ctx) {
return true
}
// 没有图片就索取
ctx.Send("请发送一张图片")
next := zero.NewFutureEvent("message", 999, false, zero.CheckUser(ctx.Event.UserID), HasPicture())
recv, cancel := next.Repeat()
select {
case e := <-recv:
cancel()
newCtx := &zero.Ctx{Event: e, State: zero.State{}}
if HasPicture()(newCtx) {
ctx.State["image_url"] = newCtx.State["image_url"]
return true
}
return false
case <-time.After(time.Second * 60):
return false
}
}
}
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ go 1.15

require (
github.com/antchfx/htmlquery v1.2.3
github.com/fumiama/ZeroBot-Plugin-Timer v0.0.0-20210609110318-3c8ef99e3c6c
github.com/fumiama/ZeroBot-Plugin-Timer v0.0.0-20210616151841-d047372a50c2
github.com/mattn/go-sqlite3 v1.14.7
github.com/sirupsen/logrus v1.8.1
github.com/t-tomalak/logrus-easy-formatter v0.0.0-20190827215021-c074f06c5816
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/fumiama/ZeroBot-Plugin-Timer v0.0.0-20210606064339-d55b94d71eee/go.mod h1:RN0gCtafWRu2d7lMg9/5UfZDhtsPgdeUovsyuSwl+oQ=
github.com/fumiama/ZeroBot-Plugin-Timer v0.0.0-20210606075146-09f50acdb4de/go.mod h1:vG2ODqgJYFQobphBnhhmNv3TO+j/ZNYvN6FjUP/zkmA=
github.com/fumiama/ZeroBot-Plugin-Timer v0.0.0-20210609110318-3c8ef99e3c6c h1:M98iR1Em9EzfaduyhaO/I9Az3CVC0YS3pVbUihoPlM8=
github.com/fumiama/ZeroBot-Plugin-Timer v0.0.0-20210609110318-3c8ef99e3c6c/go.mod h1:/Tv1kgOdp76gvr1VoVmMG2Xu4c76vXngy6P8NFE4pA0=
github.com/fumiama/ZeroBot-Plugin-Timer v0.0.0-20210616151841-d047372a50c2 h1:8gJPxljHfnIFsE0ZfV8DJuI45Y+zTe/o2YtjKQRGYX8=
github.com/fumiama/ZeroBot-Plugin-Timer v0.0.0-20210616151841-d047372a50c2/go.mod h1:/Tv1kgOdp76gvr1VoVmMG2Xu4c76vXngy6P8NFE4pA0=
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
Expand Down
55 changes: 2 additions & 53 deletions picsearcher/pic_searcher.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,12 @@ package picsearcher
import (
"fmt"
"os"
"strconv"
"strings"
"time"

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"
Expand Down Expand Up @@ -48,7 +47,7 @@ func init() { // 插件主体
illust.RmPic(CACHEPATH)
})
// 以图搜图
zero.OnMessage(FullMatchText("以图搜图", "搜索图片", "以图识图"), MustHasPicture()).SetBlock(true).SetPriority(999).
zero.OnMessage(FullMatchText("以图搜图", "搜索图片", "以图识图"), context.MustHasPicture()).SetBlock(true).SetPriority(999).
Handle(func(ctx *zero.Ctx) {
// 开始搜索图片
ctx.Send("少女祈祷中......")
Expand Down Expand Up @@ -90,53 +89,3 @@ func FullMatchText(src ...string) zero.Rule {
return false
}
}

// HasPicture 消息含有图片返回 true
func HasPicture() zero.Rule {
return func(ctx *zero.Ctx) bool {
msg := ctx.Event.Message
url := []string{}
// 如果是回复信息则将信息替换成被回复的那条
if msg[0].Type == "reply" {
id, _ := strconv.Atoi(msg[0].Data["id"])
msg = ctx.GetMessage(int64(id)).Elements
}
// 遍历信息中所有图片
for _, elem := range msg {
if elem.Type == "image" {
url = append(url, elem.Data["url"])
}
}
// 如果有图片就返回true
if len(url) > 0 {
ctx.State["image_url"] = url
return true
}
return false
}
}

// MustHasPicture 消息不存在图片阻塞60秒至有图片,超时返回 false
func MustHasPicture() zero.Rule {
return func(ctx *zero.Ctx) bool {
if HasPicture()(ctx) {
return true
}
// 没有图片就索取
ctx.Send("请发送一张图片")
next := zero.NewFutureEvent("message", 999, false, zero.CheckUser(ctx.Event.UserID), HasPicture())
recv, cancel := next.Repeat()
select {
case e := <-recv:
cancel()
newCtx := &zero.Ctx{Event: e, State: zero.State{}}
if HasPicture()(newCtx) {
ctx.State["image_url"] = newCtx.State["image_url"]
return true
}
return false
case <-time.After(time.Second * 60):
return false
}
}
}
Loading

0 comments on commit 754057f

Please sign in to comment.