Skip to content

feat:塔罗牌阵 #268

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 50 commits into from
Jun 18, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
0a4d870
优化在两个命令中使用空格分隔的体验
shudorcl Jan 27, 2022
3eee43e
优化四个插件中使用空格分隔的体验
shudorcl Jan 28, 2022
9c6943d
优化并修正了上一个commit
shudorcl Jan 28, 2022
3e3b8f1
- 删去了遗漏的Trim
shudorcl Jan 28, 2022
ed1d66f
Merge branch 'FloatTech:master' into master
shudorcl Feb 3, 2022
6667402
优化了更多插件中使用空格的体验
shudorcl Feb 3, 2022
45b112b
Merge branch 'FloatTech:master' into master
shudorcl Feb 7, 2022
0a065ff
Merge branch 'FloatTech:master' into master
shudorcl Feb 16, 2022
68cde8e
Merge branch 'FloatTech:master' into master
shudorcl Mar 4, 2022
a55ebda
Merge branch 'FloatTech:master' into master
shudorcl Mar 21, 2022
7f76e40
Merge branch 'FloatTech:master' into master
shudorcl Mar 31, 2022
ea3d521
Merge branch 'FloatTech:master' into master
shudorcl Mar 31, 2022
fcee9ae
Merge branch 'FloatTech:master' into master
shudorcl Apr 5, 2022
f378d3f
Merge branch 'FloatTech:master' into master
shudorcl Apr 11, 2022
e3fb21d
Merge branch 'FloatTech:master' into master
shudorcl Apr 20, 2022
e29288f
Merge branch 'FloatTech:master' into master
shudorcl Apr 21, 2022
63c6395
Merge branch 'FloatTech:master' into master
shudorcl Apr 27, 2022
2d203f0
Merge branch 'FloatTech:master' into master
shudorcl Apr 29, 2022
2b47e61
Merge branch 'FloatTech:master' into master
shudorcl May 1, 2022
9a7fdfd
- 调整funny
shudorcl May 1, 2022
9bb1d34
- 简化funny说明
shudorcl May 1, 2022
1c175f2
Merge branch 'FloatTech:master' into master
shudorcl May 3, 2022
cc5f950
Merge branch 'FloatTech:master' into master
shudorcl May 5, 2022
c1adf22
Merge branch 'FloatTech:master' into master
shudorcl May 5, 2022
6f1a266
Merge branch 'FloatTech:master' into master
shudorcl May 7, 2022
3cf4b7d
Merge branch 'FloatTech:master' into master
shudorcl May 7, 2022
9d5a19d
- 用暴力的办法使抽多张塔罗牌不重复
shudorcl May 7, 2022
40fad7e
- 解塔罗牌
shudorcl May 7, 2022
5c12f35
- 修改readme
shudorcl May 7, 2022
3c8df7b
大幅减少全局变量,简化抽塔罗牌输出
shudorcl May 8, 2022
e09ca34
Merge branch 'FloatTech:master' into master
shudorcl May 8, 2022
2f80b58
Merge branch 'FloatTech:master' into master
shudorcl May 9, 2022
2f16d0f
Merge branch 'FloatTech:master' into master
shudorcl May 9, 2022
64940d5
Merge branch 'FloatTech:master' into master
shudorcl May 12, 2022
5c6e82d
Merge branch 'FloatTech:master' into master
shudorcl May 13, 2022
e128e8b
Merge branch 'FloatTech:master' into master
shudorcl May 16, 2022
0f8be56
Merge branch 'FloatTech:master' into master
shudorcl May 20, 2022
cbab311
Merge branch 'FloatTech:master' into master
shudorcl May 24, 2022
4ff6c77
Merge branch 'FloatTech:master' into master
shudorcl May 27, 2022
8bc8b6b
Merge branch 'FloatTech:master' into master
shudorcl Jun 17, 2022
d5544ae
- 更新了塔罗牌阵
shudorcl Jun 17, 2022
6707f53
Merge branch 'master' of github.com:shudorcl/ZeroBot-Plugin
shudorcl Jun 17, 2022
6ea9a1c
- 顺lint心意
shudorcl Jun 17, 2022
5a04fe8
调整塔罗牌阵消息
shudorcl Jun 17, 2022
74be5e0
调整DoOnceOnSuccess,减少冗余
shudorcl Jun 18, 2022
5732740
🎨 改进代码样式
github-actions[bot] Jun 18, 2022
01ab8a6
调整发送牌阵信息
shudorcl Jun 18, 2022
78077b9
调整变量名
shudorcl Jun 18, 2022
ff65622
🎨 改进代码样式
github-actions[bot] Jun 18, 2022
d100a11
改回base64
shudorcl Jun 18, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -862,6 +862,7 @@ print("run[CQ:image,file="+j["img"]+"]")
- [x] 抽塔罗牌
- [x] 抽n张塔罗牌
- [x] 解塔罗牌[牌名]
- [x] 塔罗牌阵[圣三角|时间之流|四要素|五牌阵|吉普赛十字|马蹄|六芒星]"

</details>
<details>
Expand Down
140 changes: 90 additions & 50 deletions plugin/tarot/tarot.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,10 @@ import (
"strings"

ctrl "github.com/FloatTech/zbpctrl"
"github.com/FloatTech/zbputils/binary"
"github.com/FloatTech/zbputils/control"
"github.com/FloatTech/zbputils/ctxext"
"github.com/FloatTech/zbputils/img/text"
"github.com/sirupsen/logrus"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message"
Expand All @@ -27,39 +29,64 @@ type card struct {
Name string `json:"name"`
cardInfo `json:"info"`
}

type formation struct {
CardsNum int `json:"cards_num"`
IsCut bool `json:"is_cut"`
Represent [][]string `json:"represent"`
}
type cardSet = map[string]card

var cardMap = make(cardSet, 30)
var infoMap = make(map[string]cardInfo, 30)
var formationMap = make(map[string]formation, 10)

// var cardName = make([]string, 22)
// var cardName = make([]string, 30)
// var formationName = make([]string, 10)

func init() {
engine := control.Register("tarot", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "塔罗牌\n" +
"- 抽塔罗牌\n" +
"- 抽n张塔罗牌\n" +
"- 解塔罗牌[牌名]",
"- 解塔罗牌[牌名]\n" +
"- 塔罗牌阵[圣三角|时间之流|四要素|五牌阵|吉普赛十字|马蹄|六芒星]",
PublicDataFolder: "Tarot",
}).ApplySingle(ctxext.DefaultSingle)

engine.OnRegex(`^抽(\d{1,2}张)?塔罗牌$`, ctxext.DoOnceOnSuccess(
func(ctx *zero.Ctx) bool {
data, err := engine.GetLazyData("tarots.json", true)
if err != nil {
ctx.SendChain(message.Text("ERROR:", err))
return false
}
err = json.Unmarshal(data, &cardMap)
if err != nil {
ctx.SendChain(message.Text("ERROR:", err))
return false
}
logrus.Infof("[tarot]读取%d张塔罗牌", len(cardMap))
return true
},
)).SetBlock(true).Limit(ctxext.LimitByGroup).Handle(func(ctx *zero.Ctx) {
getTarot := ctxext.DoOnceOnSuccess(func(ctx *zero.Ctx) bool {
data, err := engine.GetLazyData("tarots.json", true)
if err != nil {
ctx.SendChain(message.Text("ERROR:", err))
return false
}
err = json.Unmarshal(data, &cardMap)
if err != nil {
ctx.SendChain(message.Text("ERROR:", err))
return false
}
for _, card := range cardMap {
infoMapKey := strings.Split(card.Name, "(")[0]
infoMap[infoMapKey] = card.cardInfo
// 可以拿来显示大阿尔卡纳列表
// cardName = append(cardName, infoMapKey)
}
logrus.Infof("[tarot]读取%d张大阿尔卡纳塔罗牌", len(cardMap))
formation, err := engine.GetLazyData("formation.json", true)
if err != nil {
ctx.SendChain(message.Text("ERROR:", err))
return false
}
err = json.Unmarshal(formation, &formationMap)
if err != nil {
ctx.SendChain(message.Text("ERROR:", err))
return false
}
logrus.Infof("[tarot]读取%d组塔罗牌阵", len(formationMap))
return true
})
engine.OnRegex(`^抽(\d{1,2}张)?塔罗牌$`, getTarot).SetBlock(true).Limit(ctxext.LimitByGroup).Handle(func(ctx *zero.Ctx) {
match := ctx.State["regex_matched"].([]string)[1]
n := 1
reasons := [...]string{"您抽到的是~\n", "锵锵锵,塔罗牌的预言是~\n", "诶,让我看看您抽到了~\n"}
Expand Down Expand Up @@ -118,38 +145,7 @@ func init() {
ctx.SendGroupForwardMessage(ctx.Event.GroupID, msg)
})

engine.OnRegex(`^解塔罗牌\s?(.*)`, ctxext.DoOnceOnSuccess(
func(ctx *zero.Ctx) bool {
if len(cardMap) > 0 {
for _, card := range cardMap {
infoMapKey := strings.Split(card.Name, "(")[0]
infoMap[infoMapKey] = card.cardInfo
// 可以拿来显示大阿尔卡纳列表
// cardName = append(cardName, infoMapKey)
}
return true
}
tempMap := make(cardSet, 30)
data, err := engine.GetLazyData("tarots.json", true)
if err != nil {
ctx.SendChain(message.Text("ERROR:", err))
return false
}
err = json.Unmarshal(data, &tempMap)
if err != nil {
ctx.SendChain(message.Text("ERROR:", err))
return false
}

for _, card := range tempMap {
infoMapKey := strings.Split(card.Name, "(")[0]
infoMap[infoMapKey] = card.cardInfo
// 可以拿来显示大阿尔卡纳列表
// cardName = append(cardName, infoMapKey)
}
return true
},
)).SetBlock(true).Limit(ctxext.LimitByGroup).Handle(func(ctx *zero.Ctx) {
engine.OnRegex(`^解塔罗牌\s?(.*)`, getTarot).SetBlock(true).Limit(ctxext.LimitByGroup).Handle(func(ctx *zero.Ctx) {
match := ctx.State["regex_matched"].([]string)[1]
info, ok := infoMap[match]
if ok {
Expand All @@ -162,4 +158,48 @@ func init() {
ctx.SendChain(message.Text("没有找到", match, "噢~"))
}
})
engine.OnRegex(`^塔罗牌阵\s?(.*)`, getTarot).SetBlock(true).Limit(ctxext.LimitByGroup).Handle(func(ctx *zero.Ctx) {
match := ctx.State["regex_matched"].([]string)[1]
info, ok := formationMap[match]
position := [...]string{"正位", "逆位"}
reverse := [...]string{"", "Reverse"}
if ok {
var build strings.Builder
build.WriteString(ctx.CardOrNickName(ctx.Event.UserID))
build.WriteString("\n")
msg := make([]message.MessageSegment, info.CardsNum)
randomIntMap := make(map[int]int, 30)
for i := range msg {
j := rand.Intn(22)
_, ok := randomIntMap[j]
for ok {
j = rand.Intn(22)
_, ok = randomIntMap[j]
}
randomIntMap[j] = 0
p := rand.Intn(2)
card := cardMap[(strconv.Itoa(j))]
name := card.Name
tarotMsg := []message.MessageSegment{message.Image(fmt.Sprintf(bed+"MajorArcana%s/%d.png", reverse[p], j))}
build.WriteString(info.Represent[0][i])
build.WriteString(": ")
build.WriteString(position[p])
build.WriteString(" 的 ")
build.WriteString(name)
build.WriteString("\n")
msg[i] = ctxext.FakeSenderForwardNode(ctx, tarotMsg...)
}
txt := build.String()
formation, err := text.RenderToBase64(txt, text.FontFile, 400, 20)
if err != nil {
ctx.SendChain(message.Text("ERROR:", err))
return
}
// TODO 视gocq变化将牌阵信息加入转发列表中
ctx.SendChain(message.Image("base64://" + binary.BytesToString(formation)))
ctx.SendGroupForwardMessage(ctx.Event.GroupID, msg)
} else {
ctx.SendChain(message.Text("没有找到", match, "噢~"))
}
})
}