diff --git a/README.md b/README.md
index 50c1692fa1..b3d0455236 100644
--- a/README.md
+++ b/README.md
@@ -795,6 +795,14 @@ print("run[CQ:image,file="+j["img"]+"]")
- [x] 黄油角色[@xxx]
+
+
+ 抽塔罗牌
+
+ `import _ "github.com/FloatTech/ZeroBot-Plugin/plugin/tarot"`
+
+ - [x] 抽塔罗牌
+
搜番
diff --git a/main.go b/main.go
index 16cfaba0c9..4fe0028a8f 100644
--- a/main.go
+++ b/main.go
@@ -104,6 +104,7 @@ import (
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/setutime" // 来份涩图
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/shadiao" // 沙雕app
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/shindan" // 测定
+ _ "github.com/FloatTech/ZeroBot-Plugin/plugin/tarot" // 抽塔罗牌
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/tiangou" // 舔狗日记
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/tracemoe" // 搜番
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/translation" // 翻译
diff --git a/plugin/tarot/tarot.go b/plugin/tarot/tarot.go
new file mode 100644
index 0000000000..6a7d5af229
--- /dev/null
+++ b/plugin/tarot/tarot.go
@@ -0,0 +1,77 @@
+package tarot
+
+import (
+ "encoding/json"
+ "fmt"
+ "log"
+ "math/rand"
+ "strconv"
+
+ "github.com/FloatTech/zbputils/control"
+ "github.com/FloatTech/zbputils/ctxext"
+ "github.com/FloatTech/zbputils/file"
+ zero "github.com/wdvxdr1123/ZeroBot"
+ "github.com/wdvxdr1123/ZeroBot/message"
+)
+
+const bed = "https://gitcode.net/shudorcl/zbp-tarot/-/raw/master/"
+
+type card struct {
+ Name string `json:"name"`
+ Info struct {
+ Description string `json:"description"`
+ ReverseDescription string `json:"reverseDescription"`
+ ImgURL string `json:"imgUrl"`
+ } `json:"info"`
+}
+type cardset = map[string]card
+
+var cardMap = make(cardset, 256)
+var reasons = []string{"您抽到的是~\n", "锵锵锵,塔罗牌的预言是~\n", "诶,让我看看您抽到了~\n"}
+var position = []string{"正位", "逆位"}
+
+func init() {
+ engine := control.Register("tarot", &control.Options{
+ DisableOnDefault: false,
+ Help: "塔罗牌\n" +
+ "- 抽塔罗牌\n",
+ // TODO 抽X张塔罗牌 解塔罗牌[牌名]
+ PublicDataFolder: "Tarot",
+ }).ApplySingle(ctxext.DefaultSingle)
+
+ engine.OnFullMatch("抽塔罗牌", ctxext.DoOnceOnSuccess(
+ func(ctx *zero.Ctx) bool {
+ tarotPath := engine.DataFolder() + "tarots.json"
+ data, err := file.GetLazyData(tarotPath, true, true)
+ if err != nil {
+ ctx.SendChain(message.Text("ERROR:", err))
+ return false
+ }
+ err = json.Unmarshal(data, &cardMap)
+ if err != nil {
+ panic(err)
+ }
+ log.Printf("[tarot]读取%d张塔罗牌", len(cardMap))
+ return true
+ },
+ )).SetBlock(true).Limit(ctxext.LimitByUser).Handle(func(ctx *zero.Ctx) {
+ i := rand.Intn(22)
+ p := rand.Intn(2)
+ card := cardMap[(strconv.Itoa(i))]
+ name := card.Name
+ var info string
+ if p == 0 {
+ info = card.Info.Description
+ } else {
+ info = card.Info.ReverseDescription
+ }
+ if id := ctx.SendChain(
+ message.At(ctx.Event.UserID),
+ message.Text(reasons[rand.Intn(len(reasons))], position[p], " 的 ", name, "\n"),
+ message.Image(fmt.Sprintf(bed+"MajorArcana/%d.png", i)),
+ message.Text("\n其意义为:", info),
+ ); id.ID() == 0 {
+ ctx.SendChain(message.Text("ERROR:可能被风控了"))
+ }
+ })
+}