diff --git a/README.md b/README.md index 380e405b93..cfcb503b00 100644 --- a/README.md +++ b/README.md @@ -393,6 +393,24 @@ print("run[CQ:image,file="+j["img"]+"]") - [x] t.bilibili.com/642277677329285174 | bilibili.com/read/cv17134450 | bilibili.com/video/BV13B4y1x7pS | live.bilibili.com/22603245 + +
+ b站动态、直播推送,需要配合job一起使用 + + `import _ "github.com/FloatTech/ZeroBot-Plugin/plugin/bilibili"` + + - [x] 添加b站订阅[uid|name] + + - [x] 取消b站订阅[uid|name] + + - [x] 取消b站动态订阅[uid|name] + + - [x] 取消b站直播订阅[uid|name] + + - [x] b站推送列表 + + - [x] 拉取b站推送 (使用job执行定时任务------记录在"@every 10s"触发的指令) +
书评 diff --git a/plugin/bilibili/bilibili.go b/plugin/bilibili/bilibili.go index 6451cdd6a1..2707c258ed 100644 --- a/plugin/bilibili/bilibili.go +++ b/plugin/bilibili/bilibili.go @@ -47,7 +47,7 @@ func init() { var getdb = ctxext.DoOnceOnSuccess(func(ctx *zero.Ctx) bool { var err error _, _ = engine.GetLazyData("bilibili.db", false) - vdb, err = initialize(engine.DataFolder() + "bilibili.db") + vdb, err = initializeVup(engine.DataFolder() + "bilibili.db") if err != nil { ctx.SendChain(message.Text("ERROR:", err)) return false diff --git a/plugin/bilibili/bilibili_parse.go b/plugin/bilibili/bilibili_parse.go index 8d6e2a8958..0f8f1fe790 100644 --- a/plugin/bilibili/bilibili_parse.go +++ b/plugin/bilibili/bilibili_parse.go @@ -1,3 +1,4 @@ +// Package bilibili bilibili卡片解析 package bilibili import ( diff --git a/plugin/bilibili/model.go b/plugin/bilibili/bilibilimodel.go similarity index 96% rename from plugin/bilibili/model.go rename to plugin/bilibili/bilibilimodel.go index 2e482acb91..10d4f4d0c2 100644 --- a/plugin/bilibili/model.go +++ b/plugin/bilibili/bilibilimodel.go @@ -41,8 +41,8 @@ func (config) TableName() string { return "config" } -// initialize 初始化vtb数据库 -func initialize(dbpath string) (*vupdb, error) { +// initializeVup 初始化vup数据库 +func initializeVup(dbpath string) (*vupdb, error) { if _, err := os.Stat(dbpath); err != nil || os.IsNotExist(err) { // 生成文件 f, err := os.Create(dbpath) diff --git a/plugin/bilibili/bilibilipush.go b/plugin/bilibili/bilibilipush.go new file mode 100644 index 0000000000..9c95904251 --- /dev/null +++ b/plugin/bilibili/bilibilipush.go @@ -0,0 +1,357 @@ +// Package bilibili b站推送 +package bilibili + +import ( + "bytes" + "encoding/json" + "fmt" + "strconv" + "time" + + "github.com/pkg/errors" + "github.com/tidwall/gjson" + zero "github.com/wdvxdr1123/ZeroBot" + "github.com/wdvxdr1123/ZeroBot/message" + + ctrl "github.com/FloatTech/zbpctrl" + "github.com/FloatTech/zbputils/binary" + "github.com/FloatTech/zbputils/control" + "github.com/FloatTech/zbputils/img/text" + "github.com/FloatTech/zbputils/web" +) + +const ( + ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36" + referer = "https://www.bilibili.com/" + infoURL = "https://api.bilibili.com/x/space/acc/info?mid=%v" + serviceName = "bilibilipush" +) + +// bdb bilibili推送数据库 +var bdb *bilibilipushdb + +var ( + lastTime = map[int64]int64{} + liveStatus = map[int64]int{} + upMap = map[int64]string{} +) + +func init() { + en := control.Register(serviceName, &ctrl.Options[*zero.Ctx]{ + DisableOnDefault: false, + Help: "bilibilipush,需要配合job一起使用\n" + + "- 添加b站订阅[uid|name]\n" + + "- 取消b站订阅[uid|name]\n" + + "- 取消b站动态订阅[uid|name]\n" + + "- 取消b站直播订阅[uid|name]\n" + + "- b站推送列表\n" + + "- 拉取b站推送 (使用job执行定时任务------记录在\"@every 10s\"触发的指令)", + PrivateDataFolder: serviceName, + }) + + // 加载bilibili推送数据库 + dbpath := en.DataFolder() + dbfile := dbpath + "push.db" + bdb = initializePush(dbfile) + + en.OnRegex(`^添加b站订阅\s?(.{1,25})$`, zero.UserOrGrpAdmin, getPara).SetBlock(true).Handle(func(ctx *zero.Ctx) { + buid, _ := strconv.ParseInt(ctx.State["uid"].(string), 10, 64) + name, err := getName(buid) + if err != nil { + ctx.SendChain(message.Text("ERROR:", err)) + return + } + gid := ctx.Event.GroupID + if gid == 0 { + gid = -ctx.Event.UserID + } + if err := subscribe(buid, gid); err != nil { + ctx.SendChain(message.Text("ERROR:", err)) + return + } + ctx.SendChain(message.Text("已添加" + name + "的订阅")) + }) + en.OnRegex(`^取消b站订阅\s?(.{1,25})$`, zero.UserOrGrpAdmin, getPara).SetBlock(true).Handle(func(ctx *zero.Ctx) { + buid, _ := strconv.ParseInt(ctx.State["uid"].(string), 10, 64) + name, err := getName(buid) + if err != nil { + ctx.SendChain(message.Text("ERROR:", err)) + return + } + gid := ctx.Event.GroupID + if gid == 0 { + gid = -ctx.Event.UserID + } + if err := unsubscribe(buid, gid); err != nil { + ctx.SendChain(message.Text("ERROR:", err)) + return + } + ctx.SendChain(message.Text("已取消" + name + "的订阅")) + }) + en.OnRegex(`^取消b站动态订阅\s?(.{1,25})$`, zero.UserOrGrpAdmin, getPara).SetBlock(true).Handle(func(ctx *zero.Ctx) { + buid, _ := strconv.ParseInt(ctx.State["uid"].(string), 10, 64) + name, err := getName(buid) + if err != nil { + ctx.SendChain(message.Text("ERROR:", err)) + return + } + gid := ctx.Event.GroupID + if gid == 0 { + gid = -ctx.Event.UserID + } + if err := unsubscribeDynamic(buid, gid); err != nil { + ctx.SendChain(message.Text("ERROR:", err)) + return + } + ctx.SendChain(message.Text("已取消" + name + "的动态订阅")) + }) + en.OnRegex(`^取消b站直播订阅\s?(.{1,25})$`, zero.UserOrGrpAdmin, getPara).SetBlock(true).Handle(func(ctx *zero.Ctx) { + buid, _ := strconv.ParseInt(ctx.State["uid"].(string), 10, 64) + gid := ctx.Event.GroupID + if gid == 0 { + gid = -ctx.Event.UserID + } + name, err := getName(buid) + if err != nil { + ctx.SendChain(message.Text("ERROR:", err)) + return + } + if err := unsubscribeLive(buid, gid); err != nil { + ctx.SendChain(message.Text("ERROR:", err)) + return + } + ctx.SendChain(message.Text("已取消" + name + "的直播订阅")) + }) + en.OnFullMatch("b站推送列表", zero.UserOrGrpAdmin).SetBlock(true).Handle(func(ctx *zero.Ctx) { + gid := ctx.Event.GroupID + if gid == 0 { + gid = -ctx.Event.UserID + } + bpl := bdb.getAllPushByGroup(gid) + msg := "--------b站推送列表--------" + for _, v := range bpl { + if _, ok := upMap[v.BilibiliUID]; !ok { + bdb.updateAllUp() + } + msg += fmt.Sprintf("\nuid:%-12d 动态:", v.BilibiliUID) + if v.DynamicDisable == 0 { + msg += "●" + } else { + msg += "○" + } + msg += " 直播:" + if v.LiveDisable == 0 { + msg += "●" + } else { + msg += "○" + } + msg += " up主:" + upMap[v.BilibiliUID] + } + data, err := text.RenderToBase64(msg, text.FontFile, 600, 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:可能被风控了")) + } + }) + en.OnFullMatch("拉取b站推送").SetBlock(true).Handle(func(ctx *zero.Ctx) { + err := sendDynamic(ctx) + if err != nil { + ctx.SendPrivateMessage(ctx.Event.UserID, message.Text("Error: bilibilipush,", err)) + } + err = sendLive(ctx) + if err != nil { + ctx.SendPrivateMessage(ctx.Event.UserID, message.Text("Error: bilibilipush,", err)) + } + }) +} + +// 取得uid的名字 +func getName(buid int64) (name string, err error) { + var ok bool + if name, ok = upMap[buid]; !ok { + var data []byte + data, err = web.RequestDataWith(web.NewDefaultClient(), fmt.Sprintf(infoURL, buid), "GET", referer, ua) + if err != nil { + return + } + status := int(gjson.Get(binary.BytesToString(data), "code").Int()) + if status != 0 { + err = errors.New(gjson.Get(binary.BytesToString(data), "message").String()) + return + } + name = gjson.Get(binary.BytesToString(data), "data.name").String() + bdb.insertBilibiliUp(buid, name) + upMap[buid] = name + } + return +} + +// subscribe 订阅 +func subscribe(buid, groupid int64) (err error) { + bpMap := map[string]interface{}{ + "bilibili_uid": buid, + "group_id": groupid, + "live_disable": 0, + "dynamic_disable": 0, + } + return bdb.insertOrUpdateLiveAndDynamic(bpMap) +} + +// unsubscribe 取消订阅 +func unsubscribe(buid, groupid int64) (err error) { + bpMap := map[string]interface{}{ + "bilibili_uid": buid, + "group_id": groupid, + "live_disable": 1, + "dynamic_disable": 1, + } + return bdb.insertOrUpdateLiveAndDynamic(bpMap) +} + +func unsubscribeDynamic(buid, groupid int64) (err error) { + bpMap := map[string]interface{}{ + "bilibili_uid": buid, + "group_id": groupid, + "dynamic_disable": 1, + } + return bdb.insertOrUpdateLiveAndDynamic(bpMap) +} + +func unsubscribeLive(buid, groupid int64) (err error) { + bpMap := map[string]interface{}{ + "bilibili_uid": buid, + "group_id": groupid, + "live_disable": 1, + } + return bdb.insertOrUpdateLiveAndDynamic(bpMap) +} + +func getUserDynamicCard(buid int64) (cardList []gjson.Result, err error) { + data, err := web.RequestDataWith(web.NewDefaultClient(), fmt.Sprintf(spaceHistoryURL, buid, 0), "GET", referer, ua) + if err != nil { + return + } + cardList = gjson.Get(binary.BytesToString(data), "data.cards").Array() + return +} + +func getLiveList(uids ...int64) (string, error) { + m := make(map[string]interface{}) + m["uids"] = uids + b, err := json.Marshal(m) + if err != nil { + return "", err + } + data, err := web.PostData(liveListURL, "application/json", bytes.NewReader(b)) + if err != nil { + return "", err + } + return binary.BytesToString(data), nil +} + +func sendDynamic(ctx *zero.Ctx) error { + uids := bdb.getAllBuidByDynamic() + for _, buid := range uids { + time.Sleep(2 * time.Second) + cardList, err := getUserDynamicCard(buid) + if err != nil { + return err + } + if len(cardList) == 0 { + return errors.Errorf("%v的历史动态数为0", buid) + } + t, ok := lastTime[buid] + // 第一次先记录时间,啥也不做 + if !ok { + lastTime[buid] = cardList[0].Get("desc.timestamp").Int() + return nil + } + for i := len(cardList) - 1; i >= 0; i-- { + ct := cardList[i].Get("desc.timestamp").Int() + if ct > t && ct > time.Now().Unix()-600 { + lastTime[buid] = ct + m, ok := control.Lookup(serviceName) + if ok { + groupList := bdb.getAllGroupByBuidAndDynamic(buid) + msg, err := dynamicCard2msg(cardList[i].Raw, 0) + if err != nil { + err = errors.Errorf("动态%v的解析有问题,%v", cardList[i].Get("desc.dynamic_id_str"), err) + return err + } + for _, gid := range groupList { + if m.IsEnabledIn(gid) { + time.Sleep(time.Millisecond * 100) + switch { + case gid > 0: + ctx.SendGroupMessage(gid, msg) + case gid < 0: + ctx.SendPrivateMessage(-gid, msg) + } + } + } + } + } + } + } + return nil +} + +func sendLive(ctx *zero.Ctx) error { + uids := bdb.getAllBuidByLive() + ll, err := getLiveList(uids...) + if err != nil { + return err + } + gjson.Get(ll, "data").ForEach(func(key, value gjson.Result) bool { + newStatus := int(value.Get("live_status").Int()) + if newStatus == 2 { + newStatus = 0 + } + if _, ok := liveStatus[key.Int()]; !ok { + liveStatus[key.Int()] = newStatus + return true + } + oldStatus := liveStatus[key.Int()] + if newStatus != oldStatus && newStatus == 1 { + liveStatus[key.Int()] = newStatus + m, ok := control.Lookup(serviceName) + if ok { + groupList := bdb.getAllGroupByBuidAndLive(key.Int()) + roomID := value.Get("short_id").Int() + if roomID == 0 { + roomID = value.Get("room_id").Int() + } + lURL := liveURL + strconv.FormatInt(roomID, 10) + lName := value.Get("uname").String() + lTitle := value.Get("title").String() + lCover := value.Get("cover_from_user").String() + if lCover == "" { + lCover = value.Get("keyframe").String() + } + var msg []message.MessageSegment + msg = append(msg, message.Text(lName+" 正在直播:\n")) + msg = append(msg, message.Text(lTitle)) + msg = append(msg, message.Image(lCover)) + msg = append(msg, message.Text("直播链接:", lURL)) + for _, gid := range groupList { + if m.IsEnabledIn(gid) { + time.Sleep(time.Millisecond * 100) + switch { + case gid > 0: + ctx.SendGroupMessage(gid, msg) + case gid < 0: + ctx.SendPrivateMessage(-gid, msg) + } + } + } + } + } else if newStatus != oldStatus { + liveStatus[key.Int()] = newStatus + } + return true + }) + return nil +} diff --git a/plugin/bilibili/bilibilipushmodel.go b/plugin/bilibili/bilibilipushmodel.go new file mode 100644 index 0000000000..fbacdbaa2e --- /dev/null +++ b/plugin/bilibili/bilibilipushmodel.go @@ -0,0 +1,150 @@ +package bilibili + +import ( + "encoding/json" + "os" + + _ "github.com/fumiama/sqlite3" // import sql + "github.com/jinzhu/gorm" +) + +// bilibilipushdb bilibili推送数据库 +type bilibilipushdb gorm.DB + +type bilibilipush struct { + ID int64 `gorm:"column:id;primary_key" json:"id"` + BilibiliUID int64 `gorm:"column:bilibili_uid;index:idx_buid_gid" json:"bilibili_uid"` + GroupID int64 `gorm:"column:group_id;index:idx_buid_gid" json:"group_id"` + LiveDisable int64 `gorm:"column:live_disable;default:0" json:"live_disable"` + DynamicDisable int64 `gorm:"column:dynamic_disable;default:0" json:"dynamic_disable"` +} + +// TableName ... +func (bilibilipush) TableName() string { + return "bilibili_push" +} + +type bilibiliup struct { + BilibiliUID int64 `gorm:"column:bilibili_uid;primary_key"` + Name string `gorm:"column:name"` +} + +// TableName ... +func (bilibiliup) TableName() string { + return "bilibili_up" +} + +// initializePush 初始化bilibilipushdb数据库 +func initializePush(dbpath string) *bilibilipushdb { + var err error + if _, err = os.Stat(dbpath); err != nil || os.IsNotExist(err) { + // 生成文件 + f, err := os.Create(dbpath) + if err != nil { + return nil + } + defer f.Close() + } + gdb, err := gorm.Open("sqlite3", dbpath) + if err != nil { + panic(err) + } + gdb.AutoMigrate(&bilibilipush{}).AutoMigrate(&bilibiliup{}) + return (*bilibilipushdb)(gdb) +} + +// insertOrUpdateLiveAndDynamic 插入或更新数据库 +func (bdb *bilibilipushdb) insertOrUpdateLiveAndDynamic(bpMap map[string]interface{}) (err error) { + db := (*gorm.DB)(bdb) + bp := bilibilipush{} + data, err := json.Marshal(&bpMap) + if err != nil { + return + } + err = json.Unmarshal(data, &bp) + if err != nil { + return + } + if err = db.Model(&bilibilipush{}).First(&bp, "bilibili_uid = ? and group_id = ?", bp.BilibiliUID, bp.GroupID).Error; err != nil { + if gorm.IsRecordNotFoundError(err) { + err = db.Model(&bilibilipush{}).Create(&bp).Error + } + } else { + err = db.Model(&bilibilipush{}).Where("bilibili_uid = ? and group_id = ?", bp.BilibiliUID, bp.GroupID).Update(bpMap).Error + } + return +} + +func (bdb *bilibilipushdb) getAllBuidByLive() (buidList []int64) { + db := (*gorm.DB)(bdb) + var bpl []bilibilipush + db.Model(&bilibilipush{}).Find(&bpl, "live_disable = 0") + temp := make(map[int64]bool) + for _, v := range bpl { + _, ok := temp[v.BilibiliUID] + if !ok { + buidList = append(buidList, v.BilibiliUID) + temp[v.BilibiliUID] = true + } + } + return +} + +func (bdb *bilibilipushdb) getAllBuidByDynamic() (buidList []int64) { + db := (*gorm.DB)(bdb) + var bpl []bilibilipush + db.Model(&bilibilipush{}).Find(&bpl, "dynamic_disable = 0") + temp := make(map[int64]bool) + for _, v := range bpl { + _, ok := temp[v.BilibiliUID] + if !ok { + buidList = append(buidList, v.BilibiliUID) + temp[v.BilibiliUID] = true + } + } + return +} + +func (bdb *bilibilipushdb) getAllGroupByBuidAndLive(buid int64) (groupList []int64) { + db := (*gorm.DB)(bdb) + var bpl []bilibilipush + db.Model(&bilibilipush{}).Find(&bpl, "bilibili_uid = ? and live_disable = 0", buid) + for _, v := range bpl { + groupList = append(groupList, v.GroupID) + } + return +} + +func (bdb *bilibilipushdb) getAllGroupByBuidAndDynamic(buid int64) (groupList []int64) { + db := (*gorm.DB)(bdb) + var bpl []bilibilipush + db.Model(&bilibilipush{}).Find(&bpl, "bilibili_uid = ? and dynamic_disable = 0", buid) + for _, v := range bpl { + groupList = append(groupList, v.GroupID) + } + return +} + +func (bdb *bilibilipushdb) getAllPushByGroup(groupID int64) (bpl []bilibilipush) { + db := (*gorm.DB)(bdb) + db.Model(&bilibilipush{}).Find(&bpl, "group_id = ? and (live_disable = 0 or dynamic_disable = 0)", groupID) + return +} + +func (bdb *bilibilipushdb) insertBilibiliUp(buid int64, name string) { + db := (*gorm.DB)(bdb) + bu := bilibiliup{ + BilibiliUID: buid, + Name: name, + } + db.Model(&bilibiliup{}).Create(bu) +} + +func (bdb *bilibilipushdb) updateAllUp() { + db := (*gorm.DB)(bdb) + var bul []bilibiliup + db.Model(&bilibiliup{}).Find(&bul) + for _, v := range bul { + upMap[v.BilibiliUID] = v.Name + } +} diff --git a/plugin/bilibili/types.go b/plugin/bilibili/types.go index c29192a044..475dd0e68a 100644 --- a/plugin/bilibili/types.go +++ b/plugin/bilibili/types.go @@ -3,6 +3,8 @@ package bilibili const ( // tURL bilibili动态前缀 tURL = "https://t.bilibili.com/" + // liveURL bilibili直播前缀 + liveURL = "https://live.bilibili.com/" // dynamicDetailURL 当前动态信息,一个card dynamicDetailURL = "https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/get_dynamic_detail?dynamic_id=%v" // memberCardURL 个人信息 @@ -25,6 +27,10 @@ const ( vtbDetailURL = "https://api.vtbs.moe/v1/detail/%v" // medalwallURL 查找牌子 medalwallURL = "https://api.live.bilibili.com/xlive/web-ucenter/user/MedalWall?target_id=%v" + // spaceHistoryURL 历史动态信息,一共12个card + spaceHistoryURL = "https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/space_history?host_uid=%v&offset_dynamic_id=%v&need_top=0" + // liveListURL 获得直播状态 + liveListURL = "https://api.live.bilibili.com/room/v1/Room/get_status_info_by_uids" ) // dynamicCard 总动态结构体,包括desc,card diff --git a/plugin/gif/README.md b/plugin/gif/README.md index e9728814a6..beb8327c4d 100644 --- a/plugin/gif/README.md +++ b/plugin/gif/README.md @@ -87,4 +87,17 @@ - [ ] 震惊 (摆) - [ ] 哈哈镜 (摆) - [ ] 对称 (猎奇, 不整) -- [ ] 远离 (摆) +- [x] 炖 +- [x] 2蹭 +- [x] 诶嘿 +- [x] 膜拜 +- [x] 吞 +- [x] 揍 +- [x] 给我变 +- [x] 玩一下 +- [x] 不要看 +- [x] 小天使 +- [x] 你的 +- [x] 我老婆 +- [x] 远离 +- [x] 抬棺 diff --git a/plugin/gif/gif.go b/plugin/gif/gif.go index 97339bd36e..c39967d768 100644 --- a/plugin/gif/gif.go +++ b/plugin/gif/gif.go @@ -894,7 +894,6 @@ func turn(cc *context, value ...string) (string, error) { // taiguan 抬棺 func taiguan(cc *context, value ...string) (string, error) { - _ = value _ = value var wg sync.WaitGroup var err error @@ -1044,7 +1043,6 @@ func ci(cc *context, value ...string) (string, error) { // worship 膜拜 func worship(cc *context, value ...string) (string, error) { - _ = value _ = value var wg sync.WaitGroup var err error diff --git a/plugin/gif/png.go b/plugin/gif/png.go index 3420eb967a..c03eb563e9 100644 --- a/plugin/gif/png.go +++ b/plugin/gif/png.go @@ -160,9 +160,8 @@ func convolve3x3(cc *context, args ...string) (string, error) { return "file:///" + name, writer.SavePNG2Path(name, imgnrgba) } -// rotate 旋转,带参数暂时不用 +// rotate 旋转 func rotate(cc *context, args ...string) (string, error) { - _ = args name := cc.usrdir + "Rotate.png" // 加载图片 im, err := img.LoadFirstFrame(cc.headimgsdir[0], 0, 0) @@ -174,9 +173,8 @@ func rotate(cc *context, args ...string) (string, error) { return "file:///" + name, writer.SavePNG2Path(name, imgnrgba) } -// deformation 变形,带参数暂时不用 +// deformation 变形 func deformation(cc *context, args ...string) (string, error) { - _ = args name := cc.usrdir + "Deformation.png" // 加载图片 im, err := img.LoadFirstFrame(cc.headimgsdir[0], 0, 0) @@ -1254,7 +1252,6 @@ func xiaotianshi(cc *context, args ...string) (string, error) { // 不要再看这些了 func neko(cc *context, args ...string) (string, error) { - _ = args _ = args var wg sync.WaitGroup var m sync.Mutex diff --git a/plugin/gif/run.go b/plugin/gif/run.go index 56638e0453..f7234fc67b 100644 --- a/plugin/gif/run.go +++ b/plugin/gif/run.go @@ -17,20 +17,6 @@ var ( cmd = make([]string, 0) datapath string cmdMap = map[string]func(cc *context, args ...string) (string, error){ - "炖": dun, - "2蹭": ceng2, - "诶嘿": eihei, - "膜拜": worship, - "吞": ci, - "揍": zou, - "给我变": bian, - "玩一下": van, - "不要看": neko, - "小天使": xiaotianshi, - "你的": youer, - "我老婆": nowife, - "远离": yuanli, - "抬棺": taiguan, "搓": cuo, "冲": xqe, "摸": mo, @@ -106,6 +92,20 @@ var ( "紧贴": tightly, "紧紧贴着": tightly, "转": turn, + "炖": dun, + "2蹭": ceng2, + "诶嘿": eihei, + "膜拜": worship, + "吞": ci, + "揍": zou, + "给我变": bian, + "玩一下": van, + "不要看": neko, + "小天使": xiaotianshi, + "你的": youer, + "我老婆": nowife, + "远离": yuanli, + "抬棺": taiguan, } ) @@ -120,7 +120,7 @@ func init() { // 插件主体 "- 我永远喜欢|永远喜欢\n- 像样的亲亲\n- 国旗\n- 不要靠近\n- 万能表情|空白表情\n- 采访\n- 需要|你可能需要\n- 这像画吗\n- 小画家\n" + "- 完美\n- 玩游戏\n- 出警\n- 警察\n- 舔|舔屏|prpr\n- 安全感\n- 精神支柱\n- 想什么\n- 墙纸\n- 为什么at我\n- 交个朋友\n- 打工人|继续干活\n" + "- 兑换券\n- 注意力涣散\n- 垃圾桶|垃圾\n- 捶\n- 啾啾\n- 2敲\n- 听音乐\n- 永远爱你\n- 2拍\n- 顶\n- 捣\n- 打拳\n- 滚\n- 吸|嗦\n- 扔\n" + - "- 锤\n- 紧贴|紧紧贴着\n- 转\n", + "- 锤\n- 紧贴|紧紧贴着\n- 转\n- 炖\n- 2蹭\n- 诶嘿\n- 膜拜\n- 吞\n- 揍\n- 给我变\n- 玩一下\n- 不要看\n- 小天使\n- 你的\n- 我老婆\n- 远离\n- 抬棺\n", PrivateDataFolder: "gif", }).ApplySingle(ctxext.DefaultSingle) datapath = file.BOTPATH + "/" + en.DataFolder() diff --git a/plugin/nihongo/nihongo.go b/plugin/nihongo/nihongo.go index 186c1ec9a6..a5691fa9e4 100644 --- a/plugin/nihongo/nihongo.go +++ b/plugin/nihongo/nihongo.go @@ -47,7 +47,7 @@ func init() { return true }) - engine.OnRegex(`^日语语法\s?([0-9A-Za-z]{1,6})$`, getdb).SetBlock(true). + engine.OnRegex(`^日语语法\s?([0-9A-Za-zぁ-んァ-ヶ]{1,6})$`, getdb).SetBlock(true). Handle(func(ctx *zero.Ctx) { g := getRandomGrammarByTag(ctx.State["regex_matched"].([]string)[1]) if g.ID == 0 {