mirror of
https://github.com/FloatTech/ZeroBot-Plugin.git
synced 2025-12-20 06:20:08 +08:00
✨ 添加bilibilipush和完善gif文档 (#369)
* ✨ 添加bilibilipush和完善gif文档 * 🎨 修lint * 🎨 日语语法标签匹配日文 * 🎨 优化发送逻辑和命令 * 🎨 错误处理 * 🎨 错误处理
This commit is contained in:
parent
4d68cc9fce
commit
ae7e3c9c89
18
README.md
18
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
|
- [x] t.bilibili.com/642277677329285174 | bilibili.com/read/cv17134450 | bilibili.com/video/BV13B4y1x7pS | live.bilibili.com/22603245
|
||||||
|
|
||||||
|
</details>
|
||||||
|
<details>
|
||||||
|
<summary>b站动态、直播推送,需要配合job一起使用</summary>
|
||||||
|
|
||||||
|
`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"触发的指令)
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
<details>
|
<details>
|
||||||
<summary>书评</summary>
|
<summary>书评</summary>
|
||||||
|
|||||||
@ -47,7 +47,7 @@ func init() {
|
|||||||
var getdb = ctxext.DoOnceOnSuccess(func(ctx *zero.Ctx) bool {
|
var getdb = ctxext.DoOnceOnSuccess(func(ctx *zero.Ctx) bool {
|
||||||
var err error
|
var err error
|
||||||
_, _ = engine.GetLazyData("bilibili.db", false)
|
_, _ = engine.GetLazyData("bilibili.db", false)
|
||||||
vdb, err = initialize(engine.DataFolder() + "bilibili.db")
|
vdb, err = initializeVup(engine.DataFolder() + "bilibili.db")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.SendChain(message.Text("ERROR:", err))
|
ctx.SendChain(message.Text("ERROR:", err))
|
||||||
return false
|
return false
|
||||||
|
|||||||
@ -1,3 +1,4 @@
|
|||||||
|
// Package bilibili bilibili卡片解析
|
||||||
package bilibili
|
package bilibili
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@ -41,8 +41,8 @@ func (config) TableName() string {
|
|||||||
return "config"
|
return "config"
|
||||||
}
|
}
|
||||||
|
|
||||||
// initialize 初始化vtb数据库
|
// initializeVup 初始化vup数据库
|
||||||
func initialize(dbpath string) (*vupdb, error) {
|
func initializeVup(dbpath string) (*vupdb, error) {
|
||||||
if _, err := os.Stat(dbpath); err != nil || os.IsNotExist(err) {
|
if _, err := os.Stat(dbpath); err != nil || os.IsNotExist(err) {
|
||||||
// 生成文件
|
// 生成文件
|
||||||
f, err := os.Create(dbpath)
|
f, err := os.Create(dbpath)
|
||||||
357
plugin/bilibili/bilibilipush.go
Normal file
357
plugin/bilibili/bilibilipush.go
Normal file
@ -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
|
||||||
|
}
|
||||||
150
plugin/bilibili/bilibilipushmodel.go
Normal file
150
plugin/bilibili/bilibilipushmodel.go
Normal file
@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -3,6 +3,8 @@ package bilibili
|
|||||||
const (
|
const (
|
||||||
// tURL bilibili动态前缀
|
// tURL bilibili动态前缀
|
||||||
tURL = "https://t.bilibili.com/"
|
tURL = "https://t.bilibili.com/"
|
||||||
|
// liveURL bilibili直播前缀
|
||||||
|
liveURL = "https://live.bilibili.com/"
|
||||||
// dynamicDetailURL 当前动态信息,一个card
|
// dynamicDetailURL 当前动态信息,一个card
|
||||||
dynamicDetailURL = "https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/get_dynamic_detail?dynamic_id=%v"
|
dynamicDetailURL = "https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/get_dynamic_detail?dynamic_id=%v"
|
||||||
// memberCardURL 个人信息
|
// memberCardURL 个人信息
|
||||||
@ -25,6 +27,10 @@ const (
|
|||||||
vtbDetailURL = "https://api.vtbs.moe/v1/detail/%v"
|
vtbDetailURL = "https://api.vtbs.moe/v1/detail/%v"
|
||||||
// medalwallURL 查找牌子
|
// medalwallURL 查找牌子
|
||||||
medalwallURL = "https://api.live.bilibili.com/xlive/web-ucenter/user/MedalWall?target_id=%v"
|
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
|
// dynamicCard 总动态结构体,包括desc,card
|
||||||
|
|||||||
@ -87,4 +87,17 @@
|
|||||||
- [ ] 震惊 (摆)
|
- [ ] 震惊 (摆)
|
||||||
- [ ] 哈哈镜 (摆)
|
- [ ] 哈哈镜 (摆)
|
||||||
- [ ] 对称 (猎奇, 不整)
|
- [ ] 对称 (猎奇, 不整)
|
||||||
- [ ] 远离 (摆)
|
- [x] 炖
|
||||||
|
- [x] 2蹭
|
||||||
|
- [x] 诶嘿
|
||||||
|
- [x] 膜拜
|
||||||
|
- [x] 吞
|
||||||
|
- [x] 揍
|
||||||
|
- [x] 给我变
|
||||||
|
- [x] 玩一下
|
||||||
|
- [x] 不要看
|
||||||
|
- [x] 小天使
|
||||||
|
- [x] 你的
|
||||||
|
- [x] 我老婆
|
||||||
|
- [x] 远离
|
||||||
|
- [x] 抬棺
|
||||||
|
|||||||
@ -894,7 +894,6 @@ func turn(cc *context, value ...string) (string, error) {
|
|||||||
|
|
||||||
// taiguan 抬棺
|
// taiguan 抬棺
|
||||||
func taiguan(cc *context, value ...string) (string, error) {
|
func taiguan(cc *context, value ...string) (string, error) {
|
||||||
_ = value
|
|
||||||
_ = value
|
_ = value
|
||||||
var wg sync.WaitGroup
|
var wg sync.WaitGroup
|
||||||
var err error
|
var err error
|
||||||
@ -1044,7 +1043,6 @@ func ci(cc *context, value ...string) (string, error) {
|
|||||||
|
|
||||||
// worship 膜拜
|
// worship 膜拜
|
||||||
func worship(cc *context, value ...string) (string, error) {
|
func worship(cc *context, value ...string) (string, error) {
|
||||||
_ = value
|
|
||||||
_ = value
|
_ = value
|
||||||
var wg sync.WaitGroup
|
var wg sync.WaitGroup
|
||||||
var err error
|
var err error
|
||||||
|
|||||||
@ -160,9 +160,8 @@ func convolve3x3(cc *context, args ...string) (string, error) {
|
|||||||
return "file:///" + name, writer.SavePNG2Path(name, imgnrgba)
|
return "file:///" + name, writer.SavePNG2Path(name, imgnrgba)
|
||||||
}
|
}
|
||||||
|
|
||||||
// rotate 旋转,带参数暂时不用
|
// rotate 旋转
|
||||||
func rotate(cc *context, args ...string) (string, error) {
|
func rotate(cc *context, args ...string) (string, error) {
|
||||||
_ = args
|
|
||||||
name := cc.usrdir + "Rotate.png"
|
name := cc.usrdir + "Rotate.png"
|
||||||
// 加载图片
|
// 加载图片
|
||||||
im, err := img.LoadFirstFrame(cc.headimgsdir[0], 0, 0)
|
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)
|
return "file:///" + name, writer.SavePNG2Path(name, imgnrgba)
|
||||||
}
|
}
|
||||||
|
|
||||||
// deformation 变形,带参数暂时不用
|
// deformation 变形
|
||||||
func deformation(cc *context, args ...string) (string, error) {
|
func deformation(cc *context, args ...string) (string, error) {
|
||||||
_ = args
|
|
||||||
name := cc.usrdir + "Deformation.png"
|
name := cc.usrdir + "Deformation.png"
|
||||||
// 加载图片
|
// 加载图片
|
||||||
im, err := img.LoadFirstFrame(cc.headimgsdir[0], 0, 0)
|
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) {
|
func neko(cc *context, args ...string) (string, error) {
|
||||||
_ = args
|
|
||||||
_ = args
|
_ = args
|
||||||
var wg sync.WaitGroup
|
var wg sync.WaitGroup
|
||||||
var m sync.Mutex
|
var m sync.Mutex
|
||||||
|
|||||||
@ -17,20 +17,6 @@ var (
|
|||||||
cmd = make([]string, 0)
|
cmd = make([]string, 0)
|
||||||
datapath string
|
datapath string
|
||||||
cmdMap = map[string]func(cc *context, args ...string) (string, error){
|
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,
|
"搓": cuo,
|
||||||
"冲": xqe,
|
"冲": xqe,
|
||||||
"摸": mo,
|
"摸": mo,
|
||||||
@ -106,6 +92,20 @@ var (
|
|||||||
"紧贴": tightly,
|
"紧贴": tightly,
|
||||||
"紧紧贴着": tightly,
|
"紧紧贴着": tightly,
|
||||||
"转": turn,
|
"转": 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- 万能表情|空白表情\n- 采访\n- 需要|你可能需要\n- 这像画吗\n- 小画家\n" +
|
||||||
"- 完美\n- 玩游戏\n- 出警\n- 警察\n- 舔|舔屏|prpr\n- 安全感\n- 精神支柱\n- 想什么\n- 墙纸\n- 为什么at我\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- 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",
|
PrivateDataFolder: "gif",
|
||||||
}).ApplySingle(ctxext.DefaultSingle)
|
}).ApplySingle(ctxext.DefaultSingle)
|
||||||
datapath = file.BOTPATH + "/" + en.DataFolder()
|
datapath = file.BOTPATH + "/" + en.DataFolder()
|
||||||
|
|||||||
@ -47,7 +47,7 @@ func init() {
|
|||||||
return true
|
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) {
|
Handle(func(ctx *zero.Ctx) {
|
||||||
g := getRandomGrammarByTag(ctx.State["regex_matched"].([]string)[1])
|
g := getRandomGrammarByTag(ctx.State["regex_matched"].([]string)[1])
|
||||||
if g.ID == 0 {
|
if g.ID == 0 {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user