mirror of
https://github.com/FloatTech/ZeroBot-Plugin.git
synced 2025-12-25 03:03:48 +08:00
108 lines
2.9 KiB
Go
108 lines
2.9 KiB
Go
package hyaku
|
|
|
|
import (
|
|
"encoding/csv"
|
|
"fmt"
|
|
"math/rand"
|
|
"os"
|
|
"strconv"
|
|
"unsafe"
|
|
|
|
"github.com/FloatTech/zbputils/control"
|
|
"github.com/FloatTech/zbputils/control/order"
|
|
"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/u011570312/OguraHyakuninIsshu/-/raw/master/"
|
|
|
|
type line struct {
|
|
no, 歌人, 上の句, 下の句, 上の句ひらがな, 下の句ひらがな string
|
|
}
|
|
|
|
var lines [100]*line
|
|
|
|
func init() {
|
|
engine := control.Register("hyaku", order.AcquirePrio(), &control.Options{
|
|
DisableOnDefault: false,
|
|
Help: "百人一首\n" +
|
|
"- 百人一首(随机发一首)\n" +
|
|
"- 百人一首之n",
|
|
PrivateDataFolder: "hyaku",
|
|
})
|
|
csvfile := engine.DataFolder() + "hyaku.csv"
|
|
go func() {
|
|
if file.IsNotExist(csvfile) {
|
|
err := file.DownloadTo(bed+"小倉百人一首.csv", csvfile, true)
|
|
if err != nil {
|
|
_ = os.Remove(csvfile)
|
|
panic(err)
|
|
}
|
|
}
|
|
f, err := os.Open(csvfile)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
records, err := csv.NewReader(f).ReadAll()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
records = records[1:] // skip title
|
|
if len(records) != 100 {
|
|
panic("invalid csvfile")
|
|
}
|
|
for j, r := range records {
|
|
i, err := strconv.Atoi(r[0])
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
i--
|
|
if j != i {
|
|
panic("invalid csvfile")
|
|
}
|
|
lines[i] = (*line)(*(*unsafe.Pointer)(unsafe.Pointer(&r)))
|
|
}
|
|
}()
|
|
engine.OnFullMatch("百人一首").SetBlock(true).Limit(ctxext.LimitByUser).Handle(func(ctx *zero.Ctx) {
|
|
i := rand.Intn(100)
|
|
ctx.SendChain(
|
|
message.Image(fmt.Sprintf(bed+"img/%03d.jpg", i+1)),
|
|
message.Text("\n",
|
|
"●番 号: ", lines[i].no, "\n",
|
|
"●歌 人: ", lines[i].歌人, "\n",
|
|
"●上の句: ", lines[i].上の句, "\n",
|
|
"●下の句: ", lines[i].下の句, "\n",
|
|
"●上の句ひらがな: ", lines[i].上の句ひらがな, "\n",
|
|
"●下の句ひらがな: ", lines[i].下の句ひらがな, "\n",
|
|
),
|
|
message.Image(fmt.Sprintf(bed+"img/%03d.png", i+1)),
|
|
)
|
|
})
|
|
engine.OnRegex(`^百人一首之\s?(\d+)$`).SetBlock(true).Limit(ctxext.LimitByUser).Handle(func(ctx *zero.Ctx) {
|
|
i, err := strconv.Atoi(ctx.State["regex_matched"].([]string)[1])
|
|
if err != nil {
|
|
ctx.SendChain(message.Text("ERROR:", err))
|
|
return
|
|
}
|
|
if i > 100 || i < 1 {
|
|
ctx.SendChain(message.Text("ERROR:超出范围"))
|
|
return
|
|
}
|
|
i--
|
|
ctx.SendChain(
|
|
message.Image(fmt.Sprintf(bed+"img/%03d.jpg", i+1)),
|
|
message.Text("\n",
|
|
"●番 号: ", lines[i].no, "\n",
|
|
"●歌 人: ", lines[i].歌人, "\n",
|
|
"●上の句: ", lines[i].上の句, "\n",
|
|
"●下の句: ", lines[i].下の句, "\n",
|
|
"●上の句ひらがな: ", lines[i].上の句ひらがな, "\n",
|
|
"●下の句ひらがな: ", lines[i].下の句ひらがな, "\n",
|
|
),
|
|
message.Image(fmt.Sprintf(bed+"img/%03d.png", i+1)),
|
|
)
|
|
})
|
|
}
|