diff --git a/README.md b/README.md index 61de3232..61fa06c7 100644 --- a/README.md +++ b/README.md @@ -797,6 +797,20 @@ print("run[CQ:image,file="+j["img"]+"]") - [x] [查梗|小鸡词典][梗] + +
+ 日语听力学习材料 + + `import _ "github.com/FloatTech/ZeroBot-Plugin/plugin/jptingroom"` + + - [x] 随机日语听力 + + - [x] 随机日语歌曲 + + - [x] 日语听力 xxx + + - [x] 日语歌曲 xxx +
绝绝子 diff --git a/main.go b/main.go index 4d9758dd..3f164925 100644 --- a/main.go +++ b/main.go @@ -95,6 +95,7 @@ import ( _ "github.com/FloatTech/ZeroBot-Plugin/plugin/inject" // 注入指令 _ "github.com/FloatTech/ZeroBot-Plugin/plugin/jandan" // 煎蛋网无聊图 _ "github.com/FloatTech/ZeroBot-Plugin/plugin/jikipedia" // 小鸡词典 + _ "github.com/FloatTech/ZeroBot-Plugin/plugin/jptingroom" // 日语听力学习材料 _ "github.com/FloatTech/ZeroBot-Plugin/plugin/juejuezi" // 绝绝子生成器 _ "github.com/FloatTech/ZeroBot-Plugin/plugin/lolicon" // lolicon 随机图片 _ "github.com/FloatTech/ZeroBot-Plugin/plugin/midicreate" // 简易midi音乐制作 diff --git a/plugin/jptingroom/jptingroom.go b/plugin/jptingroom/jptingroom.go new file mode 100644 index 00000000..96f5ac47 --- /dev/null +++ b/plugin/jptingroom/jptingroom.go @@ -0,0 +1,105 @@ +// Package jptingroom 日语听力学习材料 +package jptingroom + +import ( + "time" + + "github.com/FloatTech/floatbox/binary" + fcext "github.com/FloatTech/floatbox/ctxext" + ctrl "github.com/FloatTech/zbpctrl" + "github.com/FloatTech/zbputils/control" + "github.com/FloatTech/zbputils/img/text" + log "github.com/sirupsen/logrus" + zero "github.com/wdvxdr1123/ZeroBot" + "github.com/wdvxdr1123/ZeroBot/message" +) + +func init() { // 插件主体 + engine := control.Register("jptingroom", &ctrl.Options[*zero.Ctx]{ + DisableOnDefault: false, + Help: "日语听力学习材料\n" + + "- 随机日语听力\n" + + "- 随机日语歌曲\n" + + "- 日语听力 xxx\n" + + "- 日语歌曲 xxx\n", + PublicDataFolder: "Jptingroom", + }) + + getdb := fcext.DoOnceOnSuccess(func(ctx *zero.Ctx) bool { + db.DBPath = engine.DataFolder() + "item.db" + _, err := engine.GetLazyData("item.db", true) + if err != nil { + ctx.SendChain(message.Text("ERROR: ", err)) + return false + } + err = db.Open(time.Hour * 24) + if err != nil { + ctx.SendChain(message.Text("ERROR: ", err)) + return false + } + err = db.Create("item", &item{}) + if err != nil { + ctx.SendChain(message.Text("ERROR: ", err)) + return false + } + n, err := db.Count("item") + if err != nil { + ctx.SendChain(message.Text("ERROR: ", err)) + return false + } + log.Infof("[jptingroom]读取%d条日语听力材料", n) + return true + }) + // 开启 + engine.OnFullMatchGroup([]string{"随机日语听力", "随机日语歌曲"}, getdb).SetBlock(true). + Handle(func(ctx *zero.Ctx) { + matched := ctx.State["matched"].(string) + var t item + switch matched { + case "随机日语听力": + t = getRandomAudioByCategory("tingli") + case "随机日语歌曲": + t = getRandomAudioByCategory("gequ") + default: + } + if t.AudioURL == "" { + ctx.SendChain(message.Text("未能找到相关材料")) + return + } + ctx.SendChain(message.Record(t.AudioURL)) + content := t.Title + "\n\n" + t.Content + data, err := text.RenderToBase64(content, text.FontFile, 400, 20) + if err != nil { + ctx.SendChain(message.Text("ERROR: ", err)) + return + } + if id := ctx.SendChain(message.Image("base64://" + binary.BytesToString(data))); id.ID() == 0 { + ctx.SendChain(message.Text("ERROR: 可能被风控了")) + } + }) + engine.OnRegex(`日语(听力|歌曲)\s?([一-龥A-Za-z0-9ぁ-んァ-ヶ]{1,50})$`, getdb).SetBlock(true). + Handle(func(ctx *zero.Ctx) { + regexMatched := ctx.State["regex_matched"].([]string) + var t item + switch regexMatched[1] { + case "听力": + t = getRandomAudioByCategoryAndKeyword("tingli", regexMatched[2]) + case "歌曲": + t = getRandomAudioByCategoryAndKeyword("gequ", regexMatched[2]) + default: + } + if t.AudioURL == "" { + ctx.SendChain(message.Text("未能找到相关材料")) + return + } + content := t.Title + "\n\n" + t.Content + data, err := text.RenderToBase64(content, text.FontFile, 400, 20) + if err != nil { + ctx.SendChain(message.Text("ERROR: ", err)) + return + } + if id := ctx.SendChain(message.Image("base64://" + binary.BytesToString(data))); id.ID() == 0 { + ctx.SendChain(message.Text("ERROR: 可能被风控了")) + } + }) +} diff --git a/plugin/jptingroom/model.go b/plugin/jptingroom/model.go new file mode 100644 index 00000000..4ab9de4a --- /dev/null +++ b/plugin/jptingroom/model.go @@ -0,0 +1,30 @@ +package jptingroom + +import ( + "time" + + sql "github.com/FloatTech/sqlite" +) + +type item struct { + ID int64 `db:"id"` + Title string `db:"title"` + PageURL string `db:"page_url"` + Category string `db:"category"` + Intro string `db:"intro"` + AudioURL string `db:"audio_url"` + Content string `db:"content"` + Datetime time.Time `db:"datetime"` +} + +var db = &sql.Sqlite{} + +func getRandomAudioByCategory(category string) (t item) { + _ = db.Find("item", &t, "where category = '"+category+"' ORDER BY RANDOM() limit 1") + return +} + +func getRandomAudioByCategoryAndKeyword(category string, keyword string) (t item) { + _ = db.Find("item", &t, "where category = '"+category+"' and (title like '%"+keyword+"%' or content like '%"+keyword+"%') ORDER BY RANDOM() limit 1") + return +}