Skip to content

Commit 8b01032

Browse files
guohuiyuanfumiama
andauthored
✨ 添加一言 (#616)
* ✨ 添加一言 * 🎨 优化随机数 * 🎨 更新包 * 🎨 优化随机结构 * 🎨 修改随机算法 --------- Co-authored-by: 源文雨 <[email protected]>
1 parent e1591c4 commit 8b01032

File tree

6 files changed

+262
-4
lines changed

6 files changed

+262
-4
lines changed

README.md

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ zerobot [-h] [-n nickname] [-t token] [-u url] [-g url] [-p prefix] [-d|w] [-c|s
9393
9494
> 插件的优先级为`import`的先后顺序。
9595
96-
> `webui`默认禁用不编译,打开后会增加程序体积并使控制台日志格式紊乱
96+
> `webui`默认禁用不编译,打开后会增加程序体积
9797
9898
<details>
9999
<summary>插件控制</summary>
@@ -821,6 +821,16 @@ print("run[CQ:image,file="+j["img"]+"]")
821821

822822
- [x] 来点黑丝/白丝/jk/巨乳/足控/网红
823823

824+
</details>
825+
<details>
826+
<summary>一言</summary>
827+
828+
`import _ "github.com/FloatTech/ZeroBot-Plugin/plugin/hitokoto"`
829+
830+
- [x] 一言[xxx]
831+
832+
- [x] 系列一言
833+
824834
</details>
825835
<details>
826836
<summary>炉石</summary>

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ require (
1212
github.com/FloatTech/sqlite v1.5.7
1313
github.com/FloatTech/ttl v0.0.0-20220715042055-15612be72f5b
1414
github.com/FloatTech/zbpctrl v1.5.3-0.20230301071613-f2c5c97cec88
15-
github.com/FloatTech/zbputils v1.6.2-0.20230309054847-f60ce7c0aa73
15+
github.com/FloatTech/zbputils v1.6.2-0.20230310162032-fe2036d0667a
1616
github.com/RomiChan/syncx v0.0.0-20221202055724-5f842c53020e
1717
github.com/RomiChan/websocket v1.4.3-0.20220227141055-9b2c6168c9c5
1818
github.com/antchfx/htmlquery v1.2.5

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ github.com/FloatTech/ttl v0.0.0-20220715042055-15612be72f5b h1:tvciXWq2nuvTbFeJG
1818
github.com/FloatTech/ttl v0.0.0-20220715042055-15612be72f5b/go.mod h1:fHZFWGquNXuHttu9dUYoKuNbm3dzLETnIOnm1muSfDs=
1919
github.com/FloatTech/zbpctrl v1.5.3-0.20230301071613-f2c5c97cec88 h1:jdTWiYXGtYZhxIn9oGYkObNVa8GtJvki+ihsoMlLJPs=
2020
github.com/FloatTech/zbpctrl v1.5.3-0.20230301071613-f2c5c97cec88/go.mod h1:8IRMtcWhK4S8QdpStJqXQZtIBgAqUH72Imq3BQ45TWg=
21-
github.com/FloatTech/zbputils v1.6.2-0.20230309054847-f60ce7c0aa73 h1:dYRnXrzZYh19IabKc419B51yrHut75Fu5R0W79kAHzI=
22-
github.com/FloatTech/zbputils v1.6.2-0.20230309054847-f60ce7c0aa73/go.mod h1:QwQvA0E+SRcW2kjXt07etth+uunhnCC0fYGhTbl1pgk=
21+
github.com/FloatTech/zbputils v1.6.2-0.20230310162032-fe2036d0667a h1:As8TrKJhLtPSvu/qWAav1StdHWUn7ReDcrfTJlJga1s=
22+
github.com/FloatTech/zbputils v1.6.2-0.20230310162032-fe2036d0667a/go.mod h1:QwQvA0E+SRcW2kjXt07etth+uunhnCC0fYGhTbl1pgk=
2323
github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc=
2424
github.com/RomiChan/syncx v0.0.0-20221202055724-5f842c53020e h1:wR3MXQ3VbUlPKOOUwLOYgh/QaJThBTYtsl673O3lqSA=
2525
github.com/RomiChan/syncx v0.0.0-20221202055724-5f842c53020e/go.mod h1:vD7Ra3Q9onRtojoY5sMCLQ7JBgjUsrXDnDKyFxqpf9w=

main.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ import (
9595
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/github" // 搜索GitHub仓库
9696
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/guessmusic" // 猜歌
9797
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/heisi" // 黑丝
98+
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/hitokoto" // 一言
9899
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/hs" // 炉石
99100
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/hyaku" // 百人一首
100101
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/image_finder" // 关键字搜图

plugin/hitokoto/hitokoto.go

Lines changed: 174 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,174 @@
1+
// Package hitokoto 一言
2+
package hitokoto
3+
4+
import (
5+
"math/rand"
6+
"strconv"
7+
"strings"
8+
"time"
9+
10+
"github.com/FloatTech/floatbox/binary"
11+
fcext "github.com/FloatTech/floatbox/ctxext"
12+
ctrl "github.com/FloatTech/zbpctrl"
13+
"github.com/FloatTech/zbputils/control"
14+
"github.com/FloatTech/zbputils/ctxext"
15+
"github.com/FloatTech/zbputils/img/text"
16+
zero "github.com/wdvxdr1123/ZeroBot"
17+
"github.com/wdvxdr1123/ZeroBot/message"
18+
)
19+
20+
func init() { // 插件主体
21+
engine := control.Register("hitokoto", &ctrl.Options[*zero.Ctx]{
22+
DisableOnDefault: false,
23+
Brief: "一言",
24+
Help: "- 一言[xxx]\n" +
25+
"- 系列一言",
26+
PublicDataFolder: "Hitokoto",
27+
})
28+
getdb := fcext.DoOnceOnSuccess(func(ctx *zero.Ctx) bool {
29+
dbfile := engine.DataFolder() + "hitokoto.db"
30+
_, err := engine.GetLazyData("hitokoto.db", false)
31+
if err != nil {
32+
ctx.SendChain(message.Text("ERROR: ", err))
33+
return false
34+
}
35+
hdb, err = initialize(dbfile)
36+
if err != nil {
37+
ctx.SendChain(message.Text("ERROR: ", err))
38+
return false
39+
}
40+
return true
41+
})
42+
engine.OnPrefix(`一言`, getdb).SetBlock(true).
43+
Handle(func(ctx *zero.Ctx) {
44+
ctx.SendChain(message.Text("少女祈祷中..."))
45+
args := ctx.State["args"].(string)
46+
blist, err := hdb.getByKey(strings.TrimSpace(args))
47+
if err != nil {
48+
ctx.SendChain(message.Text("ERROR: ", err))
49+
return
50+
}
51+
if len(blist) == 0 {
52+
ctx.SendChain(message.Text("ERROR: hitokoto empty"))
53+
return
54+
}
55+
m := make(message.Message, 0, 10)
56+
text := strings.Builder{}
57+
if len(blist) <= 10 {
58+
for _, b := range blist {
59+
text.WriteString(b.Hitokoto)
60+
text.WriteString("\n——")
61+
text.WriteString(b.From)
62+
m = append(m, ctxext.FakeSenderForwardNode(ctx, message.Text(text.String())))
63+
text.Reset()
64+
}
65+
} else {
66+
indexes := map[int]struct{}{}
67+
for i := 0; i < 10; i++ {
68+
ind := rand.Intn(len(blist))
69+
if _, ok := indexes[ind]; ok {
70+
i--
71+
continue
72+
}
73+
indexes[ind] = struct{}{}
74+
}
75+
for k := range indexes {
76+
b := blist[k]
77+
text.WriteString(b.Hitokoto)
78+
text.WriteString("\n——")
79+
text.WriteString(b.From)
80+
m = append(m, ctxext.FakeSenderForwardNode(ctx, message.Text(text.String())))
81+
text.Reset()
82+
}
83+
}
84+
if id := ctx.Send(m).ID(); id == 0 {
85+
ctx.SendChain(message.Text("ERROR: 可能被风控或下载图片用时过长,请耐心等待"))
86+
}
87+
})
88+
engine.OnFullMatch(`系列一言`, getdb).SetBlock(true).
89+
Handle(func(ctx *zero.Ctx) {
90+
next := zero.NewFutureEvent("message", 999, false, ctx.CheckSession())
91+
recv, cancel := next.Repeat()
92+
defer cancel()
93+
results, err := hdb.getAllCategory()
94+
if err != nil {
95+
ctx.SendChain(message.Text("ERROR: ", err))
96+
return
97+
}
98+
tex := strings.Builder{}
99+
tex.WriteString("请输入系列一言序号\n")
100+
for i, v := range results {
101+
tex.WriteString(strconv.Itoa(i))
102+
tex.WriteString(". ")
103+
tex.WriteString(v.Category)
104+
tex.WriteString("\n")
105+
}
106+
base64Str, err := text.RenderToBase64(tex.String(), text.FontFile, 400, 20)
107+
if err != nil {
108+
ctx.SendChain(message.Text("ERROR: ", err))
109+
return
110+
}
111+
ctx.SendChain(message.Image("base64://" + binary.BytesToString(base64Str)))
112+
for {
113+
select {
114+
case <-time.After(time.Second * 120):
115+
ctx.SendChain(message.Text("系列一言指令过期"))
116+
return
117+
case c := <-recv:
118+
msg := c.Event.Message.ExtractPlainText()
119+
num, err := strconv.Atoi(msg)
120+
if err != nil {
121+
ctx.SendChain(message.Text("请输入数字!"))
122+
continue
123+
}
124+
if num < 0 || num >= len(results) {
125+
ctx.SendChain(message.Text("序号非法!"))
126+
continue
127+
}
128+
ctx.SendChain(message.Text("请欣赏系列一言: ", results[num].Category))
129+
hlist, err := hdb.getByCategory(results[num].Category)
130+
if err != nil {
131+
ctx.SendChain(message.Text("ERROR: ", err))
132+
return
133+
}
134+
if len(hlist) == 0 {
135+
ctx.SendChain(message.Text("ERROR: hitokoto empty"))
136+
return
137+
}
138+
m := make(message.Message, 0, 10)
139+
text := strings.Builder{}
140+
if len(hlist) <= 10 {
141+
for _, b := range hlist {
142+
text.WriteString(b.Hitokoto)
143+
text.WriteString("\n——")
144+
text.WriteString(b.From)
145+
m = append(m, ctxext.FakeSenderForwardNode(ctx, message.Text(text.String())))
146+
text.Reset()
147+
}
148+
} else {
149+
indexes := map[int]struct{}{}
150+
for i := 0; i < 10; i++ {
151+
ind := rand.Intn(len(hlist))
152+
if _, ok := indexes[ind]; ok {
153+
i--
154+
continue
155+
}
156+
indexes[ind] = struct{}{}
157+
}
158+
for k := range indexes {
159+
b := hlist[k]
160+
text.WriteString(b.Hitokoto)
161+
text.WriteString("\n——")
162+
text.WriteString(b.From)
163+
m = append(m, ctxext.FakeSenderForwardNode(ctx, message.Text(text.String())))
164+
text.Reset()
165+
}
166+
}
167+
if id := ctx.Send(m).ID(); id == 0 {
168+
ctx.SendChain(message.Text("ERROR: 可能被风控或下载图片用时过长,请耐心等待"))
169+
}
170+
return
171+
}
172+
}
173+
})
174+
}

plugin/hitokoto/model.go

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package hitokoto
2+
3+
import (
4+
"os"
5+
6+
"github.com/jinzhu/gorm"
7+
)
8+
9+
// hdb 表情包数据库全局变量
10+
var hdb *hitokotodb
11+
12+
// hitokotodb 表情包数据库
13+
type hitokotodb gorm.DB
14+
15+
// initialize 初始化
16+
func initialize(dbpath string) (db *hitokotodb, err error) {
17+
if _, err = os.Stat(dbpath); err != nil || os.IsNotExist(err) {
18+
// 生成文件
19+
f, err := os.Create(dbpath)
20+
if err != nil {
21+
return nil, err
22+
}
23+
_ = f.Close()
24+
}
25+
gdb, err := gorm.Open("sqlite3", dbpath)
26+
if err != nil {
27+
return
28+
}
29+
gdb.AutoMigrate(&hitokoto{})
30+
return (*hitokotodb)(gdb), nil
31+
}
32+
33+
type hitokoto struct {
34+
ID int `json:"id" gorm:"column:id;primary_key"`
35+
Hitokoto string `json:"hitokoto" gorm:"column:hitokoto"`
36+
Type string `json:"type" gorm:"column:type"`
37+
From string `json:"from" gorm:"column:from"`
38+
FromWho string `json:"from_who" gorm:"column:from_who"`
39+
Creator string `json:"creator" gorm:"column:creator"`
40+
CreatorUID int `json:"creator_uid" gorm:"column:creator_uid"`
41+
Reviewer int `json:"reviewer" gorm:"column:reviewer"`
42+
UUID string `json:"uuid" gorm:"column:uuid"`
43+
CreatedAt string `json:"created_at" gorm:"column:created_at"`
44+
Category string `json:"catogory" gorm:"column:category"`
45+
}
46+
47+
// TableName 表名
48+
func (hitokoto) TableName() string {
49+
return "hitokoto"
50+
}
51+
52+
func (hdb *hitokotodb) getByKey(key string) (b []hitokoto, err error) {
53+
db := (*gorm.DB)(hdb)
54+
err = db.Where("hitokoto like ?", "%"+key+"%").Find(&b).Error
55+
return
56+
}
57+
58+
type result struct {
59+
Category string
60+
Count int
61+
}
62+
63+
func (hdb *hitokotodb) getAllCategory() (results []result, err error) {
64+
db := (*gorm.DB)(hdb)
65+
err = db.Table("hitokoto").Select("category, count(1) as count").Group("category").Scan(&results).Error
66+
return
67+
}
68+
69+
func (hdb *hitokotodb) getByCategory(category string) (h []hitokoto, err error) {
70+
db := (*gorm.DB)(hdb)
71+
err = db.Where("category = ?", category).Find(&h).Error
72+
return
73+
}

0 commit comments

Comments
 (0)